From ceb95791be90717ff846b0c9ef83054b33d4e2eb Mon Sep 17 00:00:00 2001 From: Paulo Vieira Date: Tue, 9 Jan 2018 10:46:22 +0000 Subject: [PATCH] Game Games --- .DS_Store | Bin 10244 -> 6148 bytes laravel/.DS_Store | Bin 16388 -> 0 bytes .../Http/Controllers/LoginControllerAPI.php | 44 - .../Controllers/MemoryGameControllerAPI.php | 83 - laravel/database/seeds/UsersTableSeeder.php | 20 - laravel/public/.DS_Store | Bin 8196 -> 0 bytes laravel/public/img/0.png | Bin 302 -> 0 bytes laravel/public/img/1.png | Bin 4117 -> 0 bytes laravel/public/img/10.png | Bin 4479 -> 0 bytes laravel/public/img/11.png | Bin 2492 -> 0 bytes laravel/public/img/12.png | Bin 3417 -> 0 bytes laravel/public/img/13.png | Bin 4624 -> 0 bytes laravel/public/img/14.png | Bin 2688 -> 0 bytes laravel/public/img/15.png | Bin 3275 -> 0 bytes laravel/public/img/16.png | Bin 3447 -> 0 bytes laravel/public/img/17.png | Bin 2959 -> 0 bytes laravel/public/img/18.png | Bin 1669 -> 0 bytes laravel/public/img/19.png | Bin 1487 -> 0 bytes laravel/public/img/2.png | Bin 4080 -> 0 bytes laravel/public/img/20.png | Bin 3159 -> 0 bytes laravel/public/img/21.png | Bin 3046 -> 0 bytes laravel/public/img/22.png | Bin 3486 -> 0 bytes laravel/public/img/23.png | Bin 3885 -> 0 bytes laravel/public/img/24.png | Bin 3085 -> 0 bytes laravel/public/img/25.png | Bin 3157 -> 0 bytes laravel/public/img/26.png | Bin 3873 -> 0 bytes laravel/public/img/27.png | Bin 3839 -> 0 bytes laravel/public/img/28.png | Bin 3304 -> 0 bytes laravel/public/img/29.png | Bin 3738 -> 0 bytes laravel/public/img/3.png | Bin 3446 -> 0 bytes laravel/public/img/30.png | Bin 2673 -> 0 bytes laravel/public/img/31.png | Bin 4557 -> 0 bytes laravel/public/img/32.png | Bin 2883 -> 0 bytes laravel/public/img/33.png | Bin 3152 -> 0 bytes laravel/public/img/34.png | Bin 2901 -> 0 bytes laravel/public/img/35.png | Bin 3531 -> 0 bytes laravel/public/img/36.png | Bin 2490 -> 0 bytes laravel/public/img/37.png | Bin 3100 -> 0 bytes laravel/public/img/38.png | Bin 3002 -> 0 bytes laravel/public/img/39.png | Bin 3141 -> 0 bytes laravel/public/img/4.png | Bin 3330 -> 0 bytes laravel/public/img/40.png | Bin 4185 -> 0 bytes laravel/public/img/41.png | Bin 3239 -> 0 bytes laravel/public/img/5.png | Bin 3324 -> 0 bytes laravel/public/img/6.png | Bin 2237 -> 0 bytes laravel/public/img/7.png | Bin 3018 -> 0 bytes laravel/public/img/8.png | Bin 2497 -> 0 bytes laravel/public/img/9.png | Bin 3656 -> 0 bytes laravel/public/img/empty.png | Bin 286 -> 0 bytes laravel/public/js/tictactoe.js | 83 - laravel/public/mix-manifest.json | 3 - .../resources/assets/js/components/lobby.vue | 0 .../assets/js/components/memoryGame.vue | 131 - .../assets/js/components/multiplayerMode.vue | 0 laravel/resources/assets/js/vueapp.js | 43 - {laravel/app => laravel_server}/.DS_Store | Bin 6148 -> 10244 bytes {laravel => laravel_server}/.env.example | 0 {laravel => laravel_server}/.gitattributes | 0 {laravel => laravel_server}/.gitignore | 0 .../app/Console/Kernel.php | 0 .../app/Department.php | 0 .../app/Exceptions/Handler.php | 0 laravel_server/app/Game.php | 33 + .../Auth/ForgotPasswordController.php | 0 .../Http/Controllers/Auth/LoginController.php | 0 .../Controllers/Auth/RegisterController.php | 0 .../Auth/ResetPasswordController.php | 0 .../app/Http/Controllers/Controller.php | 0 .../Controllers/DepartmentControllerAPI.php | 3 +- .../Http/Controllers/GameControllerAPI.php | 83 + .../Http/Controllers/LoginControllerAPI.php | 43 + .../Http/Controllers/UserControllerAPI.php | 2 +- .../app/Http/Controllers/VueController.php | 1 - .../app/Http/Kernel.php | 0 .../app/Http/Middleware/EncryptCookies.php | 0 .../Middleware/RedirectIfAuthenticated.php | 0 .../app/Http/Middleware/TrimStrings.php | 0 .../app/Http/Middleware/TrustProxies.php | 0 .../app/Http/Middleware/VerifyCsrfToken.php | 0 .../Http/Requests/StoreDepartmentRequest.php | 0 .../app/Http/Requests/StoreUserRequest.php | 0 .../Http/Requests/UpdateDepartmentRequest.php | 0 .../app/Http/Requests/UpdateUserRequest.php | 0 .../app/Http/Resources/Department.php | 0 laravel_server/app/Http/Resources/Game.php | 27 + .../app/Http/Resources/User.php | 0 .../app/Providers/AppServiceProvider.php | 1 + .../app/Providers/AuthServiceProvider.php | 3 +- .../Providers/BroadcastServiceProvider.php | 0 .../app/Providers/EventServiceProvider.php | 0 .../app/Providers/RouteServiceProvider.php | 0 {laravel => laravel_server}/app/User.php | 0 {laravel => laravel_server}/artisan | 0 {laravel => laravel_server}/bootstrap/app.php | 0 .../bootstrap/cache/.gitignore | 0 {laravel => laravel_server}/composer.json | 0 {laravel => laravel_server}/composer.lock | 14 +- {laravel => laravel_server}/config/app.php | 0 {laravel => laravel_server}/config/auth.php | 0 .../config/broadcasting.php | 0 {laravel => laravel_server}/config/cache.php | 0 .../config/database.php | 0 .../config/filesystems.php | 0 {laravel => laravel_server}/config/mail.php | 0 {laravel => laravel_server}/config/queue.php | 0 .../config/services.php | 0 .../config/session.php | 0 {laravel => laravel_server}/config/view.php | 0 .../database/.gitignore | 0 .../database/factories/UserFactory.php | 0 .../2017_10_03_140030_initial_migrations.php | 9 +- .../database/seeds/DatabaseSeeder.php | 9 +- .../database/seeds/DepartmentsTableSeeder.php | 0 .../database/seeds/UsersTableSeeder.php | 39 + {laravel => laravel_server}/package-lock.json | 1470 +- {laravel => laravel_server}/package.json | 6 +- .../package.json.original | 0 .../package.json.patch | 0 {laravel => laravel_server}/phpunit.xml | 0 {laravel => laravel_server}/public/.htaccess | 0 .../public/css/app.css | 3 +- .../public/css/style.css | 0 .../public/favicon.ico | 0 .../glyphicons-halflings-regular.eot | Bin .../glyphicons-halflings-regular.svg | 0 .../glyphicons-halflings-regular.ttf | Bin .../glyphicons-halflings-regular.woff | Bin .../glyphicons-halflings-regular.woff2 | Bin laravel_server/public/img/0.png | Bin 0 -> 974 bytes laravel_server/public/img/1.png | Bin 0 -> 1320 bytes laravel_server/public/img/2.png | Bin 0 -> 1480 bytes {laravel => laravel_server}/public/index.php | 0 laravel_server/public/js/tictactoe.js | 42533 ++++++++++++++++ .../public/js/vueapp.js | 1430 +- laravel_server/public/mix-manifest.json | 4 + {laravel => laravel_server}/public/robots.txt | 0 {laravel => laravel_server}/public/web.config | 0 {laravel => laravel_server}/readme.md | 0 .../resources/.DS_Store | Bin 6148 -> 6148 bytes .../resources/assets/.DS_Store | Bin .../resources/assets/js/bootstrap.js | 0 .../assets/js/components/departmentList.vue | 0 .../assets/js/components/game-tictactoe.vue | 121 + .../resources/assets/js/components/lobby.vue | 36 + .../resources/assets/js/components/login.vue | 75 + .../js/components/multiplayer_tictactoe.vue | 127 + .../assets/js/components/register.vue | 71 + .../js/components/singleplayer_tictactoe.vue | 149 +- .../resources/assets/js/components/user.vue | 59 +- .../assets/js/components/userEdit.vue | 0 .../assets/js/components/userList.vue | 0 laravel_server/resources/assets/js/vueapp.js | 48 + .../resources/assets/sass/_variables.scss | 0 .../resources/assets/sass/app.scss | 9 +- .../resources/lang/en/auth.php | 0 .../resources/lang/en/pagination.php | 0 .../resources/lang/en/passwords.php | 0 .../resources/lang/en/validation.php | 0 .../resources/views/master.blade.php | 8 +- .../resources/views/vue/index.blade.php | 8 +- .../resources/views/welcome.blade.php | 0 {laravel => laravel_server}/routes/api.php | 6 +- .../routes/channels.php | 0 .../routes/console.php | 0 {laravel => laravel_server}/routes/web.php | 1 + {laravel => laravel_server}/server.php | 0 {laravel => laravel_server}/stats.json | 0 .../storage/app/.gitignore | 0 .../storage/app/public/.gitignore | 0 .../storage/framework/.gitignore | 0 .../storage/framework/cache/.gitignore | 0 .../storage/framework/sessions/.gitignore | 0 .../storage/framework/testing/.gitignore | 0 .../storage/framework/views/.gitignore | 0 .../storage/logs/.gitignore | 0 .../tests/CreatesApplication.php | 0 .../tests/Feature/ExampleTest.php | 0 .../tests/TestCase.php | 0 .../tests/Unit/ExampleTest.php | 0 {laravel => laravel_server}/webpack.mix.js | 3 +- node_server/gamelist.js | 63 +- node_server/gamemodel.js | 45 +- node_server/gameserver.js | 30 +- 183 files changed, 45919 insertions(+), 1060 deletions(-) delete mode 100644 laravel/.DS_Store delete mode 100644 laravel/app/Http/Controllers/LoginControllerAPI.php delete mode 100644 laravel/app/Http/Controllers/MemoryGameControllerAPI.php delete mode 100644 laravel/database/seeds/UsersTableSeeder.php delete mode 100644 laravel/public/.DS_Store delete mode 100755 laravel/public/img/0.png delete mode 100755 laravel/public/img/1.png delete mode 100755 laravel/public/img/10.png delete mode 100755 laravel/public/img/11.png delete mode 100755 laravel/public/img/12.png delete mode 100755 laravel/public/img/13.png delete mode 100755 laravel/public/img/14.png delete mode 100755 laravel/public/img/15.png delete mode 100755 laravel/public/img/16.png delete mode 100755 laravel/public/img/17.png delete mode 100755 laravel/public/img/18.png delete mode 100755 laravel/public/img/19.png delete mode 100755 laravel/public/img/2.png delete mode 100755 laravel/public/img/20.png delete mode 100755 laravel/public/img/21.png delete mode 100755 laravel/public/img/22.png delete mode 100755 laravel/public/img/23.png delete mode 100755 laravel/public/img/24.png delete mode 100755 laravel/public/img/25.png delete mode 100755 laravel/public/img/26.png delete mode 100755 laravel/public/img/27.png delete mode 100755 laravel/public/img/28.png delete mode 100755 laravel/public/img/29.png delete mode 100755 laravel/public/img/3.png delete mode 100755 laravel/public/img/30.png delete mode 100755 laravel/public/img/31.png delete mode 100755 laravel/public/img/32.png delete mode 100755 laravel/public/img/33.png delete mode 100755 laravel/public/img/34.png delete mode 100755 laravel/public/img/35.png delete mode 100755 laravel/public/img/36.png delete mode 100755 laravel/public/img/37.png delete mode 100755 laravel/public/img/38.png delete mode 100755 laravel/public/img/39.png delete mode 100755 laravel/public/img/4.png delete mode 100755 laravel/public/img/40.png delete mode 100755 laravel/public/img/41.png delete mode 100755 laravel/public/img/5.png delete mode 100755 laravel/public/img/6.png delete mode 100755 laravel/public/img/7.png delete mode 100755 laravel/public/img/8.png delete mode 100755 laravel/public/img/9.png delete mode 100755 laravel/public/img/empty.png delete mode 100644 laravel/public/js/tictactoe.js delete mode 100644 laravel/public/mix-manifest.json delete mode 100644 laravel/resources/assets/js/components/lobby.vue delete mode 100644 laravel/resources/assets/js/components/memoryGame.vue delete mode 100644 laravel/resources/assets/js/components/multiplayerMode.vue delete mode 100644 laravel/resources/assets/js/vueapp.js rename {laravel/app => laravel_server}/.DS_Store (55%) rename {laravel => laravel_server}/.env.example (100%) rename {laravel => laravel_server}/.gitattributes (100%) rename {laravel => laravel_server}/.gitignore (100%) rename {laravel => laravel_server}/app/Console/Kernel.php (100%) rename {laravel => laravel_server}/app/Department.php (100%) rename {laravel => laravel_server}/app/Exceptions/Handler.php (100%) create mode 100644 laravel_server/app/Game.php rename {laravel => laravel_server}/app/Http/Controllers/Auth/ForgotPasswordController.php (100%) rename {laravel => laravel_server}/app/Http/Controllers/Auth/LoginController.php (100%) rename {laravel => laravel_server}/app/Http/Controllers/Auth/RegisterController.php (100%) rename {laravel => laravel_server}/app/Http/Controllers/Auth/ResetPasswordController.php (100%) rename {laravel => laravel_server}/app/Http/Controllers/Controller.php (100%) rename {laravel => laravel_server}/app/Http/Controllers/DepartmentControllerAPI.php (99%) create mode 100644 laravel_server/app/Http/Controllers/GameControllerAPI.php create mode 100644 laravel_server/app/Http/Controllers/LoginControllerAPI.php rename {laravel => laravel_server}/app/Http/Controllers/UserControllerAPI.php (97%) rename {laravel => laravel_server}/app/Http/Controllers/VueController.php (99%) rename {laravel => laravel_server}/app/Http/Kernel.php (100%) rename {laravel => laravel_server}/app/Http/Middleware/EncryptCookies.php (100%) rename {laravel => laravel_server}/app/Http/Middleware/RedirectIfAuthenticated.php (100%) rename {laravel => laravel_server}/app/Http/Middleware/TrimStrings.php (100%) rename {laravel => laravel_server}/app/Http/Middleware/TrustProxies.php (100%) rename {laravel => laravel_server}/app/Http/Middleware/VerifyCsrfToken.php (100%) rename {laravel => laravel_server}/app/Http/Requests/StoreDepartmentRequest.php (100%) rename {laravel => laravel_server}/app/Http/Requests/StoreUserRequest.php (100%) rename {laravel => laravel_server}/app/Http/Requests/UpdateDepartmentRequest.php (100%) rename {laravel => laravel_server}/app/Http/Requests/UpdateUserRequest.php (100%) rename {laravel => laravel_server}/app/Http/Resources/Department.php (100%) create mode 100644 laravel_server/app/Http/Resources/Game.php rename {laravel => laravel_server}/app/Http/Resources/User.php (100%) rename {laravel => laravel_server}/app/Providers/AppServiceProvider.php (99%) rename {laravel => laravel_server}/app/Providers/AuthServiceProvider.php (95%) rename {laravel => laravel_server}/app/Providers/BroadcastServiceProvider.php (100%) rename {laravel => laravel_server}/app/Providers/EventServiceProvider.php (100%) rename {laravel => laravel_server}/app/Providers/RouteServiceProvider.php (100%) rename {laravel => laravel_server}/app/User.php (100%) rename {laravel => laravel_server}/artisan (100%) rename {laravel => laravel_server}/bootstrap/app.php (100%) rename {laravel => laravel_server}/bootstrap/cache/.gitignore (100%) rename {laravel => laravel_server}/composer.json (100%) rename {laravel => laravel_server}/composer.lock (99%) rename {laravel => laravel_server}/config/app.php (100%) rename {laravel => laravel_server}/config/auth.php (100%) rename {laravel => laravel_server}/config/broadcasting.php (100%) rename {laravel => laravel_server}/config/cache.php (100%) rename {laravel => laravel_server}/config/database.php (100%) rename {laravel => laravel_server}/config/filesystems.php (100%) rename {laravel => laravel_server}/config/mail.php (100%) rename {laravel => laravel_server}/config/queue.php (100%) rename {laravel => laravel_server}/config/services.php (100%) rename {laravel => laravel_server}/config/session.php (100%) rename {laravel => laravel_server}/config/view.php (100%) rename {laravel => laravel_server}/database/.gitignore (100%) rename {laravel => laravel_server}/database/factories/UserFactory.php (100%) rename {laravel => laravel_server}/database/migrations/2017_10_03_140030_initial_migrations.php (88%) rename {laravel => laravel_server}/database/seeds/DatabaseSeeder.php (52%) rename {laravel => laravel_server}/database/seeds/DepartmentsTableSeeder.php (100%) create mode 100644 laravel_server/database/seeds/UsersTableSeeder.php rename {laravel => laravel_server}/package-lock.json (89%) rename {laravel => laravel_server}/package.json (92%) rename {laravel => laravel_server}/package.json.original (100%) rename {laravel => laravel_server}/package.json.patch (100%) rename {laravel => laravel_server}/phpunit.xml (100%) rename {laravel => laravel_server}/public/.htaccess (100%) rename {laravel => laravel_server}/public/css/app.css (99%) rename {laravel => laravel_server}/public/css/style.css (100%) rename {laravel => laravel_server}/public/favicon.ico (100%) rename {laravel => laravel_server}/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot (100%) rename {laravel => laravel_server}/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg (100%) rename {laravel => laravel_server}/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf (100%) rename {laravel => laravel_server}/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff (100%) rename {laravel => laravel_server}/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 (100%) create mode 100644 laravel_server/public/img/0.png create mode 100644 laravel_server/public/img/1.png create mode 100644 laravel_server/public/img/2.png rename {laravel => laravel_server}/public/index.php (100%) create mode 100644 laravel_server/public/js/tictactoe.js rename {laravel => laravel_server}/public/js/vueapp.js (92%) create mode 100644 laravel_server/public/mix-manifest.json rename {laravel => laravel_server}/public/robots.txt (100%) rename {laravel => laravel_server}/public/web.config (100%) rename {laravel => laravel_server}/readme.md (100%) rename {laravel => laravel_server}/resources/.DS_Store (98%) rename {laravel => laravel_server}/resources/assets/.DS_Store (100%) rename {laravel => laravel_server}/resources/assets/js/bootstrap.js (100%) rename {laravel => laravel_server}/resources/assets/js/components/departmentList.vue (100%) create mode 100644 laravel_server/resources/assets/js/components/game-tictactoe.vue create mode 100644 laravel_server/resources/assets/js/components/lobby.vue create mode 100644 laravel_server/resources/assets/js/components/login.vue create mode 100644 laravel_server/resources/assets/js/components/multiplayer_tictactoe.vue create mode 100644 laravel_server/resources/assets/js/components/register.vue rename laravel/resources/assets/js/components/singleplayerMode.vue => laravel_server/resources/assets/js/components/singleplayer_tictactoe.vue (58%) rename {laravel => laravel_server}/resources/assets/js/components/user.vue (68%) rename {laravel => laravel_server}/resources/assets/js/components/userEdit.vue (100%) rename {laravel => laravel_server}/resources/assets/js/components/userList.vue (100%) create mode 100644 laravel_server/resources/assets/js/vueapp.js rename {laravel => laravel_server}/resources/assets/sass/_variables.scss (100%) rename {laravel => laravel_server}/resources/assets/sass/app.scss (92%) rename {laravel => laravel_server}/resources/lang/en/auth.php (100%) rename {laravel => laravel_server}/resources/lang/en/pagination.php (100%) rename {laravel => laravel_server}/resources/lang/en/passwords.php (100%) rename {laravel => laravel_server}/resources/lang/en/validation.php (100%) rename {laravel => laravel_server}/resources/views/master.blade.php (82%) rename {laravel => laravel_server}/resources/views/vue/index.blade.php (53%) rename {laravel => laravel_server}/resources/views/welcome.blade.php (100%) rename {laravel => laravel_server}/routes/api.php (90%) rename {laravel => laravel_server}/routes/channels.php (100%) rename {laravel => laravel_server}/routes/console.php (100%) rename {laravel => laravel_server}/routes/web.php (99%) rename {laravel => laravel_server}/server.php (100%) rename {laravel => laravel_server}/stats.json (100%) rename {laravel => laravel_server}/storage/app/.gitignore (100%) rename {laravel => laravel_server}/storage/app/public/.gitignore (100%) rename {laravel => laravel_server}/storage/framework/.gitignore (100%) rename {laravel => laravel_server}/storage/framework/cache/.gitignore (100%) rename {laravel => laravel_server}/storage/framework/sessions/.gitignore (100%) rename {laravel => laravel_server}/storage/framework/testing/.gitignore (100%) rename {laravel => laravel_server}/storage/framework/views/.gitignore (100%) rename {laravel => laravel_server}/storage/logs/.gitignore (100%) rename {laravel => laravel_server}/tests/CreatesApplication.php (100%) rename {laravel => laravel_server}/tests/Feature/ExampleTest.php (100%) rename {laravel => laravel_server}/tests/TestCase.php (100%) rename {laravel => laravel_server}/tests/Unit/ExampleTest.php (100%) rename {laravel => laravel_server}/webpack.mix.js (83%) diff --git a/.DS_Store b/.DS_Store index d40548694f5d72156c4c14810943e6927d63ec96..7796d69775a498e4c6e8bc3da7ff20420b1e491d 100644 GIT binary patch delta 203 zcmZn(XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50D9Qzr2aA<4q%!0%#4{8#q;4!+ z&MXX);RA{!G86$ZSa$MOv1b-&Vh|lbH6Rs5DaFY-N%{FXK)o26^Ce_AuMu0vw3wZP oLy#Gy0%$KckZ=XLXJg@a=E?jjo*>sTFhN`jay-N4c%C`T0ILNh2mk;8 literal 10244 zcmeHMZ)_Ar6rWcL?6N|)1>56Kxs_5235g++IFro0 z*?I5H%=_){_GRV>A&|%$Q9?9Ah=i3&^$u*VQ>dQSic%GfP(MI_LJGtrc52kirtAu9 zF(42S2nYlO0s;Yn!0mtl=4@Idg-g*21Ox&CfoTNj_d&x-Wjv4*T(VCGHtYz1vKoh3 z!9Jb?n2#37cpxXZWUe?TKRrO;3c(QrxI5}KYK}4<$O$gFI|1%aAXpiK6AG}^(NAOM z1mawZRv;h{s6>FC-RBdV=p=`A#`)b%q2}XM*0wyqwe?%5no~V@-h7Fch0>wqh&!6} zbwBSV^xPnQ+O7K|si5EIy7qKmPwlhJ(IIt7m+Sbt<(N68(SkB2h2u4rZb#~{>0tVincI|w|K}~I1x6^qvHn-Y#(mKwq(>d3+ce|eDTduQz zz&DTiR7WSeMm2E2b8~(dn{2?s`MFgcU1L|4I(z%foQG1DFDzg zwMiPtr>w{FmOsYkYFrso4jLH6L#{z*Gt@~*W|~ziL!m*c>B^bd8j{4OQCdQ4WmT8@ zJdBHvM3nWi>dAda@$K`aqDo9s4SBDvr%am8V22v)D%y1ax}%)1RX92X^OYxtbHME?`L`FT%EylSLrx@XZqE_QifonH!LG3&weK2pMvQ3s%a#O6mA!jde%2x?vkU47-q}d!Uc8^a$tyQypaL7!+X~P9R^OhG*becn+S2vv3YxhF9QK zcnw+m23&wQVG=F|{QVFn`22T z$1j;#lDbsl^^7E?Tt7(#$%Q4Ff0LwwWQQqA!XyW{{R22--uX2ARrL<&k%s>?qqiYmoMEb zl<$PzwQE?9V5NoHO>oIvu%RY&oL$G`1HF!C7c4jyT&pmBJg}SKlDVTFb4ST<^Kbc| O0pk2G&j0`O^Z!4mLFDNG diff --git a/laravel/.DS_Store b/laravel/.DS_Store deleted file mode 100644 index 05d84f32d2b42160df5609299fe8f35ac38c788c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16388 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.'/oauth/token', [ - - 'form_params' => [ - 'grant_type' => 'password', - 'client_id' => CLIENT_ID, - 'client_secret' => CLIENT_SECRET, - 'username' => $request->email, - 'password' => $request->password, - 'scope' => ''], - - 'exceptions' => false,]); - - $errorCode= $response->getStatusCode(); - if ($errorCode=='200') { - return json_decode((string) $response->getBody(), true); - } else { - return response()->json(['msg'=>'User credentials are invalid'], $errorCode); - } - } - - public function logout() - { - \Auth::guard('api')->user()->token()->revoke(); - \Auth::guard('api')->user()->token()->delete(); - return response()->json(['msg'=>'Token revoked'], 200); - } -} diff --git a/laravel/app/Http/Controllers/MemoryGameControllerAPI.php b/laravel/app/Http/Controllers/MemoryGameControllerAPI.php deleted file mode 100644 index 6ba9226..0000000 --- a/laravel/app/Http/Controllers/MemoryGameControllerAPI.php +++ /dev/null @@ -1,83 +0,0 @@ -get()); - } - - public function gamesStatus($status) - { - return GameResource::collection(Game::where('status', $status)->get()); - } - - public function getGame($id) - { - return new GameResource(Game::find($id)); - } - - public function store(Request $request) - { - $request->validate([ - 'player1' => 'required', - ]); - $game = new Game(); - $game->fill($request->all()); - // No matter what status and winner was defined on the client. - // When creating a game it will always assume "pending" status - // and winner will be null - $game->status = 'pending'; - $game->winner = null; - $game->save(); - return response()->json(new GameResource($game), 201); - } - - public function joinAndStart(Request $request, $id) - { - $player2 = $request->all()["player2"]; - $game = Game::findOrFail($id); - if (!(is_null($game->player2) || ($game->player2 == ""))) { - return response()->json(array('code'=> 409, 'message' => 'Cannot join a game that already has a second player'), 409); - } - if (is_null($game->status) || ($game->status != "pending")) { - return response()->json(array('code'=> 409, 'message' => 'Cannot join a game whose status is not "pending"'), 409); - } - $game->player2 = $player2; - $game->status = 'active'; - $game->save(); - return new GameResource($game); - } - - public function endgame($id, $winner) - { - $game = Game::findOrFail($id); - if (is_null($game->player1) || ($game->player1 == "")) { - return response()->json(array('code'=> 409, 'message' => 'Cannot end a game that has no first player'), 409); - } - if (is_null($game->player2) || ($game->player2 == "")) { - return response()->json(array('code'=> 409, 'message' => 'Cannot end a game that has no second player'), 409); - } - if (is_null($game->status) || ($game->status != "active")) { - return response()->json(array('code'=> 409, 'message' => 'Cannot end a game whose status is not "active"'), 409); - } - if (($winner != 0) && ($winner != 1) && ($winner != 2)) { - return response()->json(array('code'=> 409, 'message' => 'To end a game winner must be 0 (tie), 1 (player1) or 2 (player2)'), 409); - } - $game->winner = $winner; - $game->status = 'complete'; - $game->save(); - return new GameResource($game); - } -} diff --git a/laravel/database/seeds/UsersTableSeeder.php b/laravel/database/seeds/UsersTableSeeder.php deleted file mode 100644 index f2bdd01..0000000 --- a/laravel/database/seeds/UsersTableSeeder.php +++ /dev/null @@ -1,20 +0,0 @@ -create(); - - } - -} diff --git a/laravel/public/.DS_Store b/laravel/public/.DS_Store deleted file mode 100644 index 44676426cd2fd5655e9829256b938f806e55165b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeI1Uu+ab9LMK-EwF31bPGu9dBuZT3wnmO)HYRtqpd&%ZRJ{8{z$ubyV4DNyY+VO zuBDXRn?@z^K?RNR&x1z8gD-%8pEO3JCjM(e)Zl|L@yYmNMB|IU+1Ufy!kY>SJITy% zW`4i<_uJ3zWM&y-=+5h{jMX#7B#K3S_KXA!BWT(o$J#6z|8aBAEsraaBd zyWLuDA1@7P-gr954?2!@A+M!(n?`X|UD4y%o@Uxc&Tnk$2AS+1Hf`N0b~|}ncl~}+ zLLu`os;-=#ZcoHFZ0MXx#HTwuTN3g14IMKxvQ*d9y0LF8J9T*a$js5>Vm%1H39M$` z`c7P2oaGjJ#N|Zft@MOg-1p_h$v0Ff)zNL+`xVOrmCxGls9KxRtW4h0JY$PxrOd+y)z!F}oMTx7j%)I6_KbMOq{np& zR3m#`C+GF}osF2(zpzsCuCdFYPR)YROI^Dv-Q*Xy4! zY?{)i!Pq@Cr9E7?Mc4U+q{d|FY5&SrX8k%wXt5dlZ~+)n`Xz@ z3HB;G#m=y|*+=XPc9xxEzp&rf@9aGLll_GVs!)xks6joN(2TWMhc;}&W+c&v2Qh$$ zunYSzhBPwJk%fyq3Mit4$MFQ7#8Y?{FX3gpf;aIF-oyL&03YK^e1)&^4SvAS_!WPM z=|##A?<~(;NSr4byrBefaKjdP=JF87wr< z`ykbnxt?nrmae`BD#R4(`T768E8qWL{fUM%2t5#b;6L*KDtlAC-PHY+KGpoJ9j7=( vkq2&964Gx%$()M-Dqr|vNclLK@;1ppmV~4l3jg~>K)C;h`@c`#^_~0!l{x)B diff --git a/laravel/public/img/0.png b/laravel/public/img/0.png deleted file mode 100755 index 56bf6d6ffa4e67d9e42bcc4c505a9959c66632d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}c0*}aI z1_r((Aj~*bn@<`js9oY3QQ};bnpl#VpQjL#nVZVsR-|BPs^FJjreI`XV5DGZU}a!o zWn`(KZD43%@O4qrF`zc~5>H=O_RFmNJfhMy=Do9lLT#Qdjv*P&Z*LlMH7H0pB)+Ya zUAi%Hj!eRuZtvAN*Ivx6v2@GX^{cn; zWB+pa2H(D{naiUcen=WLq%oXjn8j$qoWXX1XMv=HF?NAl`|WlqSF*T>*02TLVwm>8 V+|D(EJsRjD22WQ%mvv4FO#q6SU4sAs diff --git a/laravel/public/img/1.png b/laravel/public/img/1.png deleted file mode 100755 index 2bd080b3d729708bebdc56fdd46dab95498b698c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4117 zcmV+w5bE!VP)WdKBJAT%INa(W;#FfcP9F)=zcIXW~lAS*C2FfeBUOilm*00(qQO+^RO z1rH1t6yCn_hyVZp32;bRa{vGe@Bjb`@Bu=sG?)MY00d`2O+f$vv5yPC zddPt!w6wILq$Jez1d`ChNgbsrA*QAz25Q$2Y=bRXwuEF`w)K8ktKHQ;W@o0q@0*n@ z`GK8~)cJ$)`8=!9?)Tl_y}$dr_pX4CuaB=wf3-ggm+>q-m*Q;YqkOpaWdy7|{w|)x z{dpU?h>rEJaD}3vFK?kq_u%jqpF{lj7C_7Q@x893{;*oT0ui+rr& zG7XryEOLn^G;ud$`TdPkV?bzF!MRsyjywNVHvP2aW@P1Jn{sVNhIV-Cr6PHct70Ox*|h^Va*TSad#DpE_Q+Q zIB!A`M$vGn!e|u=GuO(cFw)zJ#85wsbecx0(1SX{u`u68%2^XgKn%86;-6*9-`S?z z4t_r%7zqu(Jky?E3&4>E1c!R?M7DUj5{uE0uv;D=Xd_MG4=x%$bn*k7Y~BysyA0vl z`w*VL2zsPeQYI5WfuZgl$n^XavG4#iPvC;*G6DiX-tWU(9|?ewz?UP=%sLiqVaC=?n1bHHp*w+La<*)-=Uu&+43m7 z9^*sLrFg;TN8|O6qxUxkaB>r>x_hy~sJsbfVGW^>OU7L(7~gYXD|(JAs9wDv-e5Ip zWJAsF14iG1F}#zq+D)K-sJ=Py#%_hb;!ae}yA#>kmFRx!I&L-O=!`vCY(#{a+tAvP z>MO+^1kx4^vbG$=$OHmj_-cI#|I(c)Uav2_7gZ%LL_(TW8Uf(w_Mak+n^3;|8Iak~ ztfR08{sG5#Z^B3-2w(9Zz~zg=tF%J*oFJ9b2ox_w>Cy&hz8E8W6vtk_k~!o%tysK^ z{WXn6;sfA{ZC?0~<>0n$JK}>;5x_qyjo5He5$Jsd3pxhzpj~?tBBX54uQJh0$@vp| zUPngzB+8e4Q|i3O{BMl3eG~0_PGZLDS21r!J(b7tq%h{t8{dLkFGf$#JIHKbiy61P z0e5T~qBH*lL#@xBCWY-pcXX6F#vEAohl_!z7xaMA_oLmO{?6gtMN?=njlUiBP4$F| zD+oY^#vZ|<4kmj$FwkF#DRtkV@i}_J6=KENDB2z^-4s7HgvBdWs^dQwr#&c<@Nsx#mvwXT~J3}!jboSvGAT<{5?Hr z#gS-UgH*@gBX#^~y!nrpNzRIu8hDpXI*z`!H|05cWCpEq7qrw_;ucQ;Qv#(xfZmV# zkvI4}Zd-a5yDtbp6s_I?JT)4et45+Bg#3yWXB#GlyISF?`T|^TdIoNIvOh-0`+G2R z^(JnbCtY-m9)Ap`!Q|8eNRDJsHs=vW1#%6ye~&M8H_3z94{X2=`}9EOb>ZK`3CsD;z{BD6BGltp`yw_wzi1(NG4V z8jTpuR3TckLVDOt??--Q4?p0R5_;r78y0`+Zyb7akCColum>{f`OC-8GjqfAy5oIe ze<~$h13IpVFGNN2BGcL@?AST3Qs?zPi`J<)o-krdln5o0-J?_nGoP1bK5xh1_Ln=G zvo>0(mHX5?(yDhufp zAr>qRghaDtNr|+*SHk4$pl=@yW-p|vD4X>Ff~7ao5v^FVZUx*PpWJ(->sR#l2iW^R zY25Yoz2j&09(anLpqDK{A7&YGdf%3`FpZo9A&U%OM@j>*5<6H6JTy3jtm{4)DVEFD&%%hm!xlM>aA^%HXWt;( z<*_S0>PLU-Zmf7<6T;kII&AOPkWcqXeUcGi1lf7YT&kYVXxA`8i*bGHy?EsP4Vca6 z;~Sn8fwq6c!me&SU{@|c#FwY^QV=Pd!rM|Ecz`9nq(RUBfCnz7*MkVxtixa~gsuaR zA=thap;*wN8}lVp#h+{LfgW9o@)_64HFm{MY(~%fPco8T*}(|-|E0xc8mJqrM*zo*ikGFLbfX2rE-Pc94|>vtWMuw)^#ZE9Timtd8%ka^~z ze9m2{UhqfgZ}}y9T3Mmvhd55QA+zfR#7Z`zv`mA`KNWh(as*3ONHI9ReLW5K$$h2w zQPBTkV9|}vv63gWG|>;cG=euL+B>NiI`krL?e52B^RksnWknFNh`Ue~QSkm`5VlNc zM$=5PfPMnLiu>s01#o#B)tlUCS!iykl(H)5WtwTn=)a2z70zg4S(|+Kg$7TNq z@r6zL6rVL9J@-nK2ANuCMc~+X;5y1lE2CE{G0IiYXE{^RcynkMf^gdSF)+66g*p5d zas!(&;)=l&UIK4qA@uNUc!E>m_En&3-&e;q-low|D5;7mBP?iRTaNdIswG){i-=W; z6pm*8pJLf63S;L)<0k>=HSxKerOfvfPh-nKVRYHfrb2a`QRyriIUt@?0l6D$jTg$`v{|Lm!o7>A*XC}{AW3S2}&pqeQM_y=%YFIojS^H;(Qa?p63vW zC-J!E4JtwNB;rTnNb3Ovi_2IkqjLNci7a?O=B-II8hdV=<6uDj7h@%ryx?ia+ou6c zSOw$9E>XaW$_mNrcb*L$gYBz44}hLNe3|d9wAeWrRta*h1welXw3dCcZ_%Tg1miC% zhCdRKUJ@RYk(uC8i~%^)!{!-=o92Yind3u@*f%{YI#r-?3(!n+!zC=h`Z-8z>=fO|#jfN18ot5ivkdIyVPr<$MZD)-puLTwBLT6653pPHhq;2x zIK?U$CJa2=`(r>v6edZc7+|RX?KJ_khrDQJ2WyO^SARFjP`dB}&T&Zqta^vo0o*Ch z?Rx)*s9dxTT6Pp(Z_fFeut15t$@Vw5jQ3^8u`f4rIhcvVNOI;)oFbrOho$Xa0VwQ2 zfJ2CnnI{=18Z_=<+UGW23N1gICVZrnfICM7>YCxf?h8=dj}a}^dW|0 z=K?TZYo1$&r-zdGOU(r(NA49DL(+qtF``o!A$IvKh)u6YpmdJxLPY^n;k3QNO9D_X zXAlg5iAF4E5nLYG;X}yv?SRq08^+*!(hs7m4ib<*=zM7d0fpK2kM;vQ zS4_k3wKGwo`%zsK#WVl88Apcu{u*Dzw=M)=((~s(iy27^b$myCE{~PGM|?ikPaYPK z^MUi>V0jIq(^jK+#%%~!uYg9>Vm44o6J-LRJXJyf%5t;3X(MY`{Mkfis1>R1ZJe98 zBNg9+t?L%E4KG4zAc(0YrC7glBMZG3V!6OF=cRVO^@H9rYYD=QF=t zfq+ASfbPt>Dl;lta~&gd8!2}O^y1l!nki*fWrQZuO#sSr9yZ7~(^7G)?FjzD`aI@N ztw06UEanf$O8kwN8w`}70{3F*HwJL#_0m14N@%#5!cw2f<7Pf8ClDn_PKUU3F}sk9 zzHoqGK8Yf(XzlIr=watTih-&))0~KoM&u3eG~n)EtmOuz)08l-oK^`p6XWfc=4N~e z^Ui0>NBR?!xV}?IHdS!&S5Zfb3qaSnT=0cx2s?7nnQ&>&L4op_q}yGL&Swy*UM36R z*w-uv_U?o6_7d!3tM=+J;#;cFNCjJh2wo}4RmZhyX3lT9@D5g zYLw$FbCM&f^FE^Jc#!FKf%DZ`_aR$GZ#n0+UKzbPcj}+R^La?|M#@t zI)F3x|IrsQlU+(3)1ZFT!1eTcC|U%ih^iCg^0*5%&E=?EV-xF=f;ra@iGzH8lbI-L3rd<7fm>09hB?U0?y89t$^=@3nwnJI_ZM=J_?fLk+*z5lQq{-rb TVJaX;00000NkvXXu0mjf_+7tH diff --git a/laravel/public/img/10.png b/laravel/public/img/10.png deleted file mode 100755 index 40c7e946551a6e7b092844f5b0d255526d0f273b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4479 zcmV-_5rFQAP)WdKuQAUPmLWnv&QFfcM8F*Z6dF*-FdAS*C2FfftZS~&m!00(qQO+^RO z1rHJh4b+*W;Q#;t32;bRa{vGe@Bjb`@Bu=sG?)MY00d`2O+f$vv5yP_vwT1*3>v~(Dng`^G*4NV}Mo!E&jJ6{YH)BT8j zU82b_BH99SW`ZUYq});!R33dm$^F$fxplP@TOqUXU3 z9|7NIDIpX(ejG?9u)oBM+c$j~qwiaRGe1XQU*dzH#CwUK$>dm~7e?p_BvbaDf>zz#Kq!QXA}{XT`W5VYFAB&D zA4ma#K$@PRg(KtGw6z!`z5N*OpRgzZEe{S-$KxT_11sPz+62|R1hPU-8A+H~ijkqv z9j0O1XAZn2{F~&ifm-r;xZHD;VgH#CFi_kJ6He8mbxv*=5tVbY}*eKds7 zxUC%Rhg%VgGZ@r-7_t|E02Q2koz$8nM2WOAD7>C?sOB* zd#2EIZ4(VWNGc66NYjW!9neefws;_@B1sy#r}Iid7E*Q`a%LD(dYC~n2s1Tp1-6J6 z5#%C{L^#YR1BL#Ngn_n`Fj+?)^MvtdH~k2S%T_?FH@=656G{AaSvf2VeDoP$F$1TgHrEjm0tJP(61jOYOwUTZ_)I&N*DgV6xd*98 zKa5P&wxYSQfLbfOUh za=IT)H`L-(Yd^wtv+N+h7?>i92(f_MiC__+E0KAltXgH!xUN5fH(&ZXwq8g9Wzo}< zsKYGY8Ys!F(I?|rMxeUe2B<4(`0~kZHNc?mMtNlg(Wbar;v7{jWYsJ2!2G>1MnQp< z(7eMT-1QeX;PhjA7T1c!9*E)775;$pYu8?lS2rv{7r7W3w!I*ND?2rWmFs-)<@#{^ za2Hf(zLjO(uf@-&k1&`BXmLNol&yMy$GoDDP=5Z-K-iX*^=<~ zc?;OL2WUMC^o&^A0Vmv!9AuI+@0wlaGtB%wx3FSK$m}$|9ARn|%CZfSbLyci zTLn*WHPoEt?7MWvLSW~%Eo+}SKL*tEJaBkC95bV_q@+^;pVx<+8`k50o;`w3_SsFG zrV1q{5M+H=b5#{uTe`62no<_rII~j90xZjm!6uV7P(j04QX(3*i&s|jBI~JTq}D=O zLeM!?P<0nndPG$u?j@5t2Jh4Gdz8Kl1@U49LfFspJ9esfyr^a=qeqHhZ9zVMxv>JP z_ML^^Pw=|!iGbRJx=kA}I*^AGM@P}PF^|(qh(*e@Kw4mD?Q4qE$S4|8`U+%R)yS5t zWQD9|Cd+{)z^al3*aEF*c~$r~A*yA4m77vA_ocJY9+uCKBX?pl-n@bqmSo{~4gyQd z@srUZG!JGh1$3vdkjeW9f<;Tvada5r=@V5I8|kr%4Jg}d-C;F>4qc)sHh72QoCvU@lT~PWS<&sx2Dagf*Yb)_Il-B< z&2#*%qj%r64bH25c>ULB>`CsO3cSYN<64}Y7><7?*YDtX$o_^(_-UchLLZ`?W5^># z^4TlB`37*H-^IXbLPD#C;V6T{>4n>=z~j;&zN={hutuP^RW(hsL|9g4#uI=ASjcW` z_;E{v$d&hSW_=nJ_$~qy-$T6nS&Vfb#Y`A-Jc(^3%W>?fH_-mh7!d3Ja4q^LABFx^ zY0u#&@u}^cs6=jNG;S_0#DA_UMD4*bcsp#4$IJkV^L_BTH7meXEAW2HU(2epu&ior zmo>#G=U{*2fJ+`n5QpHG+TfRu!x`_!6uX{Db^&KY%-G|0RqkWVnJQjwknx!2Ld$Ir zq4UB)Y!$P!f9Ebxm)EX&0!Q|~f_+DOuzhnC;~`0j;MS&kJTx$ce;P_#1;#-aJNZ^& zRhj8W0G2odn5Il03$U~>DIuFlQlW#ve+mJ)9XSM@oX%o;iZR1l(@wBS)|rS~LT|2& z-a-YPl@dB61F3GNtQ6LhFZW;v`Y)b^#7dK?;rN~UEsq_Z00XNuY20Q zX6f0Hpn~2!1!rj9HYSGAB-_>*ntd=UIs?`pH>!L~JG+doM~QCi-P5R53(`g=mcS4T z%ZlP<$S-{aCl23-yr9QYKxV!#3V6}gT!lAZ=)!6xgF>wph2C6L6^x?XKa4y*gcz+E zW>uXg*Z~2SZON=hMt^~d-lZx!9VR+u1Bn?H33>uUc0{i9u0%s%HCC55U~T?d6nF{{ z%nR$XSAqcB_D;lwTt$BzwS zO=AU>NLt>w_3Ao&J#+vMjAY>&0ND58P^pfWYc;0REaEfd*eoeQe!H0x*J*XAan+!H zNgXOZm2hyxlvu=lt>6EKDcre zRMfwYvnRJBFMkH*<$f#Mc-%TFR}|wL#vpqYH=Dqiea_NrV1-m8=C;h*fb_8?;CSb~0df=3M>U@#nsPzr^$SAqLKed*PG0n_t=iGxh*B zZe-68gu~~?G8V7FH||3u_5*BdE@z+aMf<4`P92y)d8Pt6r8!t?EJd|eg(7zmTppK2 z1BHc409WQx>%1%kY$XT9{#<4T(^S?AS%a=R;o=zE7wy5#kA0HCg}d=EUca;g*Brq-!3XjhNx5sUX$Ll#) z2NnXh>w>%htVSyfuq<>eY6b&)DAS9+Ognm0o#;!S#7J}$r;bmtgEdp|<2HN;zrHwy z#M-q!jO$icqe)jotRFBt)mv}crpnqJ0U}2Ballth(#25O z**IB)bqvQx&>3k*XY@2WqNfOU_O~;jIcHh1l5E|hs|l1~X9+x3$p4o`Sy2{i>I?*Z z(sNJlRsRP2uQ`2rLA-Enex@EN=E~I#UU75=pAT+!sf8&6y)7PV4!k9C3xfGUOgJVm zB9EXy+mEs2m<@97knY@0Sw6%C$OhZGQ4Ta|4LN}%>Ppk7FE!AxL_$@u%4U#pLb?TW zgP+^5x%p=of_Hg8a5O!BFEWvTM)P)wdDJ>A3I-T_U3(E4+-~K03ncY{YwoS{Z%)vf z@kRn&Lm}V<+iPbE)dg{^EFtKk46n2cn?cd=N#ZzCoarle4Nw{6xw*j`*RS93;)S58 zm!-gg@kg=IeG`rx`2?=I%9~Wc;MwtpqIq*YR%(mii-X zOQNVQjH9-&8~HxjYNr|XR8$;Csw_YDRXH!kIvpGl!&2VGpk4k?Oq>6!45`thSh2hS zb#;~(6pm)A?&@!LJYEop+Zq#~zgNAY^0=We&UYy3<9xCC3$K$zRdmzAy zfk!7;YrItKy3rrjaBSRxa)e*Rg8}ZuBB{52> zbH5M3nx8ceCOR86b{|Na2D(ROoMPeTIE}VZ38^qkI43l=?zC)L9M{phu3-lB0Sl~4 zYeCX+6o>yHa!Gr>X9eb0(-Yr8Ch?^T^HqFet(crhAD0tRBgkPW2mMn{bd4$;E#{7` zMTQbxsAQVfR3y1usV%Lmws7n`h=aF@gDdkr6XJ>$sNCU1zJEVr18Zw?I0K;y5Nq>uYhg_6L1N5jH8C1{Zds2& z;fN+ID}$irgV=w^&<6qbgI7STbw90voOuwYSwVRnrfUb@{_NC;1^D-F{VzOXyY;bg R-G%@F002ovPDHLkV1gaXK63y7 diff --git a/laravel/public/img/11.png b/laravel/public/img/11.png deleted file mode 100755 index f6384455a91b3014e00d21538e985844de59376b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2492 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 JPDHLkV1h#yB4Ypm diff --git a/laravel/public/img/16.png b/laravel/public/img/16.png deleted file mode 100755 index 03a7647f203cb5706f1505b2f5d92fbcb78c1af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3447 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 Z{tKDuC=dqd)Aj%W002ovPDHLkV1m(KZXo~w diff --git a/laravel/public/img/17.png b/laravel/public/img/17.png deleted file mode 100755 index 77a8edb3f8f2bbf11be9a61418d9f4ec011c531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2959 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 diff --git a/laravel/public/img/18.png b/laravel/public/img/18.png deleted file mode 100755 index 93f1677c9b5dd12d1e10151ece89000265d56a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1669 zcmV;027394P)WdKBJATcx`Piu4_GB7YRATcvKGdVgjFd!>1F)%RSi?n6{000McNliru z(+Um?CnE9Tx6=Rs010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00rGi zL_t(|+U;1~ZxmG&|IN&H+x=h>TG|2)U@&R5i1H!4V2BcpikPS%sSo}ICVsr=zu*H2 z{2ML27=1Aqi26Vp)EGgql%!ymPq*9McDvh|`{B8B?|gJ!k}XV8l0C`Ey|XiW=l473 z+;h$ypd%gWNJl!-ktbNJBp0h~M7C1ELBX+?a||CI;*Hc*8vY ze(VI~OW4PjaK^K(q0}3%plinnfp$qf4O)Ts2?V3izjNl3DPJ#QdUBe0id&mFj&GmE zPmhfNfj=zj7#CXxv#H}p04Jq^#x)M!V`fgHs|b>E&nJBO$EzsaTc{5L9}JiA%}TM@ zD+a$0`@|x~tsUF5&PT_{1P*~A>sn-s6wMu4GG*)0wjx#c)w8y-8EqP6ztIEFU|@40 zQxq7#ydE#FDgoN8eO?`B__o0;-hB&}3K>c-P^m_#0_ix~u~wjVY%U`*zVmg88s4)7 z>-#d9TO1Qt@)%e>57;>A*%<0NdPIX)pqDX}8l(?4{Bil~f=es*9}2A(c5Q;~SOaAX zCsu`kN|luc#?o&d0@7V31ezqYto4B1B_6Q2{>zS$Ud#!M{g%V-#0k(I{2Yaho!U8~ zH)BhDLhlEuMyY|x*r-rSD*_!7*Vp|Nnc19U&)WDhQ38I2_3(bzu2G=j8ta=-2`nFk zQ%FKKsktXx+*9kRdo*s_ltoqGowLAGi4mw|aggd#K0`&yPlJA16cG{M+H~y+{W~{m zK>2DO^`8?hNcigrZ0_q;x4Y-F?Pa942vDNfi)@NogA5U1QLa~H{A)FGJyIhS5(r5M z{kyLsA`#95FHiFk0Vv)=)!yYIBG9Zd zQ0@~cWNp-4u`MwIv}Ui>-J`86^h=_AZX_Pd0q`)Kc$2mwBg1)0*T&xDJfPYa^#X2U z-xe(h7!pC)sC}Wpszy$EP5n1cA|6sAPKfJm(Pop=76E#7$*VQU1Lj3`tkT9k5PHE7 z@kw|Q_@J3Y8APT#&Xqb;QxIoC6zYsLV)YqSY`IQN#5V9T@9mAedUfUl|JnoEp;5?b_>ItG@f zi#onN13o@BD{JzC*D8zx>oXKf9;$VSti)IC;%b|KI)LYFOkA71rY-Jytx32s>&NGD zZ}6sYG8_KF3`fqw_#qEJCr&^~nhxNeD{fu-;fimu5O6biHy%c=-Ybl?2q6QW^xPCf zgW>)f7oV;K(~8f;S9@{b4##)>Lxs$ug1J952VPIoUSKgpk5^{OhY0{)Wf}?nkEPsQm&qwzO{D&*G{38=k zGD!z;m(H*iiLqSPvA5D;WT?N#Z;Abi9flM032{O@bD!Z)N|ohBh&&~Qf{RaH1@1m9 zhD1IsUZgYZyoE2S5{D^Ta;l$KEpgh>j&MC{4{8Dnu2gMQjePZOPT<5LhRH{LccLG6 zzo&9h$>E?Su%B>mAtw|}t3=#zlgM1`c5&`Kpqk`+JJOMkbfhC4d1B=s1g4dxMJQ@E P00000NkvXXu0mjf=ScX& diff --git a/laravel/public/img/19.png b/laravel/public/img/19.png deleted file mode 100755 index ca3fa181d5bba98024be4e406fb17cc87fedf89d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1487 zcmV;=1u*)FP)WdKBJATcx`Piu4_GB7YRATcvKGB-LkHXti7F)%RaR$$ct000McNliru z(+Um?925fS&2j($010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00k#W zL_t(|+U=NIY!p=($N#gJ*;}`FXbWwvwFRsgTBQaDP}#P--FA0pW_R}ZotfEoD>QVp?N&2i zax%MTXSV;}`L0{QGRrKp%reXV!zRr8&OL*lKoAm8+=uXS=~$+Pr_5%8^#xjQ!lPbC zbMOrukX@M;Zw`O~4;6dp384^5_#@Z?J@_#EB7HD_FJ>0NhME!&>MODUhf|>7TZ2&O zOSInl4j-_FVnJf00C>Cl}bAi4y|_NOrZ>qWE#PvTuxv3vo@)FhDSx1*ub zV?0fdyWN1t<$xUCj)`CT&=hzFO)Pi$0jK~u06_`ZUgx9t1341QUb{FI#5?GVpbLAAU*=iFW_D&L1g?03P*m#!P{FGGto^X zu}UGtpc2H*FtGD6?`$s!hDJLjOI{vOTqHoWKZ?n~H+ZZ6EE)rK83tfT(vm5ZVzlzJ z99UQ4gysd|9v~vMiIPB0D8uOT@CKLy)X^I z^qAveRaprX6^W37uOJ%e$F89!ygik*v;ZWChmdSQ{22wR3LL0d>6pU{Y2M&gK)JEL z23S#$jaaZ5cdlK~2>*rf!|XwvMl{t*gc?!2HYG>%BicvbJ!|rVYiA;?Sy5j6k;1frjYC#gQb! zvH(fdJ;Xyz(Uzb?(VrBNQ)s6ZUp?D0Us>~yKgP69 zobCbM*v4d_JX^qKnl%Ch5>r&jbdy9kDfC*3tJ+njn`N1%aU}tn_9SX3(TI!)t!Ow3 zH7fB|@1USCHwGM^*N+v!_orqMnYzvAEo#Ndhco^^QWLX~dWjOY8+PwO poPK5?)50yY%reU?v+RFie*xN>nDLq7BzXV;002ovPDHLkV1m<)mfrvX diff --git a/laravel/public/img/2.png b/laravel/public/img/2.png deleted file mode 100755 index 19dcd9f61964de8be1f191fa3c187720f2fee685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4080 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 iw}zL diff --git a/laravel/public/img/20.png b/laravel/public/img/20.png deleted file mode 100755 index 7b5de6610b840ec6cd3a36493293da031208db22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3159 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 diff --git a/laravel/public/img/22.png b/laravel/public/img/22.png deleted file mode 100755 index adf65837e9474636de30e39d0ca8326e0b37bd68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3486 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 M07*qoM6N<$f&;LYmjD0& diff --git a/laravel/public/img/23.png b/laravel/public/img/23.png deleted file mode 100755 index e0292eee1a28dc246dfd41fdfb68c0607d2fd954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3885 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 diff --git a/laravel/public/img/24.png b/laravel/public/img/24.png deleted file mode 100755 index a8b7bd4c08d58d761d5946184790b3f5b1db1cfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3085 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 diff --git a/laravel/public/img/26.png b/laravel/public/img/26.png deleted file mode 100755 index 2d999dfaa22893e97a03e6c8cbedde7638bcca4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3873 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 diff --git a/laravel/public/img/27.png b/laravel/public/img/27.png deleted file mode 100755 index f003b879e6c59e24c5534bdbd69f98cffc1b1d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3839 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 BAJhN< diff --git a/laravel/public/img/28.png b/laravel/public/img/28.png deleted file mode 100755 index 480da077c4e902e16f28d42a8ac128d9fe269971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3304 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 Ef^m;2j{pDw diff --git a/laravel/public/img/3.png b/laravel/public/img/3.png deleted file mode 100755 index a1ac6da7c95d06cbef3872304d92bee1a4516f32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3446 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

#!mVfZ_C?5LuC7?&J8xRZEVle zLC>E*H=)lz#44{n&*yN>0tS>e1h_qgZXlcm&}a#UUbE-4HQ5CK2vkrpe*AdZW>EG> zzh1q1sYp;`LP7!yln477MvR`OKmaUkQ5OLCzneF2E-ET2f!~@8Yq)&%BVKHpVTQWEfxO${`|<*4zzlRhB1OhZr{GW9MO)# z-uJRQ;B6Gr545(Fu2HA~U+&nkqvXt)Gd3RE_wv>+1?*ZWv$B_G9-*(|reEHNVkFRY zN^Qq=BMis|RqwA}y}Anb#zN=MxeLBl1oQ*_xCJu4h3dEdiTsb zckYY;W!ey|_H|kNWXK`~36#Z)#R>JJ>hR&irPw$7GJ&b}%o`YX6M6PMgNfd!ys_Zx zq)=T096f@HJQ!5@_Ta&T6)>h&GX{B7HNA%_nQ;CKB<2&V#@o~e*BbT547Uy70HuuB zUVa1K4!M2%_R*6kPs%ofoaYwMYJdq*h{0|u35NMnVrc-u!wHXJ(CQCuK!ZOmqQvu$ z5TBwg_&xai7f>pgbfV`89x|L{jf5W+j0(iY498LKN~NRW_Ln&%;w?z-KLOAWUhWU@ z^EL1o3R;h^AOJ1UZL)&R!ZoLjnLFcy{Cxmjs~_ajs6Q7T9^M%V{3(>F7~p^SIlwoK frqMM155|80JO0%G@o^OD00000NkvXXu0mjfJaYEl diff --git a/laravel/public/img/31.png b/laravel/public/img/31.png deleted file mode 100755 index 002e1749dfd4d073a6aa3413090794c4b716dd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4557 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 diff --git a/laravel/public/img/32.png b/laravel/public/img/32.png deleted file mode 100755 index e3f93b215e395f1f4acc858a25c06f606b047380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 zcmV-J3%vA+P)WdKBPAT}UPa(W;#FfcP9F*G_eGCD9fAS*C2FfdWLOYQ&w00(qQO+^RO z1rP`%F>a!)>Hq)$32;bRa{vGf5&!@T5&_cPe*6Fc00d`2O+f$vv5yPAPh1W+SXRH>x`61Av6rMC1?qJmVZ zQl&OXQ6f<;wM2p+MJ+T{RZ)Qi1X3r6v^e0@i3OoRY;*fsgTd=-y~j+SXY6nL?PPcD z&{S1b5Bm7#+HaoceV_N3vB<GEp+_&@tlf^ihRQ`0+wa@P16iSA`wX> z5|Ma39U&t;{*Mvp=;(O%$&)AF4Tr;D4hDmh zb8~Zf+VXfj5(orL&KO2cPLB9|J_A72Pi+lYJQj=DgM))+Z*Q-O_3W;$F8k4=M-D}3W4y6#+qMfJI4&|{5@>5{s~#8_IEV*-5!NzcNfRVII5zM=f|XIw&a8$y23a9l zNJ{7t4(Gv!q0crvXu-R3<;oR16bdzzmzV!&)22-y{#yh9egzgg3Cjj=-@fe~8XEGz z+Nof%AMghx$ItVA9INX-=bCrKGvfD~;=$7r3BpZ?WhIhiIFlgBU`@NBp~1R%@nU4k zlqp}^vSmx%QxRxwZ4JP+AI+IFr{ctk6JA=8vLGlwK>Blo79+M8tLrWvvzZH zb4OlYUL!nBoGtnJ`G4B5VMD!+)0>F^v)a%1~cOn%_Mu zJJ%k z|EdIM)JVy)UrS!;v*I=5^6=q9sjI6KWF`RylTw{Ld9uu#H_yIs;lkz{H*OH(xA>o# z#RDY(Z*jk>s!E=J;RP9PIWKJ=-IRniqCH#7FN{UV*qKM;GdZjMpx zw6(k|Z@zg}jvYHD$VP%J<-`X)fY4-fPC+@ zKRV;%#&@LUgSVxlwNW0mUzdT0_ar)m-$2SXtShmR*?`7PED^`>VAuo+a%Oa9bq zG4iWq!2Z1S8VjVoYf!>}YnB)mDl03K`}gllOG}H~yLZn(&Y5fpvxw&*}mE zumc4rlXsj!4?${9@dRftES@iMI~UfB;W#F-_z>o>b6<2gDzR8p5|D^tBWP{f z$VypL!@%R)NFtXYpB=0_losWLb2(#Wp;i>E#Hh**9XubRz$*gIK4%Oo!PJPXVsl^# z+j0VCWRZXUUI*0X29IG$`l}cK?c(Jj0^JX@NCM{3!$V@iw+qZY`-uA2nu!s-fyhvxI zqSbi@k()#&VD9})#PoaE{88&DUPf(gE%62K+_}TF$@a#EBHluG@NzQH(}4%mS~PM; z5eL<%eqLB5d0%&TcS_*tK+};?MCpE#=g{}{bJTu8L4lM1m7%x>;{panhBaQld-v{7 zPM$nDtnhpy3!#DfdS_?nZx=3Hn1gQ6>&`%YkUJY?BcUqkSl;5gQ>RXqo}M0=F=K|X zSn)bL+ta5{+sHmg4j(@Jk{hqb4IUPLWBKyse)J$YI(RO|{7WsS)3p1X0Rm+ww`}^g~mzx!?WDuh`ypE|`Nc*9|jzzp-}hTBg-sZQZ)nmqGxH zmVxOCXfW#=8eS+I3n|U&mR1kagK{hqYz^2dvp^xUqy?|X2n=YHmX^)|;q@s5P$ZrM zdqc+Yj!gIBC4-gP@rELzK&uR+_T3UvS%tv)*#&8lJ-<`HbPu{)3?->%0I*ez~b2OHry(uXIt-L^sj>il7K7$+e!g=MR9M}dB z9B17NdXPi14iReJZSi!^akLI&p$Afh^nOYV6crV{g>tQbfXXT#{Q(5PEQ0*(q*;Pz z4yUd;RDMVHaIT{ra9Ra@4L4Z#redbCvC&x{>-{Cg1FKf8djHg^QX~3)OKwxNloi7QL6(yrI&SQFlk|7up;Q4eU^uhDIpI;#`Y|0W|-LY@q zzGRD^Li_yr^FIiMLa(h~zdnv17P*0EN^knBpn5Q>rsHzHe5g%1+;<0nVH(LJr zNid52FaUPLGacCHpO%>KydUiaX^gC68=15&Y$9z9Bne(Jw} hO>7g}#P)x%{S)C~1q4c^oe%&3002ovPDHLkV1g-`ZRY?0 diff --git a/laravel/public/img/33.png b/laravel/public/img/33.png deleted file mode 100755 index f47c1228f25f3c2a63914736fcb3fdc2d94b6774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3152 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%0Diwz%scyRrk07xG@ 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 FV1g^rg)smC diff --git a/laravel/public/img/36.png b/laravel/public/img/36.png deleted file mode 100755 index db63f00cabe6dbe4a6681c66e26a309f9d122d79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2490 zcmV;r2}SmaP)WdKHUATc%|O<`#uGB7YRATcsJF)=zbG9W83F)%Pk>xffdeS}yVXJ2Q2Ypvh9%zOp- z|M+(g5nMg^P6o3VKMX=W1PT`QQ%R4WyS2M;@l4q=9|>U^9c5X9Qp%hUio%>LeUI)J z)jhm6?+ga|T)(6EwLQo8j&HSk&m7u&0{VS`LfR_im&3%wgn3;`30anzXE-SdWWZNon;Hs~x`*Gj z+im#pv+whZru&!LF*7|^4xLW1|Kv(>Td`W+0r0`Y0CyCj0CQhF4((t* zu_W|Xe=`_l-h#26=flDUv*NdJjz6LwM*@^;QFJ;QytIQ<)UnM2=RmRbdObLH>{!wg z+)q+gnwgn_(a}+33I4tj$mlPF?PG`abszGvSs0yLfQc#XhW+A_x(^^V5TLS}C*XD< zt<_3PDPW2{Yr5YgOzK@c!jiNPkrjlC6#PI9 z?%%&Z0GOf;rw{QyWi|6X`h# zV1^wjzdSZqiDCl4*`25^0o2r*jp6gotU$Gj#8*Wl`y$#s0GMu^pCSZ845st(9zj@d3m|2VTN-)KCm#vC=?6e=)9XJ(vmdU|?jc@gIhP9g3W^sKUKZUwhs94Y`=fJ?yF2lOl`eSrapv>$_)Dd2I! zO8bE+DrtF`62J_ucum7>!5x@{iPsGO0K8QvxcBN-h$scjB1sD2>bEzao6yAY-|kX=jY+>2OopED=vu=owv+o=gq^9f2=tfq#9}g zwxHzY1Q|je@rSH=Rvq7d$Sg%w{|Qeee`8b>WZd*o7AwR+Rr$)4EvrO|S$)iRpq z4J|@FKBqj==pSy5bMXNw>hYhs0iGau+KM2(OJ&R2hPgB310z zqFI1y=S!4c0ujh!CPTjCjjcE$Ok^r1G1RkkKYvK^R_W`I`#`2<90@S@;

Cgnc|86o(JO8QADSs`^0JO@rz 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 diff --git a/laravel/public/img/38.png b/laravel/public/img/38.png deleted file mode 100755 index a42d8430f9bdd447fa0ef1ee7225583fcb0164e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 zcmV;r3q|yaP)WdKcYATc!{L3L*!GB7YTATcpIGch_bG$1Q5F)%RM{uz1z000McNliru z(+CF<1p^F2+u;BJ010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E01FaH zL_t(|+U;3eY*fb?{?6XlX4h-*+87%Q*e(!5>Oin*O+XD&8d6Xbsc}=O%|oRoQPU<$ zmA6V&AEG=(Ri&sDHEq~rGg=|@xU8|SFA8SCYe@CAqGDpAvqhGIBd{*9~FK_9YNzV*D`P^@p zE-CCB1LIgorcd=DD2*r8V zKiPPM`lO%KbNLcKn!`Rc2L#&JcOu@uqjN4XdF;E-@9X*O0LV8A&!^pHJ_y5lw-mUr zbLE&2^jV0r1jxHJk!Ok%h>m;jLCcO^ZK>JBU%&m#uU3C10Me_APqW3sAPnIJFj^uW znj0IRLg%VD+9MvcMFUttb$K+176P++<9f6|^vKG5E^+LM=k{&5)3d#dkHu-vcF`L zl14Em?_h053pTE6$N0?|B&KGOP0YYIH-kuK3N7|DqBk!AS1(co&&RXL>7j2u{mRZ7 zBp|9J8nqW@%hvn4(Z9J{=1F-70!$wOKodT-HWDpU3!Q3P=7q+Auskx}TOU zs7@6D$Yjh}1ZvBNNS*9lp0*bn=4IhxPed8G3`Y~6Y<-W?fTU+EK- z{mi0qUo3z_6lR2(r|!nr#Ya!4Pt*{rO&Tn@Hv z!_F%adN^nD`QZ-)s0LMv;=*D8$_!ShT*X80aPAZc_^W=mvI=o3aR&sfr<0SDn4X@- z`1rU~fdCOH8A^Qy#b7d-4CdzMFgrUd0X8+ov9zfPZS5-&X=p?#r<6oERtPPtYE)E~ z03SkRhVNYfo51bcw{iLMWl1OlsjshB8c=NB#OHF2<13I zWKy%p&D}(D!bX_JV#`(`yd813cr4=nLE$Hj(!@+|Gap=uIku+8zwsaX*tzJuM zc#$j>11r1qsuHkJJXx9JBm-d%u357NZ=X7aSYs0=uZ-gT(IF(SpMgC)j$ja|r-MzH zm|v$`!iV_k^;p)q2eEZeBN*uXr~iyMUwRQ2jvm4k*@5&XWCq@VYJEY~as*D@I*(gtUctpb zbmPXzFL37UFy46M4N3fp6)P|>Fo5o^PMkdc4;6<#MX4Id_%Cm`&nl!ru+DR7h(_?k zmtMzHKih{7PrrqUtLKoM`WSYK4BD9`7nn!5E`(5B82&JcAlQtw)sD&BN}L^@Kqmb* z8X6jK;J^Wd$OayL^ij07w&GtWPolSPXW_HelCnG4fa@?WN;gTT)AFNolRyX?w(X`R zyTL9ylOcCXHI>c~k!fissdNg-#5CrTv-F%Gwa$XQsh9kGTD~)fiHQj%VS3+aP2o1< zZUI97(O-2wdH2)M5h;OA)(&U?(y;tN7hoR7iRO?Rtc^-W(A! z^6nWlH#bv~b$LPI@MNDAxj#sNhj8H zt;6~A7fJ${n}bFzI6AXOVU^;;4p&yaItqR)6?UIYEEBCxYU(U}{P=NPyLJt`9^Qjc zxL$qV#Q$2-Y0HuhSb?BtJ`Qf#HXym%+uJK8;l499Aei$!*5BVR^Zk!L`bY*TKKwAj ztm6!XE9X)S@WO=)n4XzI-@p#^ZvCo^zd~mMOh>iLh01}93@7gtGf=Me(HI`s^)ODI zIEImt5p3DAMdtII$1riM?_9VwcG1z%Au9vqfOY=-d1=^e(3dV+l>5xHmbo&~5G7jMAAAV^x%LUA#3ML-_^|Zne8OsMY?P|PU`&$7 z9*8{?+rkWSnNM*yZ{Cz{*5?o4D?4{#bN_&hCxzruOIE6GB`Nh``pB z9kM2-r!aQyD#pjIF3qkL1XEZ!v%nvYN*dt~rD6h; zG)^Yc(t*ZYVXL1t^{+X~21G5%9Q044$&4+}1_fXXz3LVmU&i>u2nE6gJ?1xTdazS= z;Sx(oFXQMw2P|4=xXw2njshuv%5`dy04+)p@rk5ec1^y}%jMui@qgKz(1T{KbJsX#fBK diff --git a/laravel/public/img/39.png b/laravel/public/img/39.png deleted file mode 100755 index 0f6b4818e6fd496d5ea9dc1e690077de857e0afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3141 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 M07*qoM6N<$f?yv}i~s-t diff --git a/laravel/public/img/40.png b/laravel/public/img/40.png deleted file mode 100755 index 3084a376a43e1d9267c5e3916bd3565cb6e5ad00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4185 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 diff --git a/laravel/public/img/41.png b/laravel/public/img/41.png deleted file mode 100755 index 90b6204bd0909d466973eac8f3c66882d2e77c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3239 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 Z{sR{o#Fr$$i7NmA002ovPDHLkV1lIE1D*f? diff --git a/laravel/public/img/5.png b/laravel/public/img/5.png deleted file mode 100755 index f9b7a318e6a24219e654737e9d71aad0af6a5eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3324 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 LNkvXXu0mjfE-w~i diff --git a/laravel/public/img/7.png b/laravel/public/img/7.png deleted file mode 100755 index 50ea7a967f40a3213a3d79cd771aeb465c142a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3018 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%0DYbqMqGh0024rc9Ne`WOY(yQ zRD19ru;;EvCnKO;JZji_4uhTFKsco4+?2dGf|83hj@tv3$t*dN#$ZJadW8>XdfYJM zL9`|#=rN+`aaSQN6W(M%t_AdDnlKCnsl;m3f47A9ckI8i2IScA@=xKmzK-R~om8)K z#*Gpy=Nvr8-bTMLSc?XnL}W2Rr7e?&rCeXolO0RH8BH;6N4Mg&JAQIm7`-@3z8_*Z zF^UTpfNYkImt%6%(E&e(<}X7&E08g$9o94n+fxQV9tOv&&Z*3+-8=ERJeHBl>sFEJ zdjhxZx&O)pUcaRay7w`hIYWodI5VFsVt_#-8Dd#LhxLsNKvR?}1GyF=*YZ7$*6uNM z6neH}?VgR36Of}b_XP5VGdO$JsU&3slA_}dWU0ye2Ke%6c#7F_l$mUEA*K#+vcFvt zoj4236-f$nkO^c&?#nJ5xbbo)9v_3xTA2Nq zk8g52zM6ec=BN_^=LtA1RZg%88IJR4nqI<&n}BcMuAh7Poxm&{y!)avU-`}4@~2-! z&~+D9tSGmHfdEXe8#O${-o1=QCNu6NBtFS0Kb{MubIP7Ume_f&1q+(j#-g~5rntb8 zI$%~zqxEPIiiS`qyyLcYcYN*gL^j#5J%5S*o^?#?L|x-JQl3@jpl%?tkfrw9&B)5o ziK|F@9P~Kg0%wj=&J`WNroTi9TWG2&Vew3X>0!#0b(93Ga4m7QX(+m;Lo>XsABTBm z0!KHW!OcH=60NO|lDaG>X>dA{e5g4s1|t@QF))ZiFmic@y%^PK<2fnaVp+;18~#8E zjWu~RRu?I03snIHLK`dhR1F0QmU~F4%c<-7#ntck4^Ewc9PaRANO#?j4?c)v&Kwd@ zooF!Z@*}!rDLgN|f&#-WT&^;3DcwAQX2&Ey&r?O3@&k$yli01T;S(13X54HOb-M{*8e zMwLom5(}bPG)6O+PtZPwZ$&8sR#eTIlYtzcE($}XxsI>n_jpVlyWbi)|M<4-dc3>2 zZR!MYuZCqC_9IfU8VwC)0xU1^!b|WLE+AOrN0l#+ITZ=akL1``nY`?W#xg__Q`JwF z?l@?Lk#6EOl_j`F0;Y?RkD8Z)Xlcvi-XEUsKt=UN9NzNo6bW#w`Q=KayAPnLQFk1= z^)!q6lUN;o3GrA3qiqcgw-;`&4{nn4u>>(q^P&VNN_HYh33`0h2vPzzxVjCEeT{;G zt)XSejY9(-931fBe3lk)oW1#l&OWFtJdZqhLZ1?Wx4wJ`%YL>4ZEY;}!a#37bkT*H zNnVquslCKgcP&rVW`II&_i#a zue$|p-_Bh<3SFXwP2E_r<1rHWJDHhvjnXp=2cR4_BaQ@W(UHfGrGz!bhT)M$_2K7{-b>O>s&u!dhm@_qH*#jWgrf^g{?W3&f0 z%k1_<5N&k2)-JY|Lt{J0Jf&hn>8KQ-dQWiON9TDRiq(um4~$$hmQO{%A@TIDkR9CA z=sSQ|G=$##474XJ*)khrKt=h<%2-xbv?8O%DJFw`j#*^1gE)E5;HTRAx)50Q+yaJ$ z<4Co+ksDy!7i4aTF(WfaIIp6$5;V_yj&y~!55l`2?|ilIdH}vY1msxt+*Xu^e*`PV zG%HICmXW%9Cv5EnI>MWH`<|}<3BcEnfJ5T>^$Z)|fc)tj?j30U%4?qm=+DRJNS%G}c0*}aI z1_r((Aj~*bn@<`js9oY3QQ};bnpl#VpQjL#nVZVsR-|BPs^FJjreI`XV5DGZU}a!o zWn`(KZD43%@O4qrF`zc~5>H=O_RFmNJfhMy=Do9lLS>#Vjv*P&Z*OhnJ)pqD;HX}_ z(e|FU;-p{|ZkuWUq+&h^g%reio0MI<752N~yx^%bv%Z-fTaj7G6jyw1*0-%9?^KvOpIwc)I$ztaD0e F0szhsSr`BS diff --git a/laravel/public/js/tictactoe.js b/laravel/public/js/tictactoe.js deleted file mode 100644 index 94a9f18..0000000 --- a/laravel/public/js/tictactoe.js +++ /dev/null @@ -1,83 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 74); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ 74: -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(75); - - -/***/ }), - -/***/ 75: -/***/ (function(module, exports) { - -throw new Error("Module build failed: Error: ENOENT: no such file or directory, open '/home/vagrant/projeto/resources/assets/js/tictactoe.js'\n at Error (native)"); - -/***/ }) - -/******/ }); \ No newline at end of file diff --git a/laravel/public/mix-manifest.json b/laravel/public/mix-manifest.json deleted file mode 100644 index ab65923..0000000 --- a/laravel/public/mix-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "/js/vueapp.js": "/js/vueapp.js" -} \ No newline at end of file diff --git a/laravel/resources/assets/js/components/lobby.vue b/laravel/resources/assets/js/components/lobby.vue deleted file mode 100644 index e69de29..0000000 diff --git a/laravel/resources/assets/js/components/memoryGame.vue b/laravel/resources/assets/js/components/memoryGame.vue deleted file mode 100644 index 590aa4b..0000000 --- a/laravel/resources/assets/js/components/memoryGame.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - - - diff --git a/laravel/resources/assets/js/components/multiplayerMode.vue b/laravel/resources/assets/js/components/multiplayerMode.vue deleted file mode 100644 index e69de29..0000000 diff --git a/laravel/resources/assets/js/vueapp.js b/laravel/resources/assets/js/vueapp.js deleted file mode 100644 index 2c4e9d9..0000000 --- a/laravel/resources/assets/js/vueapp.js +++ /dev/null @@ -1,43 +0,0 @@ -/*jshint esversion: 6 */ - -/** - * First we will load all of this project's JavaScript dependencies which - * includes Vue and other libraries. It is a great starting point when - * building robust, powerful web applications using Vue and Laravel. - */ - -require('./bootstrap'); - -window.Vue = require('vue'); - -import VueRouter from 'vue-router'; -Vue.use(VueRouter); - -const user = Vue.component('user', require('./components/user.vue')); -const department = Vue.component('department', require('./components/departmentList.vue')); - -const singleplayerMode = Vue.component('singleplayerMode', require('./components/singleplayerMode.vue')); -//const multiplayerMode = Vue.component('multiplayerMode', require('./components/multiplayerMode.vue')); - -const routes = [ - { path: '/', redirect: '/users' }, - { path: '/users', component: user }, - { path: '/departments', component: department }, - - { path: '/singleplayerMode', component: singleplayerMode }, - //{ path: '/multiplayerMode', component: multiplayerMode } - -]; - -const router = new VueRouter({ - routes:routes -}); - -const app = new Vue({ - router, - data:{ - player1:undefined, - player2: undefined, - departments: [], - } -}).$mount('#app'); diff --git a/laravel/app/.DS_Store b/laravel_server/.DS_Store similarity index 55% rename from laravel/app/.DS_Store rename to laravel_server/.DS_Store index 52d9110ff225ea718c942a20558a71467705671c..7b48f20f932cdce1eb60f10f27b775b213d470b5 100644 GIT binary patch literal 10244 zcmeHMO>Epm6n>MW8@ow~lO{Axh2&&afs_bk+ft=MRhMlLLC^ON_8_#?5e!f{h z`#AtWN)5XJpaXz{ol$KNhm6Mftar4YWaSc4g8QLRwrH*1Atx6k0ulj}Tl8@FhbkbHiwM z_7~FA+jlD0uPDlZaz?pZ-lW^*$cP$Y$p~)qE7x|+WWG$PcQiN571!CWXrni&9~rLi z1cLaTH(cMQ+a=oY?U3tPGNMh~tE#G^Rl(0YZ6yJdZ<_)CrfJQP)zbrmXPy|+ zhDXj0j}DJLId*P*?EJ)qiHdgCG^~5ofH{AYdNe3`4d-?>aP4y4uw1{o8aeMoWp~%9 zXd`W+w;cPe*3$A$9c4ya3tZhxf#djG-{Qtb=tQd(Z78$?>Um2vbR(DgYXW!ePKbxH z5IMC4e}kgMErfls&cwnMCkT;t>|b3og23>rPHE?^XPAz+=$B{|(b}qOQ9t&4h^xiR zrNCh-^Edd<86aPLCB`>jd?ub~kZ&TMFMj!u&lQa<`$o-C^Tnl@sp73L4KKi}umbmB z7e0hf;VbwWet=)$4>%tBwZKTcM-?WUjpj_dELSGfKDQC7SSPd|IS-mP-rd(^L@6pJ^9S*(Gn!^8At ziLt=++ZWsUg8!4oN8CM|j&wh_z zK?J^NduoKajrgbdE$dl)(SFYtb*?}T5&?;TL_i{NauDc^L)F>${};Re|NrCwA|sUu zoInIf-+Xz#gn>7!=XMNwa6!kuj-53ocMwy)1qUX=*7@gnykMW>dF_vDvy8_Y&Wi~> mh$*gM`|tl5kov48zHiI=zg0VAeIF2O2U-7PvHX9n|NjPt_Z|QM delta 134 zcmZn(XfcprU|?W$DortDU=RQ@Ie-{MGpJ5X6gFc7GFTWq7)pS!Af-4tCn-Na2P6mt zOc06z#06pj2Dtpj#AW<~%n)e-ZXoRn#Ht$;zcWwfS5ahSoNTIM#0s*PVRJms9A*GK C5EUW- diff --git a/laravel/.env.example b/laravel_server/.env.example similarity index 100% rename from laravel/.env.example rename to laravel_server/.env.example diff --git a/laravel/.gitattributes b/laravel_server/.gitattributes similarity index 100% rename from laravel/.gitattributes rename to laravel_server/.gitattributes diff --git a/laravel/.gitignore b/laravel_server/.gitignore similarity index 100% rename from laravel/.gitignore rename to laravel_server/.gitignore diff --git a/laravel/app/Console/Kernel.php b/laravel_server/app/Console/Kernel.php similarity index 100% rename from laravel/app/Console/Kernel.php rename to laravel_server/app/Console/Kernel.php diff --git a/laravel/app/Department.php b/laravel_server/app/Department.php similarity index 100% rename from laravel/app/Department.php rename to laravel_server/app/Department.php diff --git a/laravel/app/Exceptions/Handler.php b/laravel_server/app/Exceptions/Handler.php similarity index 100% rename from laravel/app/Exceptions/Handler.php rename to laravel_server/app/Exceptions/Handler.php diff --git a/laravel_server/app/Game.php b/laravel_server/app/Game.php new file mode 100644 index 0000000..97f0b21 --- /dev/null +++ b/laravel_server/app/Game.php @@ -0,0 +1,33 @@ +winner == 1) { + return $this->player1; + } else if ($this->winner == 2) { + return $this->player2; + } else if (is_null($this->winner)) { + return ''; + } else if ($this->winner == 0) { + return 'tie'; + } + return "Unknown Winner"; + } +} diff --git a/laravel/app/Http/Controllers/Auth/ForgotPasswordController.php b/laravel_server/app/Http/Controllers/Auth/ForgotPasswordController.php similarity index 100% rename from laravel/app/Http/Controllers/Auth/ForgotPasswordController.php rename to laravel_server/app/Http/Controllers/Auth/ForgotPasswordController.php diff --git a/laravel/app/Http/Controllers/Auth/LoginController.php b/laravel_server/app/Http/Controllers/Auth/LoginController.php similarity index 100% rename from laravel/app/Http/Controllers/Auth/LoginController.php rename to laravel_server/app/Http/Controllers/Auth/LoginController.php diff --git a/laravel/app/Http/Controllers/Auth/RegisterController.php b/laravel_server/app/Http/Controllers/Auth/RegisterController.php similarity index 100% rename from laravel/app/Http/Controllers/Auth/RegisterController.php rename to laravel_server/app/Http/Controllers/Auth/RegisterController.php diff --git a/laravel/app/Http/Controllers/Auth/ResetPasswordController.php b/laravel_server/app/Http/Controllers/Auth/ResetPasswordController.php similarity index 100% rename from laravel/app/Http/Controllers/Auth/ResetPasswordController.php rename to laravel_server/app/Http/Controllers/Auth/ResetPasswordController.php diff --git a/laravel/app/Http/Controllers/Controller.php b/laravel_server/app/Http/Controllers/Controller.php similarity index 100% rename from laravel/app/Http/Controllers/Controller.php rename to laravel_server/app/Http/Controllers/Controller.php diff --git a/laravel/app/Http/Controllers/DepartmentControllerAPI.php b/laravel_server/app/Http/Controllers/DepartmentControllerAPI.php similarity index 99% rename from laravel/app/Http/Controllers/DepartmentControllerAPI.php rename to laravel_server/app/Http/Controllers/DepartmentControllerAPI.php index 9e3a40d..4b35798 100644 --- a/laravel/app/Http/Controllers/DepartmentControllerAPI.php +++ b/laravel_server/app/Http/Controllers/DepartmentControllerAPI.php @@ -2,9 +2,8 @@ namespace App\Http\Controllers; -use App\Http\Resources\Department as DepartmentResource; - use Illuminate\Http\Request; +use App\Http\Resources\Department as DepartmentResource; use App\Department; class DepartmentControllerAPI extends Controller diff --git a/laravel_server/app/Http/Controllers/GameControllerAPI.php b/laravel_server/app/Http/Controllers/GameControllerAPI.php new file mode 100644 index 0000000..b88ffb3 --- /dev/null +++ b/laravel_server/app/Http/Controllers/GameControllerAPI.php @@ -0,0 +1,83 @@ +get()); + } + + public function gamesStatus($status) + { + return GameResource::collection(Game::where('status', $status)->get()); + } + + public function getGame($id) + { + return new GameResource(Game::find($id)); + } + + public function store(Request $request) + { + $request->validate([ + 'player1' => 'required', + ]); + $game = new Game(); + $game->fill($request->all()); + // No matter what status and winner was defined on the client. + // When creating a game it will always assume "pending" status + // and winner will be null + $game->status = 'pending'; + $game->winner = null; + $game->save(); + return response()->json(new GameResource($game), 201); + } + + public function joinAndStart(Request $request, $id) + { + $player2 = $request->all()["player2"]; + $game = Game::findOrFail($id); + if (!(is_null($game->player2) || ($game->player2 == ""))) { + return response()->json(array('code'=> 409, 'message' => 'Cannot join a game that already has a second player'), 409); + } + if (is_null($game->status) || ($game->status != "pending")) { + return response()->json(array('code'=> 409, 'message' => 'Cannot join a game whose status is not "pending"'), 409); + } + $game->player2 = $player2; + $game->status = 'active'; + $game->save(); + return new GameResource($game); + } + + public function endgame($id, $winner) + { + $game = Game::findOrFail($id); + if (is_null($game->player1) || ($game->player1 == "")) { + return response()->json(array('code'=> 409, 'message' => 'Cannot end a game that has no first player'), 409); + } + if (is_null($game->player2) || ($game->player2 == "")) { + return response()->json(array('code'=> 409, 'message' => 'Cannot end a game that has no second player'), 409); + } + if (is_null($game->status) || ($game->status != "active")) { + return response()->json(array('code'=> 409, 'message' => 'Cannot end a game whose status is not "active"'), 409); + } + if (($winner != 0) && ($winner != 1) && ($winner != 2)) { + return response()->json(array('code'=> 409, 'message' => 'To end a game winner must be 0 (tie), 1 (player1) or 2 (player2)'), 409); + } + $game->winner = $winner; + $game->status = 'complete'; + $game->save(); + return new GameResource($game); + } +} diff --git a/laravel_server/app/Http/Controllers/LoginControllerAPI.php b/laravel_server/app/Http/Controllers/LoginControllerAPI.php new file mode 100644 index 0000000..1a4a1f4 --- /dev/null +++ b/laravel_server/app/Http/Controllers/LoginControllerAPI.php @@ -0,0 +1,43 @@ +post(YOUR_SERVER_URL.'/oauth/token', [ + 'form_params' => [ + 'grant_type' => 'password', + 'client_id' => CLIENT_ID, + 'client_secret' => CLIENT_SECRET, + 'username' => $request->email, + 'password' => $request->password, + 'scope' => '' + ], + 'exceptions' => false, + ]); + $errorCode= $response->getStatusCode(); + if ($errorCode=='200') { + return json_decode((string) $response->getBody(), true); + } else { + return response()->json(['msg'=>'User credentials are invalid'], $errorCode); + } + } + + public function logout() + { + \Auth::guard('api')->user()->token()->revoke(); + \Auth::guard('api')->user()->token()->delete(); + return response()->json(['msg'=>'Token revoked'], 200); + } + +} diff --git a/laravel/app/Http/Controllers/UserControllerAPI.php b/laravel_server/app/Http/Controllers/UserControllerAPI.php similarity index 97% rename from laravel/app/Http/Controllers/UserControllerAPI.php rename to laravel_server/app/Http/Controllers/UserControllerAPI.php index 4f3f7e9..b6f77b9 100644 --- a/laravel/app/Http/Controllers/UserControllerAPI.php +++ b/laravel_server/app/Http/Controllers/UserControllerAPI.php @@ -33,7 +33,7 @@ class UserControllerAPI extends Controller $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users,email', - 'age' => 'integer|between:18,75', + 'username' => 'required|unique:email', 'password' => 'min:3' ]); $user = new User(); diff --git a/laravel/app/Http/Controllers/VueController.php b/laravel_server/app/Http/Controllers/VueController.php similarity index 99% rename from laravel/app/Http/Controllers/VueController.php rename to laravel_server/app/Http/Controllers/VueController.php index 18c1a4a..41da77e 100644 --- a/laravel/app/Http/Controllers/VueController.php +++ b/laravel_server/app/Http/Controllers/VueController.php @@ -8,5 +8,4 @@ class VueController extends Controller { return view('vue.index'); } - } diff --git a/laravel/app/Http/Kernel.php b/laravel_server/app/Http/Kernel.php similarity index 100% rename from laravel/app/Http/Kernel.php rename to laravel_server/app/Http/Kernel.php diff --git a/laravel/app/Http/Middleware/EncryptCookies.php b/laravel_server/app/Http/Middleware/EncryptCookies.php similarity index 100% rename from laravel/app/Http/Middleware/EncryptCookies.php rename to laravel_server/app/Http/Middleware/EncryptCookies.php diff --git a/laravel/app/Http/Middleware/RedirectIfAuthenticated.php b/laravel_server/app/Http/Middleware/RedirectIfAuthenticated.php similarity index 100% rename from laravel/app/Http/Middleware/RedirectIfAuthenticated.php rename to laravel_server/app/Http/Middleware/RedirectIfAuthenticated.php diff --git a/laravel/app/Http/Middleware/TrimStrings.php b/laravel_server/app/Http/Middleware/TrimStrings.php similarity index 100% rename from laravel/app/Http/Middleware/TrimStrings.php rename to laravel_server/app/Http/Middleware/TrimStrings.php diff --git a/laravel/app/Http/Middleware/TrustProxies.php b/laravel_server/app/Http/Middleware/TrustProxies.php similarity index 100% rename from laravel/app/Http/Middleware/TrustProxies.php rename to laravel_server/app/Http/Middleware/TrustProxies.php diff --git a/laravel/app/Http/Middleware/VerifyCsrfToken.php b/laravel_server/app/Http/Middleware/VerifyCsrfToken.php similarity index 100% rename from laravel/app/Http/Middleware/VerifyCsrfToken.php rename to laravel_server/app/Http/Middleware/VerifyCsrfToken.php diff --git a/laravel/app/Http/Requests/StoreDepartmentRequest.php b/laravel_server/app/Http/Requests/StoreDepartmentRequest.php similarity index 100% rename from laravel/app/Http/Requests/StoreDepartmentRequest.php rename to laravel_server/app/Http/Requests/StoreDepartmentRequest.php diff --git a/laravel/app/Http/Requests/StoreUserRequest.php b/laravel_server/app/Http/Requests/StoreUserRequest.php similarity index 100% rename from laravel/app/Http/Requests/StoreUserRequest.php rename to laravel_server/app/Http/Requests/StoreUserRequest.php diff --git a/laravel/app/Http/Requests/UpdateDepartmentRequest.php b/laravel_server/app/Http/Requests/UpdateDepartmentRequest.php similarity index 100% rename from laravel/app/Http/Requests/UpdateDepartmentRequest.php rename to laravel_server/app/Http/Requests/UpdateDepartmentRequest.php diff --git a/laravel/app/Http/Requests/UpdateUserRequest.php b/laravel_server/app/Http/Requests/UpdateUserRequest.php similarity index 100% rename from laravel/app/Http/Requests/UpdateUserRequest.php rename to laravel_server/app/Http/Requests/UpdateUserRequest.php diff --git a/laravel/app/Http/Resources/Department.php b/laravel_server/app/Http/Resources/Department.php similarity index 100% rename from laravel/app/Http/Resources/Department.php rename to laravel_server/app/Http/Resources/Department.php diff --git a/laravel_server/app/Http/Resources/Game.php b/laravel_server/app/Http/Resources/Game.php new file mode 100644 index 0000000..7858efc --- /dev/null +++ b/laravel_server/app/Http/Resources/Game.php @@ -0,0 +1,27 @@ + $this->id, + 'status' => $this->status, + 'player1' => $this->player1, + 'player2' => $this->player2, + 'winner' => $this->winner, + 'winnerName' => $this->getWinnerName(), + ]; + return parent::toArray($request); + } +} diff --git a/laravel/app/Http/Resources/User.php b/laravel_server/app/Http/Resources/User.php similarity index 100% rename from laravel/app/Http/Resources/User.php rename to laravel_server/app/Http/Resources/User.php diff --git a/laravel/app/Providers/AppServiceProvider.php b/laravel_server/app/Providers/AppServiceProvider.php similarity index 99% rename from laravel/app/Providers/AppServiceProvider.php rename to laravel_server/app/Providers/AppServiceProvider.php index 35471f6..f5ab663 100644 --- a/laravel/app/Providers/AppServiceProvider.php +++ b/laravel_server/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; + use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider diff --git a/laravel/app/Providers/AuthServiceProvider.php b/laravel_server/app/Providers/AuthServiceProvider.php similarity index 95% rename from laravel/app/Providers/AuthServiceProvider.php rename to laravel_server/app/Providers/AuthServiceProvider.php index 5f0926c..366f865 100644 --- a/laravel/app/Providers/AuthServiceProvider.php +++ b/laravel_server/app/Providers/AuthServiceProvider.php @@ -25,8 +25,7 @@ class AuthServiceProvider extends ServiceProvider public function boot() { $this->registerPolicies(); - Passport::routes(); - + Passport::routes(); // } } diff --git a/laravel/app/Providers/BroadcastServiceProvider.php b/laravel_server/app/Providers/BroadcastServiceProvider.php similarity index 100% rename from laravel/app/Providers/BroadcastServiceProvider.php rename to laravel_server/app/Providers/BroadcastServiceProvider.php diff --git a/laravel/app/Providers/EventServiceProvider.php b/laravel_server/app/Providers/EventServiceProvider.php similarity index 100% rename from laravel/app/Providers/EventServiceProvider.php rename to laravel_server/app/Providers/EventServiceProvider.php diff --git a/laravel/app/Providers/RouteServiceProvider.php b/laravel_server/app/Providers/RouteServiceProvider.php similarity index 100% rename from laravel/app/Providers/RouteServiceProvider.php rename to laravel_server/app/Providers/RouteServiceProvider.php diff --git a/laravel/app/User.php b/laravel_server/app/User.php similarity index 100% rename from laravel/app/User.php rename to laravel_server/app/User.php diff --git a/laravel/artisan b/laravel_server/artisan similarity index 100% rename from laravel/artisan rename to laravel_server/artisan diff --git a/laravel/bootstrap/app.php b/laravel_server/bootstrap/app.php similarity index 100% rename from laravel/bootstrap/app.php rename to laravel_server/bootstrap/app.php diff --git a/laravel/bootstrap/cache/.gitignore b/laravel_server/bootstrap/cache/.gitignore similarity index 100% rename from laravel/bootstrap/cache/.gitignore rename to laravel_server/bootstrap/cache/.gitignore diff --git a/laravel/composer.json b/laravel_server/composer.json similarity index 100% rename from laravel/composer.json rename to laravel_server/composer.json diff --git a/laravel/composer.lock b/laravel_server/composer.lock similarity index 99% rename from laravel/composer.lock rename to laravel_server/composer.lock index 0cf7548..d72c6ff 100644 --- a/laravel/composer.lock +++ b/laravel_server/composer.lock @@ -2892,16 +2892,16 @@ }, { "name": "zendframework/zend-diactoros", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/zendframework/zend-diactoros.git", - "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877" + "reference": "ed6ce7e2105c400ca10277643a8327957c0384b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/c8664b92a6d5bc229e48b0923486c097e45a7877", - "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/ed6ce7e2105c400ca10277643a8327957c0384b7", + "reference": "ed6ce7e2105c400ca10277643a8327957c0384b7", "shasum": "" }, "require": { @@ -2920,8 +2920,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev", - "dev-develop": "1.7-dev" + "dev-master": "1.7.x-dev", + "dev-develop": "1.8.x-dev" } }, "autoload": { @@ -2940,7 +2940,7 @@ "psr", "psr-7" ], - "time": "2017-10-12T15:24:51+00:00" + "time": "2018-01-04T18:21:48+00:00" } ], "packages-dev": [ diff --git a/laravel/config/app.php b/laravel_server/config/app.php similarity index 100% rename from laravel/config/app.php rename to laravel_server/config/app.php diff --git a/laravel/config/auth.php b/laravel_server/config/auth.php similarity index 100% rename from laravel/config/auth.php rename to laravel_server/config/auth.php diff --git a/laravel/config/broadcasting.php b/laravel_server/config/broadcasting.php similarity index 100% rename from laravel/config/broadcasting.php rename to laravel_server/config/broadcasting.php diff --git a/laravel/config/cache.php b/laravel_server/config/cache.php similarity index 100% rename from laravel/config/cache.php rename to laravel_server/config/cache.php diff --git a/laravel/config/database.php b/laravel_server/config/database.php similarity index 100% rename from laravel/config/database.php rename to laravel_server/config/database.php diff --git a/laravel/config/filesystems.php b/laravel_server/config/filesystems.php similarity index 100% rename from laravel/config/filesystems.php rename to laravel_server/config/filesystems.php diff --git a/laravel/config/mail.php b/laravel_server/config/mail.php similarity index 100% rename from laravel/config/mail.php rename to laravel_server/config/mail.php diff --git a/laravel/config/queue.php b/laravel_server/config/queue.php similarity index 100% rename from laravel/config/queue.php rename to laravel_server/config/queue.php diff --git a/laravel/config/services.php b/laravel_server/config/services.php similarity index 100% rename from laravel/config/services.php rename to laravel_server/config/services.php diff --git a/laravel/config/session.php b/laravel_server/config/session.php similarity index 100% rename from laravel/config/session.php rename to laravel_server/config/session.php diff --git a/laravel/config/view.php b/laravel_server/config/view.php similarity index 100% rename from laravel/config/view.php rename to laravel_server/config/view.php diff --git a/laravel/database/.gitignore b/laravel_server/database/.gitignore similarity index 100% rename from laravel/database/.gitignore rename to laravel_server/database/.gitignore diff --git a/laravel/database/factories/UserFactory.php b/laravel_server/database/factories/UserFactory.php similarity index 100% rename from laravel/database/factories/UserFactory.php rename to laravel_server/database/factories/UserFactory.php diff --git a/laravel/database/migrations/2017_10_03_140030_initial_migrations.php b/laravel_server/database/migrations/2017_10_03_140030_initial_migrations.php similarity index 88% rename from laravel/database/migrations/2017_10_03_140030_initial_migrations.php rename to laravel_server/database/migrations/2017_10_03_140030_initial_migrations.php index 41c49d8..4254f5a 100644 --- a/laravel/database/migrations/2017_10_03_140030_initial_migrations.php +++ b/laravel_server/database/migrations/2017_10_03_140030_initial_migrations.php @@ -12,12 +12,13 @@ class InitialMigrations extends Migration * @return void */ public function up() - { + {/* Schema::create('departments', function (Blueprint $table) { $table->increments('id'); $table->string('name')->unique(); $table->timestamps(); }); + */ Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); @@ -25,8 +26,8 @@ class InitialMigrations extends Migration $table->string('password'); $table->rememberToken(); $table->integer('age'); - $table->integer('department_id')->unsigned(); - $table->foreign('department_id')->references('id')->on('departments'); + //$table->integer('department_id')->unsigned(); + //$table->foreign('department_id')->references('id')->on('departments'); $table->timestamps(); }); Schema::create('password_resets', function (Blueprint $table) { @@ -34,7 +35,7 @@ class InitialMigrations extends Migration $table->string('token'); $table->timestamp('created_at')->nullable(); }); - + } /** diff --git a/laravel/database/seeds/DatabaseSeeder.php b/laravel_server/database/seeds/DatabaseSeeder.php similarity index 52% rename from laravel/database/seeds/DatabaseSeeder.php rename to laravel_server/database/seeds/DatabaseSeeder.php index 251bf04..510ef1e 100644 --- a/laravel/database/seeds/DatabaseSeeder.php +++ b/laravel_server/database/seeds/DatabaseSeeder.php @@ -9,8 +9,9 @@ class DatabaseSeeder extends Seeder * * @return void */ - public function run() - { - $this->call(UsersTableSeeder::class); - } + public function run() + { + //$this->call(DepartmentsTableSeeder::class); + $this->call(UsersTableSeeder::class); + } } diff --git a/laravel/database/seeds/DepartmentsTableSeeder.php b/laravel_server/database/seeds/DepartmentsTableSeeder.php similarity index 100% rename from laravel/database/seeds/DepartmentsTableSeeder.php rename to laravel_server/database/seeds/DepartmentsTableSeeder.php diff --git a/laravel_server/database/seeds/UsersTableSeeder.php b/laravel_server/database/seeds/UsersTableSeeder.php new file mode 100644 index 0000000..723ee8e --- /dev/null +++ b/laravel_server/database/seeds/UsersTableSeeder.php @@ -0,0 +1,39 @@ +pluck('id')->toArray(); + for ($i = 0; $i < $this->numberOfUsers; ++$i) { + DB::table('users')->insert($this->fakeUser($faker/*, $faker->randomElement($departments)*/)); + } + } + + private function fakeUser(Faker\Generator $faker/*, $departmentId*/) + { + static $password; + $createdAt = Carbon\Carbon::now()->subDays(30); + $updatedAt = $faker->dateTimeBetween($createdAt); + return [ + 'name' => $faker->name, + 'email' => $faker->unique()->safeEmail, + 'password' => $password ?: $password = bcrypt('secret'), + 'remember_token' => str_random(10), + 'age' => $faker->numberBetween(18, 75), + //'department_id' => $departmentId, + 'created_at' => $createdAt, + 'updated_at' => $updatedAt, + ]; + } +} diff --git a/laravel/package-lock.json b/laravel_server/package-lock.json similarity index 89% rename from laravel/package-lock.json rename to laravel_server/package-lock.json index 53ea157..d1ced4c 100644 --- a/laravel/package-lock.json +++ b/laravel_server/package-lock.json @@ -5,7 +5,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", "dev": true }, "accepts": { @@ -21,7 +21,7 @@ "acorn": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "integrity": "sha1-MXrHghgmwixwLWYYmrg1lnXxNdc=", "dev": true }, "acorn-dynamic-import": { @@ -87,6 +87,11 @@ } } }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, "ajv": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", @@ -143,7 +148,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", "dev": true, "requires": { "color-convert": "1.9.0" @@ -158,7 +163,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { "micromatch": "2.3.11", @@ -168,7 +173,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "archive-type": { @@ -219,7 +224,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "array-differ": { @@ -271,6 +276,11 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -280,7 +290,7 @@ "asn1.js": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=", "dev": true, "requires": { "bn.js": "4.11.8", @@ -312,7 +322,7 @@ "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", "dev": true, "requires": { "lodash": "4.17.4" @@ -351,7 +361,7 @@ "autoprefixer": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", - "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", + "integrity": "sha1-+5MwOfdK90qD5xIlznjZ/Vi6hNc=", "dev": true, "requires": { "browserslist": "2.7.0", @@ -621,7 +631,7 @@ "babel-loader": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "integrity": "sha1-9svhInEPGqKvTYgcbVtUNYyiQSY=", "dev": true, "requires": { "find-cache-dir": "1.0.0", @@ -959,7 +969,7 @@ "babel-preset-env": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "integrity": "sha1-oYtWTMm5r99KrleuPBsNmRiOb0g=", "dev": true, "requires": { "babel-plugin-check-es2015-constants": "6.22.0", @@ -1064,19 +1074,29 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", "dev": true }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=", "dev": true }, "batch": { @@ -1101,10 +1121,18 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", "dev": true }, "bin-build": { @@ -1213,6 +1241,11 @@ "readable-stream": "2.3.3" } }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -1225,13 +1258,13 @@ "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -1311,7 +1344,7 @@ "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=", "dev": true, "requires": { "buffer-xor": "1.0.3", @@ -1381,7 +1414,7 @@ "browserslist": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.7.0.tgz", - "integrity": "sha512-s34mrlczJsfbJu//mz/m9zlOy/S6tiP6El1u8iC1gTfEnzKXvxo8RAoCxS/MmojB7rd7bnfYzvKQNHykWaUWWw==", + "integrity": "sha1-3DddxwBI/sPZiQQqNQIjQpAu/wA=", "dev": true, "requires": { "caniuse-lite": "1.0.30000757", @@ -1408,7 +1441,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", "dev": true }, "buffer-to-vinyl": { @@ -1461,6 +1494,11 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1586,7 +1624,7 @@ "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -1608,6 +1646,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1619,7 +1658,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "2.0.3", @@ -1629,7 +1668,7 @@ "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", "dev": true, "requires": { "chalk": "1.1.3" @@ -1837,7 +1876,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", "dev": true }, "commondir": { @@ -1846,6 +1885,21 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, "compressible": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", @@ -1947,7 +2001,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", "dev": true }, "convert-source-map": { @@ -1983,7 +2037,7 @@ "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2051,7 +2105,7 @@ "cross-env": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.1.tgz", - "integrity": "sha512-Wtvr+z0Z06KO1JxjfRRsPC+df7biIOiuV4iZ73cThjFGkH+ULBZq1MkBdywEcJC4cTDbO6c8IjgRjfswx3YTBA==", + "integrity": "sha1-ttirl/MEwPcdrnJ3t1/kJMCN+nQ=", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -2087,7 +2141,7 @@ "boom": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", "dev": true, "requires": { "hoek": "4.2.0" @@ -2098,7 +2152,7 @@ "crypto-browserify": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", "dev": true, "requires": { "browserify-cipher": "1.0.0", @@ -2145,7 +2199,7 @@ "css-loader": { "version": "0.28.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", + "integrity": "sha1-Xy7pid0y7dkHcX+VMxdlYWCZnBs=", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -2200,7 +2254,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -2356,7 +2410,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -2448,7 +2502,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -2730,7 +2784,7 @@ "dns-packet": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "integrity": "sha1-qKJr7HZGQ4lj/Ibgb4+LFtbIv3o=", "dev": true, "requires": { "ip": "1.1.5", @@ -2799,7 +2853,7 @@ "duplexify": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=", "dev": true, "requires": { "end-of-stream": "1.4.0", @@ -2918,7 +2972,7 @@ "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "integrity": "sha1-aQgpoHyuNrIi5/2bdcDQVz6yUic=", "dev": true, "requires": { "es-to-primitive": "1.1.1", @@ -3111,7 +3165,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "1.3.4", @@ -3121,7 +3175,7 @@ "exec-buffer": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", "dev": true, "requires": { "execa": "0.7.0", @@ -3256,7 +3310,7 @@ "extract-text-webpack-plugin": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "integrity": "sha1-XwQ+qgL5dQqSWLeMCm4NwUCPsvc=", "dev": true, "requires": { "async": "2.5.0", @@ -3357,7 +3411,7 @@ "file-loader": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", + "integrity": "sha1-T/HfKK84cZpgmAk7iMgscdF5SjQ=", "dev": true, "requires": { "loader-utils": "1.1.0" @@ -3467,7 +3521,7 @@ "follow-redirects": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.5.tgz", - "integrity": "sha512-lMhwQTryFbG+wYsAIEKC1Kf5IGDlVNnONRogIBllh7LLoV7pNIxW0z9fhjRar9NBql+hd2Y49KboVVNxf6GEfg==", + "integrity": "sha1-/9PhTL3V6qcvYbY2jB9oUWwqJsw=", "dev": true, "requires": { "debug": "2.6.9" @@ -3578,6 +3632,910 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -3593,7 +4551,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "gauge": { @@ -3671,7 +4629,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -3760,7 +4718,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "globby": { @@ -4038,6 +4996,26 @@ "ansi-regex": "2.1.1" } }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -4077,7 +5055,7 @@ "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", "dev": true, "requires": { "inherits": "2.0.3", @@ -4087,7 +5065,7 @@ "hawk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", "dev": true, "requires": { "boom": "4.3.1", @@ -4116,7 +5094,7 @@ "hoek": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=", "dev": true }, "home-or-tmp": { @@ -4132,7 +5110,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", "dev": true }, "hpack.js": { @@ -4175,7 +5153,7 @@ "html-minifier": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", - "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", + "integrity": "sha1-fk5mGgmZlZnH2OiiuNf7dDC7XD4=", "dev": true, "requires": { "camel-case": "3.0.0", @@ -4191,7 +5169,7 @@ "uglify-js": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.6.tgz", - "integrity": "sha512-/rseyxEKEVMBo8279lqpoJgD6C/i/CIi+9TJDvWmb+Xo6mqMKwjA8Io3IMHlcXQzj99feR6zrN8m3wqqvm/nYA==", + "integrity": "sha1-kYgyYCA26V0jGOEfJ+6EYahZLF0=", "dev": true, "requires": { "commander": "2.11.0", @@ -4291,7 +5269,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", "dev": true }, "icss-replace-symbols": { @@ -4340,7 +5318,7 @@ "imagemin-gifsicle": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", - "integrity": "sha512-K01m5QuPK+0en8oVhiOOAicF7KjrHlCZxS++mfLI2mV/Ksfq/Y9nCXCWDz6jRv13wwlqe5T7hXT+ji2DnLc2yQ==", + "integrity": "sha1-N4FSTEV2Eu8EkWrzQkGitCv8tAo=", "dev": true, "requires": { "exec-buffer": "3.2.0", @@ -4384,7 +5362,7 @@ "imagemin-svgo": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-5.2.4.tgz", - "integrity": "sha512-1bNZdlWVKdfxzu0xDD1pWjwK/G8FLcztUh/GWaI7xLgCFrn0j35o+uBbY7VcdY2AmKgiLYTXhrzrbkQk6xj8aA==", + "integrity": "sha1-bNXTQsrkvNi0g1lOUxVpXfArnps=", "dev": true, "requires": { "is-svg": "2.1.0", @@ -4440,8 +5418,7 @@ "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflight": { "version": "1.0.6", @@ -4546,7 +5523,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", "dev": true }, "is-builtin-module": { @@ -4708,7 +5685,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "3.0.1" @@ -4872,7 +5849,7 @@ "js-base64": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", - "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==", + "integrity": "sha1-p5qSNmY3K1gPjif1GEXG9+j7+68=", "dev": true }, "js-tokens": { @@ -4907,7 +5884,7 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", "dev": true }, "json-schema": { @@ -4940,8 +5917,7 @@ "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { "version": "0.5.1", @@ -4994,7 +5970,7 @@ "laravel-mix": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-1.5.1.tgz", - "integrity": "sha512-K/ONuWY339mpUfK5BUN9B5ZExl/GGGplQXJGh3bB19HRm7uGpCLTbnxekFLhYd9tOlS/kQ6TwfGnFMKlhd6QBA==", + "integrity": "sha1-mHt7+rGJKkMNZYHoaNhlGSKSnxo=", "dev": true, "requires": { "autoprefixer": "7.1.6", @@ -5424,7 +6400,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", "dev": true, "requires": { "pseudomap": "1.0.2", @@ -5440,7 +6416,7 @@ "make-dir": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "integrity": "sha1-GbQ2n+SMEW9Twq+VrRAsDjnoXVE=", "dev": true, "requires": { "pify": "3.0.0" @@ -5633,7 +6609,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "4.11.8", @@ -5643,7 +6619,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", "dev": true }, "mime-db": { @@ -5682,7 +6658,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -5822,7 +6798,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "1.1.4" @@ -5831,7 +6807,7 @@ "node-emoji": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "integrity": "sha1-buxr+wdCHiFIx1xrunJCH4UwqCY=", "dev": true, "requires": { "lodash.toarray": "4.4.0" @@ -6025,7 +7001,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "dev": true, "requires": { "hosted-git-info": "2.5.0", @@ -6073,7 +7049,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dev": true, "requires": { "are-we-there-yet": "1.1.4", @@ -6106,6 +7082,11 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -6167,12 +7148,17 @@ "opn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", "dev": true, "requires": { "is-wsl": "1.1.0" } }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, "optipng-bin": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", @@ -6282,7 +7268,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", "dev": true }, "p-pipe": { @@ -6340,6 +7326,30 @@ "error-ex": "1.3.1" } }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -6416,7 +7426,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", "dev": true, "requires": { "create-hash": "1.1.3", @@ -6501,7 +7511,7 @@ "postcss": { "version": "6.0.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", - "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=", "dev": true, "requires": { "chalk": "2.3.0", @@ -6556,7 +7566,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6629,7 +7639,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6701,7 +7711,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6772,7 +7782,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6843,7 +7853,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6914,7 +7924,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -6985,7 +7995,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7057,7 +8067,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7129,7 +8139,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7190,7 +8200,7 @@ "postcss-loader": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", + "integrity": "sha1-jGfdsClAffr+aEpAbPwWutLOCBQ=", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -7246,7 +8256,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7317,7 +8327,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7402,7 +8412,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7481,7 +8491,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7553,7 +8563,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7627,7 +8637,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7701,7 +8711,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7811,7 +8821,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7885,7 +8895,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -7957,7 +8967,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8029,7 +9039,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8100,7 +9110,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8173,7 +9183,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8258,7 +9268,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8331,7 +9341,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8410,7 +9420,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "1.1.3", @@ -8457,7 +9467,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", "dev": true }, "process": { @@ -8522,7 +9532,7 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", "dev": true }, "query-string": { @@ -8556,7 +9566,7 @@ "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { "is-number": "3.0.0", @@ -8597,7 +9607,7 @@ "randombytes": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -8696,7 +9706,7 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", "dev": true, "requires": { "core-util-is": "1.0.2", @@ -8812,19 +9822,19 @@ "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=", "dev": true }, "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=", "dev": true }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", "dev": true, "requires": { "babel-runtime": "6.26.0", @@ -8835,7 +9845,7 @@ "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { "is-equal-shallow": "0.1.3" @@ -8923,7 +9933,7 @@ "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", "dev": true, "requires": { "aws-sign2": "0.7.0", @@ -8988,7 +9998,7 @@ "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", "dev": true, "requires": { "path-parse": "1.0.5" @@ -9018,7 +10028,7 @@ "resolve-url-loader": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-2.2.0.tgz", - "integrity": "sha512-ivEo27PgDKAm3Iwzh/ObwcDrKT2O25xWBIQX6HJVVfaxYWNNW6euPMmMFzpQUZo03+iv2TloBgffEk1ULnEPdg==", + "integrity": "sha1-lmL+qhHev3z44/65Ha6VRKp97og=", "dev": true, "requires": { "adjust-sourcemap-loader": "1.1.0", @@ -9082,7 +10092,7 @@ "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "dev": true, "requires": { "glob": "7.1.2" @@ -9101,7 +10111,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", "dev": true }, "sass-graph": { @@ -9148,7 +10158,7 @@ "sass-loader": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", + "integrity": "sha1-6dXmwfFV+qMqSybXqbcQfCJeQPk=", "dev": true, "requires": { "async": "2.5.0", @@ -9161,7 +10171,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "schema-utils": { @@ -9232,7 +10242,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", "dev": true }, "semver-regex": { @@ -9253,7 +10263,7 @@ "send": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=", "dev": true, "requires": { "debug": "2.6.9", @@ -9289,7 +10299,7 @@ "serve-static": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=", "dev": true, "requires": { "encodeurl": "1.0.1", @@ -9319,13 +10329,13 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", "dev": true }, "sha.js": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "integrity": "sha1-mPZIgEdLdPSji42p08Dy0QRjPn0=", "dev": true, "requires": { "inherits": "2.0.3", @@ -9373,7 +10383,7 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", "dev": true }, "signal-exit": { @@ -9391,7 +10401,7 @@ "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", "dev": true, "requires": { "hoek": "4.2.0" @@ -9452,13 +10462,13 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "source-map-resolve": { @@ -9476,7 +10486,7 @@ "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", "dev": true, "requires": { "source-map": "0.5.7" @@ -9615,7 +10625,7 @@ "stackframe": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "integrity": "sha1-NXskqZL5Qny6a1RdlqFO0svKGHs=", "dev": true }, "stat-mode": { @@ -9662,7 +10672,7 @@ "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "dev": true, "requires": { "builtin-status-codes": "3.0.0", @@ -9684,15 +10694,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", @@ -9713,6 +10714,15 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -9827,7 +10837,7 @@ "style-loader": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "integrity": "sha1-zDFFmvvNbYC3Ig7lSykan9Zv9es=", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -10024,7 +11034,7 @@ "timers-browserify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "integrity": "sha1-lspT9LeUpefA4b18yIo3Ipj6AeY=", "dev": true, "requires": { "setimmediate": "1.0.5" @@ -10039,6 +11049,11 @@ "extend-shallow": "2.0.1" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -10272,7 +11287,7 @@ "url-parse": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "integrity": "sha1-OhnoqqbQI93SfcxEy0/I9/7COYY=", "dev": true, "requires": { "querystringify": "1.0.0", @@ -10337,7 +11352,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", "dev": true }, "vali-date": { @@ -10457,19 +11472,19 @@ "vue": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.2.tgz", - "integrity": "sha512-Au9rf8fPkBulFHfZ406UaQDd1jH9fqGRIM+0IHilrXnJ/0TeeMH4SBkNxWf2dGevl2S3aVeu0E/WklEv0/msag==", + "integrity": "sha1-/TZ6h7rnU15H+dxcnsO0luX+taQ=", "dev": true }, "vue-hot-reload-api": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.2.0.tgz", - "integrity": "sha512-Hn0jdFiNfNx4+Nxz1vokYUsP3mwpn9r/XomLrXA+KafYaiR7LNQG1fxtpVklD4KxD5GluXRiSoWNDf0H9BdsJw==", + "integrity": "sha1-miGzXO02NENKQ+6A77c1Dqj7IG0=", "dev": true }, "vue-loader": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.3.0.tgz", - "integrity": "sha512-ACslFXI52qxaWSYoyU3mNq8rcTPCP0nNlQSwWuIZCrBJbWLRtYrCdqW2IfGLZf0NuQLq3s49J1xFrApORamJtA==", + "integrity": "sha1-O/g31JC6XepvwH4INf+mxojIrzM=", "dev": true, "requires": { "consolidate": "0.14.5", @@ -10487,10 +11502,143 @@ "vue-template-es2015-compiler": "1.6.0" } }, + "vue-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", + "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" + }, + "vue-socket.io": { + "version": "2.1.1-a", + "resolved": "https://registry.npmjs.org/vue-socket.io/-/vue-socket.io-2.1.1-a.tgz", + "integrity": "sha1-1YFpGvR3WcjYdOmazqIlZuLmGJQ=", + "requires": { + "socket.io-client": "1.7.4" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "engine.io-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz", + "integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "socket.io-client": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", + "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.4", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + } + } + }, "vue-style-loader": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.0.3.tgz", - "integrity": "sha512-P/ihpaZKU23T1kq3E0y4c+F8sbm1HQO69EFYoLoGMSGVAHroHsGir/WQ9qUavP8dyFYHmXenzHaJ/nqd8vfaxw==", + "integrity": "sha1-YjZY+BUGrvnRIc3BE6T1ycrDLfc=", "dev": true, "requires": { "hash-sum": "1.0.2", @@ -10500,7 +11648,7 @@ "vue-template-compiler": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.2.tgz", - "integrity": "sha512-FtbqBWvEANPZaeRo09VKEF7tET4kPMtJYqwsy/Nm1fdr1zIcwcTI7CXqeraXMviczho5IjtxZ6Fab1Enm4rHmA==", + "integrity": "sha1-bxmOvGd7j4BDFc0zuR6EkxWucXc=", "dev": true, "requires": { "de-indent": "1.0.2", @@ -10510,7 +11658,7 @@ "vue-template-es2015-compiler": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", - "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", + "integrity": "sha1-3EJpcTMwLOMBdSQ1amxht7abShg=", "dev": true }, "ware": { @@ -10545,7 +11693,7 @@ "webpack": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "integrity": "sha1-sWloqBEAq+YWCLAVPJFZ74uyvYM=", "dev": true, "requires": { "acorn": "5.2.1", @@ -10610,7 +11758,7 @@ "webpack-dev-server": { "version": "2.9.4", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.4.tgz", - "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", + "integrity": "sha1-eIPmF1nGpLM+mxnsQDe9SrYUKNE=", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -10651,7 +11799,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -10692,7 +11840,7 @@ "webpack-merge": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "integrity": "sha1-8Rl6Cpc+acb77rbWWCGaqMDBNVU=", "dev": true, "requires": { "lodash": "4.17.4" @@ -10712,7 +11860,7 @@ "webpack-sources": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "integrity": "sha1-xzVkNqTRMSO+LiQmoF0drZy+Zc8=", "dev": true, "requires": { "source-list-map": "2.0.0", @@ -10752,7 +11900,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "dev": true, "requires": { "isexe": "2.0.0" @@ -10767,7 +11915,7 @@ "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", "dev": true, "requires": { "string-width": "1.0.2" @@ -10818,6 +11966,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + }, "xml-char-classes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", @@ -10896,7 +12049,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "dev": true, "requires": { "execa": "0.7.0", @@ -10943,7 +12096,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -11008,6 +12161,11 @@ "buffer-crc32": "0.2.13", "fd-slicer": "1.0.1" } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/laravel/package.json b/laravel_server/package.json similarity index 92% rename from laravel/package.json rename to laravel_server/package.json index 0c13934..ad3d661 100644 --- a/laravel/package.json +++ b/laravel_server/package.json @@ -8,7 +8,7 @@ "hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", "production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" - }, + }, "devDependencies": { "axios": "^0.16.2", "bootstrap-sass": "^3.3.7", @@ -17,5 +17,9 @@ "laravel-mix": "^1.0", "lodash": "^4.17.4", "vue": "^2.1.10" + }, + "dependencies": { + "vue-router": "^3.0.1", + "vue-socket.io": "^2.1.1-a" } } diff --git a/laravel/package.json.original b/laravel_server/package.json.original similarity index 100% rename from laravel/package.json.original rename to laravel_server/package.json.original diff --git a/laravel/package.json.patch b/laravel_server/package.json.patch similarity index 100% rename from laravel/package.json.patch rename to laravel_server/package.json.patch diff --git a/laravel/phpunit.xml b/laravel_server/phpunit.xml similarity index 100% rename from laravel/phpunit.xml rename to laravel_server/phpunit.xml diff --git a/laravel/public/.htaccess b/laravel_server/public/.htaccess similarity index 100% rename from laravel/public/.htaccess rename to laravel_server/public/.htaccess diff --git a/laravel/public/css/app.css b/laravel_server/public/css/app.css similarity index 99% rename from laravel/public/css/app.css rename to laravel_server/public/css/app.css index b56d120..289e8fb 100644 --- a/laravel/public/css/app.css +++ b/laravel_server/public/css/app.css @@ -8357,7 +8357,7 @@ button.close { } .board { - max-width: 375px; + max-width: 276px; margin: 0 auto; border-style: solid; border-width: 0px 0 0 0px; @@ -8380,3 +8380,4 @@ button.close { padding: 0; border-style: none; } + diff --git a/laravel/public/css/style.css b/laravel_server/public/css/style.css similarity index 100% rename from laravel/public/css/style.css rename to laravel_server/public/css/style.css diff --git a/laravel/public/favicon.ico b/laravel_server/public/favicon.ico similarity index 100% rename from laravel/public/favicon.ico rename to laravel_server/public/favicon.ico diff --git a/laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot b/laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot similarity index 100% rename from laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot rename to laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot diff --git a/laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg b/laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg similarity index 100% rename from laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg rename to laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg diff --git a/laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf b/laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf similarity index 100% rename from laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf rename to laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf diff --git a/laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff b/laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff similarity index 100% rename from laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff rename to laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff diff --git a/laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 b/laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 similarity index 100% rename from laravel/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 rename to laravel_server/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 diff --git a/laravel_server/public/img/0.png b/laravel_server/public/img/0.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6349a40bd07ecddff52d955f47f4b00d32110c GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^jX>PR!3HFI(={gpDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C-z_@Q5sCVBk9f!i-b3 z`J@>b7$Y-7B1$5BeXNr6bM+Ea@{>~aDsl^esu>t;Dy)Fa+|-gpg^Jvqyke^gTP3gx zD1^l#~=$ z>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxD?a#8ycOWDy)d+*y*DhOjBG80syc2lYWR`i6Q2`f#&>T5Uk0R{lkqsX&`S z=Gz(CfK{T1LG7{82U(8f7>G~7qCl_OaoOm@gUyc1=a70NFp%$ix;TbZFuuLkDA-`Y z!@TjpKWpcG*&%lq*v)bMtDJkn|KEG=&m_=bAmG5j$jr>hB4DtA^9GBA!+{31 zgaeid3s`cP_!JTxgbg0Z7z8kxF|rF7EZ~$V;FHi`oZZ08A#s6)$AX<_N`vnKMi!n7 zCbl`uY+eV{9xyPmnJ_Y+V`NrM5H0|kJgb56c|)Vn22P8H21efl4aEl>fY!*2T0?H2 cB?$ju{C}ENK%?>LT2QX>boFyt=akR{0GS~c^8f$< literal 0 HcmV?d00001 diff --git a/laravel_server/public/img/1.png b/laravel_server/public/img/1.png new file mode 100644 index 0000000000000000000000000000000000000000..6e6469936c9c6aea38de1262ba94090cfcdc4b8b GIT binary patch literal 1320 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 undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object' && !isArray(obj)) { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = merge(result[key], val); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim +}; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +var utils = __webpack_require__(0); +var normalizeHeaderName = __webpack_require__(21); + +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; + +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } +} + +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(5); + } else if (typeof process !== 'undefined') { + // For node use HTTP adapter + adapter = __webpack_require__(5); + } + return adapter; +} + +var defaults = { + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], + + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], + + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + } +}; + +defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' + } +}; + +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + +module.exports = defaults; + +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4))) + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(0); +var settle = __webpack_require__(22); +var buildURL = __webpack_require__(24); +var parseHeaders = __webpack_require__(25); +var isURLSameOrigin = __webpack_require__(26); +var createError = __webpack_require__(6); +var btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(27); + +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + var loadEvent = 'onreadystatechange'; + var xDomain = false; + + // For IE 8/9 CORS support + // Only supports POST and GET calls and doesn't returns the response headers. + // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest. + if ("development" !== 'test' && + typeof window !== 'undefined' && + window.XDomainRequest && !('withCredentials' in request) && + !isURLSameOrigin(config.url)) { + request = new window.XDomainRequest(); + loadEvent = 'onload'; + xDomain = true; + request.onprogress = function handleProgress() {}; + request.ontimeout = function handleTimeout() {}; + } + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + // Listen for ready state + request[loadEvent] = function handleLoad() { + if (!request || (request.readyState !== 4 && !xDomain)) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + // IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201) + status: request.status === 1223 ? 204 : request.status, + statusText: request.status === 1223 ? 'No Content' : request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(resolve, reject, response); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + var cookies = __webpack_require__(28); + + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (config.withCredentials) { + request.withCredentials = true; + } + + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } + + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } + + if (requestData === undefined) { + requestData = null; + } + + // Send the request + request.send(requestData); + }); +}; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var enhanceError = __webpack_require__(23); + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); +}; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; +} + +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; + +Cancel.prototype.__CANCEL__ = true; + +module.exports = Cancel; + + +/***/ }), +/* 9 */, +/* 10 */, +/* 11 */, +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + +window._ = __webpack_require__(13); + +/** + * We'll load jQuery and the Bootstrap jQuery plugin which provides support + * for JavaScript based Bootstrap features such as modals and tabs. This + * code may be modified to fit the specific needs of your application. + */ + +try { + window.$ = window.jQuery = __webpack_require__(15); + + __webpack_require__(16); +} catch (e) {} + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +window.axios = __webpack_require__(17); + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Next we will register the CSRF Token as a common header with Axios so that + * all outgoing HTTP requests automatically have it attached. This is just + * a simple convenience so we don't have to attach every token manually. + */ + +// let token = document.head.querySelector('meta[name="csrf-token"]'); + +// if (token) { +// window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; +// } else { +// console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); +// } + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo' + +// window.Pusher = require('pusher-js'); + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: 'your-pusher-key' +// }); + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license + * Lodash + * Copyright JS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.4'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading and trailing whitespace. */ + var reTrim = /^\s+|\s+$/g, + reTrimStart = /^\s+/, + reTrimEnd = /\s+$/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)', + rsOrdUpper = '\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * Adds the key-value `pair` to `map`. + * + * @private + * @param {Object} map The map to modify. + * @param {Array} pair The key-value pair to add. + * @returns {Object} Returns `map`. + */ + function addMapEntry(map, pair) { + // Don't return `map.set` because it's not chainable in IE 11. + map.set(pair[0], pair[1]); + return map; + } + + /** + * Adds `value` to `set`. + * + * @private + * @param {Object} set The set to modify. + * @param {*} value The value to add. + * @returns {Object} Returns `set`. + */ + function addSetEntry(set, value) { + // Don't return `set.add` because it's not chainable in IE 11. + set.add(value); + return set; + } + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, baseClone, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(object[key], srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = object[key], + srcValue = source[key], + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + var index = -1; + iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); + + var low = 0, + high = array == null ? 0 : array.length, + valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `map`. + * + * @private + * @param {Object} map The map to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned map. + */ + function cloneMap(map, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map); + return arrayReduce(array, addMapEntry, new map.constructor); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of `set`. + * + * @private + * @param {Object} set The set to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned set. + */ + function cloneSet(set, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set); + return arrayReduce(array, addSetEntry, new set.constructor); + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, cloneFunc, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return cloneMap(object, isDeep, cloneFunc); + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return cloneSet(object, isDeep, cloneFunc); + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + result = wait - timeSinceLastCall; + + return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(args) { + args.push(undefined, customDefaultsAssignIn); + return apply(assignInWith, undefined, args); + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': ' + + \ No newline at end of file diff --git a/laravel_server/resources/assets/js/components/lobby.vue b/laravel_server/resources/assets/js/components/lobby.vue new file mode 100644 index 0000000..0cd2636 --- /dev/null +++ b/laravel_server/resources/assets/js/components/lobby.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/laravel_server/resources/assets/js/components/login.vue b/laravel_server/resources/assets/js/components/login.vue new file mode 100644 index 0000000..24d626c --- /dev/null +++ b/laravel_server/resources/assets/js/components/login.vue @@ -0,0 +1,75 @@ + + + + + + + + diff --git a/laravel_server/resources/assets/js/components/multiplayer_tictactoe.vue b/laravel_server/resources/assets/js/components/multiplayer_tictactoe.vue new file mode 100644 index 0000000..0796155 --- /dev/null +++ b/laravel_server/resources/assets/js/components/multiplayer_tictactoe.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/laravel_server/resources/assets/js/components/register.vue b/laravel_server/resources/assets/js/components/register.vue new file mode 100644 index 0000000..220bd23 --- /dev/null +++ b/laravel_server/resources/assets/js/components/register.vue @@ -0,0 +1,71 @@ + + + + + + + + diff --git a/laravel/resources/assets/js/components/singleplayerMode.vue b/laravel_server/resources/assets/js/components/singleplayer_tictactoe.vue similarity index 58% rename from laravel/resources/assets/js/components/singleplayerMode.vue rename to laravel_server/resources/assets/js/components/singleplayer_tictactoe.vue index a190bfc..66694fe 100644 --- a/laravel/resources/assets/js/components/singleplayerMode.vue +++ b/laravel_server/resources/assets/js/components/singleplayer_tictactoe.vue @@ -6,10 +6,10 @@

Current Player : {{ currentPlayer }}


-
+
- {{ successMessage }}     Restart + {{ successMessage }}     Restart
@@ -18,15 +18,15 @@

-
- + + - + \ No newline at end of file diff --git a/laravel/resources/assets/js/components/user.vue b/laravel_server/resources/assets/js/components/user.vue similarity index 68% rename from laravel/resources/assets/js/components/user.vue rename to laravel_server/resources/assets/js/components/user.vue index 07a05df..339924e 100644 --- a/laravel/resources/assets/js/components/user.vue +++ b/laravel_server/resources/assets/js/components/user.vue @@ -7,27 +7,28 @@
- + {{ successMessage }}
- - + + - \ No newline at end of file + diff --git a/laravel/resources/assets/js/components/userEdit.vue b/laravel_server/resources/assets/js/components/userEdit.vue similarity index 100% rename from laravel/resources/assets/js/components/userEdit.vue rename to laravel_server/resources/assets/js/components/userEdit.vue diff --git a/laravel/resources/assets/js/components/userList.vue b/laravel_server/resources/assets/js/components/userList.vue similarity index 100% rename from laravel/resources/assets/js/components/userList.vue rename to laravel_server/resources/assets/js/components/userList.vue diff --git a/laravel_server/resources/assets/js/vueapp.js b/laravel_server/resources/assets/js/vueapp.js new file mode 100644 index 0000000..2ee5760 --- /dev/null +++ b/laravel_server/resources/assets/js/vueapp.js @@ -0,0 +1,48 @@ +/*jshint esversion: 6 */ + +/** + * First we will load all of this project's JavaScript dependencies which + * includes Vue and other libraries. It is a great starting point when + * building robust, powerful web applications using Vue and Laravel. + */ + +require('./bootstrap'); + +window.Vue = require('vue'); + +import VueRouter from 'vue-router'; +import VueSocketio from 'vue-socket.io'; + +Vue.use(VueRouter); + +//Vue.use(VueSocketio, 'http://192.168.10.10:8080'); +Vue.use(VueSocketio, 'http://192.168.10.1:8080'); + +const user = Vue.component('user', require('./components/user.vue')); +const login = Vue.component('login', require('./components/login.vue')); +const logout = Vue.component('logout', require('./components/logout.vue')); +const register = Vue.component('register', require('./components/register.vue')); +const singleplayer_game = Vue.component('singlegame', require('./components/singleplayer_tictactoe.vue')); +const multiplayerGame = Vue.component('multiplayergame', require('./components/multiplayer_tictactoe.vue')); + +const routes = [ + { path: '/', redirect: '/users' }, + { path: '/users', component: user }, + { path: '/login', component: login }, + { path: '/logout', component: logout }, + { path: '/register', component: register }, + { path: '/singletictactoe', component: singleplayer_game }, + { path: '/multitictactoe', component: multiplayerGame } +]; + +const router = new VueRouter({ + routes:routes +}); + +const app = new Vue({ + router, + data:{ + player1:undefined, + player2: undefined, + } +}).$mount('#app'); diff --git a/laravel/resources/assets/sass/_variables.scss b/laravel_server/resources/assets/sass/_variables.scss similarity index 100% rename from laravel/resources/assets/sass/_variables.scss rename to laravel_server/resources/assets/sass/_variables.scss diff --git a/laravel/resources/assets/sass/app.scss b/laravel_server/resources/assets/sass/app.scss similarity index 92% rename from laravel/resources/assets/sass/app.scss rename to laravel_server/resources/assets/sass/app.scss index 3c9850d..2d12aa8 100644 --- a/laravel/resources/assets/sass/app.scss +++ b/laravel_server/resources/assets/sass/app.scss @@ -18,10 +18,10 @@ .board{ max-width: 276px; margin: 0 auto; - border-style: solid; - border-width: 0px 0 0 0px; + border-style: solid; + border-width: 0px 0 0 0px; border-color: black; - + div{ display: inline-block; border-style: solid; @@ -39,3 +39,6 @@ border-style: none; } } + + + diff --git a/laravel/resources/lang/en/auth.php b/laravel_server/resources/lang/en/auth.php similarity index 100% rename from laravel/resources/lang/en/auth.php rename to laravel_server/resources/lang/en/auth.php diff --git a/laravel/resources/lang/en/pagination.php b/laravel_server/resources/lang/en/pagination.php similarity index 100% rename from laravel/resources/lang/en/pagination.php rename to laravel_server/resources/lang/en/pagination.php diff --git a/laravel/resources/lang/en/passwords.php b/laravel_server/resources/lang/en/passwords.php similarity index 100% rename from laravel/resources/lang/en/passwords.php rename to laravel_server/resources/lang/en/passwords.php diff --git a/laravel/resources/lang/en/validation.php b/laravel_server/resources/lang/en/validation.php similarity index 100% rename from laravel/resources/lang/en/validation.php rename to laravel_server/resources/lang/en/validation.php diff --git a/laravel/resources/views/master.blade.php b/laravel_server/resources/views/master.blade.php similarity index 82% rename from laravel/resources/views/master.blade.php rename to laravel_server/resources/views/master.blade.php index 7af52af..c454bf6 100644 --- a/laravel/resources/views/master.blade.php +++ b/laravel_server/resources/views/master.blade.php @@ -4,18 +4,18 @@ - @yield('metatags') + @yield('metatags') @yield('title') - @yield('extrastyles') + @yield('extrastyles') - +
@yield('content')
- @yield('pagescript') + @yield('pagescript') diff --git a/laravel/resources/views/vue/index.blade.php b/laravel_server/resources/views/vue/index.blade.php similarity index 53% rename from laravel/resources/views/vue/index.blade.php rename to laravel_server/resources/views/vue/index.blade.php index 386ca43..11acec6 100644 --- a/laravel/resources/views/vue/index.blade.php +++ b/laravel_server/resources/views/vue/index.blade.php @@ -4,9 +4,11 @@ @section('content') Users - - Departments - - SinglePlayer Memory Game - - Multiplayer Memory Game + Login - + Logout - + Register - + SinglePlayer TicTacToe - + Multiplayer TicTacToe @endsection diff --git a/laravel/resources/views/welcome.blade.php b/laravel_server/resources/views/welcome.blade.php similarity index 100% rename from laravel/resources/views/welcome.blade.php rename to laravel_server/resources/views/welcome.blade.php diff --git a/laravel/routes/api.php b/laravel_server/routes/api.php similarity index 90% rename from laravel/routes/api.php rename to laravel_server/routes/api.php index 70060f7..4da4375 100644 --- a/laravel/routes/api.php +++ b/laravel_server/routes/api.php @@ -17,10 +17,10 @@ Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); +// Login & Logout Route::post('login', 'LoginControllerAPI@login'); -Route::middleware('auth:api')->post('logout', 'LoginControllerAPI@logout'); - -Route::get('departments', 'DepartmentControllerAPI@index'); +Route::post('register', 'UserControllerAPI@store'); +Route::middleware('auth:api')->post('logout','LoginControllerAPI@logout'); Route::get('users', 'UserControllerAPI@getUsers'); Route::get('users/emailavailable', 'UserControllerAPI@emailAvailable'); diff --git a/laravel/routes/channels.php b/laravel_server/routes/channels.php similarity index 100% rename from laravel/routes/channels.php rename to laravel_server/routes/channels.php diff --git a/laravel/routes/console.php b/laravel_server/routes/console.php similarity index 100% rename from laravel/routes/console.php rename to laravel_server/routes/console.php diff --git a/laravel/routes/web.php b/laravel_server/routes/web.php similarity index 99% rename from laravel/routes/web.php rename to laravel_server/routes/web.php index f5fea6d..ed62086 100644 --- a/laravel/routes/web.php +++ b/laravel_server/routes/web.php @@ -12,3 +12,4 @@ */ Route::get('/','VueController@index'); + diff --git a/laravel/server.php b/laravel_server/server.php similarity index 100% rename from laravel/server.php rename to laravel_server/server.php diff --git a/laravel/stats.json b/laravel_server/stats.json similarity index 100% rename from laravel/stats.json rename to laravel_server/stats.json diff --git a/laravel/storage/app/.gitignore b/laravel_server/storage/app/.gitignore similarity index 100% rename from laravel/storage/app/.gitignore rename to laravel_server/storage/app/.gitignore diff --git a/laravel/storage/app/public/.gitignore b/laravel_server/storage/app/public/.gitignore similarity index 100% rename from laravel/storage/app/public/.gitignore rename to laravel_server/storage/app/public/.gitignore diff --git a/laravel/storage/framework/.gitignore b/laravel_server/storage/framework/.gitignore similarity index 100% rename from laravel/storage/framework/.gitignore rename to laravel_server/storage/framework/.gitignore diff --git a/laravel/storage/framework/cache/.gitignore b/laravel_server/storage/framework/cache/.gitignore similarity index 100% rename from laravel/storage/framework/cache/.gitignore rename to laravel_server/storage/framework/cache/.gitignore diff --git a/laravel/storage/framework/sessions/.gitignore b/laravel_server/storage/framework/sessions/.gitignore similarity index 100% rename from laravel/storage/framework/sessions/.gitignore rename to laravel_server/storage/framework/sessions/.gitignore diff --git a/laravel/storage/framework/testing/.gitignore b/laravel_server/storage/framework/testing/.gitignore similarity index 100% rename from laravel/storage/framework/testing/.gitignore rename to laravel_server/storage/framework/testing/.gitignore diff --git a/laravel/storage/framework/views/.gitignore b/laravel_server/storage/framework/views/.gitignore similarity index 100% rename from laravel/storage/framework/views/.gitignore rename to laravel_server/storage/framework/views/.gitignore diff --git a/laravel/storage/logs/.gitignore b/laravel_server/storage/logs/.gitignore similarity index 100% rename from laravel/storage/logs/.gitignore rename to laravel_server/storage/logs/.gitignore diff --git a/laravel/tests/CreatesApplication.php b/laravel_server/tests/CreatesApplication.php similarity index 100% rename from laravel/tests/CreatesApplication.php rename to laravel_server/tests/CreatesApplication.php diff --git a/laravel/tests/Feature/ExampleTest.php b/laravel_server/tests/Feature/ExampleTest.php similarity index 100% rename from laravel/tests/Feature/ExampleTest.php rename to laravel_server/tests/Feature/ExampleTest.php diff --git a/laravel/tests/TestCase.php b/laravel_server/tests/TestCase.php similarity index 100% rename from laravel/tests/TestCase.php rename to laravel_server/tests/TestCase.php diff --git a/laravel/tests/Unit/ExampleTest.php b/laravel_server/tests/Unit/ExampleTest.php similarity index 100% rename from laravel/tests/Unit/ExampleTest.php rename to laravel_server/tests/Unit/ExampleTest.php diff --git a/laravel/webpack.mix.js b/laravel_server/webpack.mix.js similarity index 83% rename from laravel/webpack.mix.js rename to laravel_server/webpack.mix.js index fe70dd1..e9892ba 100644 --- a/laravel/webpack.mix.js +++ b/laravel_server/webpack.mix.js @@ -14,6 +14,5 @@ let mix = require('laravel-mix'); mix.js('resources/assets/js/vueapp.js', 'public/js'); //mix.js('resources/assets/js/vueapp.js', 'public/js').extract(['vue', 'axios', 'jquery']); -//mix.sass('resources/assets/sass/app.scss', 'public/css'); +mix.sass('resources/assets/sass/app.scss', 'public/css'); -//mix.js('resources/assets/js/tictactoe.js', 'public/js'); diff --git a/node_server/gamelist.js b/node_server/gamelist.js index 000ebbf..a1d8c13 100644 --- a/node_server/gamelist.js +++ b/node_server/gamelist.js @@ -1,6 +1,6 @@ /*jshint esversion: 6 */ -var TicTacToeGame = require('./gamemodel.js'); +var MemoryGame = require('./gamemodel.js'); class GameList { constructor() { @@ -13,24 +13,38 @@ class GameList { return game; } - createGame(playerName, socketID) { + createGame(socketID) { this.contadorID = this.contadorID+1; - var game = new TicTacToeGame(this.contadorID, playerName); - game.player1SocketID = socketID; + var game = new MemoryGame(this.contadorID, socketID); + //game.players[1] = socketID; this.games.set(game.gameID, game); return game; } - joinGame(gameID, playerName, socketID) { + joinGame(gameID, socketID) { let game = this.gameByID(gameID); if (game===null) { return null; } - game.join(playerName); - game.player2SocketID = socketID; + + game.join(socketID); + //game.player2SocketID = socketID; return game; } + startGame(gameID, socketID) { + + let game = this.gameByID(gameID); + if (game===null) { + return null; + } + + game.startGame(); + //game.player2SocketID = socketID; + return game; + } + + removeGame(gameID, socketID) { let game = this.gameByID(gameID); if (game===null) { @@ -40,7 +54,7 @@ class GameList { game.player1SocketID = ""; } else if (game.player2SocketID == socketID) { game.player2SocketID = ""; - } + } if ((game.player1SocketID === "") && (game.player2SocketID === "")) { this.games.delete(gameID); } @@ -50,24 +64,29 @@ class GameList { getConnectedGamesOf(socketID) { let games = []; for (var [key, value] of this.games) { - if ((value.player1SocketID == socketID) || (value.player2SocketID == socketID)) { - games.push(value); - } - } - return games; + for(let i=0; i game.players.length || playerTurn < 0) { socket.emit('invalid_play', {'type': 'Invalid_Player', 'game': game}); return; - } - if (game.play(numPlayer, data.index)) { + }*/ + if (game.play( playerSocket, data.x, data.y)) { io.to(game.gameID).emit('game_changed', game); } else { socket.emit('invalid_play', {'type': 'Invalid_Play', 'game': game}); @@ -89,7 +93,7 @@ io.on('connection', function (socket) { socket.emit('my_active_games', my_games); }); - socket.on('get_my_lobby_games', function (){ + socket.on('get_my_lobby_games', function (data){ var my_games= games.getLobbyGamesOf(socket.id); socket.emit('my_lobby_games', my_games); });