diff --git a/.deploy/docker/apache2.conf b/.deploy/docker/apache2.conf index e00594817e..da5454d87d 100644 --- a/.deploy/docker/apache2.conf +++ b/.deploy/docker/apache2.conf @@ -1,73 +1,3 @@ -# This is the main Apache server configuration file. It contains the -# configuration directives that give the server its instructions. -# See http://httpd.apache.org/docs/2.4/ for detailed information about -# the directives and /usr/share/doc/apache2/README.Debian about Debian specific -# hints. -# -# -# Summary of how the Apache 2 configuration works in Debian: -# The Apache 2 web server configuration in Debian is quite different to -# upstream's suggested way to configure the web server. This is because Debian's -# default Apache2 installation attempts to make adding and removing modules, -# virtual hosts, and extra configuration directives as flexible as possible, in -# order to make automating the changes and administering the server as easy as -# possible. - -# It is split into several files forming the configuration hierarchy outlined -# below, all located in the /etc/apache2/ directory: -# -# /etc/apache2/ -# |-- apache2.conf -# | `-- ports.conf -# |-- mods-enabled -# | |-- *.load -# | `-- *.conf -# |-- conf-enabled -# | `-- *.conf -# `-- sites-enabled -# `-- *.conf -# -# -# * apache2.conf is the main configuration file (this file). It puts the pieces -# together by including all remaining configuration files when starting up the -# web server. -# -# * ports.conf is always included from the main configuration file. It is -# supposed to determine listening ports for incoming connections which can be -# customized anytime. -# -# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ -# directories contain particular configuration snippets which manage modules, -# global configuration fragments, or virtual host configurations, -# respectively. -# -# They are activated by symlinking available configuration files from their -# respective *-available/ counterparts. These should be managed by using our -# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See -# their respective man pages for detailed information. -# -# * The binary is called apache2. Due to the use of environment variables, in -# the default configuration, apache2 needs to be started/stopped with -# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not -# work with the default configuration. - - -# Global configuration -# - -# -# ServerRoot: The top of the directory tree under which the server's -# configuration, error, and log files are kept. -# -# NOTE! If you intend to place this on an NFS (or otherwise network) -# mounted filesystem then please read the Mutex documentation (available -# at ); -# you will save yourself a lot of trouble. -# -# Do NOT add a slash at the end of the directory path. -# -#ServerRoot "/etc/apache2" - # # The accept serialization lock file MUST BE STORED ON A LOCAL DISK. # diff --git a/.deploy/docker/build-amd64.sh b/.deploy/docker/build-amd64.sh new file mode 100755 index 0000000000..4a80ab83b2 --- /dev/null +++ b/.deploy/docker/build-amd64.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# build image +echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + +if [ "$TRAVIS_BRANCH" == "develop" ]; then + echo "Build develop amd64" + docker build -t jc5x/firefly-iii:develop-amd -f Dockerfile . + docker push jc5x/firefly-iii:develop-amd +fi + +if [ "$TRAVIS_BRANCH" == "master" ]; then + echo "Build master amd64" + docker build -t jc5x/firefly-iii:latest-amd -f Dockerfile . + docker tag jc5x/firefly-iii:latest-amd jc5x/firefly-iii:release-$VERSION-amd + docker push jc5x/firefly-iii:latest-amd + docker push jc5x/firefly-iii:release-$VERSION-amd +fi \ No newline at end of file diff --git a/.deploy/docker/build-arm.sh b/.deploy/docker/build-arm.sh new file mode 100755 index 0000000000..5e2df5c204 --- /dev/null +++ b/.deploy/docker/build-arm.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +docker run --rm --privileged multiarch/qemu-user-static:register --reset + + +# get qemu-arm-static binary +mkdir tmp +pushd tmp && \ +curl -L -o qemu-arm-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/v2.6.0/qemu-arm-static.tar.gz && \ +tar xzf qemu-arm-static.tar.gz && \ +popd + +# build image +echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + +if [ "$TRAVIS_BRANCH" == "develop" ]; then + echo "Build develop arm" + docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile-ARM . + docker push jc5x/firefly-iii:develop-arm +fi + +if [ "$TRAVIS_BRANCH" == "master" ]; then + echo "Build master arm" + docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile-ARM . + docker tag jc5x/firefly-iii:latest-arm jc5x/firefly-iii:release-$VERSION-arm + docker push jc5x/firefly-iii:latest-arm + docker push jc5x/firefly-iii:release-$VERSION-arm +fi \ No newline at end of file diff --git a/.deploy/docker/cronjob.conf b/.deploy/docker/cronjob.conf deleted file mode 100644 index 71aacd84eb..0000000000 --- a/.deploy/docker/cronjob.conf +++ /dev/null @@ -1,11 +0,0 @@ -[program:cron] -command=/usr/sbin/cron -f -L 15 -user=root -autostart=true -autorestart=true -stdout_events_enabled=true -stderr_events_enabled=true -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -startsecs=10 -startretries=3 diff --git a/.deploy/docker/docker.env b/.deploy/docker/docker.env deleted file mode 100644 index 7ba55b06fe..0000000000 --- a/.deploy/docker/docker.env +++ /dev/null @@ -1,6 +0,0 @@ -FF_APP_ENV=local -FF_APP_KEY=S0m3R@nd0mString0f32Ch@rsEx@ct1y -FF_DB_HOST= -FF_DB_NAME= -FF_DB_USER= -FF_DB_PASSWORD= \ No newline at end of file diff --git a/.deploy/docker/entrypoint.sh b/.deploy/docker/entrypoint.sh index e00eb3164e..326d932e26 100755 --- a/.deploy/docker/entrypoint.sh +++ b/.deploy/docker/entrypoint.sh @@ -1,42 +1,62 @@ #!/bin/bash +echo "Now in entrypoint.sh for Firefly III" + # make sure the correct directories exists (suggested by @chrif): -mkdir -p $FIREFLY_PATH/storage/app +echo "Making directories..." mkdir -p $FIREFLY_PATH/storage/app/public mkdir -p $FIREFLY_PATH/storage/build mkdir -p $FIREFLY_PATH/storage/database mkdir -p $FIREFLY_PATH/storage/debugbar mkdir -p $FIREFLY_PATH/storage/export -mkdir -p $FIREFLY_PATH/storage/framework/cache mkdir -p $FIREFLY_PATH/storage/framework/cache/data mkdir -p $FIREFLY_PATH/storage/framework/sessions mkdir -p $FIREFLY_PATH/storage/framework/testing -mkdir -p $FIREFLY_PATH/storage/framework/views +mkdir -p $FIREFLY_PATH/storage/framework/views/v1 +mkdir -p $FIREFLY_PATH/storage/framework/views/v2 mkdir -p $FIREFLY_PATH/storage/logs mkdir -p $FIREFLY_PATH/storage/upload +echo "Touch DB file (if SQLlite)..." if [[ $DB_CONNECTION == "sqlite" ]] then touch $FIREFLY_PATH/storage/database/database.sqlite + echo "Touched!" +fi + +if [[ $FF_DB_CONNECTION == "sqlite" ]] +then + touch $FIREFLY_PATH/storage/database/database.sqlite + echo "Touched!" fi # make sure we own the volumes: +echo "Run chown on ${FIREFLY_PATH}/storage..." chown -R www-data:www-data -R $FIREFLY_PATH/storage +echo "Run chmod on ${FIREFLY_PATH}/storage..." chmod -R 775 $FIREFLY_PATH/storage # remove any lingering files that may break upgrades: +echo "Remove log file..." rm -f $FIREFLY_PATH/storage/logs/laravel.log +echo "Map environment variables on .env file..." cat .env.docker | envsubst > .env +echo "Dump auto load..." composer dump-autoload +echo "Discover packages..." php artisan package:discover +echo "Run various artisan commands..." php artisan migrate --seed +php artisan firefly:decrypt-all php artisan firefly:upgrade-database php artisan firefly:verify php artisan passport:install php artisan cache:clear php artisan firefly:instructions install -exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf --nodaemon \ No newline at end of file + +echo "Go!" +exec apache2-foreground \ No newline at end of file diff --git a/.deploy/docker/firefly-iii.conf b/.deploy/docker/firefly-iii.conf deleted file mode 100644 index 5ee1c2eb28..0000000000 --- a/.deploy/docker/firefly-iii.conf +++ /dev/null @@ -1,6 +0,0 @@ -[program:apache2] -command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" -stdout_events_enabled=true -stderr_events_enabled=true -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 \ No newline at end of file diff --git a/.deploy/docker/manifest.sh b/.deploy/docker/manifest.sh new file mode 100755 index 0000000000..7dc254cc47 --- /dev/null +++ b/.deploy/docker/manifest.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +if [ "$TRAVIS_BRANCH" == "develop" ]; then + TARGET=jc5x/firefly-iii:develop + ARM=jc5x/firefly-iii:develop-arm + AMD=jc5x/firefly-iii:develop-amd + + docker manifest create $TARGET $AMD $ARM + docker manifest annotate $TARGET $ARM --arch arm --os linux + docker manifest annotate $TARGET $AMD --arch amd64 --os linux + docker manifest push $TARGET +fi + +echo "The version is $VERSION" + +if [ "$TRAVIS_BRANCH" == "master" ]; then + TARGET=jc5x/firefly-iii:latest + ARM=jc5x/firefly-iii:latest-arm + AMD=jc5x/firefly-iii:latest-amd + + docker manifest create $TARGET $AMD $ARM + docker manifest annotate $TARGET $ARM --arch arm --os linux + docker manifest annotate $TARGET $AMD --arch amd64 --os linux + docker manifest push $TARGET + + # and another one for version specific: + TARGET=jc5x/firefly-iii:release-$VERSION + ARM=jc5x/firefly-iii:release-$VERSION-arm + AMD=jc5x/firefly-iii:release-$VERSION-amd + + docker manifest create $TARGET $AMD $ARM + docker manifest annotate $TARGET $ARM --arch arm --os linux + docker manifest annotate $TARGET $AMD --arch amd64 --os linux + docker manifest push $TARGET +fi diff --git a/.deploy/docker/supervisord.conf b/.deploy/docker/supervisord.conf deleted file mode 100644 index 479120ed38..0000000000 --- a/.deploy/docker/supervisord.conf +++ /dev/null @@ -1,30 +0,0 @@ -# supervisor config file -# Adapted from the config file distributed with the supervisor package on Debian -# Jessie - -# Enable supervisord in non-daemon mode. Disable the logfile as we receive -# log messages via stdout/err. Set up the child process log directory in case -# the user doesn't set logging to stdout/err. -[supervisord] -nodaemon = true -logfile = NONE -pidfile = /var/run/supervisord.pid -childlogdir = /var/log/supervisor -loglevel=debug - -# Enable supervisorctl via RPC interface over Unix socket -[unix_http_server] -file = /var/run/supervisor.sock -chmod = 0700 - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[supervisorctl] -serverurl = unix:///var/run/supervisor.sock - - -# Include conf files for child processes -# Debian/Ubuntu packages use /etc/supervisor/conf.d -[include] -files = /etc/supervisor/conf.d/*.conf \ No newline at end of file diff --git a/.env.docker b/.env.docker index 7267344004..414a0c2578 100644 --- a/.env.docker +++ b/.env.docker @@ -93,8 +93,14 @@ SEND_REPORT_JOURNALS=${SEND_REPORT_JOURNALS} # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY=${MAPBOX_API_KEY} -# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. -# Please note that this will only work for paid fixer.io accounts because they severly limited +# Firefly III currently supports two provider for live Currency Exchange Rates: +# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one. +# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, +# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key. +CER_PROVIDER=${CER_PROVIDER} +# If you have select "fixer" as default currency exchange rates, +# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited # the free API up to the point where you might as well offer nothing. FIXER_API_KEY=${FIXER_API_KEY} diff --git a/.env.example b/.env.example index a626fb6648..64d243c2e3 100644 --- a/.env.example +++ b/.env.example @@ -93,8 +93,14 @@ SEND_REPORT_JOURNALS=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= -# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. -# Please note that this will only work for paid fixer.io accounts because they severly limited +# Firefly III currently supports two provider for live Currency Exchange Rates: +# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one. +# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, +# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key. +CER_PROVIDER=fixer +# If you have select "fixer" as default currency exchange rates, +# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited # the free API up to the point where you might as well offer nothing. FIXER_API_KEY= diff --git a/.env.heroku b/.env.heroku index 91265ca0b9..483635cfca 100644 --- a/.env.heroku +++ b/.env.heroku @@ -93,8 +93,14 @@ SEND_REPORT_JOURNALS=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= -# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. -# Please note that this will only work for paid fixer.io accounts because they severly limited +# Firefly III currently supports two provider for live Currency Exchange Rates: +# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one. +# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, +# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key. +CER_PROVIDER=fixer +# If you have select "fixer" as default currency exchange rates, +# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited # the free API up to the point where you might as well offer nothing. FIXER_API_KEY= diff --git a/.env.sandstorm b/.env.sandstorm index 45842c2845..92aa14ff50 100755 --- a/.env.sandstorm +++ b/.env.sandstorm @@ -3,7 +3,7 @@ APP_ENV=local # Set to true if you want to see debug information in error screens. -APP_DEBUG=false +APP_DEBUG=true # This should be your email address SITE_OWNER=sandstorm@example.com @@ -93,8 +93,14 @@ SEND_REPORT_JOURNALS=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= -# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. -# Please note that this will only work for paid fixer.io accounts because they severly limited +# Firefly III currently supports two provider for live Currency Exchange Rates: +# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one. +# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, +# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key. +CER_PROVIDER=fixer +# If you have select "fixer" as default currency exchange rates, +# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited # the free API up to the point where you might as well offer nothing. FIXER_API_KEY= diff --git a/.env.testing b/.env.testing index 0ac26d6891..353bdac8c3 100644 --- a/.env.testing +++ b/.env.testing @@ -93,8 +93,14 @@ SEND_REPORT_JOURNALS=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= -# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. -# Please note that this will only work for paid fixer.io accounts because they severly limited +# Firefly III currently supports two provider for live Currency Exchange Rates: +# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one. +# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, +# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key. +CER_PROVIDER=fixer +# If you have select "fixer" as default currency exchange rates, +# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited # the free API up to the point where you might as well offer nothing. FIXER_API_KEY= diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 3b35ad47c4..bcb83cccdc 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -5,21 +5,23 @@ about: Create a report to help Firefly III improve --- **Bug description** -I am running Firefly III version x.x.x +I am running Firefly III version x.x.x, and my problem is: -(please give a clear and concise description of what the bug is) + **Steps to reproduce** -What do you need to do to trigger this bug? + **Expected behavior** -What do you expect to see after those steps? + **Extra info** -Please add extra info here, such as OS, browser, and the output from the /debug page of your Firefly III installation (click the version at the bottom). + **Bonus points** -Earn bonus points by: + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md index 0db426cdf3..5572cc788e 100644 --- a/.github/ISSUE_TEMPLATE/Custom.md +++ b/.github/ISSUE_TEMPLATE/Custom.md @@ -7,21 +7,19 @@ about: Ask away! I am running Firefly III version x.x.x **Description** - - - -**Steps to reproduce** -(if relevant of course) - - + **Extra info** -Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom). + **Bonus points** -Earn bonus points by: + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md index 3bdd3d861e..3d8ed366a9 100644 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -5,17 +5,28 @@ about: Suggest an idea or feature for Firefly III --- **Description** + **Solution** -Describe what your feature would add to Firefly III. + **What are alternatives?** -Please describe what alternatives currently exist. + **Additional context** -Add any other context or screenshots about the feature request here. \ No newline at end of file + + +**Bonus points** + \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3bfa65b142..3d0e8ff063 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,11 @@ -Fixes # (if relevant) + + +Fixes issue # (if relevant) Changes in this pull request: diff --git a/.github/stale.yml b/.github/stale.yml index 8f9da31fcd..01b7d8a372 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,7 +1,7 @@ # Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 14 +daysUntilStale: 7 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. @@ -13,6 +13,8 @@ exemptLabels: - enhancement - feature - bug + - possible-bug + - announcement # Set to true to ignore issues in a project (defaults to false) exemptProjects: false @@ -53,4 +55,4 @@ limitPerRun: 30 # issues: # exemptLabels: -# - confirmed \ No newline at end of file +# - confirmed diff --git a/.sandstorm/changelog.md b/.sandstorm/changelog.md index faa0b25507..75e45b90ad 100644 --- a/.sandstorm/changelog.md +++ b/.sandstorm/changelog.md @@ -1,3 +1,53 @@ +# 4.7.10 +- [Issue 2037](https://github.com/firefly-iii/firefly-iii/issues/2037) Added some new magic keywords to reports. +- Added a new currency exchange rate service, [ratesapi.io](https://ratesapi.io/), that does not require expensive API keys. Built by [@BoGnY](https://github.com/BoGnY). +- Added Chinese Traditional translations. Thanks! +- [Issue 1977](https://github.com/firefly-iii/firefly-iii/issues/1977) Docker image now includes memcached support +- [Issue 2031](https://github.com/firefly-iii/firefly-iii/issues/2031) A new generic debit/credit indicator for imports. +- The new Docker image no longer has the capability to run cron jobs, and will no longer generate your recurring transactions for you. This has been done to simplify the build and make sure your Docker container runs one service, as it should. To set up a cron job for your new Docker container, [check out the documentation](https://docs.firefly-iii.org/en/latest/installation/cronjob.html). +- Due to a change in the database structure, this upgrade will reset your preferences. Sorry about that. +- I will no longer accept PR's that introduce new currencies. +- Firefly III no longer encrypts the database and will [decrypt the database]() on its first run. +- [Issue 1923](https://github.com/firefly-iii/firefly-iii/issues/1923) Broken window position for date picker. +- [Issue 1967](https://github.com/firefly-iii/firefly-iii/issues/1967) Attachments were hidden in bill view. +- [Issue 1927](https://github.com/firefly-iii/firefly-iii/issues/1927) It was impossible to make recurring transactions skip. +- [Issue 1929](https://github.com/firefly-iii/firefly-iii/issues/1929) Fix the recurring transactions calendar overview. +- [Issue 1933](https://github.com/firefly-iii/firefly-iii/issues/1933) Fixed a bug that made it impossible to authenticate to FreeIPA servers. +- [Issue 1938](https://github.com/firefly-iii/firefly-iii/issues/1938) The importer can now handle the insane way Postbank (DE) formats its numbers. +- [Issue 1942](https://github.com/firefly-iii/firefly-iii/issues/1942) Favicons are relative so Scriptaculous installations work better. +- [Issue 1944](https://github.com/firefly-iii/firefly-iii/issues/1944) Make sure that the search allows you to mass-select transactions. +- [Issue 1945](https://github.com/firefly-iii/firefly-iii/issues/1945) Slight UI change so the drop-down menu renders better. +- [Issue 1955](https://github.com/firefly-iii/firefly-iii/issues/1955) Fixed a bug in the category report. +- [Issue 1968](https://github.com/firefly-iii/firefly-iii/issues/1968) The yearly range would jump to 1-Jan / 1-Jan instead of 1-Jan / 31-Dec +- [Issue 1975](https://github.com/firefly-iii/firefly-iii/issues/1975) Fixed explanation for missing credit card liabilities. +- [Issue 1979](https://github.com/firefly-iii/firefly-iii/issues/1979) Make sure tags are trimmed. +- [Issue 1983](https://github.com/firefly-iii/firefly-iii/issues/1983) Could not use your favorite decimal separator. +- [Issue 1989](https://github.com/firefly-iii/firefly-iii/issues/1989) Bug in YNAB importer forced you to select all accounts. +- [Issue 1990](https://github.com/firefly-iii/firefly-iii/issues/1990) Rule description was invisible in edit screen. +- [Issue 1996](https://github.com/firefly-iii/firefly-iii/issues/1996) Deleted budget would inadvertently also hide transactions. +- [Issue 2001](https://github.com/firefly-iii/firefly-iii/issues/2001) Various issues with tag chart view. +- [Issue 2009](https://github.com/firefly-iii/firefly-iii/issues/2009) Could not change recurrence back to "forever". +- [Issue 2033](https://github.com/firefly-iii/firefly-iii/issues/2033) Longitude can go from -180 to 180. +- [Issue 2034](https://github.com/firefly-iii/firefly-iii/issues/2034) Rules were not being triggered in mass-edit. +- #2043 In rare instances the repetition of a recurring transaction was displayed incorrectly. +- Fixed broken translations in the recurring transactions overview. +- When you create a recurring transfer you make make it fill (or empty) a piggy bank. This was not working, despite a fix in 4.7.8. +- Fixed a bug where the importer would not be capable of creating new currencies. +- Rule trigger tester would skip the amount. +- OAuth2 form can now submit back to original requester. +- Submitting transactions with a disabled currency will auto-enable the currency. +- The documentation now states that "Deposit" is a possible return when you get a transaction. +- "savingAsset" was incorrectly documented as "savingsAsset". +- Account endpoint can now return type "reconciliation" and "initial-balance" correctly. +- New API endpoint under `/summary/basic` that gives you a basic overview of the user's finances. +- New API endpoints under `/chart/*` to allow you to render charts. +- `/accounts/x/transactions` now supports the limit query parameter. +- `/budgets/x/transactions` now supports the limit query parameter. +- `/available_budgets` now supports custom start and end date parameters. +- New endpoint `/preferences/prefName` to retrieve a single preference. +- Added field `account_name` to all piggy banks. +- New tag cloud in API. + # 4.7.9 - [Issue 1622](https://github.com/firefly-iii/firefly-iii/issues/1622) Can now unlink a transaction from a bill. - [Issue 1848](https://github.com/firefly-iii/firefly-iii/issues/1848) Added support for the Swiss Franc. diff --git a/.sandstorm/launcher.sh b/.sandstorm/launcher.sh index 515a1413ab..d203eb5c92 100755 --- a/.sandstorm/launcher.sh +++ b/.sandstorm/launcher.sh @@ -25,9 +25,9 @@ mkdir -p /var/storage/build mkdir -p /var/storage/database mkdir -p /var/storage/debugbar mkdir -p /var/storage/export -mkdir -p /var/storage/framework/cache +mkdir -p /var/storage/framework/cache/v1 mkdir -p /var/storage/framework/sessions -mkdir -p /var/storage/framework/views +mkdir -p /var/storage/framework/views/v1 mkdir -p /var/storage/logs mkdir -p /var/storage/upload @@ -58,9 +58,5 @@ echo "Migrating..." php /opt/app/artisan migrate --seed --force echo "Done!" -echo "Clear cache.." -php /opt/app/artisan cache:clear -echo "Done" - # Start nginx. /usr/sbin/nginx -c /opt/app/.sandstorm/service-config/nginx.conf -g "daemon off;" diff --git a/.sandstorm/sandstorm-files.list b/.sandstorm/sandstorm-files.list index 15c1aaac96..0522104dae 100644 --- a/.sandstorm/sandstorm-files.list +++ b/.sandstorm/sandstorm-files.list @@ -2,23 +2,30 @@ # This file is automatically updated and rewritten in sorted order every time # the app runs in dev mode. You may manually add or remove files, but don't # expect comments or ordering to be retained. +app-graphics bin/bash bin/cat bin/chmod bin/dash +bin/dir bin/grep bin/hostname +bin/ls bin/mkdir +bin/nano bin/rm bin/sed bin/sh bin/sleep bin/stty etc/alternatives/php +etc/alternatives/vi +etc/bash.bashrc etc/bindresvport.blacklist etc/default/nss etc/hosts.allow etc/hosts.deny +etc/inputrc etc/ld.so.cache etc/locale.alias etc/localtime @@ -26,6 +33,7 @@ etc/mysql/conf.d etc/mysql/conf.d/mysqld_safe_syslog.cnf etc/mysql/conf.d/sandstorm.cnf etc/mysql/my.cnf +etc/nanorc etc/php/7.2/cli/conf.d etc/php/7.2/cli/conf.d/10-mysqlnd.ini etc/php/7.2/cli/conf.d/10-opcache.ini @@ -44,6 +52,7 @@ etc/php/7.2/cli/conf.d/20-gettext.ini etc/php/7.2/cli/conf.d/20-iconv.ini etc/php/7.2/cli/conf.d/20-intl.ini etc/php/7.2/cli/conf.d/20-json.ini +etc/php/7.2/cli/conf.d/20-ldap.ini etc/php/7.2/cli/conf.d/20-mbstring.ini etc/php/7.2/cli/conf.d/20-mysqli.ini etc/php/7.2/cli/conf.d/20-pdo_mysql.ini @@ -81,6 +90,7 @@ etc/php/7.2/fpm/conf.d/20-gettext.ini etc/php/7.2/fpm/conf.d/20-iconv.ini etc/php/7.2/fpm/conf.d/20-intl.ini etc/php/7.2/fpm/conf.d/20-json.ini +etc/php/7.2/fpm/conf.d/20-ldap.ini etc/php/7.2/fpm/conf.d/20-mbstring.ini etc/php/7.2/fpm/conf.d/20-mysqli.ini etc/php/7.2/fpm/conf.d/20-pdo_mysql.ini @@ -116,6 +126,7 @@ etc/php/7.2/mods-available/gettext.ini etc/php/7.2/mods-available/iconv.ini etc/php/7.2/mods-available/intl.ini etc/php/7.2/mods-available/json.ini +etc/php/7.2/mods-available/ldap.ini etc/php/7.2/mods-available/mbstring.ini etc/php/7.2/mods-available/mysqli.ini etc/php/7.2/mods-available/mysqlnd.ini @@ -140,9 +151,16 @@ etc/php/7.2/mods-available/xsl.ini etc/php/7.2/mods-available/zip.ini etc/services etc/ssl/openssl.cnf +etc/vim/vimrc.tiny +lib/terminfo/a/ansi +lib/terminfo/d/dumb lib/x86_64-linux-gnu/ld-2.19.so +lib/x86_64-linux-gnu/libacl.so.1 +lib/x86_64-linux-gnu/libacl.so.1.1.0 lib/x86_64-linux-gnu/libaio.so.1 lib/x86_64-linux-gnu/libaio.so.1.0.1 +lib/x86_64-linux-gnu/libattr.so.1 +lib/x86_64-linux-gnu/libattr.so.1.1.0 lib/x86_64-linux-gnu/libbsd.so.0 lib/x86_64-linux-gnu/libbsd.so.0.7.0 lib/x86_64-linux-gnu/libc-2.19.so @@ -168,6 +186,8 @@ lib/x86_64-linux-gnu/libm-2.19.so lib/x86_64-linux-gnu/libm.so.6 lib/x86_64-linux-gnu/libncurses.so.5 lib/x86_64-linux-gnu/libncurses.so.5.9 +lib/x86_64-linux-gnu/libncursesw.so.5 +lib/x86_64-linux-gnu/libncursesw.so.5.9 lib/x86_64-linux-gnu/libnsl-2.19.so lib/x86_64-linux-gnu/libnsl.so.1 lib/x86_64-linux-gnu/libnss_compat-2.19.so @@ -200,7 +220,8 @@ lib/x86_64-linux-gnu/libwrap.so.0.7.6 lib/x86_64-linux-gnu/libz.so.1 lib/x86_64-linux-gnu/libz.so.1.2.8 lib64/ld-linux-x86-64.so.2 -opt/app/.codeclimate.yml +opt +opt/app opt/app/.env opt/app/.env.docker opt/app/.env.example @@ -208,6 +229,7 @@ opt/app/.env.heroku opt/app/.env.sandstorm opt/app/.gitattributes opt/app/.htaccess +opt/app/.locales opt/app/.sandstorm/.gitattributes opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_provision opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name @@ -253,14 +275,16 @@ opt/app/app/Api/V1/Controllers/ConfigurationController.php opt/app/app/Api/V1/Controllers/Controller.php opt/app/app/Api/V1/Controllers/CurrencyController.php opt/app/app/Api/V1/Controllers/CurrencyExchangeRateController.php -opt/app/app/Api/V1/Controllers/JournalLinkController.php +opt/app/app/Api/V1/Controllers/ImportController.php opt/app/app/Api/V1/Controllers/LinkTypeController.php opt/app/app/Api/V1/Controllers/PiggyBankController.php opt/app/app/Api/V1/Controllers/PreferenceController.php opt/app/app/Api/V1/Controllers/RecurrenceController.php opt/app/app/Api/V1/Controllers/RuleController.php opt/app/app/Api/V1/Controllers/RuleGroupController.php +opt/app/app/Api/V1/Controllers/TagController.php opt/app/app/Api/V1/Controllers/TransactionController.php +opt/app/app/Api/V1/Controllers/TransactionLinkController.php opt/app/app/Api/V1/Controllers/UserController.php opt/app/app/Api/V1/Requests/AccountRequest.php opt/app/app/Api/V1/Requests/AttachmentRequest.php @@ -269,8 +293,8 @@ opt/app/app/Api/V1/Requests/BillRequest.php opt/app/app/Api/V1/Requests/BudgetLimitRequest.php opt/app/app/Api/V1/Requests/BudgetRequest.php opt/app/app/Api/V1/Requests/CategoryRequest.php +opt/app/app/Api/V1/Requests/ConfigurationRequest.php opt/app/app/Api/V1/Requests/CurrencyRequest.php -opt/app/app/Api/V1/Requests/JournalLinkRequest.php opt/app/app/Api/V1/Requests/LinkTypeRequest.php opt/app/app/Api/V1/Requests/PiggyBankRequest.php opt/app/app/Api/V1/Requests/PreferenceRequest.php @@ -278,9 +302,12 @@ opt/app/app/Api/V1/Requests/RecurrenceRequest.php opt/app/app/Api/V1/Requests/Request.php opt/app/app/Api/V1/Requests/RuleGroupRequest.php opt/app/app/Api/V1/Requests/RuleRequest.php +opt/app/app/Api/V1/Requests/TagRequest.php +opt/app/app/Api/V1/Requests/TransactionLinkRequest.php opt/app/app/Api/V1/Requests/TransactionRequest.php opt/app/app/Api/V1/Requests/UserRequest.php opt/app/app/Console/Commands +opt/app/app/Console/Commands/ApplyRules.php opt/app/app/Console/Commands/CreateExport.php opt/app/app/Console/Commands/CreateImport.php opt/app/app/Console/Commands/Cron.php @@ -377,6 +404,7 @@ opt/app/app/Helpers/Collector/TransactionCollector.php opt/app/app/Helpers/Collector/TransactionCollectorInterface.php opt/app/app/Helpers/Filter/AmountFilter.php opt/app/app/Helpers/Filter/CountAttachmentsFilter.php +opt/app/app/Helpers/Filter/DoubleTransactionFilter.php opt/app/app/Helpers/Filter/EmptyFilter.php opt/app/app/Helpers/Filter/FilterInterface.php opt/app/app/Helpers/Filter/InternalTransferFilter.php @@ -699,11 +727,13 @@ opt/app/app/Repositories/User/UserRepository.php opt/app/app/Repositories/User/UserRepositoryInterface.php opt/app/app/Rules/BelongsUser.php opt/app/app/Rules/IsAssetAccountId.php +opt/app/app/Rules/IsBoolean.php opt/app/app/Rules/IsValidAttachmentModel.php opt/app/app/Rules/UniqueIban.php opt/app/app/Rules/ValidRecurrenceRepetitionType.php opt/app/app/Rules/ValidRecurrenceRepetitionValue.php opt/app/app/Rules/ValidTransactions.php +opt/app/app/Rules/ZeroOrMore.php opt/app/app/Services/Bunq/ApiContext.php opt/app/app/Services/Bunq/MonetaryAccount.php opt/app/app/Services/Bunq/Payment.php @@ -766,12 +796,14 @@ opt/app/app/Support/Binder/BinderInterface.php opt/app/app/Support/Binder/BudgetList.php opt/app/app/Support/Binder/CLIToken.php opt/app/app/Support/Binder/CategoryList.php +opt/app/app/Support/Binder/ConfigurationName.php opt/app/app/Support/Binder/CurrencyCode.php opt/app/app/Support/Binder/Date.php opt/app/app/Support/Binder/ImportProvider.php opt/app/app/Support/Binder/JournalList.php opt/app/app/Support/Binder/SimpleJournalList.php opt/app/app/Support/Binder/TagList.php +opt/app/app/Support/Binder/TagOrId.php opt/app/app/Support/Binder/UnfinishedJournal.php opt/app/app/Support/CacheProperties.php opt/app/app/Support/ChartColour.php @@ -786,7 +818,10 @@ opt/app/app/Support/Facades/Navigation.php opt/app/app/Support/Facades/Preferences.php opt/app/app/Support/Facades/Steam.php opt/app/app/Support/FinTS/FinTS.php +opt/app/app/Support/FinTS/MetadataParser.php opt/app/app/Support/FireflyConfig.php +opt/app/app/Support/Http/Api/AccountFilter.php +opt/app/app/Support/Http/Api/TransactionFilter.php opt/app/app/Support/Http/Controllers/AugumentData.php opt/app/app/Support/Http/Controllers/BasicDataSupport.php opt/app/app/Support/Http/Controllers/CreateStuff.php @@ -824,6 +859,7 @@ opt/app/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php opt/app/app/Support/Import/JobConfiguration/Ynab/YnabJobConfigurationInterface.php opt/app/app/Support/Import/Placeholder/ColumnValue.php opt/app/app/Support/Import/Placeholder/ImportTransaction.php +opt/app/app/Support/Import/Routine/Bunq/PaymentConverter.php opt/app/app/Support/Import/Routine/Bunq/StageImportDataHandler.php opt/app/app/Support/Import/Routine/Bunq/StageNewHandler.php opt/app/app/Support/Import/Routine/Fake/StageAhoyHandler.php @@ -929,6 +965,7 @@ opt/app/app/TransactionRules/Triggers/ToAccountStarts.php opt/app/app/TransactionRules/Triggers/TransactionType.php opt/app/app/TransactionRules/Triggers/TriggerInterface.php opt/app/app/TransactionRules/Triggers/UserAction.php +opt/app/app/Transformers/AbstractTransformer.php opt/app/app/Transformers/AccountTransformer.php opt/app/app/Transformers/AttachmentTransformer.php opt/app/app/Transformers/AvailableBudgetTransformer.php @@ -938,19 +975,16 @@ opt/app/app/Transformers/BudgetTransformer.php opt/app/app/Transformers/CategoryTransformer.php opt/app/app/Transformers/CurrencyExchangeRateTransformer.php opt/app/app/Transformers/CurrencyTransformer.php -opt/app/app/Transformers/JournalLinkTransformer.php -opt/app/app/Transformers/JournalMetaTransformer.php +opt/app/app/Transformers/ImportJobTransformer.php opt/app/app/Transformers/LinkTypeTransformer.php -opt/app/app/Transformers/NoteTransformer.php opt/app/app/Transformers/PiggyBankEventTransformer.php opt/app/app/Transformers/PiggyBankTransformer.php opt/app/app/Transformers/PreferenceTransformer.php opt/app/app/Transformers/RecurrenceTransformer.php -opt/app/app/Transformers/RuleActionTransformer.php opt/app/app/Transformers/RuleGroupTransformer.php opt/app/app/Transformers/RuleTransformer.php -opt/app/app/Transformers/RuleTriggerTransformer.php opt/app/app/Transformers/TagTransformer.php +opt/app/app/Transformers/TransactionLinkTransformer.php opt/app/app/Transformers/TransactionTransformer.php opt/app/app/Transformers/UserTransformer.php opt/app/app/User.php @@ -966,6 +1000,8 @@ opt/app/composer.json opt/app/composer.lock opt/app/composer.phar opt/app/config +opt/app/config/adldap.php +opt/app/config/adldap_auth.php opt/app/config/app.php opt/app/config/auth.php opt/app/config/breadcrumbs.php @@ -987,7 +1023,9 @@ opt/app/config/session.php opt/app/config/twigbridge.php opt/app/config/upgrade.php opt/app/config/view.php +opt/app/database/factories/AccountFactory.php opt/app/database/factories/ModelFactory.php +opt/app/database/factories/UserFactory.php opt/app/database/migrations opt/app/database/migrations/2016_06_16_000000_create_support_tables.php opt/app/database/migrations/2016_06_16_000001_create_users_table.php @@ -1013,6 +1051,7 @@ opt/app/database/migrations/2018_04_07_210913_changes_for_v473.php opt/app/database/migrations/2018_04_29_174524_changes_for_v474.php opt/app/database/migrations/2018_06_08_200526_changes_for_v475.php opt/app/database/migrations/2018_09_05_195147_changes_for_v477.php +opt/app/database/migrations/2018_11_06_172532_changes_for_v479.php opt/app/database/seeds/AccountTypeSeeder.php opt/app/database/seeds/ConfigSeeder.php opt/app/database/seeds/DatabaseSeeder.php @@ -1027,391 +1066,983 @@ opt/app/public/.htaccess opt/app/public/.well-known/security.txt opt/app/public/android-chrome-192x192.png opt/app/public/android-chrome-512x512.png +opt/app/public/apple-touch-icon-120x120-precomposed.png +opt/app/public/apple-touch-icon-120x120.png +opt/app/public/apple-touch-icon-152x152-precomposed.png +opt/app/public/apple-touch-icon-152x152.png +opt/app/public/apple-touch-icon-180x180-precomposed.png +opt/app/public/apple-touch-icon-180x180.png +opt/app/public/apple-touch-icon-60x60-precomposed.png +opt/app/public/apple-touch-icon-60x60.png +opt/app/public/apple-touch-icon-76x76-precomposed.png +opt/app/public/apple-touch-icon-76x76.png +opt/app/public/apple-touch-icon-precomposed.png opt/app/public/apple-touch-icon.png opt/app/public/browserconfig.xml -opt/app/public/css/.htaccess -opt/app/public/css/bootstrap-multiselect.css -opt/app/public/css/bootstrap-sortable.css -opt/app/public/css/bootstrap-tagsinput.css -opt/app/public/css/daterangepicker.css -opt/app/public/css/firefly.css -opt/app/public/css/gf-roboto.css -opt/app/public/css/gf-source.css -opt/app/public/css/jquery-ui/.htaccess -opt/app/public/css/jquery-ui/images/.htaccess -opt/app/public/css/jquery-ui/images/ui-icons_444444_256x240.png -opt/app/public/css/jquery-ui/images/ui-icons_555555_256x240.png -opt/app/public/css/jquery-ui/images/ui-icons_777620_256x240.png -opt/app/public/css/jquery-ui/images/ui-icons_777777_256x240.png -opt/app/public/css/jquery-ui/images/ui-icons_cc0000_256x240.png -opt/app/public/css/jquery-ui/images/ui-icons_ffffff_256x240.png -opt/app/public/css/jquery-ui/jquery-ui.structure.min.css -opt/app/public/css/jquery-ui/jquery-ui.theme.min.css opt/app/public/favicon-16x16.png opt/app/public/favicon-32x32.png opt/app/public/favicon.ico -opt/app/public/fonts/.htaccess -opt/app/public/fonts/Roboto-Regular-cyrillic-ext.woff2 -opt/app/public/fonts/Roboto-Regular-cyrillic.woff2 -opt/app/public/fonts/Roboto-Regular-greek-ext.woff2 -opt/app/public/fonts/Roboto-Regular-greek.woff2 -opt/app/public/fonts/Roboto-Regular-latin-ext.woff2 -opt/app/public/fonts/Roboto-Regular-latin.woff2 -opt/app/public/fonts/Roboto-Regular-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff -opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff -opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-Bold-greek.woff -opt/app/public/fonts/SourceSansPro-Bold-greek.woff2 -opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff -opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-Bold-latin.woff -opt/app/public/fonts/SourceSansPro-Bold-latin.woff2 -opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff -opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-greek.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-greek.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-latin.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-latin.woff2 -opt/app/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff -opt/app/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff -opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff -opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-Italic-greek.woff -opt/app/public/fonts/SourceSansPro-Italic-greek.woff2 -opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff -opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-Italic-latin.woff -opt/app/public/fonts/SourceSansPro-Italic-latin.woff2 -opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff -opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff -opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff -opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-Light-greek.woff -opt/app/public/fonts/SourceSansPro-Light-greek.woff2 -opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff -opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-Light-latin.woff -opt/app/public/fonts/SourceSansPro-Light-latin.woff2 -opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff -opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff -opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff -opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff -opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff -opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff -opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff2 -opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff -opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff -opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff -opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-Regular-greek.woff -opt/app/public/fonts/SourceSansPro-Regular-greek.woff2 -opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff -opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-Regular-latin.woff -opt/app/public/fonts/SourceSansPro-Regular-latin.woff2 -opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff -opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff -opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff -opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff -opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff2 -opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff -opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2 -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff -opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2 -opt/app/public/fonts/lato-100.woff -opt/app/public/fonts/lato-100.woff2 -opt/app/public/fonts/roboto-light-300.woff -opt/app/public/fonts/roboto-light-300.woff2 -opt/app/public/fonts/vendor/.htaccess -opt/app/public/fonts/vendor/bootstrap-sass/.htaccess -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/.htaccess -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff -opt/app/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 -opt/app/public/fonts/vendor/font-awesome/.htaccess -opt/app/public/fonts/vendor/font-awesome/fontawesome-webfont.eot -opt/app/public/fonts/vendor/font-awesome/fontawesome-webfont.svg -opt/app/public/fonts/vendor/font-awesome/fontawesome-webfont.ttf -opt/app/public/fonts/vendor/font-awesome/fontawesome-webfont.woff -opt/app/public/fonts/vendor/font-awesome/fontawesome-webfont.woff2 -opt/app/public/images/.htaccess -opt/app/public/images/error.png -opt/app/public/images/flags/.htaccess -opt/app/public/images/flags/de_DE.png -opt/app/public/images/flags/es_ES.png -opt/app/public/images/flags/fr_FR.png -opt/app/public/images/flags/id_ID.png -opt/app/public/images/flags/it_IT.png -opt/app/public/images/flags/nl_NL.png -opt/app/public/images/flags/pl_PL.png -opt/app/public/images/flags/pt_BR.png -opt/app/public/images/flags/ru_RU.png -opt/app/public/images/flags/tr_TR.png -opt/app/public/images/image.png -opt/app/public/images/loading-small.gif -opt/app/public/images/loading-wide.gif -opt/app/public/images/logos/.htaccess -opt/app/public/images/logos/bunq.png -opt/app/public/images/logos/csv.png -opt/app/public/images/logos/fake.png -opt/app/public/images/logos/file.png -opt/app/public/images/logos/fints.png -opt/app/public/images/logos/plaid.png -opt/app/public/images/logos/quovo.png -opt/app/public/images/logos/spectre.png -opt/app/public/images/logos/ynab.png -opt/app/public/images/logos/yodlee.png -opt/app/public/images/page_green.png -opt/app/public/images/page_white_acrobat.png opt/app/public/index.php -opt/app/public/js/.htaccess -opt/app/public/js/app.js -opt/app/public/js/ff/.htaccess -opt/app/public/js/ff/accounts/.htaccess -opt/app/public/js/ff/accounts/create.js -opt/app/public/js/ff/accounts/edit-reconciliation.js -opt/app/public/js/ff/accounts/edit.js -opt/app/public/js/ff/accounts/reconcile.js -opt/app/public/js/ff/accounts/show.js -opt/app/public/js/ff/admin/.htaccess -opt/app/public/js/ff/admin/update/.htaccess -opt/app/public/js/ff/admin/update/index.js -opt/app/public/js/ff/bills/.htaccess -opt/app/public/js/ff/bills/create.js -opt/app/public/js/ff/bills/edit.js -opt/app/public/js/ff/bills/show.js -opt/app/public/js/ff/budgets/.htaccess -opt/app/public/js/ff/budgets/index.js -opt/app/public/js/ff/budgets/show.js -opt/app/public/js/ff/categories/.htaccess -opt/app/public/js/ff/categories/index.js -opt/app/public/js/ff/categories/show-by-date.js -opt/app/public/js/ff/categories/show.js -opt/app/public/js/ff/charts.defaults.js -opt/app/public/js/ff/charts.js -opt/app/public/js/ff/common/autocomplete.js -opt/app/public/js/ff/export/.htaccess -opt/app/public/js/ff/export/index.js -opt/app/public/js/ff/firefly.js -opt/app/public/js/ff/guest.js -opt/app/public/js/ff/help.js -opt/app/public/js/ff/import/.htaccess -opt/app/public/js/ff/import/file/.htaccess -opt/app/public/js/ff/import/file/configure-upload.js -opt/app/public/js/ff/import/status.js -opt/app/public/js/ff/import/status_v2.js -opt/app/public/js/ff/index.js -opt/app/public/js/ff/install/.htaccess -opt/app/public/js/ff/install/index.js -opt/app/public/js/ff/intro/.htaccess -opt/app/public/js/ff/intro/intro.js -opt/app/public/js/ff/moment/.htaccess -opt/app/public/js/ff/moment/de_DE.js -opt/app/public/js/ff/moment/en_US.js -opt/app/public/js/ff/moment/es_ES.js -opt/app/public/js/ff/moment/fr_FR.js -opt/app/public/js/ff/moment/id_ID.js -opt/app/public/js/ff/moment/it_IT.js -opt/app/public/js/ff/moment/nl_NL.js -opt/app/public/js/ff/moment/pl_PL.js -opt/app/public/js/ff/moment/pt_BR.js -opt/app/public/js/ff/moment/ru_RU.js -opt/app/public/js/ff/moment/tr_TR.js -opt/app/public/js/ff/piggy-banks/.htaccess -opt/app/public/js/ff/piggy-banks/create.js -opt/app/public/js/ff/piggy-banks/edit.js -opt/app/public/js/ff/piggy-banks/index.js -opt/app/public/js/ff/piggy-banks/show.js -opt/app/public/js/ff/preferences/.htaccess -opt/app/public/js/ff/preferences/index.js -opt/app/public/js/ff/recurring/.htaccess -opt/app/public/js/ff/recurring/create.js -opt/app/public/js/ff/recurring/edit.js -opt/app/public/js/ff/reports/.htaccess -opt/app/public/js/ff/reports/account/.htaccess -opt/app/public/js/ff/reports/account/month.js -opt/app/public/js/ff/reports/all.js -opt/app/public/js/ff/reports/audit/.htaccess -opt/app/public/js/ff/reports/audit/all.js -opt/app/public/js/ff/reports/budget/.htaccess -opt/app/public/js/ff/reports/budget/month.js -opt/app/public/js/ff/reports/category/.htaccess -opt/app/public/js/ff/reports/category/month.js -opt/app/public/js/ff/reports/default/.htaccess -opt/app/public/js/ff/reports/default/all.js -opt/app/public/js/ff/reports/default/month.js -opt/app/public/js/ff/reports/default/multi-year.js -opt/app/public/js/ff/reports/default/year.js -opt/app/public/js/ff/reports/index.js -opt/app/public/js/ff/reports/tag/.htaccess -opt/app/public/js/ff/reports/tag/month.js -opt/app/public/js/ff/rules/.htaccess -opt/app/public/js/ff/rules/create-edit.js -opt/app/public/js/ff/rules/index.js -opt/app/public/js/ff/rules/select-transactions.js -opt/app/public/js/ff/search/.htaccess -opt/app/public/js/ff/search/index.js -opt/app/public/js/ff/tags/.htaccess -opt/app/public/js/ff/tags/create-edit.js -opt/app/public/js/ff/tags/index.js -opt/app/public/js/ff/tags/show.js -opt/app/public/js/ff/transactions/.htaccess -opt/app/public/js/ff/transactions/convert.js -opt/app/public/js/ff/transactions/list.js -opt/app/public/js/ff/transactions/mass/.htaccess -opt/app/public/js/ff/transactions/mass/edit-bulk.js -opt/app/public/js/ff/transactions/mass/edit.js -opt/app/public/js/ff/transactions/show.js -opt/app/public/js/ff/transactions/single/.htaccess -opt/app/public/js/ff/transactions/single/common.js -opt/app/public/js/ff/transactions/single/create.js -opt/app/public/js/ff/transactions/single/edit.js -opt/app/public/js/ff/transactions/split/.htaccess -opt/app/public/js/ff/transactions/split/edit.js -opt/app/public/js/lib/.htaccess -opt/app/public/js/lib/Chart.bundle.min.js -opt/app/public/js/lib/accounting.min.js -opt/app/public/js/lib/bootstrap-multiselect.js -opt/app/public/js/lib/bootstrap-sortable.js -opt/app/public/js/lib/bootstrap-tagsinput.min.js -opt/app/public/js/lib/bootstrap-tagsinput.min.js.map -opt/app/public/js/lib/bootstrap3-typeahead.min.js -opt/app/public/js/lib/chartjs-plugin-annotation.min.js -opt/app/public/js/lib/daterangepicker.js -opt/app/public/js/lib/html5shiv.min.js -opt/app/public/js/lib/jquery-ui.min.js -opt/app/public/js/lib/jquery.color-2.1.2.min.js -opt/app/public/js/lib/modernizr-custom.js -opt/app/public/js/lib/moment.min.js -opt/app/public/js/lib/respond.min.js -opt/app/public/js/lib/typeahead/.htaccess -opt/app/public/js/lib/typeahead/bloodhound.js -opt/app/public/js/lib/typeahead/bloodhound.min.js -opt/app/public/js/lib/typeahead/typeahead.bundle.js -opt/app/public/js/lib/typeahead/typeahead.bundle.min.js -opt/app/public/js/lib/typeahead/typeahead.jquery.js -opt/app/public/js/lib/typeahead/typeahead.jquery.min.js -opt/app/public/lib/.htaccess -opt/app/public/lib/adminlte/.htaccess -opt/app/public/lib/adminlte/css/.htaccess -opt/app/public/lib/adminlte/css/AdminLTE.css -opt/app/public/lib/adminlte/css/AdminLTE.min.css -opt/app/public/lib/adminlte/css/skins/.htaccess -opt/app/public/lib/adminlte/css/skins/skin-blue-light.css -opt/app/public/lib/adminlte/css/skins/skin-blue-light.min.css -opt/app/public/lib/adminlte/img/.htaccess -opt/app/public/lib/adminlte/img/icons.png -opt/app/public/lib/adminlte/js/.htaccess -opt/app/public/lib/adminlte/js/adminlte.js -opt/app/public/lib/adminlte/js/adminlte.min.js -opt/app/public/lib/adminlte/js/app.js -opt/app/public/lib/adminlte/js/app.min.js -opt/app/public/lib/bs/css/bootstrap-theme.css -opt/app/public/lib/bs/css/bootstrap-theme.css.map -opt/app/public/lib/bs/css/bootstrap-theme.min.css -opt/app/public/lib/bs/css/bootstrap-theme.min.css.map -opt/app/public/lib/bs/css/bootstrap.css -opt/app/public/lib/bs/css/bootstrap.css.map -opt/app/public/lib/bs/css/bootstrap.min.css -opt/app/public/lib/bs/css/bootstrap.min.css.map -opt/app/public/lib/bs/fonts/glyphicons-halflings-regular.eot -opt/app/public/lib/bs/fonts/glyphicons-halflings-regular.svg -opt/app/public/lib/bs/fonts/glyphicons-halflings-regular.ttf -opt/app/public/lib/bs/fonts/glyphicons-halflings-regular.woff -opt/app/public/lib/bs/fonts/glyphicons-halflings-regular.woff2 -opt/app/public/lib/bs/js/bootstrap.js -opt/app/public/lib/bs/js/bootstrap.min.js -opt/app/public/lib/bs/js/npm.js -opt/app/public/lib/fa/css/font-awesome.css -opt/app/public/lib/fa/css/font-awesome.min.css -opt/app/public/lib/fa/fonts/FontAwesome.otf -opt/app/public/lib/fa/fonts/fontawesome-webfont.eot -opt/app/public/lib/fa/fonts/fontawesome-webfont.svg -opt/app/public/lib/fa/fonts/fontawesome-webfont.ttf -opt/app/public/lib/fa/fonts/fontawesome-webfont.woff -opt/app/public/lib/fa/fonts/fontawesome-webfont.woff2 -opt/app/public/lib/fc/.htaccess -opt/app/public/lib/fc/fullcalendar.css -opt/app/public/lib/fc/fullcalendar.js -opt/app/public/lib/fc/fullcalendar.min.css -opt/app/public/lib/fc/fullcalendar.min.js -opt/app/public/lib/fc/fullcalendar.print.css -opt/app/public/lib/fc/fullcalendar.print.min.css -opt/app/public/lib/intro/.htaccess -opt/app/public/lib/intro/intro.min.js -opt/app/public/lib/intro/introjs-rtl.min.css -opt/app/public/lib/intro/introjs.min.css -opt/app/public/lib/leaflet/.htaccess -opt/app/public/lib/leaflet/images/.htaccess -opt/app/public/lib/leaflet/images/layers-2x.png -opt/app/public/lib/leaflet/images/layers.png -opt/app/public/lib/leaflet/images/marker-icon-2x.png -opt/app/public/lib/leaflet/images/marker-icon.png -opt/app/public/lib/leaflet/images/marker-shadow.png -opt/app/public/lib/leaflet/leaflet-src.js -opt/app/public/lib/leaflet/leaflet-src.js.map -opt/app/public/lib/leaflet/leaflet.css -opt/app/public/lib/leaflet/leaflet.js -opt/app/public/lib/leaflet/leaflet.js.map opt/app/public/manifest.json opt/app/public/mix-manifest.json +opt/app/public/mstile-144x144.png opt/app/public/mstile-150x150.png +opt/app/public/mstile-310x150.png +opt/app/public/mstile-310x310.png +opt/app/public/mstile-70x70.png opt/app/public/robots.txt opt/app/public/safari-pinned-tab.svg +opt/app/public/site.webmanifest +opt/app/public/v1/css/.htaccess +opt/app/public/v1/css/bootstrap-multiselect.css +opt/app/public/v1/css/bootstrap-sortable.css +opt/app/public/v1/css/bootstrap-tagsinput.css +opt/app/public/v1/css/daterangepicker.css +opt/app/public/v1/css/firefly.css +opt/app/public/v1/css/gf-roboto.css +opt/app/public/v1/css/gf-source.css +opt/app/public/v1/css/jquery-ui/.htaccess +opt/app/public/v1/css/jquery-ui/images/.htaccess +opt/app/public/v1/css/jquery-ui/images/ui-icons_444444_256x240.png +opt/app/public/v1/css/jquery-ui/images/ui-icons_555555_256x240.png +opt/app/public/v1/css/jquery-ui/images/ui-icons_777620_256x240.png +opt/app/public/v1/css/jquery-ui/images/ui-icons_777777_256x240.png +opt/app/public/v1/css/jquery-ui/images/ui-icons_cc0000_256x240.png +opt/app/public/v1/css/jquery-ui/images/ui-icons_ffffff_256x240.png +opt/app/public/v1/css/jquery-ui/jquery-ui.structure.min.css +opt/app/public/v1/css/jquery-ui/jquery-ui.theme.min.css +opt/app/public/v1/fonts/.htaccess +opt/app/public/v1/fonts/Roboto-Regular-cyrillic-ext.woff2 +opt/app/public/v1/fonts/Roboto-Regular-cyrillic.woff2 +opt/app/public/v1/fonts/Roboto-Regular-greek-ext.woff2 +opt/app/public/v1/fonts/Roboto-Regular-greek.woff2 +opt/app/public/v1/fonts/Roboto-Regular-latin-ext.woff2 +opt/app/public/v1/fonts/Roboto-Regular-latin.woff2 +opt/app/public/v1/fonts/Roboto-Regular-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-greek.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-latin.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-Bold-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-Bold-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-greek.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-latin.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-greek.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-latin.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-Italic-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-Italic-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Light-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-Light-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Light-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-greek.woff +opt/app/public/v1/fonts/SourceSansPro-Light-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Light-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-latin.woff +opt/app/public/v1/fonts/SourceSansPro-Light-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-Light-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-Light-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-greek.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-latin.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-LightItalic-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-LightItalic-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-greek.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-latin.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-Regular-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-Regular-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-greek.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-latin.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBold-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBold-vietnamese.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-greek.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-greek.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-latin.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-latin.woff2 +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff +opt/app/public/v1/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2 +opt/app/public/v1/fonts/lato-100.woff +opt/app/public/v1/fonts/lato-100.woff2 +opt/app/public/v1/fonts/roboto-light-300.woff +opt/app/public/v1/fonts/roboto-light-300.woff2 +opt/app/public/v1/fonts/vendor/.htaccess +opt/app/public/v1/fonts/vendor/bootstrap-sass/.htaccess +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/.htaccess +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff +opt/app/public/v1/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 +opt/app/public/v1/fonts/vendor/font-awesome/.htaccess +opt/app/public/v1/fonts/vendor/font-awesome/fontawesome-webfont.eot +opt/app/public/v1/fonts/vendor/font-awesome/fontawesome-webfont.svg +opt/app/public/v1/fonts/vendor/font-awesome/fontawesome-webfont.ttf +opt/app/public/v1/fonts/vendor/font-awesome/fontawesome-webfont.woff +opt/app/public/v1/fonts/vendor/font-awesome/fontawesome-webfont.woff2 +opt/app/public/v1/images/.htaccess +opt/app/public/v1/images/error.png +opt/app/public/v1/images/flags/.htaccess +opt/app/public/v1/images/flags/de_DE.png +opt/app/public/v1/images/flags/es_ES.png +opt/app/public/v1/images/flags/fr_FR.png +opt/app/public/v1/images/flags/id_ID.png +opt/app/public/v1/images/flags/it_IT.png +opt/app/public/v1/images/flags/nl_NL.png +opt/app/public/v1/images/flags/pl_PL.png +opt/app/public/v1/images/flags/pt_BR.png +opt/app/public/v1/images/flags/ru_RU.png +opt/app/public/v1/images/flags/tr_TR.png +opt/app/public/v1/images/image.png +opt/app/public/v1/images/loading-small.gif +opt/app/public/v1/images/loading-wide.gif +opt/app/public/v1/images/logos/.htaccess +opt/app/public/v1/images/logos/bunq.png +opt/app/public/v1/images/logos/csv.png +opt/app/public/v1/images/logos/fake.png +opt/app/public/v1/images/logos/file.png +opt/app/public/v1/images/logos/fints.png +opt/app/public/v1/images/logos/plaid.png +opt/app/public/v1/images/logos/quovo.png +opt/app/public/v1/images/logos/spectre.png +opt/app/public/v1/images/logos/ynab.png +opt/app/public/v1/images/logos/yodlee.png +opt/app/public/v1/images/page_green.png +opt/app/public/v1/images/page_white_acrobat.png +opt/app/public/v1/js/.htaccess +opt/app/public/v1/js/app.js +opt/app/public/v1/js/ff/.htaccess +opt/app/public/v1/js/ff/accounts/.htaccess +opt/app/public/v1/js/ff/accounts/create.js +opt/app/public/v1/js/ff/accounts/edit-reconciliation.js +opt/app/public/v1/js/ff/accounts/edit.js +opt/app/public/v1/js/ff/accounts/reconcile.js +opt/app/public/v1/js/ff/accounts/show.js +opt/app/public/v1/js/ff/admin/.htaccess +opt/app/public/v1/js/ff/admin/update/.htaccess +opt/app/public/v1/js/ff/admin/update/index.js +opt/app/public/v1/js/ff/bills/.htaccess +opt/app/public/v1/js/ff/bills/create.js +opt/app/public/v1/js/ff/bills/edit.js +opt/app/public/v1/js/ff/bills/show.js +opt/app/public/v1/js/ff/budgets/.htaccess +opt/app/public/v1/js/ff/budgets/create.js +opt/app/public/v1/js/ff/budgets/edit.js +opt/app/public/v1/js/ff/budgets/index.js +opt/app/public/v1/js/ff/budgets/show.js +opt/app/public/v1/js/ff/categories/.htaccess +opt/app/public/v1/js/ff/categories/create.js +opt/app/public/v1/js/ff/categories/edit.js +opt/app/public/v1/js/ff/categories/index.js +opt/app/public/v1/js/ff/categories/show-by-date.js +opt/app/public/v1/js/ff/categories/show.js +opt/app/public/v1/js/ff/charts.defaults.js +opt/app/public/v1/js/ff/charts.js +opt/app/public/v1/js/ff/common/autocomplete.js +opt/app/public/v1/js/ff/export/.htaccess +opt/app/public/v1/js/ff/export/index.js +opt/app/public/v1/js/ff/firefly.js +opt/app/public/v1/js/ff/guest.js +opt/app/public/v1/js/ff/help.js +opt/app/public/v1/js/ff/import/.htaccess +opt/app/public/v1/js/ff/import/file/.htaccess +opt/app/public/v1/js/ff/import/file/configure-upload.js +opt/app/public/v1/js/ff/import/status.js +opt/app/public/v1/js/ff/import/status_v2.js +opt/app/public/v1/js/ff/index.js +opt/app/public/v1/js/ff/install/.htaccess +opt/app/public/v1/js/ff/install/index.js +opt/app/public/v1/js/ff/intro/.htaccess +opt/app/public/v1/js/ff/intro/intro.js +opt/app/public/v1/js/ff/moment/.htaccess +opt/app/public/v1/js/ff/moment/de_DE.js +opt/app/public/v1/js/ff/moment/en_US.js +opt/app/public/v1/js/ff/moment/es_ES.js +opt/app/public/v1/js/ff/moment/fr_FR.js +opt/app/public/v1/js/ff/moment/id_ID.js +opt/app/public/v1/js/ff/moment/it_IT.js +opt/app/public/v1/js/ff/moment/nl_NL.js +opt/app/public/v1/js/ff/moment/pl_PL.js +opt/app/public/v1/js/ff/moment/pt_BR.js +opt/app/public/v1/js/ff/moment/ru_RU.js +opt/app/public/v1/js/ff/moment/tr_TR.js +opt/app/public/v1/js/ff/piggy-banks/.htaccess +opt/app/public/v1/js/ff/piggy-banks/create.js +opt/app/public/v1/js/ff/piggy-banks/edit.js +opt/app/public/v1/js/ff/piggy-banks/index.js +opt/app/public/v1/js/ff/piggy-banks/show.js +opt/app/public/v1/js/ff/preferences/.htaccess +opt/app/public/v1/js/ff/preferences/index.js +opt/app/public/v1/js/ff/recurring/.htaccess +opt/app/public/v1/js/ff/recurring/create.js +opt/app/public/v1/js/ff/recurring/edit.js +opt/app/public/v1/js/ff/reports/.htaccess +opt/app/public/v1/js/ff/reports/account/.htaccess +opt/app/public/v1/js/ff/reports/account/month.js +opt/app/public/v1/js/ff/reports/all.js +opt/app/public/v1/js/ff/reports/audit/.htaccess +opt/app/public/v1/js/ff/reports/audit/all.js +opt/app/public/v1/js/ff/reports/budget/.htaccess +opt/app/public/v1/js/ff/reports/budget/month.js +opt/app/public/v1/js/ff/reports/category/.htaccess +opt/app/public/v1/js/ff/reports/category/month.js +opt/app/public/v1/js/ff/reports/default/.htaccess +opt/app/public/v1/js/ff/reports/default/all.js +opt/app/public/v1/js/ff/reports/default/month.js +opt/app/public/v1/js/ff/reports/default/multi-year.js +opt/app/public/v1/js/ff/reports/default/year.js +opt/app/public/v1/js/ff/reports/index.js +opt/app/public/v1/js/ff/reports/tag/.htaccess +opt/app/public/v1/js/ff/reports/tag/month.js +opt/app/public/v1/js/ff/rule-groups/create.js +opt/app/public/v1/js/ff/rule-groups/edit.js +opt/app/public/v1/js/ff/rules/.htaccess +opt/app/public/v1/js/ff/rules/create-edit.js +opt/app/public/v1/js/ff/rules/index.js +opt/app/public/v1/js/ff/rules/select-transactions.js +opt/app/public/v1/js/ff/search/.htaccess +opt/app/public/v1/js/ff/search/index.js +opt/app/public/v1/js/ff/tags/.htaccess +opt/app/public/v1/js/ff/tags/create-edit.js +opt/app/public/v1/js/ff/tags/index.js +opt/app/public/v1/js/ff/tags/show.js +opt/app/public/v1/js/ff/transactions/.htaccess +opt/app/public/v1/js/ff/transactions/convert.js +opt/app/public/v1/js/ff/transactions/list.js +opt/app/public/v1/js/ff/transactions/mass/.htaccess +opt/app/public/v1/js/ff/transactions/mass/edit-bulk.js +opt/app/public/v1/js/ff/transactions/mass/edit.js +opt/app/public/v1/js/ff/transactions/show.js +opt/app/public/v1/js/ff/transactions/single/.htaccess +opt/app/public/v1/js/ff/transactions/single/common.js +opt/app/public/v1/js/ff/transactions/single/create.js +opt/app/public/v1/js/ff/transactions/single/edit.js +opt/app/public/v1/js/ff/transactions/split/.htaccess +opt/app/public/v1/js/ff/transactions/split/edit.js +opt/app/public/v1/js/lib/.htaccess +opt/app/public/v1/js/lib/Chart.bundle.min.js +opt/app/public/v1/js/lib/accounting.min.js +opt/app/public/v1/js/lib/bootstrap-multiselect.js +opt/app/public/v1/js/lib/bootstrap-sortable.js +opt/app/public/v1/js/lib/bootstrap-tagsinput.min.js +opt/app/public/v1/js/lib/bootstrap-tagsinput.min.js.map +opt/app/public/v1/js/lib/bootstrap3-typeahead.min.js +opt/app/public/v1/js/lib/chartjs-plugin-annotation.min.js +opt/app/public/v1/js/lib/daterangepicker.js +opt/app/public/v1/js/lib/html5shiv.min.js +opt/app/public/v1/js/lib/jquery-ui.min.js +opt/app/public/v1/js/lib/jquery.color-2.1.2.min.js +opt/app/public/v1/js/lib/modernizr-custom.js +opt/app/public/v1/js/lib/moment.min.js +opt/app/public/v1/js/lib/respond.min.js +opt/app/public/v1/js/lib/typeahead/.htaccess +opt/app/public/v1/js/lib/typeahead/bloodhound.js +opt/app/public/v1/js/lib/typeahead/bloodhound.min.js +opt/app/public/v1/js/lib/typeahead/typeahead.bundle.js +opt/app/public/v1/js/lib/typeahead/typeahead.bundle.min.js +opt/app/public/v1/js/lib/typeahead/typeahead.jquery.js +opt/app/public/v1/js/lib/typeahead/typeahead.jquery.min.js +opt/app/public/v1/lib/.htaccess +opt/app/public/v1/lib/adminlte/.htaccess +opt/app/public/v1/lib/adminlte/css/.htaccess +opt/app/public/v1/lib/adminlte/css/AdminLTE.css +opt/app/public/v1/lib/adminlte/css/AdminLTE.min.css +opt/app/public/v1/lib/adminlte/css/skins/.htaccess +opt/app/public/v1/lib/adminlte/css/skins/skin-blue-light.css +opt/app/public/v1/lib/adminlte/css/skins/skin-blue-light.min.css +opt/app/public/v1/lib/adminlte/img/.htaccess +opt/app/public/v1/lib/adminlte/img/icons.png +opt/app/public/v1/lib/adminlte/js/.htaccess +opt/app/public/v1/lib/adminlte/js/adminlte.js +opt/app/public/v1/lib/adminlte/js/adminlte.min.js +opt/app/public/v1/lib/adminlte/js/app.js +opt/app/public/v1/lib/adminlte/js/app.min.js +opt/app/public/v1/lib/bs/css/bootstrap-theme.css +opt/app/public/v1/lib/bs/css/bootstrap-theme.css.map +opt/app/public/v1/lib/bs/css/bootstrap-theme.min.css +opt/app/public/v1/lib/bs/css/bootstrap-theme.min.css.map +opt/app/public/v1/lib/bs/css/bootstrap.css +opt/app/public/v1/lib/bs/css/bootstrap.css.map +opt/app/public/v1/lib/bs/css/bootstrap.min.css +opt/app/public/v1/lib/bs/css/bootstrap.min.css.map +opt/app/public/v1/lib/bs/fonts/glyphicons-halflings-regular.eot +opt/app/public/v1/lib/bs/fonts/glyphicons-halflings-regular.svg +opt/app/public/v1/lib/bs/fonts/glyphicons-halflings-regular.ttf +opt/app/public/v1/lib/bs/fonts/glyphicons-halflings-regular.woff +opt/app/public/v1/lib/bs/fonts/glyphicons-halflings-regular.woff2 +opt/app/public/v1/lib/bs/js/bootstrap.js +opt/app/public/v1/lib/bs/js/bootstrap.min.js +opt/app/public/v1/lib/bs/js/npm.js +opt/app/public/v1/lib/fa/css/font-awesome.css +opt/app/public/v1/lib/fa/css/font-awesome.min.css +opt/app/public/v1/lib/fa/fonts/FontAwesome.otf +opt/app/public/v1/lib/fa/fonts/fontawesome-webfont.eot +opt/app/public/v1/lib/fa/fonts/fontawesome-webfont.svg +opt/app/public/v1/lib/fa/fonts/fontawesome-webfont.ttf +opt/app/public/v1/lib/fa/fonts/fontawesome-webfont.woff +opt/app/public/v1/lib/fa/fonts/fontawesome-webfont.woff2 +opt/app/public/v1/lib/fc/.htaccess +opt/app/public/v1/lib/fc/fullcalendar.css +opt/app/public/v1/lib/fc/fullcalendar.js +opt/app/public/v1/lib/fc/fullcalendar.min.css +opt/app/public/v1/lib/fc/fullcalendar.min.js +opt/app/public/v1/lib/fc/fullcalendar.print.css +opt/app/public/v1/lib/fc/fullcalendar.print.min.css +opt/app/public/v1/lib/intro/.htaccess +opt/app/public/v1/lib/intro/intro.min.js +opt/app/public/v1/lib/intro/introjs-rtl.min.css +opt/app/public/v1/lib/intro/introjs.min.css +opt/app/public/v1/lib/leaflet/.htaccess +opt/app/public/v1/lib/leaflet/images/.htaccess +opt/app/public/v1/lib/leaflet/images/layers-2x.png +opt/app/public/v1/lib/leaflet/images/layers.png +opt/app/public/v1/lib/leaflet/images/marker-icon-2x.png +opt/app/public/v1/lib/leaflet/images/marker-icon.png +opt/app/public/v1/lib/leaflet/images/marker-shadow.png +opt/app/public/v1/lib/leaflet/leaflet-src.js +opt/app/public/v1/lib/leaflet/leaflet-src.js.map +opt/app/public/v1/lib/leaflet/leaflet.css +opt/app/public/v1/lib/leaflet/leaflet.js +opt/app/public/v1/lib/leaflet/leaflet.js.map +opt/app/public/v2/assets/css/dashboard.css +opt/app/public/v2/assets/css/dashboard.rtl.css +opt/app/public/v2/assets/css/gf-source.css +opt/app/public/v2/assets/css/tabler.css +opt/app/public/v2/assets/css/tabler.rtl.css +opt/app/public/v2/assets/fonts/feather/feather-webfont.eot +opt/app/public/v2/assets/fonts/feather/feather-webfont.svg +opt/app/public/v2/assets/fonts/feather/feather-webfont.ttf +opt/app/public/v2/assets/fonts/feather/feather-webfont.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Bold-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Italic-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Light-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-LightItalic-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-Regular-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBold-vietnamese.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-cyrillic.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-cyrillic.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-greek-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-greek-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-greek.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-greek.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-latin-ext.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-latin-ext.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-latin.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-latin.woff2 +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-vietnamese.woff +opt/app/public/v2/assets/fonts/source-sans-pro/SourceSansPro-SemiBoldItalic-vietnamese.woff2 +opt/app/public/v2/assets/images/basic-logo-ff3.png +opt/app/public/v2/assets/images/browsers/android-browser.svg +opt/app/public/v2/assets/images/browsers/aol-explorer.svg +opt/app/public/v2/assets/images/browsers/blackberry.svg +opt/app/public/v2/assets/images/browsers/camino.svg +opt/app/public/v2/assets/images/browsers/chrome.svg +opt/app/public/v2/assets/images/browsers/chromium.svg +opt/app/public/v2/assets/images/browsers/dolphin.svg +opt/app/public/v2/assets/images/browsers/edge.svg +opt/app/public/v2/assets/images/browsers/firefox.svg +opt/app/public/v2/assets/images/browsers/ie.svg +opt/app/public/v2/assets/images/browsers/maxthon.svg +opt/app/public/v2/assets/images/browsers/mozilla.svg +opt/app/public/v2/assets/images/browsers/netscape.svg +opt/app/public/v2/assets/images/browsers/opera.svg +opt/app/public/v2/assets/images/browsers/safari.svg +opt/app/public/v2/assets/images/browsers/sleipnir.svg +opt/app/public/v2/assets/images/browsers/uc-browser.svg +opt/app/public/v2/assets/images/browsers/vivaldi.svg +opt/app/public/v2/assets/images/crypto-currencies/bitcoin.svg +opt/app/public/v2/assets/images/crypto-currencies/cardano.svg +opt/app/public/v2/assets/images/crypto-currencies/dash.svg +opt/app/public/v2/assets/images/crypto-currencies/eos.svg +opt/app/public/v2/assets/images/crypto-currencies/ethereum.svg +opt/app/public/v2/assets/images/crypto-currencies/litecoin.svg +opt/app/public/v2/assets/images/crypto-currencies/nem.svg +opt/app/public/v2/assets/images/crypto-currencies/ripple.svg +opt/app/public/v2/assets/images/firefly-iii-128.png +opt/app/public/v2/assets/images/firefly-iii-48.png +opt/app/public/v2/assets/images/flags/ad.svg +opt/app/public/v2/assets/images/flags/ae.svg +opt/app/public/v2/assets/images/flags/af.svg +opt/app/public/v2/assets/images/flags/ag.svg +opt/app/public/v2/assets/images/flags/ai.svg +opt/app/public/v2/assets/images/flags/al.svg +opt/app/public/v2/assets/images/flags/am.svg +opt/app/public/v2/assets/images/flags/ao.svg +opt/app/public/v2/assets/images/flags/aq.svg +opt/app/public/v2/assets/images/flags/ar.svg +opt/app/public/v2/assets/images/flags/as.svg +opt/app/public/v2/assets/images/flags/at.svg +opt/app/public/v2/assets/images/flags/au.svg +opt/app/public/v2/assets/images/flags/aw.svg +opt/app/public/v2/assets/images/flags/ax.svg +opt/app/public/v2/assets/images/flags/az.svg +opt/app/public/v2/assets/images/flags/ba.svg +opt/app/public/v2/assets/images/flags/bb.svg +opt/app/public/v2/assets/images/flags/bd.svg +opt/app/public/v2/assets/images/flags/be.svg +opt/app/public/v2/assets/images/flags/bf.svg +opt/app/public/v2/assets/images/flags/bg.svg +opt/app/public/v2/assets/images/flags/bh.svg +opt/app/public/v2/assets/images/flags/bi.svg +opt/app/public/v2/assets/images/flags/bj.svg +opt/app/public/v2/assets/images/flags/bl.svg +opt/app/public/v2/assets/images/flags/bm.svg +opt/app/public/v2/assets/images/flags/bn.svg +opt/app/public/v2/assets/images/flags/bo.svg +opt/app/public/v2/assets/images/flags/bq.svg +opt/app/public/v2/assets/images/flags/br.svg +opt/app/public/v2/assets/images/flags/bs.svg +opt/app/public/v2/assets/images/flags/bt.svg +opt/app/public/v2/assets/images/flags/bv.svg +opt/app/public/v2/assets/images/flags/bw.svg +opt/app/public/v2/assets/images/flags/by.svg +opt/app/public/v2/assets/images/flags/bz.svg +opt/app/public/v2/assets/images/flags/ca.svg +opt/app/public/v2/assets/images/flags/cc.svg +opt/app/public/v2/assets/images/flags/cd.svg +opt/app/public/v2/assets/images/flags/cf.svg +opt/app/public/v2/assets/images/flags/cg.svg +opt/app/public/v2/assets/images/flags/ch.svg +opt/app/public/v2/assets/images/flags/ci.svg +opt/app/public/v2/assets/images/flags/ck.svg +opt/app/public/v2/assets/images/flags/cl.svg +opt/app/public/v2/assets/images/flags/cm.svg +opt/app/public/v2/assets/images/flags/cn.svg +opt/app/public/v2/assets/images/flags/co.svg +opt/app/public/v2/assets/images/flags/cr.svg +opt/app/public/v2/assets/images/flags/cu.svg +opt/app/public/v2/assets/images/flags/cv.svg +opt/app/public/v2/assets/images/flags/cw.svg +opt/app/public/v2/assets/images/flags/cx.svg +opt/app/public/v2/assets/images/flags/cy.svg +opt/app/public/v2/assets/images/flags/cz.svg +opt/app/public/v2/assets/images/flags/de.svg +opt/app/public/v2/assets/images/flags/dj.svg +opt/app/public/v2/assets/images/flags/dk.svg +opt/app/public/v2/assets/images/flags/dm.svg +opt/app/public/v2/assets/images/flags/do.svg +opt/app/public/v2/assets/images/flags/dz.svg +opt/app/public/v2/assets/images/flags/ec.svg +opt/app/public/v2/assets/images/flags/ee.svg +opt/app/public/v2/assets/images/flags/eg.svg +opt/app/public/v2/assets/images/flags/eh.svg +opt/app/public/v2/assets/images/flags/er.svg +opt/app/public/v2/assets/images/flags/es.svg +opt/app/public/v2/assets/images/flags/et.svg +opt/app/public/v2/assets/images/flags/eu.svg +opt/app/public/v2/assets/images/flags/fi.svg +opt/app/public/v2/assets/images/flags/fj.svg +opt/app/public/v2/assets/images/flags/fk.svg +opt/app/public/v2/assets/images/flags/fm.svg +opt/app/public/v2/assets/images/flags/fo.svg +opt/app/public/v2/assets/images/flags/fr.svg +opt/app/public/v2/assets/images/flags/ga.svg +opt/app/public/v2/assets/images/flags/gb-eng.svg +opt/app/public/v2/assets/images/flags/gb-nir.svg +opt/app/public/v2/assets/images/flags/gb-sct.svg +opt/app/public/v2/assets/images/flags/gb-wls.svg +opt/app/public/v2/assets/images/flags/gb.svg +opt/app/public/v2/assets/images/flags/gd.svg +opt/app/public/v2/assets/images/flags/ge.svg +opt/app/public/v2/assets/images/flags/gf.svg +opt/app/public/v2/assets/images/flags/gg.svg +opt/app/public/v2/assets/images/flags/gh.svg +opt/app/public/v2/assets/images/flags/gi.svg +opt/app/public/v2/assets/images/flags/gl.svg +opt/app/public/v2/assets/images/flags/gm.svg +opt/app/public/v2/assets/images/flags/gn.svg +opt/app/public/v2/assets/images/flags/gp.svg +opt/app/public/v2/assets/images/flags/gq.svg +opt/app/public/v2/assets/images/flags/gr.svg +opt/app/public/v2/assets/images/flags/gs.svg +opt/app/public/v2/assets/images/flags/gt.svg +opt/app/public/v2/assets/images/flags/gu.svg +opt/app/public/v2/assets/images/flags/gw.svg +opt/app/public/v2/assets/images/flags/gy.svg +opt/app/public/v2/assets/images/flags/hk.svg +opt/app/public/v2/assets/images/flags/hm.svg +opt/app/public/v2/assets/images/flags/hn.svg +opt/app/public/v2/assets/images/flags/hr.svg +opt/app/public/v2/assets/images/flags/ht.svg +opt/app/public/v2/assets/images/flags/hu.svg +opt/app/public/v2/assets/images/flags/id.svg +opt/app/public/v2/assets/images/flags/ie.svg +opt/app/public/v2/assets/images/flags/il.svg +opt/app/public/v2/assets/images/flags/im.svg +opt/app/public/v2/assets/images/flags/in.svg +opt/app/public/v2/assets/images/flags/io.svg +opt/app/public/v2/assets/images/flags/iq.svg +opt/app/public/v2/assets/images/flags/ir.svg +opt/app/public/v2/assets/images/flags/is.svg +opt/app/public/v2/assets/images/flags/it.svg +opt/app/public/v2/assets/images/flags/je.svg +opt/app/public/v2/assets/images/flags/jm.svg +opt/app/public/v2/assets/images/flags/jo.svg +opt/app/public/v2/assets/images/flags/jp.svg +opt/app/public/v2/assets/images/flags/ke.svg +opt/app/public/v2/assets/images/flags/kg.svg +opt/app/public/v2/assets/images/flags/kh.svg +opt/app/public/v2/assets/images/flags/ki.svg +opt/app/public/v2/assets/images/flags/km.svg +opt/app/public/v2/assets/images/flags/kn.svg +opt/app/public/v2/assets/images/flags/kp.svg +opt/app/public/v2/assets/images/flags/kr.svg +opt/app/public/v2/assets/images/flags/kw.svg +opt/app/public/v2/assets/images/flags/ky.svg +opt/app/public/v2/assets/images/flags/kz.svg +opt/app/public/v2/assets/images/flags/la.svg +opt/app/public/v2/assets/images/flags/lb.svg +opt/app/public/v2/assets/images/flags/lc.svg +opt/app/public/v2/assets/images/flags/li.svg +opt/app/public/v2/assets/images/flags/lk.svg +opt/app/public/v2/assets/images/flags/lr.svg +opt/app/public/v2/assets/images/flags/ls.svg +opt/app/public/v2/assets/images/flags/lt.svg +opt/app/public/v2/assets/images/flags/lu.svg +opt/app/public/v2/assets/images/flags/lv.svg +opt/app/public/v2/assets/images/flags/ly.svg +opt/app/public/v2/assets/images/flags/ma.svg +opt/app/public/v2/assets/images/flags/mc.svg +opt/app/public/v2/assets/images/flags/md.svg +opt/app/public/v2/assets/images/flags/me.svg +opt/app/public/v2/assets/images/flags/mf.svg +opt/app/public/v2/assets/images/flags/mg.svg +opt/app/public/v2/assets/images/flags/mh.svg +opt/app/public/v2/assets/images/flags/mk.svg +opt/app/public/v2/assets/images/flags/ml.svg +opt/app/public/v2/assets/images/flags/mm.svg +opt/app/public/v2/assets/images/flags/mn.svg +opt/app/public/v2/assets/images/flags/mo.svg +opt/app/public/v2/assets/images/flags/mp.svg +opt/app/public/v2/assets/images/flags/mq.svg +opt/app/public/v2/assets/images/flags/mr.svg +opt/app/public/v2/assets/images/flags/ms.svg +opt/app/public/v2/assets/images/flags/mt.svg +opt/app/public/v2/assets/images/flags/mu.svg +opt/app/public/v2/assets/images/flags/mv.svg +opt/app/public/v2/assets/images/flags/mw.svg +opt/app/public/v2/assets/images/flags/mx.svg +opt/app/public/v2/assets/images/flags/my.svg +opt/app/public/v2/assets/images/flags/mz.svg +opt/app/public/v2/assets/images/flags/na.svg +opt/app/public/v2/assets/images/flags/nc.svg +opt/app/public/v2/assets/images/flags/ne.svg +opt/app/public/v2/assets/images/flags/nf.svg +opt/app/public/v2/assets/images/flags/ng.svg +opt/app/public/v2/assets/images/flags/ni.svg +opt/app/public/v2/assets/images/flags/nl.svg +opt/app/public/v2/assets/images/flags/no.svg +opt/app/public/v2/assets/images/flags/np.svg +opt/app/public/v2/assets/images/flags/nr.svg +opt/app/public/v2/assets/images/flags/nu.svg +opt/app/public/v2/assets/images/flags/nz.svg +opt/app/public/v2/assets/images/flags/om.svg +opt/app/public/v2/assets/images/flags/pa.svg +opt/app/public/v2/assets/images/flags/pe.svg +opt/app/public/v2/assets/images/flags/pf.svg +opt/app/public/v2/assets/images/flags/pg.svg +opt/app/public/v2/assets/images/flags/ph.svg +opt/app/public/v2/assets/images/flags/pk.svg +opt/app/public/v2/assets/images/flags/pl.svg +opt/app/public/v2/assets/images/flags/pm.svg +opt/app/public/v2/assets/images/flags/pn.svg +opt/app/public/v2/assets/images/flags/pr.svg +opt/app/public/v2/assets/images/flags/ps.svg +opt/app/public/v2/assets/images/flags/pt.svg +opt/app/public/v2/assets/images/flags/pw.svg +opt/app/public/v2/assets/images/flags/py.svg +opt/app/public/v2/assets/images/flags/qa.svg +opt/app/public/v2/assets/images/flags/re.svg +opt/app/public/v2/assets/images/flags/ro.svg +opt/app/public/v2/assets/images/flags/rs.svg +opt/app/public/v2/assets/images/flags/ru.svg +opt/app/public/v2/assets/images/flags/rw.svg +opt/app/public/v2/assets/images/flags/sa.svg +opt/app/public/v2/assets/images/flags/sb.svg +opt/app/public/v2/assets/images/flags/sc.svg +opt/app/public/v2/assets/images/flags/sd.svg +opt/app/public/v2/assets/images/flags/se.svg +opt/app/public/v2/assets/images/flags/sg.svg +opt/app/public/v2/assets/images/flags/sh.svg +opt/app/public/v2/assets/images/flags/si.svg +opt/app/public/v2/assets/images/flags/sj.svg +opt/app/public/v2/assets/images/flags/sk.svg +opt/app/public/v2/assets/images/flags/sl.svg +opt/app/public/v2/assets/images/flags/sm.svg +opt/app/public/v2/assets/images/flags/sn.svg +opt/app/public/v2/assets/images/flags/so.svg +opt/app/public/v2/assets/images/flags/sr.svg +opt/app/public/v2/assets/images/flags/ss.svg +opt/app/public/v2/assets/images/flags/st.svg +opt/app/public/v2/assets/images/flags/sv.svg +opt/app/public/v2/assets/images/flags/sx.svg +opt/app/public/v2/assets/images/flags/sy.svg +opt/app/public/v2/assets/images/flags/sz.svg +opt/app/public/v2/assets/images/flags/tc.svg +opt/app/public/v2/assets/images/flags/td.svg +opt/app/public/v2/assets/images/flags/tf.svg +opt/app/public/v2/assets/images/flags/tg.svg +opt/app/public/v2/assets/images/flags/th.svg +opt/app/public/v2/assets/images/flags/tj.svg +opt/app/public/v2/assets/images/flags/tk.svg +opt/app/public/v2/assets/images/flags/tl.svg +opt/app/public/v2/assets/images/flags/tm.svg +opt/app/public/v2/assets/images/flags/tn.svg +opt/app/public/v2/assets/images/flags/to.svg +opt/app/public/v2/assets/images/flags/tr.svg +opt/app/public/v2/assets/images/flags/tt.svg +opt/app/public/v2/assets/images/flags/tv.svg +opt/app/public/v2/assets/images/flags/tw.svg +opt/app/public/v2/assets/images/flags/tz.svg +opt/app/public/v2/assets/images/flags/ua.svg +opt/app/public/v2/assets/images/flags/ug.svg +opt/app/public/v2/assets/images/flags/um.svg +opt/app/public/v2/assets/images/flags/un.svg +opt/app/public/v2/assets/images/flags/us.svg +opt/app/public/v2/assets/images/flags/uy.svg +opt/app/public/v2/assets/images/flags/uz.svg +opt/app/public/v2/assets/images/flags/va.svg +opt/app/public/v2/assets/images/flags/vc.svg +opt/app/public/v2/assets/images/flags/ve.svg +opt/app/public/v2/assets/images/flags/vg.svg +opt/app/public/v2/assets/images/flags/vi.svg +opt/app/public/v2/assets/images/flags/vn.svg +opt/app/public/v2/assets/images/flags/vu.svg +opt/app/public/v2/assets/images/flags/wf.svg +opt/app/public/v2/assets/images/flags/ws.svg +opt/app/public/v2/assets/images/flags/ye.svg +opt/app/public/v2/assets/images/flags/yt.svg +opt/app/public/v2/assets/images/flags/za.svg +opt/app/public/v2/assets/images/flags/zm.svg +opt/app/public/v2/assets/images/flags/zw.svg +opt/app/public/v2/assets/images/payments/2checkout-dark.svg +opt/app/public/v2/assets/images/payments/2checkout.svg +opt/app/public/v2/assets/images/payments/alipay-dark.svg +opt/app/public/v2/assets/images/payments/alipay.svg +opt/app/public/v2/assets/images/payments/amazon-dark.svg +opt/app/public/v2/assets/images/payments/amazon.svg +opt/app/public/v2/assets/images/payments/americanexpress-dark.svg +opt/app/public/v2/assets/images/payments/americanexpress.svg +opt/app/public/v2/assets/images/payments/applepay-dark.svg +opt/app/public/v2/assets/images/payments/applepay.svg +opt/app/public/v2/assets/images/payments/bancontact-dark.svg +opt/app/public/v2/assets/images/payments/bancontact.svg +opt/app/public/v2/assets/images/payments/bitcoin-dark.svg +opt/app/public/v2/assets/images/payments/bitcoin.svg +opt/app/public/v2/assets/images/payments/bitpay-dark.svg +opt/app/public/v2/assets/images/payments/bitpay.svg +opt/app/public/v2/assets/images/payments/cirrus-dark.svg +opt/app/public/v2/assets/images/payments/cirrus.svg +opt/app/public/v2/assets/images/payments/clickandbuy-dark.svg +opt/app/public/v2/assets/images/payments/clickandbuy.svg +opt/app/public/v2/assets/images/payments/coinkite-dark.svg +opt/app/public/v2/assets/images/payments/coinkite.svg +opt/app/public/v2/assets/images/payments/dinersclub-dark.svg +opt/app/public/v2/assets/images/payments/dinersclub.svg +opt/app/public/v2/assets/images/payments/directdebit-dark.svg +opt/app/public/v2/assets/images/payments/directdebit.svg +opt/app/public/v2/assets/images/payments/discover-dark.svg +opt/app/public/v2/assets/images/payments/discover.svg +opt/app/public/v2/assets/images/payments/dwolla-dark.svg +opt/app/public/v2/assets/images/payments/dwolla.svg +opt/app/public/v2/assets/images/payments/ebay-dark.svg +opt/app/public/v2/assets/images/payments/ebay.svg +opt/app/public/v2/assets/images/payments/eway-dark.svg +opt/app/public/v2/assets/images/payments/eway.svg +opt/app/public/v2/assets/images/payments/giropay-dark.svg +opt/app/public/v2/assets/images/payments/giropay.svg +opt/app/public/v2/assets/images/payments/googlewallet-dark.svg +opt/app/public/v2/assets/images/payments/googlewallet.svg +opt/app/public/v2/assets/images/payments/ingenico-dark.svg +opt/app/public/v2/assets/images/payments/ingenico.svg +opt/app/public/v2/assets/images/payments/jcb-dark.svg +opt/app/public/v2/assets/images/payments/jcb.svg +opt/app/public/v2/assets/images/payments/klarna-dark.svg +opt/app/public/v2/assets/images/payments/klarna.svg +opt/app/public/v2/assets/images/payments/laser-dark.svg +opt/app/public/v2/assets/images/payments/laser.svg +opt/app/public/v2/assets/images/payments/maestro-dark.svg +opt/app/public/v2/assets/images/payments/maestro.svg +opt/app/public/v2/assets/images/payments/mastercard-dark.svg +opt/app/public/v2/assets/images/payments/mastercard.svg +opt/app/public/v2/assets/images/payments/monero-dark.svg +opt/app/public/v2/assets/images/payments/monero.svg +opt/app/public/v2/assets/images/payments/neteller-dark.svg +opt/app/public/v2/assets/images/payments/neteller.svg +opt/app/public/v2/assets/images/payments/ogone-dark.svg +opt/app/public/v2/assets/images/payments/ogone.svg +opt/app/public/v2/assets/images/payments/okpay-dark.svg +opt/app/public/v2/assets/images/payments/okpay.svg +opt/app/public/v2/assets/images/payments/paybox-dark.svg +opt/app/public/v2/assets/images/payments/paybox.svg +opt/app/public/v2/assets/images/payments/paymill-dark.svg +opt/app/public/v2/assets/images/payments/paymill.svg +opt/app/public/v2/assets/images/payments/payone-dark.svg +opt/app/public/v2/assets/images/payments/payone.svg +opt/app/public/v2/assets/images/payments/payoneer-dark.svg +opt/app/public/v2/assets/images/payments/payoneer.svg +opt/app/public/v2/assets/images/payments/paypal-dark.svg +opt/app/public/v2/assets/images/payments/paypal.svg +opt/app/public/v2/assets/images/payments/paysafecard-dark.svg +opt/app/public/v2/assets/images/payments/paysafecard.svg +opt/app/public/v2/assets/images/payments/payu-dark.svg +opt/app/public/v2/assets/images/payments/payu.svg +opt/app/public/v2/assets/images/payments/payza-dark.svg +opt/app/public/v2/assets/images/payments/payza.svg +opt/app/public/v2/assets/images/payments/ripple-dark.svg +opt/app/public/v2/assets/images/payments/ripple.svg +opt/app/public/v2/assets/images/payments/sage-dark.svg +opt/app/public/v2/assets/images/payments/sage.svg +opt/app/public/v2/assets/images/payments/sepa-dark.svg +opt/app/public/v2/assets/images/payments/sepa.svg +opt/app/public/v2/assets/images/payments/shopify-dark.svg +opt/app/public/v2/assets/images/payments/shopify.svg +opt/app/public/v2/assets/images/payments/skrill-dark.svg +opt/app/public/v2/assets/images/payments/skrill.svg +opt/app/public/v2/assets/images/payments/solo-dark.svg +opt/app/public/v2/assets/images/payments/solo.svg +opt/app/public/v2/assets/images/payments/square-dark.svg +opt/app/public/v2/assets/images/payments/square.svg +opt/app/public/v2/assets/images/payments/stripe-dark.svg +opt/app/public/v2/assets/images/payments/stripe.svg +opt/app/public/v2/assets/images/payments/switch-dark.svg +opt/app/public/v2/assets/images/payments/switch.svg +opt/app/public/v2/assets/images/payments/ukash-dark.svg +opt/app/public/v2/assets/images/payments/ukash.svg +opt/app/public/v2/assets/images/payments/unionpay-dark.svg +opt/app/public/v2/assets/images/payments/unionpay.svg +opt/app/public/v2/assets/images/payments/verifone-dark.svg +opt/app/public/v2/assets/images/payments/verifone.svg +opt/app/public/v2/assets/images/payments/verisign-dark.svg +opt/app/public/v2/assets/images/payments/verisign.svg +opt/app/public/v2/assets/images/payments/visa-dark.svg +opt/app/public/v2/assets/images/payments/visa.svg +opt/app/public/v2/assets/images/payments/webmoney-dark.svg +opt/app/public/v2/assets/images/payments/webmoney.svg +opt/app/public/v2/assets/images/payments/westernunion-dark.svg +opt/app/public/v2/assets/images/payments/westernunion.svg +opt/app/public/v2/assets/images/payments/worldpay-dark.svg +opt/app/public/v2/assets/images/payments/worldpay.svg +opt/app/public/v2/assets/js/core.js +opt/app/public/v2/assets/js/dashboard.js +opt/app/public/v2/assets/js/require.min.js +opt/app/public/v2/assets/js/vendors/bootstrap.bundle.min.js +opt/app/public/v2/assets/js/vendors/chart.bundle.min.js +opt/app/public/v2/assets/js/vendors/circle-progress.min.js +opt/app/public/v2/assets/js/vendors/jquery-3.2.1.min.js +opt/app/public/v2/assets/js/vendors/jquery-3.2.1.slim.min.js +opt/app/public/v2/assets/js/vendors/jquery-jvectormap-2.0.3.min.js +opt/app/public/v2/assets/js/vendors/jquery-jvectormap-de-merc.js +opt/app/public/v2/assets/js/vendors/jquery-jvectormap-world-mill.js +opt/app/public/v2/assets/js/vendors/jquery.sparkline.min.js +opt/app/public/v2/assets/js/vendors/jquery.tablesorter.min.js +opt/app/public/v2/assets/js/vendors/selectize.min.js +opt/app/public/v2/assets/plugins/charts-c3/js/c3.min.js +opt/app/public/v2/assets/plugins/charts-c3/js/d3.v3.min.js +opt/app/public/v2/assets/plugins/charts-c3/plugin.css +opt/app/public/v2/assets/plugins/charts-c3/plugin.js +opt/app/public/v2/assets/plugins/fullcalendar/js/fullcalendar.min.js +opt/app/public/v2/assets/plugins/fullcalendar/js/moment.min.js +opt/app/public/v2/assets/plugins/fullcalendar/plugin.css +opt/app/public/v2/assets/plugins/fullcalendar/plugin.js +opt/app/public/v2/assets/plugins/iconfonts/fonts/materialdesignicons/materialdesignicons-webfont.eot +opt/app/public/v2/assets/plugins/iconfonts/fonts/materialdesignicons/materialdesignicons-webfont.svg +opt/app/public/v2/assets/plugins/iconfonts/fonts/materialdesignicons/materialdesignicons-webfont.ttf +opt/app/public/v2/assets/plugins/iconfonts/fonts/materialdesignicons/materialdesignicons-webfont.woff +opt/app/public/v2/assets/plugins/iconfonts/fonts/materialdesignicons/materialdesignicons-webfont.woff2 +opt/app/public/v2/assets/plugins/iconfonts/fonts/simple-line-icons/Simple-Line-Icons.eot +opt/app/public/v2/assets/plugins/iconfonts/fonts/simple-line-icons/Simple-Line-Icons.svg +opt/app/public/v2/assets/plugins/iconfonts/fonts/simple-line-icons/Simple-Line-Icons.ttf +opt/app/public/v2/assets/plugins/iconfonts/fonts/simple-line-icons/Simple-Line-Icons.woff +opt/app/public/v2/assets/plugins/iconfonts/fonts/simple-line-icons/Simple-Line-Icons.woff2 +opt/app/public/v2/assets/plugins/iconfonts/fonts/themify/themify.eot +opt/app/public/v2/assets/plugins/iconfonts/fonts/themify/themify.svg +opt/app/public/v2/assets/plugins/iconfonts/fonts/themify/themify.ttf +opt/app/public/v2/assets/plugins/iconfonts/fonts/themify/themify.woff +opt/app/public/v2/assets/plugins/iconfonts/fonts/weathericons/weathericons-regular-webfont.eot +opt/app/public/v2/assets/plugins/iconfonts/fonts/weathericons/weathericons-regular-webfont.svg +opt/app/public/v2/assets/plugins/iconfonts/fonts/weathericons/weathericons-regular-webfont.ttf +opt/app/public/v2/assets/plugins/iconfonts/fonts/weathericons/weathericons-regular-webfont.woff +opt/app/public/v2/assets/plugins/iconfonts/fonts/weathericons/weathericons-regular-webfont.woff2 +opt/app/public/v2/assets/plugins/iconfonts/plugin.css +opt/app/public/v2/assets/plugins/input-mask/js/jquery.mask.min.js +opt/app/public/v2/assets/plugins/input-mask/plugin.js +opt/app/public/v2/assets/plugins/maps-google/plugin.css +opt/app/public/v2/assets/plugins/maps-google/plugin.js +opt/app/public/v2/assets/plugins/prismjs/js/prism.pack.js +opt/app/public/v2/assets/plugins/prismjs/plugin.css +opt/app/public/v2/assets/plugins/prismjs/plugin.js +opt/app/public/v2/lib/font-awesome/4.7.0/css/font-awesome.css +opt/app/public/v2/lib/font-awesome/4.7.0/css/font-awesome.min.css +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/FontAwesome.otf +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +opt/app/public/v2/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 opt/app/public/web.config opt/app/readme.md opt/app/resources/assets/js/app.js @@ -1423,6 +2054,9 @@ opt/app/resources/assets/js/components/passport/Clients.vue opt/app/resources/assets/js/components/passport/PersonalAccessTokens.vue opt/app/resources/assets/sass/_variables.scss opt/app/resources/assets/sass/app.scss +opt/app/resources/js/app.js +opt/app/resources/js/bootstrap.js +opt/app/resources/js/components/Example.js opt/app/resources/lang/de_DE/auth.php opt/app/resources/lang/de_DE/bank.php opt/app/resources/lang/de_DE/breadcrumbs.php @@ -1592,271 +2226,326 @@ opt/app/resources/lang/tr_TR/list.php opt/app/resources/lang/tr_TR/pagination.php opt/app/resources/lang/tr_TR/passwords.php opt/app/resources/lang/tr_TR/validation.php +opt/app/resources/lang/zh_TW/auth.php +opt/app/resources/lang/zh_TW/bank.php +opt/app/resources/lang/zh_TW/breadcrumbs.php +opt/app/resources/lang/zh_TW/components.php +opt/app/resources/lang/zh_TW/config.php +opt/app/resources/lang/zh_TW/csv.php +opt/app/resources/lang/zh_TW/demo.php +opt/app/resources/lang/zh_TW/firefly.php +opt/app/resources/lang/zh_TW/form.php +opt/app/resources/lang/zh_TW/import.php +opt/app/resources/lang/zh_TW/intro.php +opt/app/resources/lang/zh_TW/list.php +opt/app/resources/lang/zh_TW/pagination.php +opt/app/resources/lang/zh_TW/passwords.php +opt/app/resources/lang/zh_TW/validation.php +opt/app/resources/sass/_variables.scss +opt/app/resources/sass/app.scss opt/app/resources/stubs/binary.bin opt/app/resources/stubs/csv.csv opt/app/resources/stubs/demo-configuration.json opt/app/resources/stubs/demo-import.csv -opt/app/resources/views/accounts/create.twig -opt/app/resources/views/accounts/delete.twig -opt/app/resources/views/accounts/edit.twig -opt/app/resources/views/accounts/index.twig -opt/app/resources/views/accounts/reconcile/edit.twig -opt/app/resources/views/accounts/reconcile/index.twig -opt/app/resources/views/accounts/reconcile/overview.twig -opt/app/resources/views/accounts/reconcile/show.twig -opt/app/resources/views/accounts/reconcile/transactions.twig -opt/app/resources/views/accounts/show.twig -opt/app/resources/views/admin/configuration/index.twig -opt/app/resources/views/admin/index.twig -opt/app/resources/views/admin/link/create.twig -opt/app/resources/views/admin/link/delete.twig -opt/app/resources/views/admin/link/edit.twig -opt/app/resources/views/admin/link/index.twig -opt/app/resources/views/admin/link/show.twig -opt/app/resources/views/admin/update/index.twig -opt/app/resources/views/admin/users/delete.twig -opt/app/resources/views/admin/users/edit.twig -opt/app/resources/views/admin/users/index.twig -opt/app/resources/views/admin/users/show.twig -opt/app/resources/views/attachments/delete.twig -opt/app/resources/views/attachments/edit.twig -opt/app/resources/views/attachments/index.twig -opt/app/resources/views/auth/login.twig -opt/app/resources/views/auth/lost-two-factor.twig -opt/app/resources/views/auth/passwords/email.twig -opt/app/resources/views/auth/passwords/reset.twig -opt/app/resources/views/auth/register.twig -opt/app/resources/views/auth/two-factor.twig -opt/app/resources/views/bills/create.twig -opt/app/resources/views/bills/delete.twig -opt/app/resources/views/bills/edit.twig -opt/app/resources/views/bills/index.twig -opt/app/resources/views/bills/show.twig -opt/app/resources/views/budgets/create.twig -opt/app/resources/views/budgets/delete.twig -opt/app/resources/views/budgets/edit.twig -opt/app/resources/views/budgets/income.twig -opt/app/resources/views/budgets/index.twig -opt/app/resources/views/budgets/info.twig -opt/app/resources/views/budgets/no-budget.twig -opt/app/resources/views/budgets/show.twig -opt/app/resources/views/categories/create.twig -opt/app/resources/views/categories/delete.twig -opt/app/resources/views/categories/edit.twig -opt/app/resources/views/categories/index.twig -opt/app/resources/views/categories/no-category.twig -opt/app/resources/views/categories/show.twig -opt/app/resources/views/currencies/create.twig -opt/app/resources/views/currencies/delete.twig -opt/app/resources/views/currencies/edit.twig -opt/app/resources/views/currencies/index.twig -opt/app/resources/views/debug.twig -opt/app/resources/views/demo/accounts/index.twig -opt/app/resources/views/demo/budgets/index.twig -opt/app/resources/views/demo/currencies/index.twig -opt/app/resources/views/demo/home.twig -opt/app/resources/views/demo/import/index.twig -opt/app/resources/views/demo/index.twig -opt/app/resources/views/demo/no-demo-text.twig -opt/app/resources/views/demo/piggy-banks/index.twig -opt/app/resources/views/demo/recurring/index.twig -opt/app/resources/views/demo/recurring/recurring-create.twig -opt/app/resources/views/demo/reports/index.twig -opt/app/resources/views/demo/transactions/index.twig -opt/app/resources/views/emails/access-token-created-html.twig -opt/app/resources/views/emails/access-token-created-text.twig -opt/app/resources/views/emails/admin-test-html.twig -opt/app/resources/views/emails/admin-test-text.twig -opt/app/resources/views/emails/confirm-account-html.twig -opt/app/resources/views/emails/confirm-account-text.twig -opt/app/resources/views/emails/confirm-email-change-html.twig -opt/app/resources/views/emails/confirm-email-change-text.twig -opt/app/resources/views/emails/error-html.twig -opt/app/resources/views/emails/error-text.twig -opt/app/resources/views/emails/footer-html.twig -opt/app/resources/views/emails/footer-text.twig -opt/app/resources/views/emails/header-html.twig -opt/app/resources/views/emails/header-text.twig -opt/app/resources/views/emails/oauth-client-created-html.twig -opt/app/resources/views/emails/oauth-client-created-text.twig -opt/app/resources/views/emails/password-html.twig -opt/app/resources/views/emails/password-text.twig -opt/app/resources/views/emails/registered-html.twig -opt/app/resources/views/emails/registered-text.twig -opt/app/resources/views/emails/report-new-journals-html.twig -opt/app/resources/views/emails/report-new-journals-text.twig -opt/app/resources/views/emails/undo-email-change-html.twig -opt/app/resources/views/emails/undo-email-change-text.twig -opt/app/resources/views/error.twig -opt/app/resources/views/errors/404.twig -opt/app/resources/views/errors/500.twig -opt/app/resources/views/errors/503.twig -opt/app/resources/views/errors/FireflyException.twig -opt/app/resources/views/export/index.twig -opt/app/resources/views/form/amount-no-currency.twig -opt/app/resources/views/form/amount-small.twig -opt/app/resources/views/form/amount.twig -opt/app/resources/views/form/assetAccountCheckList.twig -opt/app/resources/views/form/balance.twig -opt/app/resources/views/form/checkbox.twig -opt/app/resources/views/form/date.twig -opt/app/resources/views/form/feedback.twig -opt/app/resources/views/form/file.twig -opt/app/resources/views/form/help.twig -opt/app/resources/views/form/integer.twig -opt/app/resources/views/form/location.twig -opt/app/resources/views/form/non-selectable-amount.twig -opt/app/resources/views/form/number.twig -opt/app/resources/views/form/options.twig -opt/app/resources/views/form/password.twig -opt/app/resources/views/form/percentage.twig -opt/app/resources/views/form/select.twig -opt/app/resources/views/form/static.twig -opt/app/resources/views/form/tags.twig -opt/app/resources/views/form/text.twig -opt/app/resources/views/form/textarea.twig -opt/app/resources/views/import/bank/form.twig -opt/app/resources/views/import/bunq/choose-accounts.twig -opt/app/resources/views/import/bunq/prerequisites.twig -opt/app/resources/views/import/fake/apply-rules.twig -opt/app/resources/views/import/fake/enter-album.twig -opt/app/resources/views/import/fake/enter-artist.twig -opt/app/resources/views/import/fake/enter-song.twig -opt/app/resources/views/import/fake/prerequisites.twig -opt/app/resources/views/import/file/configure-upload.twig -opt/app/resources/views/import/file/map.twig -opt/app/resources/views/import/file/new.twig -opt/app/resources/views/import/file/roles.twig -opt/app/resources/views/import/fints/choose_account.twig -opt/app/resources/views/import/fints/new.twig -opt/app/resources/views/import/index.twig -opt/app/resources/views/import/spectre/accounts.twig -opt/app/resources/views/import/spectre/choose-login.twig -opt/app/resources/views/import/spectre/prerequisites.twig -opt/app/resources/views/import/spectre/redirect.twig -opt/app/resources/views/import/status.twig -opt/app/resources/views/import/ynab/accounts.twig -opt/app/resources/views/import/ynab/prerequisites.twig -opt/app/resources/views/import/ynab/redirect.twig -opt/app/resources/views/import/ynab/select-budgets.twig -opt/app/resources/views/index.twig -opt/app/resources/views/install/index.twig -opt/app/resources/views/javascript/accounts.twig -opt/app/resources/views/javascript/currencies.twig -opt/app/resources/views/javascript/variables.twig -opt/app/resources/views/json/piggy-banks.twig -opt/app/resources/views/layout/default.twig -opt/app/resources/views/layout/empty.twig -opt/app/resources/views/layout/guest.twig -opt/app/resources/views/layout/install.twig -opt/app/resources/views/list/accounts.twig -opt/app/resources/views/list/bills.twig -opt/app/resources/views/list/categories.twig -opt/app/resources/views/list/journals-tiny.twig -opt/app/resources/views/list/journals.twig -opt/app/resources/views/list/periods.twig -opt/app/resources/views/list/piggy-bank-events.twig -opt/app/resources/views/list/piggy-banks.twig -opt/app/resources/views/list/transactions.twig -opt/app/resources/views/new-user/index.twig -opt/app/resources/views/partials/boxes.twig -opt/app/resources/views/partials/breadcrumbs.twig -opt/app/resources/views/partials/control-bar.twig -opt/app/resources/views/partials/empty.twig -opt/app/resources/views/partials/favicons.twig -opt/app/resources/views/partials/flashes.twig -opt/app/resources/views/partials/journal-row.twig -opt/app/resources/views/partials/menu-sidebar.twig -opt/app/resources/views/partials/page-header.twig -opt/app/resources/views/partials/password-modal.twig -opt/app/resources/views/partials/transaction-row.twig -opt/app/resources/views/piggy-banks/add-mobile.twig -opt/app/resources/views/piggy-banks/add.twig -opt/app/resources/views/piggy-banks/create.twig -opt/app/resources/views/piggy-banks/delete.twig -opt/app/resources/views/piggy-banks/edit.twig -opt/app/resources/views/piggy-banks/index.twig -opt/app/resources/views/piggy-banks/remove-mobile.twig -opt/app/resources/views/piggy-banks/remove.twig -opt/app/resources/views/piggy-banks/show.twig -opt/app/resources/views/popup/list/journals.twig -opt/app/resources/views/popup/report/balance-amount.twig -opt/app/resources/views/popup/report/budget-spent-amount.twig -opt/app/resources/views/popup/report/category-entry.twig -opt/app/resources/views/popup/report/expense-entry.twig -opt/app/resources/views/popup/report/income-entry.twig -opt/app/resources/views/preferences/index.twig -opt/app/resources/views/profile/change-email.twig -opt/app/resources/views/profile/change-password.twig -opt/app/resources/views/profile/code.twig -opt/app/resources/views/profile/delete-account.twig -opt/app/resources/views/profile/index.twig -opt/app/resources/views/recurring/create.twig -opt/app/resources/views/recurring/delete.twig -opt/app/resources/views/recurring/edit.twig -opt/app/resources/views/recurring/index.twig -opt/app/resources/views/recurring/show.twig -opt/app/resources/views/reports/account/report.twig -opt/app/resources/views/reports/audit/report.twig -opt/app/resources/views/reports/budget/month.twig -opt/app/resources/views/reports/category/month.twig -opt/app/resources/views/reports/default/month.twig -opt/app/resources/views/reports/default/multi-year.twig -opt/app/resources/views/reports/default/year.twig -opt/app/resources/views/reports/index.twig -opt/app/resources/views/reports/options/account.twig -opt/app/resources/views/reports/options/budget.twig -opt/app/resources/views/reports/options/category.twig -opt/app/resources/views/reports/options/no-options.twig -opt/app/resources/views/reports/options/tag.twig -opt/app/resources/views/reports/partials/accounts.twig -opt/app/resources/views/reports/partials/balance.twig -opt/app/resources/views/reports/partials/bills.twig -opt/app/resources/views/reports/partials/budget-period.twig -opt/app/resources/views/reports/partials/budgets.twig -opt/app/resources/views/reports/partials/categories.twig -opt/app/resources/views/reports/partials/category-period.twig -opt/app/resources/views/reports/partials/exp-budgets.twig -opt/app/resources/views/reports/partials/exp-categories.twig -opt/app/resources/views/reports/partials/exp-not-grouped.twig -opt/app/resources/views/reports/partials/income-expenses.twig -opt/app/resources/views/reports/partials/journals-audit.twig -opt/app/resources/views/reports/partials/operations.twig -opt/app/resources/views/reports/partials/tags.twig -opt/app/resources/views/reports/partials/top-transactions.twig -opt/app/resources/views/reports/tag/month.twig -opt/app/resources/views/rules/index.twig -opt/app/resources/views/rules/partials/action.twig -opt/app/resources/views/rules/partials/test-trigger-modal.twig -opt/app/resources/views/rules/partials/trigger.twig -opt/app/resources/views/rules/rule-group/create.twig -opt/app/resources/views/rules/rule-group/delete.twig -opt/app/resources/views/rules/rule-group/edit.twig -opt/app/resources/views/rules/rule-group/select-transactions.twig -opt/app/resources/views/rules/rule/create.twig -opt/app/resources/views/rules/rule/delete.twig -opt/app/resources/views/rules/rule/edit.twig -opt/app/resources/views/rules/rule/select-transactions.twig -opt/app/resources/views/search/index.twig -opt/app/resources/views/search/search.twig -opt/app/resources/views/tags/create.twig -opt/app/resources/views/tags/delete.twig -opt/app/resources/views/tags/edit.twig -opt/app/resources/views/tags/index.twig -opt/app/resources/views/tags/show.twig -opt/app/resources/views/test/test.twig -opt/app/resources/views/transactions/bulk/edit.twig -opt/app/resources/views/transactions/convert.twig -opt/app/resources/views/transactions/index.twig -opt/app/resources/views/transactions/links/delete.twig -opt/app/resources/views/transactions/mass/delete.twig -opt/app/resources/views/transactions/mass/edit.twig -opt/app/resources/views/transactions/show.twig -opt/app/resources/views/transactions/single/create.twig -opt/app/resources/views/transactions/single/delete.twig -opt/app/resources/views/transactions/single/edit.twig -opt/app/resources/views/transactions/split/edit.twig -opt/app/resources/views/vendor/passport/authorize.twig +opt/app/resources/views/v1/accounts/create.twig +opt/app/resources/views/v1/accounts/delete.twig +opt/app/resources/views/v1/accounts/edit.twig +opt/app/resources/views/v1/accounts/index.twig +opt/app/resources/views/v1/accounts/reconcile/edit.twig +opt/app/resources/views/v1/accounts/reconcile/index.twig +opt/app/resources/views/v1/accounts/reconcile/overview.twig +opt/app/resources/views/v1/accounts/reconcile/show.twig +opt/app/resources/views/v1/accounts/reconcile/transactions.twig +opt/app/resources/views/v1/accounts/show.twig +opt/app/resources/views/v1/admin/configuration/index.twig +opt/app/resources/views/v1/admin/index.twig +opt/app/resources/views/v1/admin/link/create.twig +opt/app/resources/views/v1/admin/link/delete.twig +opt/app/resources/views/v1/admin/link/edit.twig +opt/app/resources/views/v1/admin/link/index.twig +opt/app/resources/views/v1/admin/link/show.twig +opt/app/resources/views/v1/admin/update/index.twig +opt/app/resources/views/v1/admin/users/delete.twig +opt/app/resources/views/v1/admin/users/edit.twig +opt/app/resources/views/v1/admin/users/index.twig +opt/app/resources/views/v1/admin/users/show.twig +opt/app/resources/views/v1/attachments/delete.twig +opt/app/resources/views/v1/attachments/edit.twig +opt/app/resources/views/v1/attachments/index.twig +opt/app/resources/views/v1/auth/login.twig +opt/app/resources/views/v1/auth/lost-two-factor.twig +opt/app/resources/views/v1/auth/passwords/email.twig +opt/app/resources/views/v1/auth/passwords/reset.twig +opt/app/resources/views/v1/auth/register.twig +opt/app/resources/views/v1/auth/two-factor.twig +opt/app/resources/views/v1/bills/create.twig +opt/app/resources/views/v1/bills/delete.twig +opt/app/resources/views/v1/bills/edit.twig +opt/app/resources/views/v1/bills/index.twig +opt/app/resources/views/v1/bills/show.twig +opt/app/resources/views/v1/budgets/create.twig +opt/app/resources/views/v1/budgets/delete.twig +opt/app/resources/views/v1/budgets/edit.twig +opt/app/resources/views/v1/budgets/income.twig +opt/app/resources/views/v1/budgets/index.twig +opt/app/resources/views/v1/budgets/info.twig +opt/app/resources/views/v1/budgets/no-budget.twig +opt/app/resources/views/v1/budgets/show.twig +opt/app/resources/views/v1/categories/create.twig +opt/app/resources/views/v1/categories/delete.twig +opt/app/resources/views/v1/categories/edit.twig +opt/app/resources/views/v1/categories/index.twig +opt/app/resources/views/v1/categories/no-category.twig +opt/app/resources/views/v1/categories/show.twig +opt/app/resources/views/v1/currencies/create.twig +opt/app/resources/views/v1/currencies/delete.twig +opt/app/resources/views/v1/currencies/edit.twig +opt/app/resources/views/v1/currencies/index.twig +opt/app/resources/views/v1/debug.twig +opt/app/resources/views/v1/demo/accounts/index.twig +opt/app/resources/views/v1/demo/budgets/index.twig +opt/app/resources/views/v1/demo/currencies/index.twig +opt/app/resources/views/v1/demo/home.twig +opt/app/resources/views/v1/demo/import/index.twig +opt/app/resources/views/v1/demo/index.twig +opt/app/resources/views/v1/demo/no-demo-text.twig +opt/app/resources/views/v1/demo/piggy-banks/index.twig +opt/app/resources/views/v1/demo/profile/index.twig +opt/app/resources/views/v1/demo/recurring/index.twig +opt/app/resources/views/v1/demo/recurring/recurring-create.twig +opt/app/resources/views/v1/demo/reports/index.twig +opt/app/resources/views/v1/demo/transactions/index.twig +opt/app/resources/views/v1/emails/access-token-created-html.twig +opt/app/resources/views/v1/emails/access-token-created-text.twig +opt/app/resources/views/v1/emails/admin-test-html.twig +opt/app/resources/views/v1/emails/admin-test-text.twig +opt/app/resources/views/v1/emails/confirm-account-html.twig +opt/app/resources/views/v1/emails/confirm-account-text.twig +opt/app/resources/views/v1/emails/confirm-email-change-html.twig +opt/app/resources/views/v1/emails/confirm-email-change-text.twig +opt/app/resources/views/v1/emails/error-html.twig +opt/app/resources/views/v1/emails/error-text.twig +opt/app/resources/views/v1/emails/footer-html.twig +opt/app/resources/views/v1/emails/footer-text.twig +opt/app/resources/views/v1/emails/header-html.twig +opt/app/resources/views/v1/emails/header-text.twig +opt/app/resources/views/v1/emails/oauth-client-created-html.twig +opt/app/resources/views/v1/emails/oauth-client-created-text.twig +opt/app/resources/views/v1/emails/password-html.twig +opt/app/resources/views/v1/emails/password-text.twig +opt/app/resources/views/v1/emails/registered-html.twig +opt/app/resources/views/v1/emails/registered-text.twig +opt/app/resources/views/v1/emails/report-new-journals-html.twig +opt/app/resources/views/v1/emails/report-new-journals-text.twig +opt/app/resources/views/v1/emails/undo-email-change-html.twig +opt/app/resources/views/v1/emails/undo-email-change-text.twig +opt/app/resources/views/v1/error.twig +opt/app/resources/views/v1/errors/404.twig +opt/app/resources/views/v1/errors/500.twig +opt/app/resources/views/v1/errors/503.twig +opt/app/resources/views/v1/errors/FireflyException.twig +opt/app/resources/views/v1/export/index.twig +opt/app/resources/views/v1/form/amount-no-currency.twig +opt/app/resources/views/v1/form/amount-small.twig +opt/app/resources/views/v1/form/amount.twig +opt/app/resources/views/v1/form/assetAccountCheckList.twig +opt/app/resources/views/v1/form/balance.twig +opt/app/resources/views/v1/form/checkbox.twig +opt/app/resources/views/v1/form/date.twig +opt/app/resources/views/v1/form/feedback.twig +opt/app/resources/views/v1/form/file.twig +opt/app/resources/views/v1/form/help.twig +opt/app/resources/views/v1/form/integer.twig +opt/app/resources/views/v1/form/location.twig +opt/app/resources/views/v1/form/non-selectable-amount.twig +opt/app/resources/views/v1/form/number.twig +opt/app/resources/views/v1/form/options.twig +opt/app/resources/views/v1/form/password.twig +opt/app/resources/views/v1/form/percentage.twig +opt/app/resources/views/v1/form/select.twig +opt/app/resources/views/v1/form/static.twig +opt/app/resources/views/v1/form/tags.twig +opt/app/resources/views/v1/form/text.twig +opt/app/resources/views/v1/form/textarea.twig +opt/app/resources/views/v1/import/bank/form.twig +opt/app/resources/views/v1/import/bunq/choose-accounts.twig +opt/app/resources/views/v1/import/bunq/prerequisites.twig +opt/app/resources/views/v1/import/fake/apply-rules.twig +opt/app/resources/views/v1/import/fake/enter-album.twig +opt/app/resources/views/v1/import/fake/enter-artist.twig +opt/app/resources/views/v1/import/fake/enter-song.twig +opt/app/resources/views/v1/import/fake/prerequisites.twig +opt/app/resources/views/v1/import/file/configure-upload.twig +opt/app/resources/views/v1/import/file/map.twig +opt/app/resources/views/v1/import/file/new.twig +opt/app/resources/views/v1/import/file/roles.twig +opt/app/resources/views/v1/import/fints/choose_account.twig +opt/app/resources/views/v1/import/fints/new.twig +opt/app/resources/views/v1/import/index.twig +opt/app/resources/views/v1/import/spectre/accounts.twig +opt/app/resources/views/v1/import/spectre/choose-login.twig +opt/app/resources/views/v1/import/spectre/prerequisites.twig +opt/app/resources/views/v1/import/spectre/redirect.twig +opt/app/resources/views/v1/import/status.twig +opt/app/resources/views/v1/import/ynab/accounts.twig +opt/app/resources/views/v1/import/ynab/prerequisites.twig +opt/app/resources/views/v1/import/ynab/redirect.twig +opt/app/resources/views/v1/import/ynab/select-budgets.twig +opt/app/resources/views/v1/index.twig +opt/app/resources/views/v1/install/index.twig +opt/app/resources/views/v1/javascript/accounts.twig +opt/app/resources/views/v1/javascript/currencies.twig +opt/app/resources/views/v1/javascript/variables.twig +opt/app/resources/views/v1/json/piggy-banks.twig +opt/app/resources/views/v1/layout/default.twig +opt/app/resources/views/v1/layout/empty.twig +opt/app/resources/views/v1/layout/guest.twig +opt/app/resources/views/v1/layout/install.twig +opt/app/resources/views/v1/list/accounts.twig +opt/app/resources/views/v1/list/bills.twig +opt/app/resources/views/v1/list/categories.twig +opt/app/resources/views/v1/list/journals-tiny.twig +opt/app/resources/views/v1/list/journals.twig +opt/app/resources/views/v1/list/periods.twig +opt/app/resources/views/v1/list/piggy-bank-events.twig +opt/app/resources/views/v1/list/piggy-banks.twig +opt/app/resources/views/v1/list/transactions.twig +opt/app/resources/views/v1/new-user/index.twig +opt/app/resources/views/v1/partials/boxes.twig +opt/app/resources/views/v1/partials/breadcrumbs.twig +opt/app/resources/views/v1/partials/control-bar.twig +opt/app/resources/views/v1/partials/empty.twig +opt/app/resources/views/v1/partials/favicons.twig +opt/app/resources/views/v1/partials/flashes.twig +opt/app/resources/views/v1/partials/journal-row.twig +opt/app/resources/views/v1/partials/menu-sidebar.twig +opt/app/resources/views/v1/partials/page-header.twig +opt/app/resources/views/v1/partials/password-modal.twig +opt/app/resources/views/v1/partials/transaction-row.twig +opt/app/resources/views/v1/piggy-banks/add-mobile.twig +opt/app/resources/views/v1/piggy-banks/add.twig +opt/app/resources/views/v1/piggy-banks/create.twig +opt/app/resources/views/v1/piggy-banks/delete.twig +opt/app/resources/views/v1/piggy-banks/edit.twig +opt/app/resources/views/v1/piggy-banks/index.twig +opt/app/resources/views/v1/piggy-banks/remove-mobile.twig +opt/app/resources/views/v1/piggy-banks/remove.twig +opt/app/resources/views/v1/piggy-banks/show.twig +opt/app/resources/views/v1/popup/list/journals.twig +opt/app/resources/views/v1/popup/report/balance-amount.twig +opt/app/resources/views/v1/popup/report/budget-spent-amount.twig +opt/app/resources/views/v1/popup/report/category-entry.twig +opt/app/resources/views/v1/popup/report/expense-entry.twig +opt/app/resources/views/v1/popup/report/income-entry.twig +opt/app/resources/views/v1/preferences/index.twig +opt/app/resources/views/v1/profile/change-email.twig +opt/app/resources/views/v1/profile/change-password.twig +opt/app/resources/views/v1/profile/code.twig +opt/app/resources/views/v1/profile/delete-account.twig +opt/app/resources/views/v1/profile/index.twig +opt/app/resources/views/v1/recurring/create.twig +opt/app/resources/views/v1/recurring/delete.twig +opt/app/resources/views/v1/recurring/edit.twig +opt/app/resources/views/v1/recurring/index.twig +opt/app/resources/views/v1/recurring/show.twig +opt/app/resources/views/v1/reports/account/report.twig +opt/app/resources/views/v1/reports/audit/report.twig +opt/app/resources/views/v1/reports/budget/month.twig +opt/app/resources/views/v1/reports/category/month.twig +opt/app/resources/views/v1/reports/default/month.twig +opt/app/resources/views/v1/reports/default/multi-year.twig +opt/app/resources/views/v1/reports/default/year.twig +opt/app/resources/views/v1/reports/index.twig +opt/app/resources/views/v1/reports/options/account.twig +opt/app/resources/views/v1/reports/options/budget.twig +opt/app/resources/views/v1/reports/options/category.twig +opt/app/resources/views/v1/reports/options/no-options.twig +opt/app/resources/views/v1/reports/options/tag.twig +opt/app/resources/views/v1/reports/partials/accounts.twig +opt/app/resources/views/v1/reports/partials/balance.twig +opt/app/resources/views/v1/reports/partials/bills.twig +opt/app/resources/views/v1/reports/partials/budget-period.twig +opt/app/resources/views/v1/reports/partials/budgets.twig +opt/app/resources/views/v1/reports/partials/categories.twig +opt/app/resources/views/v1/reports/partials/category-period.twig +opt/app/resources/views/v1/reports/partials/exp-budgets.twig +opt/app/resources/views/v1/reports/partials/exp-categories.twig +opt/app/resources/views/v1/reports/partials/exp-not-grouped.twig +opt/app/resources/views/v1/reports/partials/income-expenses.twig +opt/app/resources/views/v1/reports/partials/journals-audit.twig +opt/app/resources/views/v1/reports/partials/operations.twig +opt/app/resources/views/v1/reports/partials/tags.twig +opt/app/resources/views/v1/reports/partials/top-transactions.twig +opt/app/resources/views/v1/reports/tag/month.twig +opt/app/resources/views/v1/rules/index.twig +opt/app/resources/views/v1/rules/partials/action.twig +opt/app/resources/views/v1/rules/partials/test-trigger-modal.twig +opt/app/resources/views/v1/rules/partials/trigger.twig +opt/app/resources/views/v1/rules/rule-group/create.twig +opt/app/resources/views/v1/rules/rule-group/delete.twig +opt/app/resources/views/v1/rules/rule-group/edit.twig +opt/app/resources/views/v1/rules/rule-group/select-transactions.twig +opt/app/resources/views/v1/rules/rule/create.twig +opt/app/resources/views/v1/rules/rule/delete.twig +opt/app/resources/views/v1/rules/rule/edit.twig +opt/app/resources/views/v1/rules/rule/select-transactions.twig +opt/app/resources/views/v1/search/index.twig +opt/app/resources/views/v1/search/search.twig +opt/app/resources/views/v1/tags/create.twig +opt/app/resources/views/v1/tags/delete.twig +opt/app/resources/views/v1/tags/edit.twig +opt/app/resources/views/v1/tags/index.twig +opt/app/resources/views/v1/tags/show.twig +opt/app/resources/views/v1/test/test.twig +opt/app/resources/views/v1/transactions/bulk/edit.twig +opt/app/resources/views/v1/transactions/convert.twig +opt/app/resources/views/v1/transactions/index.twig +opt/app/resources/views/v1/transactions/links/delete.twig +opt/app/resources/views/v1/transactions/mass/delete.twig +opt/app/resources/views/v1/transactions/mass/edit.twig +opt/app/resources/views/v1/transactions/show.twig +opt/app/resources/views/v1/transactions/single/create.twig +opt/app/resources/views/v1/transactions/single/delete.twig +opt/app/resources/views/v1/transactions/single/edit.twig +opt/app/resources/views/v1/transactions/split/edit.twig +opt/app/resources/views/v1/vendor/passport/authorize.twig +opt/app/resources/views/v2/auth/login.twig +opt/app/resources/views/v2/auth/passwords/email.twig +opt/app/resources/views/v2/auth/passwords/reset.twig +opt/app/resources/views/v2/auth/register.twig +opt/app/resources/views/v2/emails/access-token-created-html.twig +opt/app/resources/views/v2/emails/access-token-created-text.twig +opt/app/resources/views/v2/emails/admin-test-html.twig +opt/app/resources/views/v2/emails/admin-test-text.twig +opt/app/resources/views/v2/emails/confirm-account-html.twig +opt/app/resources/views/v2/emails/confirm-account-text.twig +opt/app/resources/views/v2/emails/confirm-email-change-html.twig +opt/app/resources/views/v2/emails/confirm-email-change-text.twig +opt/app/resources/views/v2/emails/error-html.twig +opt/app/resources/views/v2/emails/error-text.twig +opt/app/resources/views/v2/emails/footer-html.twig +opt/app/resources/views/v2/emails/footer-text.twig +opt/app/resources/views/v2/emails/header-html.twig +opt/app/resources/views/v2/emails/header-text.twig +opt/app/resources/views/v2/emails/oauth-client-created-html.twig +opt/app/resources/views/v2/emails/oauth-client-created-text.twig +opt/app/resources/views/v2/emails/password-html.twig +opt/app/resources/views/v2/emails/password-text.twig +opt/app/resources/views/v2/emails/registered-html.twig +opt/app/resources/views/v2/emails/registered-text.twig +opt/app/resources/views/v2/emails/report-new-journals-html.twig +opt/app/resources/views/v2/emails/report-new-journals-text.twig +opt/app/resources/views/v2/emails/undo-email-change-html.twig +opt/app/resources/views/v2/emails/undo-email-change-text.twig +opt/app/resources/views/v2/error.twig +opt/app/resources/views/v2/index.twig +opt/app/resources/views/v2/layout/auth.twig +opt/app/resources/views/v2/layout/default.twig +opt/app/resources/views/v2/partials/favicons.twig +opt/app/resources/views/v2/partials/index_boxes.twig +opt/app/resources/views/v2/partials/password_modal.twig +opt/app/resources/views/v2/partials/top_bar.twig +opt/app/resources/views/v2/partials/top_menu.twig opt/app/routes/api.php opt/app/routes/breadcrumbs.php opt/app/routes/channels.php @@ -1864,6 +2553,166 @@ opt/app/routes/console.php opt/app/routes/web.php opt/app/server.php opt/app/storage +opt/app/vendor/adldap2/adldap2-laravel/.github/issue_template.md +opt/app/vendor/adldap2/adldap2-laravel/changelog.md +opt/app/vendor/adldap2/adldap2-laravel/composer.json +opt/app/vendor/adldap2/adldap2-laravel/docs/auth.md +opt/app/vendor/adldap2/adldap2-laravel/docs/importing.md +opt/app/vendor/adldap2/adldap2-laravel/docs/quick-start.md +opt/app/vendor/adldap2/adldap2-laravel/license.md +opt/app/vendor/adldap2/adldap2-laravel/readme.md +opt/app/vendor/adldap2/adldap2-laravel/src/AdldapAuthServiceProvider.php +opt/app/vendor/adldap2/adldap2-laravel/src/AdldapServiceProvider.php +opt/app/vendor/adldap2/adldap2-laravel/src/Auth/DatabaseUserProvider.php +opt/app/vendor/adldap2/adldap2-laravel/src/Auth/NoDatabaseUserProvider.php +opt/app/vendor/adldap2/adldap2-laravel/src/Auth/Provider.php +opt/app/vendor/adldap2/adldap2-laravel/src/Commands/Console/Import.php +opt/app/vendor/adldap2/adldap2-laravel/src/Commands/Import.php +opt/app/vendor/adldap2/adldap2-laravel/src/Commands/SyncPassword.php +opt/app/vendor/adldap2/adldap2-laravel/src/Config/auth.php +opt/app/vendor/adldap2/adldap2-laravel/src/Config/config.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Authenticated.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticatedModelTrashed.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticatedWithCredentials.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticatedWithWindows.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Authenticating.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticationFailed.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticationRejected.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/AuthenticationSuccessful.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/DiscoveredWithCredentials.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Imported.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Importing.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Synchronized.php +opt/app/vendor/adldap2/adldap2-laravel/src/Events/Synchronizing.php +opt/app/vendor/adldap2/adldap2-laravel/src/Exceptions/ConfigurationMissingException.php +opt/app/vendor/adldap2/adldap2-laravel/src/Facades/Adldap.php +opt/app/vendor/adldap2/adldap2-laravel/src/Facades/Resolver.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/BindsLdapUserModel.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogAuthenticated.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogAuthentication.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogAuthenticationFailure.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogAuthenticationRejection.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogAuthenticationSuccess.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogDiscovery.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogImport.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogSynchronized.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogSynchronizing.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogTrashedModel.php +opt/app/vendor/adldap2/adldap2-laravel/src/Listeners/LogWindowsAuth.php +opt/app/vendor/adldap2/adldap2-laravel/src/Middleware/WindowsAuthenticate.php +opt/app/vendor/adldap2/adldap2-laravel/src/Resolvers/ResolverInterface.php +opt/app/vendor/adldap2/adldap2-laravel/src/Resolvers/UserResolver.php +opt/app/vendor/adldap2/adldap2-laravel/src/Scopes/MemberOfScope.php +opt/app/vendor/adldap2/adldap2-laravel/src/Scopes/ScopeInterface.php +opt/app/vendor/adldap2/adldap2-laravel/src/Scopes/UidScope.php +opt/app/vendor/adldap2/adldap2-laravel/src/Scopes/UpnScope.php +opt/app/vendor/adldap2/adldap2-laravel/src/Traits/HasLdapUser.php +opt/app/vendor/adldap2/adldap2-laravel/src/Traits/ValidatesUsers.php +opt/app/vendor/adldap2/adldap2-laravel/src/Validation/Rules/DenyTrashed.php +opt/app/vendor/adldap2/adldap2-laravel/src/Validation/Rules/OnlyImported.php +opt/app/vendor/adldap2/adldap2-laravel/src/Validation/Rules/Rule.php +opt/app/vendor/adldap2/adldap2-laravel/src/Validation/Validator.php +opt/app/vendor/adldap2/adldap2-laravel/tests/Console/ImportTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/DatabaseImporterTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/DatabaseProviderTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/DatabaseTestCase.php +opt/app/vendor/adldap2/adldap2-laravel/tests/EloquentAuthenticateTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/Handlers/LdapAttributeHandler.php +opt/app/vendor/adldap2/adldap2-laravel/tests/HasLdapUserTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/Models/User.php +opt/app/vendor/adldap2/adldap2-laravel/tests/NoDatabaseProviderTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/NoDatabaseTestCase.php +opt/app/vendor/adldap2/adldap2-laravel/tests/Scopes/JohnDoeScope.php +opt/app/vendor/adldap2/adldap2-laravel/tests/TestCase.php +opt/app/vendor/adldap2/adldap2-laravel/tests/UserResolverTest.php +opt/app/vendor/adldap2/adldap2-laravel/tests/WindowsAuthenticateTest.php +opt/app/vendor/adldap2/adldap2/.gitattributes +opt/app/vendor/adldap2/adldap2/.github/issue_template.md +opt/app/vendor/adldap2/adldap2/changelog.md +opt/app/vendor/adldap2/adldap2/composer.json +opt/app/vendor/adldap2/adldap2/docs/authenticating.md +opt/app/vendor/adldap2/adldap2/docs/configuration.md +opt/app/vendor/adldap2/adldap2/docs/connecting.md +opt/app/vendor/adldap2/adldap2/docs/distinguished-names.md +opt/app/vendor/adldap2/adldap2/docs/models/computer.md +opt/app/vendor/adldap2/adldap2/docs/models/contact.md +opt/app/vendor/adldap2/adldap2/docs/models/container.md +opt/app/vendor/adldap2/adldap2/docs/models/entry.md +opt/app/vendor/adldap2/adldap2/docs/models/group.md +opt/app/vendor/adldap2/adldap2/docs/models/model.md +opt/app/vendor/adldap2/adldap2/docs/models/ou.md +opt/app/vendor/adldap2/adldap2/docs/models/printer.md +opt/app/vendor/adldap2/adldap2/docs/models/root-dse.md +opt/app/vendor/adldap2/adldap2/docs/models/traits/has-critical-system-object.md +opt/app/vendor/adldap2/adldap2/docs/models/traits/has-description.md +opt/app/vendor/adldap2/adldap2/docs/models/traits/has-last-login-last-logoff.md +opt/app/vendor/adldap2/adldap2/docs/models/traits/has-member-of.md +opt/app/vendor/adldap2/adldap2/docs/models/user.md +opt/app/vendor/adldap2/adldap2/docs/query-builder.md +opt/app/vendor/adldap2/adldap2/docs/quick-start.md +opt/app/vendor/adldap2/adldap2/docs/schema.md +opt/app/vendor/adldap2/adldap2/docs/troubleshooting.md +opt/app/vendor/adldap2/adldap2/license.md +opt/app/vendor/adldap2/adldap2/readme.md +opt/app/vendor/adldap2/adldap2/src/Adldap.php +opt/app/vendor/adldap2/adldap2/src/AdldapException.php +opt/app/vendor/adldap2/adldap2/src/AdldapInterface.php +opt/app/vendor/adldap2/adldap2/src/Auth/BindException.php +opt/app/vendor/adldap2/adldap2/src/Auth/Guard.php +opt/app/vendor/adldap2/adldap2/src/Auth/GuardInterface.php +opt/app/vendor/adldap2/adldap2/src/Auth/PasswordRequiredException.php +opt/app/vendor/adldap2/adldap2/src/Auth/UsernameRequiredException.php +opt/app/vendor/adldap2/adldap2/src/Configuration/ConfigurationException.php +opt/app/vendor/adldap2/adldap2/src/Configuration/DomainConfiguration.php +opt/app/vendor/adldap2/adldap2/src/Configuration/Validators/ArrayValidator.php +opt/app/vendor/adldap2/adldap2/src/Configuration/Validators/BooleanValidator.php +opt/app/vendor/adldap2/adldap2/src/Configuration/Validators/IntegerValidator.php +opt/app/vendor/adldap2/adldap2/src/Configuration/Validators/StringOrNullValidator.php +opt/app/vendor/adldap2/adldap2/src/Configuration/Validators/Validator.php +opt/app/vendor/adldap2/adldap2/src/Connections/ConnectionException.php +opt/app/vendor/adldap2/adldap2/src/Connections/ConnectionInterface.php +opt/app/vendor/adldap2/adldap2/src/Connections/Ldap.php +opt/app/vendor/adldap2/adldap2/src/Connections/LdapFunctionSupportTrait.php +opt/app/vendor/adldap2/adldap2/src/Connections/Provider.php +opt/app/vendor/adldap2/adldap2/src/Connections/ProviderInterface.php +opt/app/vendor/adldap2/adldap2/src/Models/Attributes/AccountControl.php +opt/app/vendor/adldap2/adldap2/src/Models/Attributes/DistinguishedName.php +opt/app/vendor/adldap2/adldap2/src/Models/Attributes/Guid.php +opt/app/vendor/adldap2/adldap2/src/Models/Attributes/Sid.php +opt/app/vendor/adldap2/adldap2/src/Models/BatchModification.php +opt/app/vendor/adldap2/adldap2/src/Models/Computer.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasAttributes.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasCriticalSystemObject.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasDescription.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasLastLogonAndLogOff.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasMemberOf.php +opt/app/vendor/adldap2/adldap2/src/Models/Concerns/HasUserAccountControl.php +opt/app/vendor/adldap2/adldap2/src/Models/Contact.php +opt/app/vendor/adldap2/adldap2/src/Models/Container.php +opt/app/vendor/adldap2/adldap2/src/Models/Entry.php +opt/app/vendor/adldap2/adldap2/src/Models/Factory.php +opt/app/vendor/adldap2/adldap2/src/Models/Group.php +opt/app/vendor/adldap2/adldap2/src/Models/Model.php +opt/app/vendor/adldap2/adldap2/src/Models/ModelDoesNotExistException.php +opt/app/vendor/adldap2/adldap2/src/Models/ModelNotFoundException.php +opt/app/vendor/adldap2/adldap2/src/Models/OrganizationalUnit.php +opt/app/vendor/adldap2/adldap2/src/Models/Printer.php +opt/app/vendor/adldap2/adldap2/src/Models/RootDse.php +opt/app/vendor/adldap2/adldap2/src/Models/User.php +opt/app/vendor/adldap2/adldap2/src/Models/UserPasswordIncorrectException.php +opt/app/vendor/adldap2/adldap2/src/Models/UserPasswordPolicyException.php +opt/app/vendor/adldap2/adldap2/src/Query/Builder.php +opt/app/vendor/adldap2/adldap2/src/Query/Factory.php +opt/app/vendor/adldap2/adldap2/src/Query/Grammar.php +opt/app/vendor/adldap2/adldap2/src/Query/Operator.php +opt/app/vendor/adldap2/adldap2/src/Query/Paginator.php +opt/app/vendor/adldap2/adldap2/src/Query/Processor.php +opt/app/vendor/adldap2/adldap2/src/Schemas/ActiveDirectory.php +opt/app/vendor/adldap2/adldap2/src/Schemas/BaseSchema.php +opt/app/vendor/adldap2/adldap2/src/Schemas/FreeIPA.php +opt/app/vendor/adldap2/adldap2/src/Schemas/OpenLDAP.php +opt/app/vendor/adldap2/adldap2/src/Schemas/SchemaInterface.php +opt/app/vendor/adldap2/adldap2/src/Utilities.php opt/app/vendor/autoload.php opt/app/vendor/bacon/bacon-qr-code/LICENSE opt/app/vendor/bacon/bacon-qr-code/Module.php @@ -1959,7 +2808,6 @@ opt/app/vendor/bunq/sdk_php/src/Http/ApiClient.php opt/app/vendor/bunq/sdk_php/src/Http/BunqResponse.php opt/app/vendor/bunq/sdk_php/src/Http/BunqResponseRaw.php opt/app/vendor/bunq/sdk_php/src/Http/Certificate/api.bunq.com.pubkey.pem -opt/app/vendor/bunq/sdk_php/src/Http/Certificate/sandbox.public.api.bunq.com.pubkey.pem opt/app/vendor/bunq/sdk_php/src/Http/Handler/HandlerBase.php opt/app/vendor/bunq/sdk_php/src/Http/Handler/HandlerUtil.php opt/app/vendor/bunq/sdk_php/src/Http/Handler/RequestHandlerAuthentication.php @@ -2003,24 +2851,18 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseBillingCont opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseBunqMeTab.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseBunqMeTabList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCard.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardBatch.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardDebit.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardGeneratedCvc2.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardGeneratedCvc2List.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardNameList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardPinChange.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardPinChangeList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardResult.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCardResultList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCashRegister.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCashRegisterList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCashRegisterQrCode.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCashRegisterQrCodeList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCertificatePinned.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCertificatePinnedList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseChatConversation.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseChatConversationList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseChatMessageList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCustomer.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCustomerLimitList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseCustomerList.php @@ -2036,8 +2878,11 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseDraftShareI opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseDraftShareInviteApiKeyList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseDraftShareInviteBank.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseDraftShareInviteBankList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseEvent.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseEventList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseExportAnnualOverview.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseExportAnnualOverviewList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseFeatureAnnouncement.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseIdealMerchantTransaction.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseIdealMerchantTransactionList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseInstallationServerPublicKeyList.php @@ -2053,25 +2898,73 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAcc opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountBankList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountJoint.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountJointList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountLight.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountLightList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountSavings.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseMonetaryAccountSavingsList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentBankSwitchServiceNetherlandsIncomingPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentBankSwitchServiceNetherlandsIncomingPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentBunqMeFundraiserResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentBunqMeFundraiserResultList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentDraftPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentDraftPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentIdealMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentIdealMerchantTransactionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentMasterCardAction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentMasterCardActionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentPaymentBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentPaymentBatchList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestInquiry.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestInquiryBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestInquiryBatchList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestInquiryList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestResponse.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentRequestResponseList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentScheduleInstance.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentScheduleInstanceList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentSofortMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentSofortMerchantTransactionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentWhitelistResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteAttachmentWhitelistResultList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextBankSwitchServiceNetherlandsIncomingPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextBankSwitchServiceNetherlandsIncomingPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextBunqMeFundraiserResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextBunqMeFundraiserResultList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextDraftPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextDraftPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextIdealMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextIdealMerchantTransactionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextMasterCardAction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextMasterCardActionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextPaymentBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextPaymentBatchList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextPaymentList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestInquiry.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestInquiryBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestInquiryBatchList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestInquiryList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestResponse.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextRequestResponseList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextScheduleInstance.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextScheduleInstanceList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextSofortMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextSofortMerchantTransactionList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextWhitelistResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNoteTextWhitelistResultList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseNull.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePayment.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePaymentBatch.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePaymentBatchList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePaymentChatList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePaymentList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePermittedIp.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePermittedIpList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponsePromotionDisplay.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestInquiry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestInquiryBatch.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestInquiryBatchList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestInquiryChatList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestInquiryList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestResponse.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestResponseChatList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseRequestResponseList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseSandboxUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseSchedule.php @@ -2090,6 +2983,7 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTab.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabAttachmentTab.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabItemShop.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabItemShopList.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabResultInquiry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabResultInquiryList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseTabResultResponse.php @@ -2104,29 +2998,19 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserCompany.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserCredentialPasswordIp.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserCredentialPasswordIpList.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserLight.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserList.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/BunqResponseUserPerson.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Card.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardBatch.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardDebit.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardGeneratedCvc2.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardName.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardPinChange.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardReplace.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CardResult.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CashRegister.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CashRegisterQrCode.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CashRegisterQrCodeContent.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CertificatePinned.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatConversation.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatConversationReference.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatConversationSupportExternal.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessage.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessageAnnouncement.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessageAttachment.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessageStatus.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessageText.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ChatMessageUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Customer.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CustomerLimit.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/CustomerStatementExport.php @@ -2138,8 +3022,10 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/DraftShareInviteApiKey. opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/DraftShareInviteApiKeyQrCodeContent.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/DraftShareInviteBank.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/DraftShareInviteBankQrCodeContent.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Event.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ExportAnnualOverview.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ExportAnnualOverviewContent.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/FeatureAnnouncement.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/IdealMerchantTransaction.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/InstallationServerPublicKey.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Invoice.php @@ -2150,16 +3036,39 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/MonetaryAccountBank.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/MonetaryAccountJoint.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/MonetaryAccountLight.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/MonetaryAccountProfile.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/MonetaryAccountSavings.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentBankSwitchServiceNetherlandsIncomingPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentBunqMeFundraiserResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentDraftPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentIdealMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentMasterCardAction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentPaymentBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentRequestInquiry.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentRequestInquiryBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentRequestResponse.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentScheduleInstance.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentSofortMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteAttachmentWhitelistResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextBankSwitchServiceNetherlandsIncomingPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextBunqMeFundraiserResult.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextDraftPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextIdealMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextMasterCardAction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextPayment.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextPaymentBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextRequestInquiry.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextRequestInquiryBatch.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextRequestResponse.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextScheduleInstance.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextSofortMerchantTransaction.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/NoteTextWhitelistResult.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Payment.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/PaymentBatch.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/PaymentChat.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/PermittedIp.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/PromotionDisplay.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/RequestInquiry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/RequestInquiryBatch.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/RequestInquiryChat.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/RequestResponse.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/RequestResponseChat.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/SandboxUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Schedule.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ScheduleInstance.php @@ -2169,6 +3078,7 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ScheduleUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Session.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ShareInviteBankAmountUsed.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ShareInviteBankInquiry.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ShareInviteBankInquiryBatch.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/ShareInviteBankResponse.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Tab.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/TabAttachmentTab.php @@ -2184,6 +3094,7 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/TabUsageSingle.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/TokenQrRequestIdeal.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/TokenQrRequestSofort.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/User.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/UserApiKey.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/UserCompany.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/UserCredentialPasswordIp.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/UserLight.php @@ -2192,7 +3103,6 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/Whitelist.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Endpoint/WhitelistResult.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Address.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Amount.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/AnchoredObject.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Attachment.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/AttachmentMonetaryAccountPayment.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/AttachmentPublic.php @@ -2201,25 +3111,19 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Avatar.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/BudgetRestriction.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/BunqId.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/BunqMeMerchantAvailable.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CardBatchEntry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CardCountryPermission.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CardLimit.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CardMagStripePermission.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CardPinAssignment.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Certificate.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContent.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentAnchorEvent.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentAttachment.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentGeolocation.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentStatusConversation.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentStatusConversationTitle.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentStatusMembership.php -opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/ChatMessageContentText.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/CoOwner.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/DraftPaymentAnchorObject.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/DraftPaymentEntry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/DraftPaymentResponse.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/DraftShareInviteEntry.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Error.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/EventObject.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Geolocation.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Image.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/InvoiceItem.php @@ -2249,6 +3153,7 @@ opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/TabTextWaitingScreen.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/TabVisibility.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/TaxResident.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/Ubo.php +opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/UserApiKeyAnchoredUser.php opt/app/vendor/bunq/sdk_php/src/Model/Generated/Object/WhitelistResultViewAnchoredObject.php opt/app/vendor/bunq/sdk_php/src/Security/KeyPair.php opt/app/vendor/bunq/sdk_php/src/Security/PrivateKey.php @@ -2267,6 +3172,22 @@ opt/app/vendor/composer/autoload_psr4.php opt/app/vendor/composer/autoload_real.php opt/app/vendor/composer/autoload_static.php opt/app/vendor/composer/installed.json +opt/app/vendor/danhunsaker/laravel-flysystem-others/.travis-phpunit-hhvm.xml +opt/app/vendor/danhunsaker/laravel-flysystem-others/.travis-phpunit.xml +opt/app/vendor/danhunsaker/laravel-flysystem-others/LICENSE +opt/app/vendor/danhunsaker/laravel-flysystem-others/README.md +opt/app/vendor/danhunsaker/laravel-flysystem-others/composer.json +opt/app/vendor/danhunsaker/laravel-flysystem-others/config/filesystems.php +opt/app/vendor/danhunsaker/laravel-flysystem-others/src/FlysystemOtherManager.php +opt/app/vendor/danhunsaker/laravel-flysystem-others/src/FlysystemOtherServiceProvider.php +opt/app/vendor/danhunsaker/laravel-flysystem-service/.travis-phpunit-hhvm.xml +opt/app/vendor/danhunsaker/laravel-flysystem-service/.travis-phpunit.xml +opt/app/vendor/danhunsaker/laravel-flysystem-service/LICENSE +opt/app/vendor/danhunsaker/laravel-flysystem-service/README.md +opt/app/vendor/danhunsaker/laravel-flysystem-service/composer.json +opt/app/vendor/danhunsaker/laravel-flysystem-service/config/filesystems.php +opt/app/vendor/danhunsaker/laravel-flysystem-service/src/FlysystemManager.php +opt/app/vendor/danhunsaker/laravel-flysystem-service/src/FlysystemServiceProvider.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsException.php @@ -2285,6 +3206,7 @@ opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bulma.blade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/foundation6.blade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/json-ld.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/materialize.blade.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/uikit.blade.php opt/app/vendor/defuse/php-encryption/.php_cs opt/app/vendor/defuse/php-encryption/LICENSE opt/app/vendor/defuse/php-encryption/README.md @@ -2354,11 +3276,7 @@ opt/app/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php opt/app/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php opt/app/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php opt/app/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php -opt/app/vendor/doctrine/dbal/.github/ISSUE_TEMPLATE/BC_Break.md -opt/app/vendor/doctrine/dbal/.github/ISSUE_TEMPLATE/Bug.md -opt/app/vendor/doctrine/dbal/.github/ISSUE_TEMPLATE/Feature_Request.md -opt/app/vendor/doctrine/dbal/.github/ISSUE_TEMPLATE/Support_Question.md -opt/app/vendor/doctrine/dbal/.github/PULL_REQUEST_TEMPLATE.md +opt/app/vendor/doctrine/dbal/.doctrine-project.json opt/app/vendor/doctrine/dbal/LICENSE opt/app/vendor/doctrine/dbal/README.md opt/app/vendor/doctrine/dbal/SECURITY.md @@ -2381,6 +3299,7 @@ opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDB2Driver.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDriverException.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractOracleDriver.php +opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractOracleDriver/EasyConnectString.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractPostgreSQLDriver.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLAnywhereDriver.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLServerDriver.php @@ -2615,7 +3534,6 @@ opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeImmutableType.ph opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeType.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Version.php opt/app/vendor/doctrine/dbal/lib/Doctrine/DBAL/VersionAwarePlatformDriver.php -opt/app/vendor/doctrine/dbal/phpstan.neon.dist opt/app/vendor/doctrine/event-manager/LICENSE opt/app/vendor/doctrine/event-manager/README.md opt/app/vendor/doctrine/event-manager/composer.json @@ -2798,6 +3716,7 @@ opt/app/vendor/guzzlehttp/promises/src/TaskQueue.php opt/app/vendor/guzzlehttp/promises/src/TaskQueueInterface.php opt/app/vendor/guzzlehttp/promises/src/functions.php opt/app/vendor/guzzlehttp/promises/src/functions_include.php +opt/app/vendor/guzzlehttp/psr7/.editorconfig opt/app/vendor/guzzlehttp/psr7/CHANGELOG.md opt/app/vendor/guzzlehttp/psr7/LICENSE opt/app/vendor/guzzlehttp/psr7/README.md @@ -2816,6 +3735,7 @@ opt/app/vendor/guzzlehttp/psr7/src/NoSeekStream.php opt/app/vendor/guzzlehttp/psr7/src/PumpStream.php opt/app/vendor/guzzlehttp/psr7/src/Request.php opt/app/vendor/guzzlehttp/psr7/src/Response.php +opt/app/vendor/guzzlehttp/psr7/src/Rfc7230.php opt/app/vendor/guzzlehttp/psr7/src/ServerRequest.php opt/app/vendor/guzzlehttp/psr7/src/Stream.php opt/app/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -3251,6 +4171,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Vue.p opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/_variables.scss opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/app.scss opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/none-stubs/app.js +opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/none-stubs/bootstrap.js opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/Example.js opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/app.js opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/vue-stubs/ExampleComponent.vue @@ -3309,6 +4230,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Events/Dispatchable.p opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Events/LocaleUpdated.php opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/WhoopsHandler.php +opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/401.blade.php opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/403.blade.php opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/404.blade.php opt/app/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/419.blade.php @@ -3455,8 +4377,6 @@ opt/app/vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Channels/NexmoSmsChannel.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Channels/SlackWebhookChannel.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Console/stubs/notifications.stub opt/app/vendor/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php @@ -3469,11 +4389,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Notifications/HasDatabaseNotific opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/NexmoMessage.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachment.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachmentField.php -opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Messages/SlackMessage.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Notifiable.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/Notification.php opt/app/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php @@ -3772,6 +4688,12 @@ opt/app/vendor/laravel/framework/src/Illuminate/View/ViewFinderInterface.php opt/app/vendor/laravel/framework/src/Illuminate/View/ViewName.php opt/app/vendor/laravel/framework/src/Illuminate/View/ViewServiceProvider.php opt/app/vendor/laravel/framework/src/Illuminate/View/composer.json +opt/app/vendor/laravel/nexmo-notification-channel/LICENSE.txt +opt/app/vendor/laravel/nexmo-notification-channel/composer.json +opt/app/vendor/laravel/nexmo-notification-channel/readme.md +opt/app/vendor/laravel/nexmo-notification-channel/src/Channels/NexmoSmsChannel.php +opt/app/vendor/laravel/nexmo-notification-channel/src/Messages/NexmoMessage.php +opt/app/vendor/laravel/nexmo-notification-channel/src/NexmoChannelServiceProvider.php opt/app/vendor/laravel/passport/LICENSE.txt opt/app/vendor/laravel/passport/composer.json opt/app/vendor/laravel/passport/config/passport.php @@ -3837,6 +4759,14 @@ opt/app/vendor/laravel/passport/src/Scope.php opt/app/vendor/laravel/passport/src/Token.php opt/app/vendor/laravel/passport/src/TokenRepository.php opt/app/vendor/laravel/passport/src/TransientToken.php +opt/app/vendor/laravel/slack-notification-channel/LICENSE.txt +opt/app/vendor/laravel/slack-notification-channel/composer.json +opt/app/vendor/laravel/slack-notification-channel/readme.md +opt/app/vendor/laravel/slack-notification-channel/src/Channels/SlackWebhookChannel.php +opt/app/vendor/laravel/slack-notification-channel/src/Messages/SlackAttachment.php +opt/app/vendor/laravel/slack-notification-channel/src/Messages/SlackAttachmentField.php +opt/app/vendor/laravel/slack-notification-channel/src/Messages/SlackMessage.php +opt/app/vendor/laravel/slack-notification-channel/src/SlackChannelServiceProvider.php opt/app/vendor/laravelcollective/html/CONTRIBUTING.md opt/app/vendor/laravelcollective/html/LICENSE.txt opt/app/vendor/laravelcollective/html/composer.json @@ -4065,10 +4995,11 @@ opt/app/vendor/league/csv/src/Writer.php opt/app/vendor/league/csv/src/XMLConverter.php opt/app/vendor/league/csv/src/functions.php opt/app/vendor/league/csv/src/functions_include.php -opt/app/vendor/league/event/LICENCE +opt/app/vendor/league/event/LICENSE opt/app/vendor/league/event/composer.json opt/app/vendor/league/event/src/AbstractEvent.php opt/app/vendor/league/event/src/AbstractListener.php +opt/app/vendor/league/event/src/BufferedEmitter.php opt/app/vendor/league/event/src/CallbackListener.php opt/app/vendor/league/event/src/Emitter.php opt/app/vendor/league/event/src/EmitterAwareInterface.php @@ -4085,6 +5016,16 @@ opt/app/vendor/league/event/src/ListenerAcceptorInterface.php opt/app/vendor/league/event/src/ListenerInterface.php opt/app/vendor/league/event/src/ListenerProviderInterface.php opt/app/vendor/league/event/src/OneTimeListener.php +opt/app/vendor/league/flysystem-replicate-adapter/changelog.md +opt/app/vendor/league/flysystem-replicate-adapter/composer.json +opt/app/vendor/league/flysystem-replicate-adapter/phpunit.hhvm.xml +opt/app/vendor/league/flysystem-replicate-adapter/phpunit.php +opt/app/vendor/league/flysystem-replicate-adapter/readme.md +opt/app/vendor/league/flysystem-replicate-adapter/src/ReplicateAdapter.php +opt/app/vendor/league/flysystem-replicate-adapter/tests/ReplicateAdapterTests.php +opt/app/vendor/league/flysystem-sftp/composer.json +opt/app/vendor/league/flysystem-sftp/readme.md +opt/app/vendor/league/flysystem-sftp/src/SftpAdapter.php opt/app/vendor/league/flysystem/LICENSE opt/app/vendor/league/flysystem/composer.json opt/app/vendor/league/flysystem/deprecations.md @@ -4182,6 +5123,7 @@ opt/app/vendor/league/oauth2-server/src/Entities/Traits/AuthCodeTrait.php opt/app/vendor/league/oauth2-server/src/Entities/Traits/ClientTrait.php opt/app/vendor/league/oauth2-server/src/Entities/Traits/EntityTrait.php opt/app/vendor/league/oauth2-server/src/Entities/Traits/RefreshTokenTrait.php +opt/app/vendor/league/oauth2-server/src/Entities/Traits/ScopeTrait.php opt/app/vendor/league/oauth2-server/src/Entities/Traits/TokenEntityTrait.php opt/app/vendor/league/oauth2-server/src/Entities/UserEntityInterface.php opt/app/vendor/league/oauth2-server/src/Exception/OAuthServerException.php @@ -4210,6 +5152,8 @@ opt/app/vendor/league/oauth2-server/src/ResponseTypes/AbstractResponseType.php opt/app/vendor/league/oauth2-server/src/ResponseTypes/BearerTokenResponse.php opt/app/vendor/league/oauth2-server/src/ResponseTypes/RedirectResponse.php opt/app/vendor/league/oauth2-server/src/ResponseTypes/ResponseTypeInterface.php +opt/app/vendor/litipk/flysystem-fallback-adapter/composer.json +opt/app/vendor/litipk/flysystem-fallback-adapter/src/FallbackAdapter.php opt/app/vendor/monolog/monolog/.php_cs opt/app/vendor/monolog/monolog/CHANGELOG.md opt/app/vendor/monolog/monolog/LICENSE @@ -4266,6 +5210,7 @@ opt/app/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php +opt/app/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php opt/app/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php @@ -4304,11 +5249,15 @@ opt/app/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php +opt/app/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php opt/app/vendor/monolog/monolog/src/Monolog/Registry.php +opt/app/vendor/monolog/monolog/src/Monolog/ResettableInterface.php +opt/app/vendor/monolog/monolog/src/Monolog/SignalHandler.php +opt/app/vendor/monolog/monolog/src/Monolog/Utils.php opt/app/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php @@ -4346,6 +5295,7 @@ opt/app/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.ph opt/app/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php +opt/app/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php @@ -4387,6 +5337,7 @@ opt/app/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php opt/app/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php opt/app/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php opt/app/vendor/monolog/monolog/tests/Monolog/RegistryTest.php +opt/app/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php opt/app/vendor/monolog/monolog/tests/Monolog/TestCase.php opt/app/vendor/mschindler83/fints-hbci-php/COMPATIBILITY.md opt/app/vendor/mschindler83/fints-hbci-php/LICENSE @@ -4559,6 +5510,131 @@ opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php opt/app/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php opt/app/vendor/nesbot/carbon/src/Carbon/Translator.php opt/app/vendor/nesbot/carbon/src/JsonSerializable.php +opt/app/vendor/nexmo/client/LICENSE.txt +opt/app/vendor/nexmo/client/composer.json +opt/app/vendor/nexmo/client/examples/fetch_recording.php +opt/app/vendor/nexmo/client/examples/send.php +opt/app/vendor/nexmo/client/phpcs.xml +opt/app/vendor/nexmo/client/src/Account/Balance.php +opt/app/vendor/nexmo/client/src/Account/Client.php +opt/app/vendor/nexmo/client/src/Account/PrefixPrice.php +opt/app/vendor/nexmo/client/src/Account/Price.php +opt/app/vendor/nexmo/client/src/Account/Secret.php +opt/app/vendor/nexmo/client/src/Account/SecretCollection.php +opt/app/vendor/nexmo/client/src/Account/SmsPrice.php +opt/app/vendor/nexmo/client/src/Account/VoicePrice.php +opt/app/vendor/nexmo/client/src/ApiErrorHandler.php +opt/app/vendor/nexmo/client/src/Application/Application.php +opt/app/vendor/nexmo/client/src/Application/ApplicationInterface.php +opt/app/vendor/nexmo/client/src/Application/Client.php +opt/app/vendor/nexmo/client/src/Application/Filter.php +opt/app/vendor/nexmo/client/src/Application/VoiceConfig.php +opt/app/vendor/nexmo/client/src/Application/Webhook.php +opt/app/vendor/nexmo/client/src/Call/Call.php +opt/app/vendor/nexmo/client/src/Call/Collection.php +opt/app/vendor/nexmo/client/src/Call/Dtmf.php +opt/app/vendor/nexmo/client/src/Call/Earmuff.php +opt/app/vendor/nexmo/client/src/Call/Endpoint.php +opt/app/vendor/nexmo/client/src/Call/Event.php +opt/app/vendor/nexmo/client/src/Call/Filter.php +opt/app/vendor/nexmo/client/src/Call/Hangup.php +opt/app/vendor/nexmo/client/src/Call/Mute.php +opt/app/vendor/nexmo/client/src/Call/Stream.php +opt/app/vendor/nexmo/client/src/Call/Talk.php +opt/app/vendor/nexmo/client/src/Call/Transfer.php +opt/app/vendor/nexmo/client/src/Call/Unearmuff.php +opt/app/vendor/nexmo/client/src/Call/Unmute.php +opt/app/vendor/nexmo/client/src/Call/Webhook.php +opt/app/vendor/nexmo/client/src/Client.php +opt/app/vendor/nexmo/client/src/Client/Callback/Callback.php +opt/app/vendor/nexmo/client/src/Client/Callback/CallbackInterface.php +opt/app/vendor/nexmo/client/src/Client/ClientAwareInterface.php +opt/app/vendor/nexmo/client/src/Client/ClientAwareTrait.php +opt/app/vendor/nexmo/client/src/Client/Credentials/AbstractCredentials.php +opt/app/vendor/nexmo/client/src/Client/Credentials/Basic.php +opt/app/vendor/nexmo/client/src/Client/Credentials/Container.php +opt/app/vendor/nexmo/client/src/Client/Credentials/CredentialsInterface.php +opt/app/vendor/nexmo/client/src/Client/Credentials/Keypair.php +opt/app/vendor/nexmo/client/src/Client/Credentials/OAuth.php +opt/app/vendor/nexmo/client/src/Client/Credentials/SignatureSecret.php +opt/app/vendor/nexmo/client/src/Client/Exception/Exception.php +opt/app/vendor/nexmo/client/src/Client/Exception/Request.php +opt/app/vendor/nexmo/client/src/Client/Exception/Server.php +opt/app/vendor/nexmo/client/src/Client/Exception/Transport.php +opt/app/vendor/nexmo/client/src/Client/Exception/Validation.php +opt/app/vendor/nexmo/client/src/Client/Factory/FactoryInterface.php +opt/app/vendor/nexmo/client/src/Client/Factory/MapFactory.php +opt/app/vendor/nexmo/client/src/Client/Request/AbstractRequest.php +opt/app/vendor/nexmo/client/src/Client/Request/RequestInterface.php +opt/app/vendor/nexmo/client/src/Client/Request/WrapResponseInterface.php +opt/app/vendor/nexmo/client/src/Client/Response/AbstractResponse.php +opt/app/vendor/nexmo/client/src/Client/Response/Error.php +opt/app/vendor/nexmo/client/src/Client/Response/Response.php +opt/app/vendor/nexmo/client/src/Client/Response/ResponseInterface.php +opt/app/vendor/nexmo/client/src/Client/Signature.php +opt/app/vendor/nexmo/client/src/Conversations/Collection.php +opt/app/vendor/nexmo/client/src/Conversations/Conversation.php +opt/app/vendor/nexmo/client/src/Conversion/Client.php +opt/app/vendor/nexmo/client/src/Entity/ArrayAccessTrait.php +opt/app/vendor/nexmo/client/src/Entity/CollectionAwareInterface.php +opt/app/vendor/nexmo/client/src/Entity/CollectionAwareTrait.php +opt/app/vendor/nexmo/client/src/Entity/CollectionInterface.php +opt/app/vendor/nexmo/client/src/Entity/CollectionTrait.php +opt/app/vendor/nexmo/client/src/Entity/EmptyFilter.php +opt/app/vendor/nexmo/client/src/Entity/EntityInterface.php +opt/app/vendor/nexmo/client/src/Entity/FilterInterface.php +opt/app/vendor/nexmo/client/src/Entity/HasEntityTrait.php +opt/app/vendor/nexmo/client/src/Entity/JsonResponseTrait.php +opt/app/vendor/nexmo/client/src/Entity/JsonSerializableInterface.php +opt/app/vendor/nexmo/client/src/Entity/JsonSerializableTrait.php +opt/app/vendor/nexmo/client/src/Entity/JsonUnserializableInterface.php +opt/app/vendor/nexmo/client/src/Entity/NoRequestResponseTrait.php +opt/app/vendor/nexmo/client/src/Entity/Psr7Trait.php +opt/app/vendor/nexmo/client/src/Entity/RequestArrayTrait.php +opt/app/vendor/nexmo/client/src/Insights/Advanced.php +opt/app/vendor/nexmo/client/src/Insights/AdvancedCnam.php +opt/app/vendor/nexmo/client/src/Insights/Basic.php +opt/app/vendor/nexmo/client/src/Insights/Client.php +opt/app/vendor/nexmo/client/src/Insights/CnamTrait.php +opt/app/vendor/nexmo/client/src/Insights/Standard.php +opt/app/vendor/nexmo/client/src/Insights/StandardCnam.php +opt/app/vendor/nexmo/client/src/InvalidResponseException.php +opt/app/vendor/nexmo/client/src/Message/AutoDetect.php +opt/app/vendor/nexmo/client/src/Message/Binary.php +opt/app/vendor/nexmo/client/src/Message/Callback/Receipt.php +opt/app/vendor/nexmo/client/src/Message/Client.php +opt/app/vendor/nexmo/client/src/Message/CollectionTrait.php +opt/app/vendor/nexmo/client/src/Message/EncodingDetector.php +opt/app/vendor/nexmo/client/src/Message/InboundMessage.php +opt/app/vendor/nexmo/client/src/Message/Message.php +opt/app/vendor/nexmo/client/src/Message/MessageInterface.php +opt/app/vendor/nexmo/client/src/Message/Query.php +opt/app/vendor/nexmo/client/src/Message/Response/Collection.php +opt/app/vendor/nexmo/client/src/Message/Response/Message.php +opt/app/vendor/nexmo/client/src/Message/Text.php +opt/app/vendor/nexmo/client/src/Message/Unicode.php +opt/app/vendor/nexmo/client/src/Message/Vcal.php +opt/app/vendor/nexmo/client/src/Message/Vcard.php +opt/app/vendor/nexmo/client/src/Message/Wap.php +opt/app/vendor/nexmo/client/src/Network.php +opt/app/vendor/nexmo/client/src/Network/Number/Callback.php +opt/app/vendor/nexmo/client/src/Network/Number/Request.php +opt/app/vendor/nexmo/client/src/Network/Number/Response.php +opt/app/vendor/nexmo/client/src/Numbers/Client.php +opt/app/vendor/nexmo/client/src/Numbers/Number.php +opt/app/vendor/nexmo/client/src/Redact/Client.php +opt/app/vendor/nexmo/client/src/Response.php +opt/app/vendor/nexmo/client/src/Response/Message.php +opt/app/vendor/nexmo/client/src/User/Collection.php +opt/app/vendor/nexmo/client/src/User/User.php +opt/app/vendor/nexmo/client/src/Verify/Check.php +opt/app/vendor/nexmo/client/src/Verify/Client.php +opt/app/vendor/nexmo/client/src/Verify/Verification.php +opt/app/vendor/nexmo/client/src/Verify/VerificationInterface.php +opt/app/vendor/nexmo/client/src/Voice/Call/Call.php +opt/app/vendor/nexmo/client/src/Voice/Call/Inbound.php +opt/app/vendor/nexmo/client/src/Voice/Message/Callback.php +opt/app/vendor/nexmo/client/src/Voice/Message/Message.php opt/app/vendor/opis/closure/CHANGELOG.md opt/app/vendor/opis/closure/LICENSE opt/app/vendor/opis/closure/NOTICE @@ -4610,9 +5686,38 @@ opt/app/vendor/paragonie/random_compat/lib/random.php opt/app/vendor/paragonie/random_compat/other/build_phar.php opt/app/vendor/paragonie/random_compat/psalm-autoload.php opt/app/vendor/paragonie/random_compat/psalm.xml +opt/app/vendor/php-http/guzzle6-adapter/CHANGELOG.md +opt/app/vendor/php-http/guzzle6-adapter/LICENSE +opt/app/vendor/php-http/guzzle6-adapter/README.md +opt/app/vendor/php-http/guzzle6-adapter/composer.json +opt/app/vendor/php-http/guzzle6-adapter/puli.json +opt/app/vendor/php-http/guzzle6-adapter/src/Client.php +opt/app/vendor/php-http/guzzle6-adapter/src/Promise.php +opt/app/vendor/php-http/httplug/CHANGELOG.md +opt/app/vendor/php-http/httplug/LICENSE +opt/app/vendor/php-http/httplug/README.md +opt/app/vendor/php-http/httplug/composer.json +opt/app/vendor/php-http/httplug/puli.json +opt/app/vendor/php-http/httplug/src/Exception.php +opt/app/vendor/php-http/httplug/src/Exception/HttpException.php +opt/app/vendor/php-http/httplug/src/Exception/NetworkException.php +opt/app/vendor/php-http/httplug/src/Exception/RequestException.php +opt/app/vendor/php-http/httplug/src/Exception/TransferException.php +opt/app/vendor/php-http/httplug/src/HttpAsyncClient.php +opt/app/vendor/php-http/httplug/src/HttpClient.php +opt/app/vendor/php-http/httplug/src/Promise/HttpFulfilledPromise.php +opt/app/vendor/php-http/httplug/src/Promise/HttpRejectedPromise.php +opt/app/vendor/php-http/promise/CHANGELOG.md +opt/app/vendor/php-http/promise/LICENSE +opt/app/vendor/php-http/promise/README.md +opt/app/vendor/php-http/promise/composer.json +opt/app/vendor/php-http/promise/src/FulfilledPromise.php +opt/app/vendor/php-http/promise/src/Promise.php +opt/app/vendor/php-http/promise/src/RejectedPromise.php opt/app/vendor/phpseclib/phpseclib/AUTHORS opt/app/vendor/phpseclib/phpseclib/LICENSE opt/app/vendor/phpseclib/phpseclib/README.md +opt/app/vendor/phpseclib/phpseclib/appveyor.yml opt/app/vendor/phpseclib/phpseclib/composer.json opt/app/vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php opt/app/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php @@ -4722,6 +5827,7 @@ opt/app/vendor/psr/log/Psr/Log/LoggerInterface.php opt/app/vendor/psr/log/Psr/Log/LoggerTrait.php opt/app/vendor/psr/log/Psr/Log/NullLogger.php opt/app/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +opt/app/vendor/psr/log/Psr/Log/Test/TestLogger.php opt/app/vendor/psr/log/README.md opt/app/vendor/psr/log/composer.json opt/app/vendor/psr/simple-cache/.editorconfig @@ -4731,6 +5837,11 @@ opt/app/vendor/psr/simple-cache/composer.json opt/app/vendor/psr/simple-cache/src/CacheException.php opt/app/vendor/psr/simple-cache/src/CacheInterface.php opt/app/vendor/psr/simple-cache/src/InvalidArgumentException.php +opt/app/vendor/ralouphie/getallheaders/LICENSE +opt/app/vendor/ralouphie/getallheaders/README.md +opt/app/vendor/ralouphie/getallheaders/composer.json +opt/app/vendor/ralouphie/getallheaders/src/getallheaders.php +opt/app/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php opt/app/vendor/ramsey/uuid/CHANGELOG.md opt/app/vendor/ramsey/uuid/CODE_OF_CONDUCT.md opt/app/vendor/ramsey/uuid/CONTRIBUTING.md @@ -5183,6 +6294,7 @@ opt/app/vendor/symfony/console/Formatter/OutputFormatterInterface.php opt/app/vendor/symfony/console/Formatter/OutputFormatterStyle.php opt/app/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php opt/app/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +opt/app/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php opt/app/vendor/symfony/console/Helper/DebugFormatterHelper.php opt/app/vendor/symfony/console/Helper/DescriptorHelper.php opt/app/vendor/symfony/console/Helper/FormatterHelper.php @@ -5461,6 +6573,27 @@ opt/app/vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php opt/app/vendor/symfony/console/Tests/Tester/CommandTesterTest.php opt/app/vendor/symfony/console/composer.json opt/app/vendor/symfony/console/phpunit.xml.dist +opt/app/vendor/symfony/contracts/CHANGELOG.md +opt/app/vendor/symfony/contracts/Cache/CacheInterface.php +opt/app/vendor/symfony/contracts/Cache/CacheTrait.php +opt/app/vendor/symfony/contracts/Cache/CallbackInterface.php +opt/app/vendor/symfony/contracts/Cache/ItemInterface.php +opt/app/vendor/symfony/contracts/Cache/TagAwareCacheInterface.php +opt/app/vendor/symfony/contracts/LICENSE +opt/app/vendor/symfony/contracts/README.md +opt/app/vendor/symfony/contracts/Service/ResetInterface.php +opt/app/vendor/symfony/contracts/Service/ServiceLocatorTrait.php +opt/app/vendor/symfony/contracts/Service/ServiceSubscriberInterface.php +opt/app/vendor/symfony/contracts/Service/ServiceSubscriberTrait.php +opt/app/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php +opt/app/vendor/symfony/contracts/Tests/Service/ServiceLocatorTest.php +opt/app/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php +opt/app/vendor/symfony/contracts/Tests/Translation/TranslatorTest.php +opt/app/vendor/symfony/contracts/Translation/LocaleAwareInterface.php +opt/app/vendor/symfony/contracts/Translation/TranslatorInterface.php +opt/app/vendor/symfony/contracts/Translation/TranslatorTrait.php +opt/app/vendor/symfony/contracts/composer.json +opt/app/vendor/symfony/contracts/phpunit.xml.dist opt/app/vendor/symfony/css-selector/CHANGELOG.md opt/app/vendor/symfony/css-selector/CssSelectorConverter.php opt/app/vendor/symfony/css-selector/Exception/ExceptionInterface.php @@ -5573,20 +6706,24 @@ opt/app/vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedFunctionFatalError opt/app/vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedMethodFatalErrorHandlerTest.php opt/app/vendor/symfony/debug/Tests/Fixtures/AnnotatedClass.php opt/app/vendor/symfony/debug/Tests/Fixtures/ClassAlias.php +opt/app/vendor/symfony/debug/Tests/Fixtures/ClassWithAnnotatedParameters.php opt/app/vendor/symfony/debug/Tests/Fixtures/DeprecatedClass.php opt/app/vendor/symfony/debug/Tests/Fixtures/DeprecatedInterface.php opt/app/vendor/symfony/debug/Tests/Fixtures/ExtendedFinalMethod.php opt/app/vendor/symfony/debug/Tests/Fixtures/FinalClass.php opt/app/vendor/symfony/debug/Tests/Fixtures/FinalMethod.php opt/app/vendor/symfony/debug/Tests/Fixtures/FinalMethod2Trait.php +opt/app/vendor/symfony/debug/Tests/Fixtures/InterfaceWithAnnotatedParameters.php opt/app/vendor/symfony/debug/Tests/Fixtures/InternalClass.php opt/app/vendor/symfony/debug/Tests/Fixtures/InternalInterface.php opt/app/vendor/symfony/debug/Tests/Fixtures/InternalTrait.php opt/app/vendor/symfony/debug/Tests/Fixtures/InternalTrait2.php opt/app/vendor/symfony/debug/Tests/Fixtures/NonDeprecatedInterface.php opt/app/vendor/symfony/debug/Tests/Fixtures/PEARClass.php +opt/app/vendor/symfony/debug/Tests/Fixtures/SubClassWithAnnotatedParameters.php opt/app/vendor/symfony/debug/Tests/Fixtures/Throwing.php opt/app/vendor/symfony/debug/Tests/Fixtures/ToStringThrower.php +opt/app/vendor/symfony/debug/Tests/Fixtures/TraitWithAnnotatedParameters.php opt/app/vendor/symfony/debug/Tests/Fixtures/TraitWithInternalMethod.php opt/app/vendor/symfony/debug/Tests/Fixtures/casemismatch.php opt/app/vendor/symfony/debug/Tests/Fixtures/notPsr0Bis.php @@ -5616,6 +6753,7 @@ opt/app/vendor/symfony/event-dispatcher/LICENSE opt/app/vendor/symfony/event-dispatcher/README.md opt/app/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php +opt/app/vendor/symfony/event-dispatcher/Tests/Debug/WrappedListenerTest.php opt/app/vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php opt/app/vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/EventTest.php @@ -5745,6 +6883,7 @@ opt/app/vendor/symfony/http-foundation/Session/Session.php opt/app/vendor/symfony/http-foundation/Session/SessionBagInterface.php opt/app/vendor/symfony/http-foundation/Session/SessionBagProxy.php opt/app/vendor/symfony/http-foundation/Session/SessionInterface.php +opt/app/vendor/symfony/http-foundation/Session/SessionUtils.php opt/app/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php opt/app/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php opt/app/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php @@ -5826,6 +6965,10 @@ opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/wi opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.expected +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.php +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.expected +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MigratingSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php @@ -5938,6 +7081,7 @@ opt/app/vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php opt/app/vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php opt/app/vendor/symfony/http-kernel/Exception/BadRequestHttpException.php opt/app/vendor/symfony/http-kernel/Exception/ConflictHttpException.php +opt/app/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php opt/app/vendor/symfony/http-kernel/Exception/GoneHttpException.php opt/app/vendor/symfony/http-kernel/Exception/HttpException.php opt/app/vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php @@ -6054,7 +7198,6 @@ opt/app/vendor/symfony/http-kernel/Tests/Exception/TooManyRequestsHttpExceptionT opt/app/vendor/symfony/http-kernel/Tests/Exception/UnauthorizedHttpExceptionTest.php opt/app/vendor/symfony/http-kernel/Tests/Exception/UnprocessableEntityHttpExceptionTest.php opt/app/vendor/symfony/http-kernel/Tests/Exception/UnsupportedMediaTypeHttpExceptionTest.php -opt/app/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt @@ -6168,6 +7311,7 @@ opt/app/vendor/symfony/process/Process.php opt/app/vendor/symfony/process/ProcessUtils.php opt/app/vendor/symfony/process/README.md opt/app/vendor/symfony/process/Tests/ExecutableFinderTest.php +opt/app/vendor/symfony/process/Tests/KillableProcessWithOutput.php opt/app/vendor/symfony/process/Tests/NonStopableProcess.php opt/app/vendor/symfony/process/Tests/PhpExecutableFinderTest.php opt/app/vendor/symfony/process/Tests/PhpProcessTest.php @@ -6236,6 +7380,7 @@ opt/app/vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd opt/app/vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php opt/app/vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php opt/app/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php +opt/app/vendor/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php opt/app/vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php opt/app/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php opt/app/vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php @@ -6278,6 +7423,7 @@ opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/MissingRouteNam opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/NothingButNameController.php opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/PrefixedActionLocalizedRouteController.php opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/PrefixedActionPathController.php +opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/RequirementsWithoutPlaceholderNameController.php opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/RouteWithPrefixController.php opt/app/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php opt/app/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php @@ -6379,6 +7525,7 @@ opt/app/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub.php opt/app/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub_i18n.php opt/app/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub_root.php opt/app/vendor/symfony/routing/Tests/Fixtures/php_object_dsl.php +opt/app/vendor/symfony/routing/Tests/Fixtures/requirements_without_placeholder_name.yml opt/app/vendor/symfony/routing/Tests/Fixtures/scalar_defaults.xml opt/app/vendor/symfony/routing/Tests/Fixtures/special_route_name.yml opt/app/vendor/symfony/routing/Tests/Fixtures/validpattern.php @@ -6453,6 +7600,8 @@ opt/app/vendor/symfony/translation/Extractor/ExtractorInterface.php opt/app/vendor/symfony/translation/Extractor/PhpExtractor.php opt/app/vendor/symfony/translation/Extractor/PhpStringTokenParser.php opt/app/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php +opt/app/vendor/symfony/translation/Formatter/IntlFormatter.php +opt/app/vendor/symfony/translation/Formatter/IntlFormatterInterface.php opt/app/vendor/symfony/translation/Formatter/MessageFormatter.php opt/app/vendor/symfony/translation/Formatter/MessageFormatterInterface.php opt/app/vendor/symfony/translation/IdentityTranslator.php @@ -6472,9 +7621,6 @@ opt/app/vendor/symfony/translation/Loader/PoFileLoader.php opt/app/vendor/symfony/translation/Loader/QtFileLoader.php opt/app/vendor/symfony/translation/Loader/XliffFileLoader.php opt/app/vendor/symfony/translation/Loader/YamlFileLoader.php -opt/app/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd -opt/app/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd -opt/app/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd opt/app/vendor/symfony/translation/LoggingTranslator.php opt/app/vendor/symfony/translation/MessageCatalogue.php opt/app/vendor/symfony/translation/MessageCatalogueInterface.php @@ -6484,7 +7630,10 @@ opt/app/vendor/symfony/translation/PluralizationRules.php opt/app/vendor/symfony/translation/README.md opt/app/vendor/symfony/translation/Reader/TranslationReader.php opt/app/vendor/symfony/translation/Reader/TranslationReaderInterface.php +opt/app/vendor/symfony/translation/Resources/data/parents.json opt/app/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd +opt/app/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd +opt/app/vendor/symfony/translation/Resources/schemas/xml.xsd opt/app/vendor/symfony/translation/Tests/Catalogue/AbstractOperationTest.php opt/app/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php opt/app/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php @@ -6506,6 +7655,7 @@ opt/app/vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php opt/app/vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php opt/app/vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php opt/app/vendor/symfony/translation/Tests/Extractor/PhpExtractorTest.php +opt/app/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php opt/app/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php opt/app/vendor/symfony/translation/Tests/IdentityTranslatorTest.php opt/app/vendor/symfony/translation/Tests/IntervalTest.php @@ -6587,6 +7737,7 @@ opt/app/vendor/symfony/translation/Translator.php opt/app/vendor/symfony/translation/TranslatorBagInterface.php opt/app/vendor/symfony/translation/TranslatorInterface.php opt/app/vendor/symfony/translation/Util/ArrayConverter.php +opt/app/vendor/symfony/translation/Util/XliffUtils.php opt/app/vendor/symfony/translation/Writer/TranslationWriter.php opt/app/vendor/symfony/translation/Writer/TranslationWriterInterface.php opt/app/vendor/symfony/translation/composer.json @@ -6606,9 +7757,12 @@ opt/app/vendor/symfony/var-dumper/Caster/EnumStub.php opt/app/vendor/symfony/var-dumper/Caster/ExceptionCaster.php opt/app/vendor/symfony/var-dumper/Caster/FrameStub.php opt/app/vendor/symfony/var-dumper/Caster/GmpCaster.php +opt/app/vendor/symfony/var-dumper/Caster/IntlCaster.php opt/app/vendor/symfony/var-dumper/Caster/LinkStub.php +opt/app/vendor/symfony/var-dumper/Caster/MemcachedCaster.php opt/app/vendor/symfony/var-dumper/Caster/PdoCaster.php opt/app/vendor/symfony/var-dumper/Caster/PgSqlCaster.php +opt/app/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php opt/app/vendor/symfony/var-dumper/Caster/RedisCaster.php opt/app/vendor/symfony/var-dumper/Caster/ReflectionCaster.php opt/app/vendor/symfony/var-dumper/Caster/ResourceCaster.php @@ -6652,6 +7806,8 @@ opt/app/vendor/symfony/var-dumper/Tests/Caster/CasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/DateCasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/GmpCasterTest.php +opt/app/vendor/symfony/var-dumper/Tests/Caster/IntlCasterTest.php +opt/app/vendor/symfony/var-dumper/Tests/Caster/MemcachedCasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php opt/app/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php @@ -6750,6 +7906,7 @@ opt/app/vendor/twig/twig/doc/intro.rst opt/app/vendor/twig/twig/doc/recipes.rst opt/app/vendor/twig/twig/doc/tags/autoescape.rst opt/app/vendor/twig/twig/doc/tags/block.rst +opt/app/vendor/twig/twig/doc/tags/deprecated.rst opt/app/vendor/twig/twig/doc/tags/do.rst opt/app/vendor/twig/twig/doc/tags/embed.rst opt/app/vendor/twig/twig/doc/tags/extends.rst @@ -6838,6 +7995,7 @@ opt/app/vendor/twig/twig/lib/Twig/Node/Block.php opt/app/vendor/twig/twig/lib/Twig/Node/BlockReference.php opt/app/vendor/twig/twig/lib/Twig/Node/Body.php opt/app/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php +opt/app/vendor/twig/twig/lib/Twig/Node/Deprecated.php opt/app/vendor/twig/twig/lib/Twig/Node/Do.php opt/app/vendor/twig/twig/lib/Twig/Node/Embed.php opt/app/vendor/twig/twig/lib/Twig/Node/Expression.php @@ -6959,6 +8117,7 @@ opt/app/vendor/twig/twig/lib/Twig/Token.php opt/app/vendor/twig/twig/lib/Twig/TokenParser.php opt/app/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php opt/app/vendor/twig/twig/lib/Twig/TokenParser/Block.php +opt/app/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php opt/app/vendor/twig/twig/lib/Twig/TokenParser/Do.php opt/app/vendor/twig/twig/lib/Twig/TokenParser/Embed.php opt/app/vendor/twig/twig/lib/Twig/TokenParser/Extends.php @@ -7019,6 +8178,7 @@ opt/app/vendor/twig/twig/src/Node/BlockNode.php opt/app/vendor/twig/twig/src/Node/BlockReferenceNode.php opt/app/vendor/twig/twig/src/Node/BodyNode.php opt/app/vendor/twig/twig/src/Node/CheckSecurityNode.php +opt/app/vendor/twig/twig/src/Node/DeprecatedNode.php opt/app/vendor/twig/twig/src/Node/DoNode.php opt/app/vendor/twig/twig/src/Node/EmbedNode.php opt/app/vendor/twig/twig/src/Node/Expression/AbstractExpression.php @@ -7130,6 +8290,7 @@ opt/app/vendor/twig/twig/src/Token.php opt/app/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php opt/app/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php opt/app/vendor/twig/twig/src/TokenParser/BlockTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php opt/app/vendor/twig/twig/src/TokenParser/DoTokenParser.php opt/app/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php opt/app/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php @@ -7325,6 +8486,9 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/block.legacy.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/macro.legacy.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/template.legacy.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test @@ -7439,6 +8603,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_attribute.te opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks_with_template.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_constants.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/dynamic_test.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test @@ -7477,6 +8642,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php +opt/app/vendor/twig/twig/test/Twig/Tests/Node/DeprecatedTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php @@ -7595,8 +8761,11 @@ sandstorm-manifest usr/bin/my_print_defaults usr/bin/mysql usr/bin/mysql_install_db +usr/bin/nano usr/bin/php usr/bin/php7.2 +usr/bin/vi +usr/bin/vim.tiny usr/lib/locale/locale-archive usr/lib/php/20170718/bcmath.so usr/lib/php/20170718/calendar.so @@ -7611,6 +8780,7 @@ usr/lib/php/20170718/gettext.so usr/lib/php/20170718/iconv.so usr/lib/php/20170718/intl.so usr/lib/php/20170718/json.so +usr/lib/php/20170718/ldap.so usr/lib/php/20170718/mbstring.so usr/lib/php/20170718/mysqli.so usr/lib/php/20170718/mysqlnd.so @@ -7648,7 +8818,7 @@ usr/lib/x86_64-linux-gnu/libapparmor.so.1 usr/lib/x86_64-linux-gnu/libapparmor.so.1.2.0 usr/lib/x86_64-linux-gnu/libargon2.so.1 usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 -usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2 +usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 usr/lib/x86_64-linux-gnu/libcurl.so.4 usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0 usr/lib/x86_64-linux-gnu/libedit.so.2 @@ -7662,7 +8832,7 @@ usr/lib/x86_64-linux-gnu/libfontconfig.so.1.8.0 usr/lib/x86_64-linux-gnu/libfreetype.so.6 usr/lib/x86_64-linux-gnu/libfreetype.so.6.11.1 usr/lib/x86_64-linux-gnu/libgd.so.3 -usr/lib/x86_64-linux-gnu/libgd.so.3.0.0 +usr/lib/x86_64-linux-gnu/libgd.so.3.0.5 usr/lib/x86_64-linux-gnu/libgmp.so.10 usr/lib/x86_64-linux-gnu/libgmp.so.10.2.0 usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28 @@ -7706,15 +8876,13 @@ usr/lib/x86_64-linux-gnu/libsodium.so.23.1.0 usr/lib/x86_64-linux-gnu/libssh2.so.1 usr/lib/x86_64-linux-gnu/libssh2.so.1.0.1 usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 -usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 +usr/lib/x86_64-linux-gnu/libssl.so.1.1 usr/lib/x86_64-linux-gnu/libstdc++.so.6 usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 usr/lib/x86_64-linux-gnu/libtasn1.so.6 usr/lib/x86_64-linux-gnu/libtasn1.so.6.3.2 usr/lib/x86_64-linux-gnu/libtiff.so.5 usr/lib/x86_64-linux-gnu/libtiff.so.5.2.0 -usr/lib/x86_64-linux-gnu/libvpx.so.1 -usr/lib/x86_64-linux-gnu/libvpx.so.1.3.0 usr/lib/x86_64-linux-gnu/libwebp.so.5 usr/lib/x86_64-linux-gnu/libwebp.so.5.0.1 usr/lib/x86_64-linux-gnu/libxcb.so.1 @@ -7734,6 +8902,30 @@ usr/share/mysql/english/errmsg.sys usr/share/mysql/fill_help_tables.sql usr/share/mysql/mysql_system_tables.sql usr/share/mysql/mysql_system_tables_data.sql +usr/share/nano/asm.nanorc +usr/share/nano/awk.nanorc +usr/share/nano/c.nanorc +usr/share/nano/css.nanorc +usr/share/nano/debian.nanorc +usr/share/nano/gentoo.nanorc +usr/share/nano/groff.nanorc +usr/share/nano/html.nanorc +usr/share/nano/java.nanorc +usr/share/nano/man.nanorc +usr/share/nano/mutt.nanorc +usr/share/nano/nanorc.nanorc +usr/share/nano/patch.nanorc +usr/share/nano/perl.nanorc +usr/share/nano/php.nanorc +usr/share/nano/pov.nanorc +usr/share/nano/python.nanorc +usr/share/nano/ruby.nanorc +usr/share/nano/sh.nanorc +usr/share/nano/tcl.nanorc +usr/share/nano/tex.nanorc +usr/share/nano/xml.nanorc +usr/share/terminfo/u/unknown +usr/share/vim/vimrc.tiny usr/share/zoneinfo usr/share/zoneinfo/Africa usr/share/zoneinfo/Africa/Abidjan diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 2aec90d1cb..1d58b6858b 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = ( manifest = ( appTitle = (defaultText = "Firefly III"), - appVersion = 19, - appMarketingVersion = (defaultText = "4.7.9"), + appVersion = 20, + appMarketingVersion = (defaultText = "4.7.10"), actions = [ # Define your "new document" handlers here. @@ -103,7 +103,7 @@ const pkgdef :Spk.PackageDefinition = ( # not have been detected as a dependency during `spk dev`. If you list # a directory here, its entire contents will be included recursively. - #bridgeConfig = ( + bridgeConfig = ( # # Used for integrating permissions and roles into the Sandstorm shell # # and for sandstorm-http-bridge to pass to your app. # # Uncomment this block and adjust the permissions and roles to make @@ -165,12 +165,12 @@ const pkgdef :Spk.PackageDefinition = ( # ), # ], # ), - # #apiPath = "/api", + apiPath = "/api/v1/", # # Apps can export an API to the world. The API is to be used primarily by Javascript # # code and native apps, so it can't serve out regular HTML to browsers. If a request # # comes in to your app's API, sandstorm-http-bridge will prefix the request's path with # # this string, if specified. - #), + ), ); const myCommand :Spk.Manifest.Command = ( diff --git a/.sandstorm/setup.sh b/.sandstorm/setup.sh index 0148f5fbfd..2af5d9362d 100755 --- a/.sandstorm/setup.sh +++ b/.sandstorm/setup.sh @@ -13,6 +13,7 @@ apt-get update apt-get install -y python-software-properties software-properties-common # install all languages +sed -i 's/# es_ES.UTF-8 UTF-8/es_ES.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# it_IT.UTF-8 UTF-8/it_IT.UTF-8 UTF-8/g' /etc/locale.gen @@ -20,7 +21,7 @@ sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen -sed -i 's/# tr_TR.UTF-8 UTF-8/tr_TR.UTF-8 UTF-8/g' /etc/locale.gen +sed -i 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/g' /etc/locale.gen dpkg-reconfigure --frontend=noninteractive locales @@ -38,7 +39,7 @@ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sou # install packages. apt-get update -apt-get install -y nginx php7.2-fpm php7.2-mysql php7.2-gd php7.2-cli php7.2-curl git php7.2-dev php7.2-zip php7.2-intl php7.2-dom php7.2-mbstring php7.2-bcmath mysql-server +apt-get install -y nginx php7.2-fpm php7.2-mysql php7.2-gd php7.2-cli php7.2-curl php7.2-ldap git php7.2-dev php7.2-zip php7.2-intl php7.2-dom php7.2-mbstring php7.2-bcmath mysql-server service nginx stop service php7.2-fpm stop service mysql stop diff --git a/.travis.yml b/.travis.yml index 1dba72615d..ae31eb4043 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,29 +1,23 @@ -language: php -php: - - 7.2 - -cache: - directories: - - vendor - - $HOME/.composer/cache - -install: - - rm composer.lock - - composer update --no-scripts - - cp .env.testing .env - - php artisan clear-compiled - - php artisan env - - wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite - - mkdir -p build/logs - -script: - - ./vendor/bin/phpunit -c phpunit.coverage.xml - -after_success: - - travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml - +sudo: required +language: bash # safelist branches: only: - develop - master + +env: + - VERSION=4.7.10 + +services: + - docker + +script: + # enable experimental features. + - echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json + - sudo service docker restart + - docker version -f '{{.Server.Experimental}}' + - docker version + - .deploy/docker/build-amd64.sh + - .deploy/docker/build-arm.sh + - .deploy/docker/manifest.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index a31ac9354d..c056613149 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,92 +1,48 @@ FROM php:7.2-apache -# If building on a RPi, use --build-arg cores=3 to use all cores when compiling -# to speed up the image build -ARG CORES -ENV CORES ${CORES:-1} - -ENV FIREFLY_PATH=/var/www/firefly-iii/ CURL_VERSION=7.60.0 OPENSSL_VERSION=1.1.1-pre6 COMPOSER_ALLOW_SUPERUSER=1 -LABEL version="1.2" maintainer="thegrumpydictator@gmail.com" - -# install packages -RUN apt-get update -y && \ - apt-get install -y --no-install-recommends libcurl4-openssl-dev \ - zlib1g-dev \ - libjpeg62-turbo-dev \ - wget \ - libpng-dev \ - libicu-dev \ - libldap2-dev \ - libedit-dev \ - libtidy-dev \ - libxml2-dev \ - unzip \ - libsqlite3-dev \ - nano \ - curl \ - openssl \ - libpq-dev \ - libbz2-dev \ - gettext-base \ - cron \ - rsyslog \ - supervisor \ - locales && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* && \ - docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ && \ - docker-php-ext-install ldap - - -# Make sure that libcurl is using the newer curl libaries -#RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/00-curl.conf && ldconfig - -# Mimic the Debian/Ubuntu config file structure for supervisor -COPY .deploy/docker/supervisord.conf /etc/supervisor/supervisord.conf -RUN mkdir -p /etc/supervisor/conf.d /var/log/supervisor - -# copy Firefly III supervisor conf file. -COPY ./.deploy/docker/firefly-iii.conf /etc/supervisor/conf.d/firefly-iii.conf - -# copy cron job supervisor conf file. -COPY ./.deploy/docker/cronjob.conf /etc/supervisor/conf.d/cronjob.conf - -# copy ca certs to correct location -COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem - -# test crons added via crontab -RUN echo "0 3 * * * /usr/local/bin/php /var/www/firefly-iii/artisan firefly:cron" | crontab - -#RUN (crontab -l ; echo "*/1 * * * * free >> /var/www/firefly-iii/public/cron.html") 2>&1 | crontab - - -# Install PHP exentions, install composer, update languages. -RUN docker-php-ext-install -j$(nproc) gd intl tidy zip curl bcmath pdo_mysql bz2 pdo_pgsql && \ - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ - echo "en_US.UTF-8 UTF-8\nde_DE.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\n\n" > /etc/locale.gen && locale-gen - -# copy Apache config to correct spot. -COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf - -# Enable apache mod rewrite and mod ssl.. -RUN a2enmod rewrite && a2enmod ssl +ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1 +LABEL version="1.3" maintainer="thegrumpydictator@gmail.com" # Create volumes VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload -# Enable default site (Firefly III) -COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf +# Install some stuff +RUN apt-get update && apt-get install -y libpng-dev \ + libicu-dev \ + unzip \ + gettext-base \ + libldap2-dev \ + libpq-dev \ + locales \ + libmemcached-dev && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* -# Make sure we own Firefly III directory -RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage - -# Copy in Firefly Source +# Copy in Firefly III source WORKDIR $FIREFLY_PATH ADD . $FIREFLY_PATH -# Fix the link to curl: -#RUN rm -rf /usr/local/lib/libcurl.so.4 && ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 /usr/local/lib/libcurl.so.4 +# copy ca certs to correct location +COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem -# Run composer -RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest +# copy Apache config to correct spot. +COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf + +# Enable default site (Firefly III) +COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf + +# Run a lot of installation commands: +RUN chown -R www-data:www-data /var/www && \ + chmod -R 775 $FIREFLY_PATH/storage && \ + a2enmod rewrite && a2enmod ssl && \ + docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \ + docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \ + pecl install memcached-3.1.3 && \ + docker-php-ext-enable memcached && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ + echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \ + locale-gen && \ + composer install --prefer-dist --no-dev --no-scripts --no-suggest # Expose port 80 EXPOSE 80 diff --git a/Dockerfile-ARM b/Dockerfile-ARM new file mode 100644 index 0000000000..cfe6e0ad31 --- /dev/null +++ b/Dockerfile-ARM @@ -0,0 +1,50 @@ +FROM arm32v7/php:7.2.8-apache-stretch +ARG TARGETPLATFORM +COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static +ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1 +LABEL version="1.3" maintainer="thegrumpydictator@gmail.com" + +# Create volumes +VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload + +# Install some stuff +RUN apt-get update && apt-get install -y libpng-dev \ + libicu-dev \ + unzip \ + gettext-base \ + libldap2-dev \ + libpq-dev \ + locales \ + libmemcached-dev + +# Copy in Firefly III source +WORKDIR $FIREFLY_PATH +ADD . $FIREFLY_PATH + +# copy ca certs to correct location +COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem + +# copy Apache config to correct spot. +COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf + +# Enable default site (Firefly III) +COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf + +# Run a lot of installation commands: +RUN chown -R www-data:www-data /var/www && \ + chmod -R 775 $FIREFLY_PATH/storage && \ + a2enmod rewrite && a2enmod ssl && \ + docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \ + docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \ + pecl install memcached-3.1.3 && \ + docker-php-ext-enable memcached && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ + echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \ + locale-gen && \ + composer install --prefer-dist --no-dev --no-scripts --no-suggest + +# Expose port 80 +EXPOSE 80 + +# Run entrypoint thing +ENTRYPOINT [".deploy/docker/entrypoint.sh"] diff --git a/app/Api/V1/Controllers/AccountController.php b/app/Api/V1/Controllers/AccountController.php index 89a0272498..6dc976cc35 100644 --- a/app/Api/V1/Controllers/AccountController.php +++ b/app/Api/V1/Controllers/AccountController.php @@ -233,6 +233,12 @@ class AccountController extends Controller $type = $request->get('type') ?? 'default'; $this->parameters->set('type', $type); + // user can overrule page size with limit parameter. + $limit = $this->parameters->get('limit'); + if (null !== $limit && $limit > 0) { + $pageSize = $limit; + } + $types = $this->mapTransactionTypes($this->parameters->get('type')); $manager = new Manager(); $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; diff --git a/app/Api/V1/Controllers/AvailableBudgetController.php b/app/Api/V1/Controllers/AvailableBudgetController.php index dee987c5cb..ccdd94b45d 100644 --- a/app/Api/V1/Controllers/AvailableBudgetController.php +++ b/app/Api/V1/Controllers/AvailableBudgetController.php @@ -104,6 +104,17 @@ class AvailableBudgetController extends Controller // get list of available budgets. Count it and split it. $collection = $this->repository->getAvailableBudgets(); + + // filter list on start and end date, if present. + // TODO: put this in the query. + $start = $this->parameters->get('start'); + $end = $this->parameters->get('end'); + if(null !== $start && null !== $end) { + $collection = $collection->filter(function(AvailableBudget $availableBudget) use ($start, $end) { + return $availableBudget->start_date->gte($start) && $availableBudget->end_date->lte($end); + }); + } + $count = $collection->count(); $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); diff --git a/app/Api/V1/Controllers/BudgetController.php b/app/Api/V1/Controllers/BudgetController.php index 6b21f09bfc..4f14df5af7 100644 --- a/app/Api/V1/Controllers/BudgetController.php +++ b/app/Api/V1/Controllers/BudgetController.php @@ -247,7 +247,14 @@ class BudgetController extends Controller public function transactions(Request $request, Budget $budget): JsonResponse { $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - $type = $request->get('type') ?? 'default'; + + // user can overrule page size with limit parameter. + $limit = $this->parameters->get('limit'); + if (null !== $limit && $limit > 0) { + $pageSize = $limit; + } + + $type = $request->get('type') ?? 'default'; $this->parameters->set('type', $type); $types = $this->mapTransactionTypes($this->parameters->get('type')); diff --git a/app/Api/V1/Controllers/Chart/AccountController.php b/app/Api/V1/Controllers/Chart/AccountController.php new file mode 100644 index 0000000000..22c97e13d9 --- /dev/null +++ b/app/Api/V1/Controllers/Chart/AccountController.php @@ -0,0 +1,327 @@ +middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->repository = app(AccountRepositoryInterface::class); + $this->repository->setUser($user); + + $this->currencyRepository = app(CurrencyRepositoryInterface::class); + $this->currencyRepository->setUser($user); + + return $next($request); + } + ); + } + + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function expenseOverview(Request $request): JsonResponse + { + // parameters for chart: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + $start->subDay(); + + // prep some vars: + $currencies = []; + $chartData = []; + $tempData = []; + + // grab all accounts and names + $accounts = $this->repository->getAccountsByType([AccountType::EXPENSE]); + $accountNames = $this->extractNames($accounts); + $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); + $endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); + + // loop the end balances. This is an array for each account ($expenses) + foreach ($endBalances as $accountId => $expenses) { + $accountId = (int)$accountId; + // loop each expense entry (each entry can be a different currency). + foreach ($expenses as $currencyId => $endAmount) { + $currencyId = (int)$currencyId; + + // see if there is an accompanying start amount. + // grab the difference and find the currency. + $startAmount = $startBalances[$accountId][$currencyId] ?? '0'; + $diff = bcsub($endAmount, $startAmount); + $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); + if (0 !== bccomp($diff, '0')) { + // store the values in a temporary array. + $tempData[] = [ + 'name' => $accountNames[$accountId], + 'difference' => $diff, + 'diff_float' => (float)$diff, + 'currency_id' => $currencyId, + ]; + } + } + } + + // sort temp array by amount. + $amounts = array_column($tempData, 'diff_float'); + array_multisort($amounts, SORT_DESC, $tempData); + + // loop all found currencies and build the data array for the chart. + /** + * @var int $currencyId + * @var TransactionCurrency $currency + */ + foreach ($currencies as $currencyId => $currency) { + $currentSet = [ + 'label' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => $this->expandNames($tempData), + ]; + $chartData[$currencyId] = $currentSet; + } + + // loop temp data and place data in correct array: + foreach ($tempData as $entry) { + $currencyId = $entry['currency_id']; + $name = $entry['name']; + $chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']); + } + $chartData = array_values($chartData); + + return response()->json($chartData); + } + + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function revenueOverview(Request $request): JsonResponse + { + // parameters for chart: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + $start->subDay(); + + // prep some vars: + $currencies = []; + $chartData = []; + $tempData = []; + + // grab all accounts and names + $accounts = $this->repository->getAccountsByType([AccountType::REVENUE]); + $accountNames = $this->extractNames($accounts); + $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); + $endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); + + // loop the end balances. This is an array for each account ($expenses) + foreach ($endBalances as $accountId => $expenses) { + $accountId = (int)$accountId; + // loop each expense entry (each entry can be a different currency). + foreach ($expenses as $currencyId => $endAmount) { + $currencyId = (int)$currencyId; + + // see if there is an accompanying start amount. + // grab the difference and find the currency. + $startAmount = $startBalances[$accountId][$currencyId] ?? '0'; + $diff = bcsub($endAmount, $startAmount); + $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); + if (0 !== bccomp($diff, '0')) { + // store the values in a temporary array. + $tempData[] = [ + 'name' => $accountNames[$accountId], + 'difference' => bcmul($diff,'-1'), + 'diff_float' => (float)$diff * -1, + 'currency_id' => $currencyId, + ]; + } + } + } + + // sort temp array by amount. + $amounts = array_column($tempData, 'diff_float'); + array_multisort($amounts, SORT_DESC, $tempData); + + // loop all found currencies and build the data array for the chart. + /** + * @var int $currencyId + * @var TransactionCurrency $currency + */ + foreach ($currencies as $currencyId => $currency) { + $currentSet = [ + 'label' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => $this->expandNames($tempData), + ]; + $chartData[$currencyId] = $currentSet; + } + + // loop temp data and place data in correct array: + foreach ($tempData as $entry) { + $currencyId = $entry['currency_id']; + $name = $entry['name']; + $chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']); + } + $chartData = array_values($chartData); + + return response()->json($chartData); + } + + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function overview(Request $request): JsonResponse + { + // parameters for chart: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + + // user's preferences + $defaultSet = $this->repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray(); + $frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); + $default = app('amount')->getDefaultCurrency(); + if (0 === \count($frontPage->data)) { + $frontPage->data = $defaultSet; + $frontPage->save(); + } + + // get accounts: + $accounts = $this->repository->getAccountsById($frontPage->data); + $chartData = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $currency = $this->repository->getAccountCurrency($account); + if (null === $currency) { + $currency = $default; + } + $currentSet = [ + 'label' => $account->name, + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'type' => 'line', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [], + ]; + + $currentStart = clone $start; + $range = app('steam')->balanceInRange($account, $start, clone $end); + $previous = round(array_values($range)[0], 12); + while ($currentStart <= $end) { + $format = $currentStart->format('Y-m-d'); + $label = $currentStart->format('Y-m-d'); + $balance = isset($range[$format]) ? round($range[$format], 12) : $previous; + $previous = $balance; + $currentStart->addDay(); + $currentSet['entries'][$label] = $balance; + } + $chartData[] = $currentSet; + } + + return response()->json($chartData); + } + + /** + * Small helper function for the revenue and expense account charts. + * TODO should include Trait instead of doing this. + * + * @param array $names + * + * @return array + */ + protected function expandNames(array $names): array + { + $result = []; + foreach ($names as $entry) { + $result[$entry['name']] = 0; + } + + return $result; + } + + /** + * Small helper function for the revenue and expense account charts. + * TODO should include Trait instead of doing this. + * + * @param Collection $accounts + * + * @return array + */ + protected function extractNames(Collection $accounts): array + { + $return = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $return[$account->id] = $account->name; + } + + return $return; + } + +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Chart/AvailableBudgetController.php b/app/Api/V1/Controllers/Chart/AvailableBudgetController.php new file mode 100644 index 0000000000..0f2c2d79a6 --- /dev/null +++ b/app/Api/V1/Controllers/Chart/AvailableBudgetController.php @@ -0,0 +1,93 @@ +middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->repository = app(BudgetRepositoryInterface::class); + $this->repository->setUser($user); + + return $next($request); + } + ); + } + + /** + * @param Request $request + * + * @param AvailableBudget $availableBudget + * + * @return JsonResponse + */ + public function overview(Request $request, AvailableBudget $availableBudget): JsonResponse + { + $currency = $availableBudget->transactionCurrency; + $budgets = $this->repository->getActiveBudgets(); + $budgetInformation = $this->repository->spentInPeriodMc($budgets, new Collection, $availableBudget->start_date, $availableBudget->end_date); + $spent = 0.0; + + // get for current currency + foreach ($budgetInformation as $spentInfo) { + if ($spentInfo['currency_id'] === $availableBudget->transaction_currency_id) { + $spent = $spentInfo['amount']; + } + } + $left = bcadd($availableBudget->amount, (string)$spent); + // left less than zero? Set to zero. + if (bccomp($left, '0') === -1) { + $left = '0'; + } + + $chartData = [ + [ + 'label' => trans('firefly.spent'), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'type' => 'pie', + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [$spent * -1], + ], + [ + 'label' => trans('firefly.left'), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'type' => 'line', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [round($left, $currency->decimal_places)], + ], + ]; + + return response()->json($chartData); + } + +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Chart/CategoryController.php b/app/Api/V1/Controllers/Chart/CategoryController.php new file mode 100644 index 0000000000..4d7a6a4422 --- /dev/null +++ b/app/Api/V1/Controllers/Chart/CategoryController.php @@ -0,0 +1,188 @@ +middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->categoryRepository = app(CategoryRepositoryInterface::class); + $this->categoryRepository->setUser($user); + + return $next($request); + } + ); + } + + + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function overview(Request $request): JsonResponse + { + // parameters for chart: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + $tempData = []; + $spent = $this->categoryRepository->spentInPeriodPerCurrency(new Collection, new Collection, $start, $end); + $earned = $this->categoryRepository->earnedInPeriodPerCurrency(new Collection, new Collection, $start, $end); + $categories = []; + + // earned: + foreach ($earned as $categoryId => $row) { + $categoryName = $row['name']; + foreach ($row['earned'] as $currencyId => $income) { + // find or make set for currency: + $key = sprintf('%s-e', $currencyId); + $decimalPlaces = $income['currency_decimal_places']; + if (!isset($tempData[$key])) { + $tempData[$key] = [ + 'label' => (string)trans('firefly.box_earned_in_currency', ['currency' => $income['currency_symbol']]), + 'currency_id' => $income['currency_id'], + 'currency_code' => $income['currency_code'], + 'currency_symbol' => $income['currency_symbol'], + 'currency_decimal_places' => $decimalPlaces, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [], + ]; + } + $amount = round($income['earned'], $decimalPlaces); + $categories[$categoryName] = isset($categories[$categoryName]) ? $categories[$categoryName] + $amount : $amount; + $tempData[$key]['entries'][$categoryName] + = $amount; + + } + } + + // earned with no category: + $noCategory = $this->categoryRepository->earnedInPeriodPcWoCategory(new Collection, $start, $end); + foreach ($noCategory as $currencyId => $income) { + $categoryName = (string)trans('firefly.no_category'); + // find or make set for currency: + $key = sprintf('%s-e', $currencyId); + $decimalPlaces = $income['currency_decimal_places']; + if (!isset($tempData[$key])) { + $tempData[$key] = [ + 'label' => (string)trans('firefly.box_earned_in_currency', ['currency' => $income['currency_symbol']]), + 'currency_id' => $income['currency_id'], + 'currency_code' => $income['currency_code'], + 'currency_symbol' => $income['currency_symbol'], + 'currency_decimal_places' => $decimalPlaces, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [], + ]; + } + $amount = round($income['spent'], $decimalPlaces); + $categories[$categoryName] = isset($categories[$categoryName]) ? $categories[$categoryName] + $amount : $amount; + $tempData[$key]['entries'][$categoryName] + = $amount; + } + + + // spent + foreach ($spent as $categoryId => $row) { + $categoryName = $row['name']; + // create a new set if necessary, "spent (EUR)": + foreach ($row['spent'] as $currencyId => $expense) { + // find or make set for currency: + $key = sprintf('%s-s', $currencyId); + $decimalPlaces = $expense['currency_decimal_places']; + if (!isset($tempData[$key])) { + $tempData[$key] = [ + 'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $expense['currency_symbol']]), + 'currency_id' => $expense['currency_id'], + 'currency_code' => $expense['currency_code'], + 'currency_symbol' => $expense['currency_symbol'], + 'currency_decimal_places' => $decimalPlaces, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [], + ]; + } + $amount = round($expense['spent'], $decimalPlaces); + $categories[$categoryName] = isset($categories[$categoryName]) ? $categories[$categoryName] + $amount : $amount; + $tempData[$key]['entries'][$categoryName] + = $amount; + + } + } + + // spent with no category + $noCategory = $this->categoryRepository->spentInPeriodPcWoCategory(new Collection, $start, $end); + foreach ($noCategory as $currencyId => $expense) { + $categoryName = (string)trans('firefly.no_category'); + // find or make set for currency: + $key = sprintf('%s-s', $currencyId); + $decimalPlaces = $expense['currency_decimal_places']; + if (!isset($tempData[$key])) { + $tempData[$key] = [ + 'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $expense['currency_symbol']]), + 'currency_id' => $expense['currency_id'], + 'currency_code' => $expense['currency_code'], + 'currency_symbol' => $expense['currency_symbol'], + 'currency_decimal_places' => $decimalPlaces, + 'type' => 'bar', // line, area or bar + 'yAxisID' => 0, // 0, 1, 2 + 'entries' => [], + ]; + } + $amount = round($expense['spent'], $decimalPlaces); + $categories[$categoryName] = isset($categories[$categoryName]) ? $categories[$categoryName] + $amount : $amount; + $tempData[$key]['entries'][$categoryName] + = $amount; + } + + + asort($categories); + $keys = array_keys($categories); + + // re-sort every spent array and add 0 for missing entries. + foreach ($tempData as $index => $set) { + $oldSet = $set['entries']; + $newSet = []; + foreach ($keys as $key) { + $value = $oldSet[$key] ?? 0; + $value = $value < 0 ? $value * -1 : $value; + $newSet[$key] = $value; + } + $tempData[$index]['entries'] = $newSet; + } + $chartData = array_values($tempData); + + return response()->json($chartData); + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Controller.php b/app/Api/V1/Controllers/Controller.php index 263cdd0d93..8e9a8153e6 100644 --- a/app/Api/V1/Controllers/Controller.php +++ b/app/Api/V1/Controllers/Controller.php @@ -113,6 +113,15 @@ class Controller extends BaseController $bag->set($field, $obj); } + // integer fields: + $integers = ['limit']; + foreach ($integers as $integer) { + $value = request()->query->get($integer); + if (null !== $value) { + $bag->set($integer, (int)$value); + } + } + return $bag; } diff --git a/app/Api/V1/Controllers/ImportController.php b/app/Api/V1/Controllers/ImportController.php index f3dbc67542..7eee249099 100644 --- a/app/Api/V1/Controllers/ImportController.php +++ b/app/Api/V1/Controllers/ImportController.php @@ -181,4 +181,4 @@ class ImportController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } -} \ No newline at end of file +} diff --git a/app/Api/V1/Controllers/PreferenceController.php b/app/Api/V1/Controllers/PreferenceController.php index 643c264a07..c3999d6f70 100644 --- a/app/Api/V1/Controllers/PreferenceController.php +++ b/app/Api/V1/Controllers/PreferenceController.php @@ -24,7 +24,9 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; use FireflyIII\Api\V1\Requests\PreferenceRequest; +use FireflyIII\Models\AccountType; use FireflyIII\Models\Preference; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Transformers\PreferenceTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -41,6 +43,34 @@ use League\Fractal\Serializer\JsonApiSerializer; */ class PreferenceController extends Controller { + /** + * LinkTypeController constructor. + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $repository = app(AccountRepositoryInterface::class); + $repository->setUser($user); + + // an important fallback is that the frontPageAccount array gets refilled automatically + // when it turns up empty. + $frontPageAccounts = app('preferences')->getForUser($user, 'frontPageAccounts', [])->data; + if (\count($frontPageAccounts) === 0) { + /** @var Collection $accounts */ + $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $accountIds = $accounts->pluck('id')->toArray(); + app('preferences')->setForUser($user, 'frontPageAccounts', $accountIds); + } + + return $next($request); + } + ); + } + /** * List all of them. * @@ -51,12 +81,13 @@ class PreferenceController extends Controller public function index(Request $request): JsonResponse { /** @var User $user */ - $user = auth()->user(); - $available = [ + $user = auth()->user(); + $available = [ 'language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference', 'transaction_journal_optional_fields', 'frontPageAccounts', 'viewRange', 'listPageSize, twoFactorAuthEnabled', ]; + $preferences = new Collection; foreach ($available as $name) { $pref = app('preferences')->getForUser($user, $name); @@ -83,6 +114,32 @@ class PreferenceController extends Controller } + /** + * Return a single preference by name. + * + * @param Request $request + * @param Preference $preference + * + * @return JsonResponse + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function show(Request $request, Preference $preference): JsonResponse + { + // create some objects: + $manager = new Manager; + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + + // present to user. + $manager->setSerializer(new JsonApiSerializer($baseUrl)); + /** @var PreferenceTransformer $transformer */ + $transformer = app(PreferenceTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($preference, $transformer, 'preferences'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); + } + /** * Update a preference. * diff --git a/app/Api/V1/Controllers/RuleGroupController.php b/app/Api/V1/Controllers/RuleGroupController.php index d612d1566f..286a247ee9 100644 --- a/app/Api/V1/Controllers/RuleGroupController.php +++ b/app/Api/V1/Controllers/RuleGroupController.php @@ -234,28 +234,10 @@ class RuleGroupController extends Controller if (0 === $rules->count()) { throw new FireflyException('No rules in this rule group.'); } - $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - $page = 0 === (int)$request->query('page') ? 1 : (int)$request->query('page'); - $startDate = null === $request->query('start_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('start_date')); - $endDate = null === $request->query('end_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('end_date')); - $searchLimit = 0 === (int)$request->query('search_limit') ? (int)config('firefly.test-triggers.limit') : (int)$request->query('search_limit'); - $triggerLimit = 0 === (int)$request->query('triggered_limit') ? (int)config('firefly.test-triggers.range') : (int)$request->query('triggered_limit'); - $accountList = '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts')); - $accounts = new Collection; - - foreach ($accountList as $accountId) { - Log::debug(sprintf('Searching for asset account with id "%s"', $accountId)); - $account = $this->accountRepository->findNull((int)$accountId); - if (null !== $account && AccountType::ASSET === $account->accountType->type) { - Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name)); - $accounts->push($account); - } - if (null === $account) { - Log::debug(sprintf('No asset account with id "%s"', $accountId)); - } - } - + $parameters = $this->getTestParameters($request); + $accounts = $this->getAccountParameter($parameters['account_list']); $matchingTransactions = new Collection; + Log::debug(sprintf('Going to test %d rules', $rules->count())); /** @var Rule $rule */ foreach ($rules as $rule) { @@ -264,10 +246,10 @@ class RuleGroupController extends Controller $matcher = app(TransactionMatcher::class); // set all parameters: $matcher->setRule($rule); - $matcher->setStartDate($startDate); - $matcher->setEndDate($endDate); - $matcher->setSearchLimit($searchLimit); - $matcher->setTriggeredLimit($triggerLimit); + $matcher->setStartDate($parameters['start_date']); + $matcher->setEndDate($parameters['end_date']); + $matcher->setSearchLimit($parameters['search_limit']); + $matcher->setTriggeredLimit($parameters['trigger_limit']); $matcher->setAccounts($accounts); $result = $matcher->findTransactionsByRule(); @@ -277,9 +259,9 @@ class RuleGroupController extends Controller // make paginator out of results. $count = $matchingTransactions->count(); - $transactions = $matchingTransactions->slice(($page - 1) * $pageSize, $pageSize); + $transactions = $matchingTransactions->slice(($parameters['page'] - 1) * $parameters['page_size'], $parameters['page_size']); // make paginator: - $paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $this->parameters->get('page')); + $paginator = new LengthAwarePaginator($transactions, $count, $parameters['page_size'], $parameters['page']); $paginator->setPath(route('api.v1.rule_groups.test', [$group->id]) . $this->buildParams()); // resulting list is presented as JSON thing. @@ -371,4 +353,49 @@ class RuleGroupController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } + + /** + * @param array $accounts + * + * @return Collection + */ + private function getAccountParameter(array $accounts): Collection + { + $return = new Collection; + foreach ($accounts as $accountId) { + Log::debug(sprintf('Searching for asset account with id "%s"', $accountId)); + $account = $this->accountRepository->findNull((int)$accountId); + if (null !== $account && AccountType::ASSET === $account->accountType->type) { + Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name)); + $return->push($account); + } + if (null === $account) { + Log::debug(sprintf('No asset account with id "%s"', $accountId)); + } + } + + return $return; + } + + /** + * @param Request $request + * + * @return array + */ + private function getTestParameters(Request $request): array + { + return [ + 'page_size' => (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data, + 'page' => 0 === (int)$request->query('page') ? 1 : (int)$request->query('page'), + 'start_date' => null === $request->query('start_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('start_date')), + 'end_date' => null === $request->query('end_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('end_date')), + 'search_limit' => 0 === (int)$request->query('search_limit') ? (int)config('firefly.test-triggers.limit') : (int)$request->query('search_limit'), + 'trigger_limit' => 0 === (int)$request->query('triggered_limit') + ? (int)config('firefly.test-triggers.range') + : (int)$request->query( + 'triggered_limit' + ), + 'account_list' => '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts')), + ]; + } } diff --git a/app/Api/V1/Controllers/SummaryController.php b/app/Api/V1/Controllers/SummaryController.php new file mode 100644 index 0000000000..f617db72b7 --- /dev/null +++ b/app/Api/V1/Controllers/SummaryController.php @@ -0,0 +1,392 @@ +middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->currencyRepos = app(CurrencyRepositoryInterface::class); + $this->billRepository = app(BillRepositoryInterface::class); + $this->budgetRepository = app(BudgetRepositoryInterface::class); + $this->accountRepository = app(AccountRepositoryInterface::class); + + $this->billRepository->setUser($user); + $this->currencyRepos->setUser($user); + $this->budgetRepository->setUser($user); + $this->accountRepository->setUser($user); + + + return $next($request); + } + ); + } + + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function basic(Request $request): JsonResponse + { + // parameters for boxes: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + // balance information: + $balanceData = $this->getBalanceInformation($start, $end); + $billData = $this->getBillInformation($start, $end); + $spentData = $this->getLeftToSpendInfo($start, $end); + $networthData = $this->getNetWorthInfo($start, $end); + $total = array_merge($balanceData, $billData, $spentData, $networthData); + // TODO: liabilities with icon line-chart + + return response()->json($total); + + } + + /** + * Check if date is outside session range. + * + * @param Carbon $date + * + * @param Carbon $start + * @param Carbon $end + * + * @return bool + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool // Validate a preference + { + $result = false; + if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) { + $result = true; + } + // start and end in the past? use $end + if ($start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date)) { + $result = true; + } + + return $result; + } + + /** + * This method will scroll through the results of the spentInPeriodMc() array and return the correct info. + * + * @param array $spentInfo + * @param TransactionCurrency $currency + * + * @return float + */ + private function findInSpentArray(array $spentInfo, TransactionCurrency $currency): float + { + foreach ($spentInfo as $array) { + if ($array['currency_id'] === $currency->id) { + return $array['amount']; + } + } + + return 0.0; + } + + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getBalanceInformation(Carbon $start, Carbon $end): array + { + // prep some arrays: + $incomes = []; + $expenses = []; + $sums = []; + $return = []; + + // collect income of user: + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes([TransactionType::DEPOSIT]) + ->withOpposingAccount(); + $set = $collector->getTransactions(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = (int)$transaction->transaction_currency_id; + $incomes[$currencyId] = $incomes[$currencyId] ?? '0'; + $incomes[$currencyId] = bcadd($incomes[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } + + // collect expenses: + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes([TransactionType::WITHDRAWAL]) + ->withOpposingAccount(); + $set = $collector->getTransactions(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = (int)$transaction->transaction_currency_id; + $expenses[$currencyId] = $expenses[$currencyId] ?? '0'; + $expenses[$currencyId] = bcadd($expenses[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } + + // format amounts: + $keys = array_keys($sums); + foreach ($keys as $currencyId) { + $currency = $this->currencyRepos->findNull($currencyId); + if (null === $currency) { + continue; + } + // create objects for big array. + $return[] = [ + 'key' => sprintf('balance-in-%s', $currency->code), + 'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($sums[$currencyId] ?? 0, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $sums[$currencyId] ?? '0', false), + 'local_icon' => 'balance-scale', + 'sub_title' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false) . + ' + ' . app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false), + ]; + $return[] = [ + 'key' => sprintf('spent-in-%s', $currency->code), + 'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($expenses[$currencyId] ?? 0, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false), + 'local_icon' => 'balance-scale', + 'sub_title' => '', + ]; + $return[] = [ + 'key' => sprintf('earned-in-%s', $currency->code), + 'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($incomes[$currencyId] ?? 0, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false), + 'local_icon' => 'balance-scale', + 'sub_title' => '', + ]; + } + + return $return; + } + + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getBillInformation(Carbon $start, Carbon $end): array + { + /* + * Since both this method and the chart use the exact same data, we can suffice + * with calling the one method in the bill repository that will get this amount. + */ + $paidAmount = $this->billRepository->getBillsPaidInRangePerCurrency($start, $end); + $unpaidAmount = $this->billRepository->getBillsUnpaidInRangePerCurrency($start, $end); + $return = []; + foreach ($paidAmount as $currencyId => $amount) { + $amount = bcmul($amount, '-1'); + $currency = $this->currencyRepos->findNull((int)$currencyId); + if (null === $currency) { + continue; + } + $return[] = [ + 'key' => sprintf('bills-paid-in-%s', $currency->code), + 'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($amount, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $amount, false), + 'local_icon' => 'check', + 'sub_title' => '', + ]; + } + + foreach ($unpaidAmount as $currencyId => $amount) { + $amount = bcmul($amount, '-1'); + $currency = $this->currencyRepos->findNull((int)$currencyId); + if (null === $currency) { + continue; + } + $return[] = [ + 'key' => sprintf('bills-unpaid-in-%s', $currency->code), + 'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($amount, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $amount, false), + 'local_icon' => 'calendar-o', + 'sub_title' => '', + ]; + } + + return $return; + } + + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getLeftToSpendInfo(Carbon $start, Carbon $end): array + { + $return = []; + $today = new Carbon; + $available = $this->budgetRepository->getAvailableBudgetWithCurrency($start, $end); + $budgets = $this->budgetRepository->getActiveBudgets(); + $spentInfo = $this->budgetRepository->spentInPeriodMc($budgets, new Collection, $start, $end); + foreach ($available as $currencyId => $amount) { + $currency = $this->currencyRepos->findNull($currencyId); + if (null === $currency) { + continue; + } + $spentInCurrency = (string)$this->findInSpentArray($spentInfo, $currency); + $leftToSpend = bcadd($amount, $spentInCurrency); + + $days = $today->diffInDays($end) + 1; + $perDay = '0'; + if (0 !== $days && bccomp($leftToSpend, '0') > -1) { + $perDay = bcdiv($leftToSpend, (string)$days); + } + + $return[] = [ + 'key' => sprintf('left-to-spend-in-%s', $currency->code), + 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => round($leftToSpend, $currency->decimal_places), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $leftToSpend, false), + 'local_icon' => 'money', + 'sub_title' => (string)trans('firefly.box_spend_per_day', ['amount' => app('amount')->formatAnything($currency, $perDay, false)]), + ]; + } + + return $return; + } + + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getNetWorthInfo(Carbon $start, Carbon $end): array + { + $date = Carbon::create()->startOfDay(); + + // start and end in the future? use $end + if ($this->notInDateRange($date, $start, $end)) { + /** @var Carbon $date */ + $date = session('end', Carbon::now()->endOfMonth()); + } + + /** @var NetWorthInterface $netWorthHelper */ + $netWorthHelper = app(NetWorthInterface::class); + $netWorthHelper->setUser(auth()->user()); + $allAccounts = $this->accountRepository->getActiveAccountsByType([AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE]); + + // filter list on preference of being included. + $filtered = $allAccounts->filter( + function (Account $account) { + $includeNetWorth = $this->accountRepository->getMetaValue($account, 'include_net_worth'); + + return null === $includeNetWorth ? true : '1' === $includeNetWorth; + } + ); + + $netWorthSet = $netWorthHelper->getNetWorthByCurrency($filtered, $date); + $return = []; + foreach ($netWorthSet as $index => $data) { + /** @var TransactionCurrency $currency */ + $currency = $data['currency']; + $amount = round($data['balance'], $currency->decimal_places); + if ($amount === 0.0) { + continue; + } + // return stuff + $return[] = [ + 'key' => sprintf('net-worth-in-%s', $currency->code), + 'title' => trans('firefly.box_net_worth_in_currency', ['currency' => $currency->symbol]), + 'monetary_value' => $amount, + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'value_parsed' => app('amount')->formatAnything($currency, $data['balance'], false), + 'local_icon' => 'line-chart', + 'sub_title' => '', + ]; + } + + return $return; + } + +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/TagController.php b/app/Api/V1/Controllers/TagController.php index 407024a9ba..3b4f92db49 100644 --- a/app/Api/V1/Controllers/TagController.php +++ b/app/Api/V1/Controllers/TagController.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; +use Carbon\Carbon; use FireflyIII\Api\V1\Requests\TagRequest; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Models\Tag; @@ -71,6 +73,55 @@ class TagController extends Controller ); } + /** + * @param Request $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function cloud(Request $request): JsonResponse + { + // parameters for cloud: + $start = (string)$request->get('start'); + $end = (string)$request->get('end'); + if ('' === $start || '' === $end) { + throw new FireflyException('Start and end are mandatory parameters.'); + } + $start = Carbon::createFromFormat('Y-m-d', $start); + $end = Carbon::createFromFormat('Y-m-d', $end); + + // get all tags: + $tags = $this->repository->get(); + $min = null; + $max = 0; + $return = [ + 'tags' => [], + ]; + /** @var Tag $tag */ + foreach ($tags as $tag) { + $earned = (float)$this->repository->earnedInPeriod($tag, $start, $end); + $spent = (float)$this->repository->spentInPeriod($tag, $start, $end); + $size = ($spent * -1) + $earned; + $min = $min ?? $size; + if ($size > 0) { + $max = $size > $max ? $size : $max; + $return['tags'][] = [ + 'tag' => $tag->tag, + 'id' => $tag->id, + 'size' => $size, + ]; + } + } + foreach ($return['tags'] as $index => $info) { + $return['tags'][$index]['relative'] = $return['tags'][$index]['size'] / $max; + } + $return['min'] = $min; + $return['max'] = $max; + + + return response()->json($return); + } + /** * Delete the resource. * @@ -121,7 +172,6 @@ class TagController extends Controller $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); - } /** @@ -245,4 +295,4 @@ class TagController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } -} \ No newline at end of file +} diff --git a/app/Api/V1/Controllers/TransactionController.php b/app/Api/V1/Controllers/TransactionController.php index ce74aa411d..9199ec45e9 100644 --- a/app/Api/V1/Controllers/TransactionController.php +++ b/app/Api/V1/Controllers/TransactionController.php @@ -246,7 +246,7 @@ class TransactionController extends Controller $data['user'] = auth()->user()->id; $journal = $repository->store($data); - event(new StoredTransactionJournal($journal, 0)); + event(new StoredTransactionJournal($journal)); $manager = new Manager(); $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; diff --git a/app/Api/V1/Requests/TagRequest.php b/app/Api/V1/Requests/TagRequest.php index 3ae2b9eff6..78dad9c6c1 100644 --- a/app/Api/V1/Requests/TagRequest.php +++ b/app/Api/V1/Requests/TagRequest.php @@ -74,7 +74,7 @@ class TagRequest extends Request 'description' => 'min:1|nullable', 'date' => 'date|nullable', 'latitude' => 'numeric|min:-90|max:90|nullable|required_with:longitude', - 'longitude' => 'numeric|min:-90|max:90|nullable|required_with:latitude', + 'longitude' => 'numeric|min:-180|max:180|nullable|required_with:latitude', 'zoom_level' => 'numeric|min:0|max:80|nullable', ]; switch ($this->method()) { diff --git a/app/Console/Commands/ApplyRules.php b/app/Console/Commands/ApplyRules.php index c0e3a9408c..f8ae0519c1 100644 --- a/app/Console/Commands/ApplyRules.php +++ b/app/Console/Commands/ApplyRules.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + namespace FireflyIII\Console\Commands; use Carbon\Carbon; diff --git a/app/Console/Commands/Cron.php b/app/Console/Commands/Cron.php index 807de0c39f..a6f48049c0 100644 --- a/app/Console/Commands/Cron.php +++ b/app/Console/Commands/Cron.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + namespace FireflyIII\Console\Commands; use FireflyIII\Exceptions\FireflyException; diff --git a/app/Console/Commands/DecryptDatabase.php b/app/Console/Commands/DecryptDatabase.php new file mode 100644 index 0000000000..5c7eb3e519 --- /dev/null +++ b/app/Console/Commands/DecryptDatabase.php @@ -0,0 +1,116 @@ +line('Going to decrypt the database.'); + $tables = [ + 'accounts' => ['name', 'iban'], + 'attachments' => ['filename', 'mime', 'title', 'description'], + 'bills' => ['name', 'match'], + 'budgets' => ['name'], + 'categories' => ['name'], + 'piggy_banks' => ['name'], + 'preferences' => ['data'], + 'tags' => ['tag', 'description'], + 'transaction_journals' => ['description'], + 'transactions' => ['description'], + 'journal_links' => ['comment'], + ]; + + foreach ($tables as $table => $fields) { + if ($this->isDecrypted($table)) { + $this->info(sprintf('No decryption required for table "%s".', $table)); + continue; + } + foreach ($fields as $field) { + $rows = DB::table($table)->get(['id', $field]); + foreach ($rows as $row) { + $original = $row->$field; + if (null === $original) { + continue; + } + $id = $row->id; + $value = $this->tryDecrypt($original); + if ($value !== $original) { + Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, $value, $table, $id)); + DB::table($table)->where('id', $id)->update([$field => $value]); + } + } + } + $this->line(sprintf('Decrypted the data in table "%s".', $table)); + // mark as decrypted: + $configName = sprintf('is_decrypted_%s', $table); + FireflyConfig::set($configName, true); + + } + $this->info('Done!'); + + return 0; + } + + /** + * @param string $table + * + * @return bool + */ + private function isDecrypted(string $table): bool + { + $configName = sprintf('is_decrypted_%s', $table); + $configVar = FireflyConfig::get($configName, false); + if (null !== $configVar) { + return $configVar->data; + } + + return false; + } + + + /** + * @param $value + * + * @return mixed + */ + private function tryDecrypt($value) + { + try { + $value = Crypt::decrypt($value); + } catch (DecryptException $e) { + //Log::debug(sprintf('Could not decrypt. %s', $e->getMessage())); + } + + return $value; + } +} diff --git a/app/Console/Commands/UseEncryption.php b/app/Console/Commands/UseEncryption.php deleted file mode 100644 index 3f50aeadd0..0000000000 --- a/app/Console/Commands/UseEncryption.php +++ /dev/null @@ -1,94 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Console\Commands; - -use Illuminate\Console\Command; -use Illuminate\Support\Str; - -/** - * Class UseEncryption. - * @codeCoverageIgnore - */ -class UseEncryption extends Command -{ - /** - * The console command description. - * - * @var string - */ - protected $description = 'This command will make sure that entries in the database will be encrypted (or not) according to the settings in .env'; - /** - * The name and signature of the console command. - * - * @var string - */ - protected $signature = 'firefly:use-encryption'; - - /** - * Execute the console command. - */ - public function handle(): int - { - if (true === config('firefly.encryption')) { - $this->info('Firefly III configuration calls for encrypted data.'); - } - if (false === config('firefly.encryption')) { - $this->info('Firefly III configuration calls for unencrypted data.'); - } - $this->handleObjects('Account', 'name', 'encrypted'); - $this->handleObjects('Bill', 'name', 'name_encrypted'); - $this->handleObjects('Bill', 'match', 'match_encrypted'); - $this->handleObjects('Budget', 'name', 'encrypted'); - $this->handleObjects('Category', 'name', 'encrypted'); - $this->handleObjects('PiggyBank', 'name', 'encrypted'); - $this->handleObjects('TransactionJournal', 'description', 'encrypted'); - - return 0; - } - - /** - * Run each object and encrypt them (or not). - * - * @param string $class - * @param string $field - * @param string $indicator - */ - public function handleObjects(string $class, string $field, string $indicator): void - { - $fqn = sprintf('FireflyIII\Models\%s', $class); - $encrypt = true === config('firefly.encryption') ? 0 : 1; - /** @noinspection PhpUndefinedMethodInspection */ - $set = $fqn::where($indicator, $encrypt)->withTrashed()->get(); - - foreach ($set as $entry) { - $newName = $entry->$field; - $entry->$field = $newName; - /** @noinspection PhpUndefinedMethodInspection */ - $entry->save(); - } - - /** @noinspection PhpUndefinedMethodInspection */ - $this->line(sprintf('Updated %d %s.', $set->count(), strtolower(Str::plural($class)))); - } -} diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index d754f98899..8a2cadf470 100644 --- a/app/Console/Commands/VerifyDatabase.php +++ b/app/Console/Commands/VerifyDatabase.php @@ -450,12 +450,6 @@ class VerifyDatabase extends Command /** @var stdClass $entry */ foreach ($set as $entry) { $objName = $entry->name; - try { - $objName = Crypt::decrypt($objName); - } catch (DecryptException $e) { - // it probably was not encrypted. - Log::debug(sprintf('Not a problem: %s', $e->getMessage())); - } // also count the transactions: $countTransactions = DB::table('budget_transaction')->where('budget_id', $entry->id)->count(); @@ -488,12 +482,6 @@ class VerifyDatabase extends Command /** @var stdClass $entry */ foreach ($set as $entry) { $objName = $entry->name; - try { - $objName = Crypt::decrypt($objName); - } catch (DecryptException $e) { - // it probably was not encrypted. - Log::debug(sprintf('Not a problem: %s', $e->getMessage())); - } // also count the transactions: $countTransactions = DB::table('category_transaction')->where('category_id', $entry->id)->count(); @@ -627,12 +615,6 @@ class VerifyDatabase extends Command /** @var stdClass $entry */ foreach ($set as $entry) { $objName = $entry->name; - try { - $objName = Crypt::decrypt($objName); - } catch (DecryptException $e) { - // it probably was not encrypted. - Log::debug(sprintf('Not a problem: %s', $e->getMessage())); - } $line = sprintf( 'User #%d (%s) has %s #%d ("%s") which has no transactions.', diff --git a/app/Events/RequestedReportOnJournals.php b/app/Events/RequestedReportOnJournals.php index 0bd2ac4c55..4b869ee173 100644 --- a/app/Events/RequestedReportOnJournals.php +++ b/app/Events/RequestedReportOnJournals.php @@ -1,4 +1,25 @@ . + */ + declare(strict_types=1); /** * RequestedReportOnJournals.php diff --git a/app/Events/StoredTransactionJournal.php b/app/Events/StoredTransactionJournal.php index 3e1348eb69..bc66a813fc 100644 --- a/app/Events/StoredTransactionJournal.php +++ b/app/Events/StoredTransactionJournal.php @@ -38,18 +38,14 @@ class StoredTransactionJournal extends Event /** @var TransactionJournal The journal that was stored. */ public $journal; - /** @var int The piggy bank ID. */ - public $piggyBankId; /** * Create a new event instance. * * @param TransactionJournal $journal - * @param int $piggyBankId */ - public function __construct(TransactionJournal $journal, int $piggyBankId) + public function __construct(TransactionJournal $journal) { $this->journal = $journal; - $this->piggyBankId = $piggyBankId; } } diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 9e0064d58e..7f036095d4 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -148,14 +148,14 @@ final class Entry $entry->transaction_type = $transaction->transaction_type_type; $entry->asset_account_id = (string)$transaction->account_id; - $entry->asset_account_name = app('steam')->tryDecrypt($transaction->account_name); + $entry->asset_account_name = $transaction->account_name; $entry->asset_account_iban = $transaction->account_iban; $entry->asset_account_number = $transaction->account_number; $entry->asset_account_bic = $transaction->account_bic; $entry->asset_currency_code = $transaction->account_currency_code; $entry->opposing_account_id = (string)$transaction->opposing_account_id; - $entry->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); + $entry->opposing_account_name = $transaction->opposing_account_name; $entry->opposing_account_iban = $transaction->opposing_account_iban; $entry->opposing_account_number = $transaction->opposing_account_number; $entry->opposing_account_bic = $transaction->opposing_account_bic; @@ -163,23 +163,23 @@ final class Entry // budget $entry->budget_id = (string)$transaction->transaction_budget_id; - $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name); + $entry->budget_name = $transaction->transaction_budget_name; if (null === $transaction->transaction_budget_id) { $entry->budget_id = $transaction->transaction_journal_budget_id; - $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); + $entry->budget_name = $transaction->transaction_journal_budget_name; } // category $entry->category_id = (string)$transaction->transaction_category_id; - $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_category_name); + $entry->category_name = $transaction->transaction_category_name; if (null === $transaction->transaction_category_id) { $entry->category_id = $transaction->transaction_journal_category_id; - $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); + $entry->category_name = $transaction->transaction_journal_category_name; } // budget $entry->bill_id = (string)$transaction->bill_id; - $entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name); + $entry->bill_name = $transaction->bill_name; $entry->tags = $transaction->tags; $entry->notes = $transaction->notes; diff --git a/app/Export/ExpandedProcessor.php b/app/Export/ExpandedProcessor.php index ba5feceb21..157520116a 100644 --- a/app/Export/ExpandedProcessor.php +++ b/app/Export/ExpandedProcessor.php @@ -368,7 +368,7 @@ class ExpandedProcessor implements ProcessorInterface foreach ($set as $entry) { $id = (int)$entry->transaction_journal_id; $result[$id] = $result[$id] ?? []; - $result[$id][] = Crypt::decrypt($entry->tag); + $result[$id][] = $entry->tag; } return $result; diff --git a/app/Factory/TagFactory.php b/app/Factory/TagFactory.php index 142b503612..e6060bf656 100644 --- a/app/Factory/TagFactory.php +++ b/app/Factory/TagFactory.php @@ -58,20 +58,19 @@ class TagFactory { $zoomLevel = 0 === (int)$data['zoom_level'] ? null : (int)$data['zoom_level']; $latitude = 0.0 === (float)$data['latitude'] ? null : (float)$data['latitude']; - $longitude = 0.0 === (float)$data['longitude'] ? null : (int)$data['longitude']; + $longitude = 0.0 === (float)$data['longitude'] ? null : (float)$data['longitude']; + $array = [ + 'user_id' => $this->user->id, + 'tag' => trim($data['tag']), + 'tagMode' => 'nothing', + 'date' => $data['date'], + 'description' => $data['description'], + 'latitude' => $latitude, + 'longitude' => $longitude, + 'zoomLevel' => $zoomLevel, + ]; - return Tag::create( - [ - 'user_id' => $this->user->id, - 'tag' => $data['tag'], - 'tagMode' => 'nothing', - 'date' => $data['date'], - 'description' => $data['description'], - 'latitude' => $latitude, - 'longitude ' => $longitude, - 'zoomLevel' => $zoomLevel, - ] - ); + return Tag::create($array); } /** @@ -81,6 +80,7 @@ class TagFactory */ public function findOrCreate(string $tag): ?Tag { + $tag = trim($tag); if (null === $this->tags) { $this->tags = $this->user->tags()->get(); } diff --git a/app/Factory/TransactionFactory.php b/app/Factory/TransactionFactory.php index 1da058eec9..e94a0da9c3 100644 --- a/app/Factory/TransactionFactory.php +++ b/app/Factory/TransactionFactory.php @@ -114,6 +114,13 @@ class TransactionFactory $currency = $this->findCurrency($data['currency_id'], $data['currency_code']); $currency = $currency ?? $defaultCurrency; + // enable currency: + if(false === $currency->enabled) { + $currency->enabled = true; + $currency->save(); + } + + // type of source account and destination account depends on journal type: $sourceType = $this->accountType($journal, 'source'); $destinationType = $this->accountType($journal, 'destination'); diff --git a/app/Helpers/Collector/TransactionCollector.php b/app/Helpers/Collector/TransactionCollector.php index 4951acef85..e46b63fb4f 100644 --- a/app/Helpers/Collector/TransactionCollector.php +++ b/app/Helpers/Collector/TransactionCollector.php @@ -304,26 +304,10 @@ class TransactionCollector implements TransactionCollectorInterface // run all filters: $set = $this->filter($set); - // loop for decryption. + // loop for date. $set->each( function (Transaction $transaction) { - $transaction->date = new Carbon($transaction->date); - $transaction->description = app('steam')->decrypt((int)$transaction->encrypted, $transaction->description); - - if (null !== $transaction->bill_name) { - $transaction->bill_name = app('steam')->decrypt((int)$transaction->bill_name_encrypted, $transaction->bill_name); - } - $transaction->account_name = app('steam')->tryDecrypt($transaction->account_name); - $transaction->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); - $transaction->account_iban = app('steam')->tryDecrypt($transaction->account_iban); - $transaction->opposing_account_iban = app('steam')->tryDecrypt($transaction->opposing_account_iban); - - // budget name - $transaction->transaction_journal_budget_name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); - $transaction->transaction_budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name); - // category name: - $transaction->transaction_journal_category_name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); - $transaction->transaction_category_name = app('steam')->tryDecrypt($transaction->transaction_category_name); + $transaction->date = new Carbon($transaction->date); } ); @@ -940,4 +924,4 @@ class TransactionCollector implements TransactionCollectorInterface $this->query->leftJoin('tag_transaction_journal', 'tag_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); } } -} \ No newline at end of file +} diff --git a/app/Helpers/Collector/TransactionCollectorInterface.php b/app/Helpers/Collector/TransactionCollectorInterface.php index 1691b63021..fe41b2d6fa 100644 --- a/app/Helpers/Collector/TransactionCollectorInterface.php +++ b/app/Helpers/Collector/TransactionCollectorInterface.php @@ -347,4 +347,4 @@ interface TransactionCollectorInterface * @return TransactionCollectorInterface */ public function withoutCategory(): TransactionCollectorInterface; -} \ No newline at end of file +} diff --git a/app/Helpers/Filter/DoubleTransactionFilter.php b/app/Helpers/Filter/DoubleTransactionFilter.php index 65e84f2f2c..02eb5db062 100644 --- a/app/Helpers/Filter/DoubleTransactionFilter.php +++ b/app/Helpers/Filter/DoubleTransactionFilter.php @@ -59,4 +59,4 @@ class DoubleTransactionFilter implements FilterInterface return $result; } -} \ No newline at end of file +} diff --git a/app/Helpers/FiscalHelper.php b/app/Helpers/FiscalHelper.php index dbc1435db8..19bf74e9d9 100644 --- a/app/Helpers/FiscalHelper.php +++ b/app/Helpers/FiscalHelper.php @@ -52,7 +52,7 @@ class FiscalHelper implements FiscalHelperInterface */ public function endOfFiscalYear(Carbon $date): Carbon { - // get start of fiscal year for passed date + Log::debug(sprintf('Now in endOfFiscalYear(%s).', $date->format('Y-m-d'))); $endDate = $this->startOfFiscalYear($date); if (true === $this->useCustomFiscalYear) { // add 1 year and sub 1 day @@ -62,6 +62,7 @@ class FiscalHelper implements FiscalHelperInterface if (false === $this->useCustomFiscalYear) { $endDate->endOfYear(); } + Log::debug(sprintf('Result of endOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $endDate->format('Y-m-d'))); return $endDate; } @@ -78,7 +79,7 @@ class FiscalHelper implements FiscalHelperInterface if (true === $this->useCustomFiscalYear) { $prefStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data; [$mth, $day] = explode('-', $prefStartStr); - $startDate->month((int)$mth)->day((int)$day); + $startDate->day((int)$day)->month((int)$mth); // if start date is after passed date, sub 1 year. if ($startDate > $date) { @@ -89,6 +90,8 @@ class FiscalHelper implements FiscalHelperInterface $startDate->startOfYear(); } + Log::debug(sprintf('Result of startOfFiscalYear(%s) = %s', $date->format('Y-m-d'), $startDate->format('Y-m-d'))); + return $startDate; } } diff --git a/app/Helpers/Report/NetWorth.php b/app/Helpers/Report/NetWorth.php index 0a2a01c46e..c4dd6d81b4 100644 --- a/app/Helpers/Report/NetWorth.php +++ b/app/Helpers/Report/NetWorth.php @@ -155,4 +155,4 @@ class NetWorth implements NetWorthInterface $this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos->setUser($this->user); } -} \ No newline at end of file +} diff --git a/app/Helpers/Report/NetWorthInterface.php b/app/Helpers/Report/NetWorthInterface.php index 8e7e532211..620274cf4f 100644 --- a/app/Helpers/Report/NetWorthInterface.php +++ b/app/Helpers/Report/NetWorthInterface.php @@ -57,4 +57,4 @@ interface NetWorthInterface */ public function setUser(User $user): void; -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index ae69e9a77f..c6699d24e3 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -59,6 +59,48 @@ class ResetPasswordController extends Controller $this->middleware('guest'); } + /** + * Reset the given user's password. + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + * @throws \Illuminate\Validation\ValidationException + */ + public function reset(Request $request) + { + $loginProvider = config('firefly.login_provider'); + if ('eloquent' !== $loginProvider) { + $message = sprintf('Cannot reset password when authenticating over "%s".', $loginProvider); + + return view('error', compact('message')); + } + + $rules = [ + 'token' => 'required', + 'email' => 'required|email', + 'password' => 'required|confirmed|min:6|secure_password', + ]; + + $this->validate($request, $rules, $this->validationErrorMessages()); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $response = $this->broker()->reset( + $this->credentials($request), function ($user, $password) { + $this->resetPassword($user, $password); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $response === Password::PASSWORD_RESET + ? $this->sendResetResponse($request, $response) + : $this->sendResetFailedResponse($request, $response); + } + /** * Display the password reset view for the given token. * @@ -89,57 +131,7 @@ class ResetPasswordController extends Controller /** @noinspection PhpUndefinedFieldInspection */ return view('auth.passwords.reset')->with( - ['token' => $token, 'email' => $request->email, 'allowRegistration' => $allowRegistration,'pageTitle' => $pageTitle] + ['token' => $token, 'email' => $request->email, 'allowRegistration' => $allowRegistration, 'pageTitle' => $pageTitle] ); } - - /** - * Reset the given user's password. - * - * @param \Illuminate\Http\Request $request - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse - * @throws \Illuminate\Validation\ValidationException - */ - public function reset(Request $request) - { - $loginProvider = config('firefly.login_provider'); - if ('eloquent' !== $loginProvider) { - $message = sprintf('Cannot reset password when authenticating over "%s".', $loginProvider); - - return view('error', compact('message')); - } - - $this->validate($request, $this->rules(), $this->validationErrorMessages()); - - // Here we will attempt to reset the user's password. If it is successful we - // will update the password on an actual user model and persist it to the - // database. Otherwise we will parse the error and return the response. - $response = $this->broker()->reset( - $this->credentials($request), function ($user, $password) { - $this->resetPassword($user, $password); - } - ); - - // If the password was successfully reset, we will redirect the user back to - // the application's home authenticated view. If there is an error we can - // redirect them back to where they came from with their error message. - return $response === Password::PASSWORD_RESET - ? $this->sendResetResponse($request, $response) - : $this->sendResetFailedResponse($request, $response); - } - - /** - * Get the password reset validation rules. - * - * @return array - */ - protected function rules() - { - return [ - 'token' => 'required', - 'email' => 'required|email', - 'password' => 'required|confirmed|min:6|secure_password', - ]; - } } diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index cfd7a7c7e2..2251706607 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -26,9 +26,11 @@ use Carbon\Carbon; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Http\Requests\BillFormRequest; +use FireflyIII\Models\Attachment; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\TransactionRules\TransactionMatcher; +use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\BillTransformer; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -315,8 +317,21 @@ class BillController extends Controller $transactions = $collector->getPaginatedTransactions(); $transactions->setPath(route('bills.show', [$bill->id])); + // transform any attachments as well. + $collection = $this->billRepository->getAttachments($bill); + $attachments = new Collection; + if ($collection->count() > 0) { + /** @var AttachmentTransformer $transformer */ + $transformer = app(AttachmentTransformer::class); + $attachments = $collection->each( + function (Attachment $attachment) use ($transformer) { + return $transformer->transform($attachment); + } + ); + } - return view('bills.show', compact('transactions', 'rules', 'yearAverage', 'overallAverage', 'year', 'object', 'bill', 'subTitle')); + + return view('bills.show', compact('attachments', 'transactions', 'rules', 'yearAverage', 'overallAverage', 'year', 'object', 'bill', 'subTitle')); } diff --git a/app/Http/Controllers/Budget/ShowController.php b/app/Http/Controllers/Budget/ShowController.php index 170cf4ec19..0c136764f9 100644 --- a/app/Http/Controllers/Budget/ShowController.php +++ b/app/Http/Controllers/Budget/ShowController.php @@ -31,12 +31,10 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Support\CacheProperties; +use FireflyIII\Support\Http\Controllers\AugumentData; use FireflyIII\Support\Http\Controllers\PeriodOverview; use Illuminate\Http\Request; -use Illuminate\Support\Collection; /** * @@ -44,10 +42,7 @@ use Illuminate\Support\Collection; */ class ShowController extends Controller { - use PeriodOverview; - - /** @var BudgetRepositoryInterface The budget repository */ - private $repository; + use PeriodOverview, AugumentData; /** * ShowController constructor. @@ -62,7 +57,6 @@ class ShowController extends Controller function ($request, $next) { app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('mainTitleIcon', 'fa-tasks'); - $this->repository = app(BudgetRepositoryInterface::class); return $next($request); } @@ -203,39 +197,4 @@ class ShowController extends Controller return view('budgets.show', compact('limits', 'budget', 'budgetLimit', 'transactions', 'subTitle')); } - - /** - * Gets all budget limits for a budget. - * - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * - * @return Collection - */ - protected function getLimits(Budget $budget, Carbon $start, Carbon $end): Collection // get data + augment with info - { - // properties for cache - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($budget->id); - $cache->addProperty('get-limits'); - - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - - $set = $this->repository->getBudgetLimits($budget, $start, $end); - $limits = new Collection(); - - /** @var BudgetLimit $entry */ - foreach ($set as $entry) { - $entry->spent = $this->repository->spentInPeriod(new Collection([$budget]), new Collection(), $entry->start_date, $entry->end_date); - $limits->push($entry); - } - $cache->store($limits); - - return $set; - } } diff --git a/app/Http/Controllers/Category/NoCategoryController.php b/app/Http/Controllers/Category/NoCategoryController.php index a38fcf0c55..8dbc24f45f 100644 --- a/app/Http/Controllers/Category/NoCategoryController.php +++ b/app/Http/Controllers/Category/NoCategoryController.php @@ -30,7 +30,7 @@ use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Support\CacheProperties; +use FireflyIII\Support\Http\Controllers\PeriodOverview; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Log; @@ -41,7 +41,7 @@ use Log; */ class NoCategoryController extends Controller { - + use PeriodOverview; /** @var JournalRepositoryInterface Journals and transactions overview */ private $journalRepos; @@ -135,92 +135,4 @@ class NoCategoryController extends Controller return view('categories.no-category', compact('transactions', 'subTitle', 'periods', 'start', 'end')); } - - - /** - * Show period overview for no category view. - * - * @param Carbon $theDate - * - * @return Collection - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function getNoCategoryPeriodOverview(Carbon $theDate): Collection // period overview method. - { - Log::debug(sprintf('Now in getNoCategoryPeriodOverview(%s)', $theDate->format('Y-m-d'))); - $range = app('preferences')->get('viewRange', '1M')->data; - $first = $this->journalRepos->firstNull(); - $start = null === $first ? new Carbon : $first->date; - $end = $theDate ?? new Carbon; - - Log::debug(sprintf('Start for getNoCategoryPeriodOverview() is %s', $start->format('Y-m-d'))); - Log::debug(sprintf('End for getNoCategoryPeriodOverview() is %s', $end->format('Y-m-d'))); - - // properties for cache - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty('no-category-period-entries'); - - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - - $dates = app('navigation')->blockPeriods($start, $end, $range); - $entries = new Collection; - - foreach ($dates as $date) { - - // count journals without category in this period: - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() - ->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); - $collector->removeFilter(InternalTransferFilter::class); - $count = $collector->getTransactions()->count(); - - // amount transferred - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() - ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); - $collector->removeFilter(InternalTransferFilter::class); - $transferred = app('steam')->positive((string)$collector->getTransactions()->sum('transaction_amount')); - - // amount spent - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( - [TransactionType::WITHDRAWAL] - ); - $spent = $collector->getTransactions()->sum('transaction_amount'); - - // amount earned - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( - [TransactionType::DEPOSIT] - ); - $earned = $collector->getTransactions()->sum('transaction_amount'); - /** @noinspection PhpUndefinedMethodInspection */ - $dateStr = $date['end']->format('Y-m-d'); - $dateName = app('navigation')->periodShow($date['end'], $date['period']); - $entries->push( - [ - 'string' => $dateStr, - 'name' => $dateName, - 'count' => $count, - 'spent' => $spent, - 'earned' => $earned, - 'transferred' => $transferred, - 'start' => clone $date['start'], - 'end' => clone $date['end'], - ] - ); - } - Log::debug('End of loops'); - $cache->store($entries); - - return $entries; - } } diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index 498d60fd75..24d4af028f 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -35,6 +35,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\CacheProperties; use FireflyIII\Support\Http\Controllers\AugumentData; +use FireflyIII\Support\Http\Controllers\ChartGeneration; use FireflyIII\Support\Http\Controllers\DateCalculation; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -49,7 +50,7 @@ use Log; */ class AccountController extends Controller { - use DateCalculation, AugumentData; + use DateCalculation, AugumentData, ChartGeneration; /** @var GeneratorInterface Chart generation methods. */ protected $generator; @@ -109,7 +110,7 @@ class AccountController extends Controller $tempData = []; // grab all accounts and names - $accounts = $this->accountRepository->getAccountsByType([AccountType::EXPENSE, AccountType::BENEFICIARY]); + $accounts = $this->accountRepository->getAccountsByType([AccountType::EXPENSE]); $accountNames = $this->extractNames($accounts); // grab all balances @@ -604,103 +605,4 @@ class AccountController extends Controller return response()->json($data); } - - - /** - * Shows an overview of the account balances for a set of accounts. - * - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function accountBalanceChart(Collection $accounts, Carbon $start, Carbon $end): array // chart helper method. - { - // chart properties for cache: - $cache = new CacheProperties(); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty('chart.account.account-balance-chart'); - $cache->addProperty($accounts); - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - Log::debug('Regenerate chart.account.account-balance-chart from scratch.'); - - /** @var CurrencyRepositoryInterface $repository */ - $repository = app(CurrencyRepositoryInterface::class); - /** @var AccountRepositoryInterface $accountRepos */ - $accountRepos = app(AccountRepositoryInterface::class); - - $default = app('amount')->getDefaultCurrency(); - $chartData = []; - /** @var Account $account */ - foreach ($accounts as $account) { - $currency = $repository->findNull((int)$accountRepos->getMetaValue($account, 'currency_id')); - if (null === $currency) { - $currency = $default; - } - $currentSet = [ - 'label' => $account->name, - 'currency_symbol' => $currency->symbol, - 'entries' => [], - ]; - - $currentStart = clone $start; - $range = app('steam')->balanceInRange($account, $start, clone $end); - $previous = array_values($range)[0]; - while ($currentStart <= $end) { - $format = $currentStart->format('Y-m-d'); - $label = $currentStart->formatLocalized((string)trans('config.month_and_day')); - $balance = isset($range[$format]) ? round($range[$format], 12) : $previous; - $previous = $balance; - $currentStart->addDay(); - $currentSet['entries'][$label] = $balance; - } - $chartData[] = $currentSet; - } - $data = $this->generator->multiSet($chartData); - $cache->store($data); - - return $data; - } - - /** - * Small helper function for the revenue and expense account charts. - * - * @param array $names - * - * @return array - */ - private function expandNames(array $names): array - { - $result = []; - foreach ($names as $entry) { - $result[$entry['name']] = 0; - } - - return $result; - } - - /** - * Small helper function for the revenue and expense account charts. - * - * @param Collection $accounts - * - * @return array - */ - private function extractNames(Collection $accounts): array - { - $return = []; - /** @var Account $account */ - foreach ($accounts as $account) { - $return[$account->id] = $account->name; - } - - return $return; - } } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 639e56f1e8..8677cbc236 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -476,154 +476,4 @@ class BudgetController extends Controller } - /** - * Get the amount of money budgeted in a period. - * - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - protected function getBudgetedInPeriod(Budget $budget, Carbon $start, Carbon $end): array // get data + augment with info - { - $key = app('navigation')->preferredCarbonFormat($start, $end); - $range = app('navigation')->preferredRangeFormat($start, $end); - $current = clone $start; - $budgeted = []; - while ($current < $end) { - /** @var Carbon $currentStart */ - $currentStart = app('navigation')->startOfPeriod($current, $range); - /** @var Carbon $currentEnd */ - $currentEnd = app('navigation')->endOfPeriod($current, $range); - $budgetLimits = $this->repository->getBudgetLimits($budget, $currentStart, $currentEnd); - $index = $currentStart->format($key); - $budgeted[$index] = $budgetLimits->sum('amount'); - $currentEnd->addDay(); - $current = clone $currentEnd; - } - - return $budgeted; - } - - - /** - * Get the expenses for a budget in a date range. - * - * @param Collection $limits - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - protected function getExpensesForBudget(Collection $limits, Budget $budget, Carbon $start, Carbon $end): array // get data + augment with info - { - $return = []; - if (0 === $limits->count()) { - $spent = $this->repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); - if (0 !== bccomp($spent, '0')) { - $return[$budget->name]['spent'] = bcmul($spent, '-1'); - $return[$budget->name]['left'] = 0; - $return[$budget->name]['overspent'] = 0; - } - - return $return; - } - - $rows = $this->spentInPeriodMulti($budget, $limits); - foreach ($rows as $name => $row) { - if (0 !== bccomp($row['spent'], '0') || 0 !== bccomp($row['left'], '0')) { - $return[$name] = $row; - } - } - unset($rows); - - return $return; - } - - /** - * - * Returns an array with the following values: - * 0 => - * 'name' => name of budget + repetition - * 'left' => left in budget repetition (always zero) - * 'overspent' => spent more than budget repetition? (always zero) - * 'spent' => actually spent in period for budget - * 1 => (etc) - * - * @param Budget $budget - * @param Collection $limits - * - * @return array - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - */ - protected function spentInPeriodMulti(Budget $budget, Collection $limits): array // get data + augment with info - { - $return = []; - $format = (string)trans('config.month_and_day'); - $name = $budget->name; - /** @var BudgetLimit $budgetLimit */ - foreach ($limits as $budgetLimit) { - $expenses = $this->repository->spentInPeriod(new Collection([$budget]), new Collection, $budgetLimit->start_date, $budgetLimit->end_date); - $expenses = app('steam')->positive($expenses); - - if ($limits->count() > 1) { - $name = $budget->name . ' ' . trans( - 'firefly.between_dates', - [ - 'start' => $budgetLimit->start_date->formatLocalized($format), - 'end' => $budgetLimit->end_date->formatLocalized($format), - ] - ); - } - $amount = $budgetLimit->amount; - $leftInLimit = bcsub($amount, $expenses); - $hasOverspent = bccomp($leftInLimit, '0') === -1; - $left = $hasOverspent ? '0' : bcsub($amount, $expenses); - $spent = $hasOverspent ? $amount : $expenses; - $overspent = $hasOverspent ? app('steam')->positive($leftInLimit) : '0'; - - $return[$name] = [ - 'left' => $left, - 'overspent' => $overspent, - 'spent' => $spent, - ]; - } - - return $return; - } - - /** - * Returns an array with the following values: - * 'name' => "no budget" in local language - * 'repetition_left' => left in budget repetition (always zero) - * 'repetition_overspent' => spent more than budget repetition? (always zero) - * 'spent' => actually spent in period for budget. - * - * @param Carbon $start - * @param Carbon $end - * - * @return string - */ - protected function spentInPeriodWithout(Carbon $start, Carbon $end): string // get data + augment with info - { - // collector - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $types = [TransactionType::WITHDRAWAL]; - $collector->setAllAssetAccounts()->setTypes($types)->setRange($start, $end)->withoutBudget(); - $transactions = $collector->getTransactions(); - $sum = '0'; - /** @var Transaction $entry */ - foreach ($transactions as $entry) { - $sum = bcadd($entry->transaction_amount, $sum); - } - - return $sum; - } } diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index f87a00efa5..c290fe557b 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -32,6 +32,8 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\CacheProperties; +use FireflyIII\Support\Http\Controllers\AugumentData; +use FireflyIII\Support\Http\Controllers\ChartGeneration; use FireflyIII\Support\Http\Controllers\DateCalculation; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -42,7 +44,7 @@ use Log; */ class CategoryController extends Controller { - use DateCalculation; + use DateCalculation, AugumentData, ChartGeneration; /** @var GeneratorInterface Chart generation methods. */ protected $generator; @@ -156,7 +158,7 @@ class CategoryController extends Controller * * @return JsonResponse */ - public function frontpage(CategoryRepositoryInterface $repository, AccountRepositoryInterface $accountRepository): JsonResponse + public function frontPage(CategoryRepositoryInterface $repository, AccountRepositoryInterface $accountRepository): JsonResponse { $start = session('start', Carbon::now()->startOfMonth()); $end = session('end', Carbon::now()->endOfMonth()); @@ -166,7 +168,7 @@ class CategoryController extends Controller $cache->addProperty($end); $cache->addProperty('chart.category.frontpage'); if ($cache->has()) { - return response()->json($cache->get()); // @codeCoverageIgnore + //return response()->json($cache->get()); // @codeCoverageIgnore } // currency repos: @@ -183,26 +185,30 @@ class CategoryController extends Controller /** @var Category $category */ foreach ($categories as $category) { $spentArray = $repository->spentInPeriodPerCurrency(new Collection([$category]), $accounts, $start, $end); - foreach ($spentArray as $currencyId => $spent) { - if (bccomp($spent, '0') === -1) { - $currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId); - $tempData[] = [ - 'name' => $category->name, - 'spent' => bcmul($spent, '-1'), - 'spent_float' => (float)bcmul($spent, '-1'), - 'currency_id' => $currencyId, - ]; + foreach ($spentArray as $categoryId => $spentInfo) { + foreach($spentInfo['spent'] as $currencyId => $row) { + $spent= $row['spent']; + if (bccomp($spent, '0') === -1) { + $currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull((int)$currencyId); + $tempData[] = [ + 'name' => $category->name, + 'spent' => bcmul($spent, '-1'), + 'spent_float' => (float)bcmul($spent, '-1'), + 'currency_id' => $currencyId, + ]; + } } } } + // no category per currency: $noCategory = $repository->spentInPeriodPcWoCategory(new Collection, $start, $end); foreach ($noCategory as $currencyId => $spent) { $currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId); $tempData[] = [ 'name' => trans('firefly.no_category'), - 'spent' => bcmul($spent, '-1'), - 'spent_float' => (float)bcmul($spent, '-1'), + 'spent' => bcmul($spent['spent'], '-1'), + 'spent_float' => (float)bcmul($spent['spent'], '-1'), 'currency_id' => $currencyId, ]; } @@ -392,108 +398,4 @@ class CategoryController extends Controller return response()->json($data); } - - /** - * Chart for a specific period (start and end). - * - * - * @param Category $category - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function makePeriodChart(Category $category, Carbon $start, Carbon $end): array // chart helper method. - { - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($category->id); - $cache->addProperty('chart.category.period-chart'); - - - if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore - } - - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $repository = app(CategoryRepositoryInterface::class); - - // chart data - $chartData = [ - [ - 'label' => (string)trans('firefly.spent'), - 'entries' => [], - 'type' => 'bar', - 'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red - ], - [ - 'label' => (string)trans('firefly.earned'), - 'entries' => [], - 'type' => 'bar', - 'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green - ], - [ - 'label' => (string)trans('firefly.sum'), - 'entries' => [], - 'type' => 'line', - 'fill' => false, - ], - ]; - - $step = $this->calculateStep($start, $end); - - - while ($start <= $end) { - $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $start, $start); - $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $start, $start); - $sum = bcadd($spent, $earned); - $label = trim(app('navigation')->periodShow($start, $step)); - $chartData[0]['entries'][$label] = round(bcmul($spent, '-1'), 12); - $chartData[1]['entries'][$label] = round($earned, 12); - $chartData[2]['entries'][$label] = round($sum, 12); - - switch ($step) { - default: - case '1D': - $start->addDay(); - break; - case '1W': - $start->addDays(7); - break; - case '1M': - $start->addMonth(); - break; - case '1Y': - $start->addYear(); - break; - } - } - - $data = $this->generator->multiSet($chartData); - $cache->store($data); - - return $data; - } - - /** - * Small helper function for the revenue and expense account charts. - * - * @param array $names - * - * @return array - */ - private function expandNames(array $names): array - { - $result = []; - foreach ($names as $entry) { - $result[$entry['name']] = 0; - } - - return $result; - } } diff --git a/app/Http/Controllers/Chart/ReportController.php b/app/Http/Controllers/Chart/ReportController.php index b13125d2da..fec7cd9219 100644 --- a/app/Http/Controllers/Chart/ReportController.php +++ b/app/Http/Controllers/Chart/ReportController.php @@ -28,9 +28,9 @@ use FireflyIII\Helpers\Report\NetWorthInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Account\AccountTaskerInterface; use FireflyIII\Support\CacheProperties; use FireflyIII\Support\Http\Controllers\BasicDataSupport; +use FireflyIII\Support\Http\Controllers\ChartGeneration; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; use Log; @@ -40,7 +40,7 @@ use Log; */ class ReportController extends Controller { - use BasicDataSupport; + use BasicDataSupport, ChartGeneration; /** @var GeneratorInterface Chart generation methods. */ protected $generator; @@ -84,7 +84,7 @@ class ReportController extends Controller // filter accounts on having the preference for being included. /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); - $filtered = $accounts->filter( + $filtered = $accounts->filter( function (Account $account) use ($accountRepository) { $includeNetWorth = $accountRepository->getMetaValue($account, 'include_net_worth'); $result = null === $includeNetWorth ? true : '1' === $includeNetWorth; @@ -97,7 +97,6 @@ class ReportController extends Controller ); - while ($current < $end) { // get balances by date, grouped by currency. $result = $helper->getNetWorthByCurrency($filtered, $current); @@ -263,67 +262,4 @@ class ReportController extends Controller return response()->json($data); } - - /** - * Collects the incomes and expenses for the given periods, grouped per month. Will cache its results. - * - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function getChartData(Collection $accounts, Carbon $start, Carbon $end): array // chart helper function - { - $cache = new CacheProperties; - $cache->addProperty('chart.report.get-chart-data'); - $cache->addProperty($start); - $cache->addProperty($accounts); - $cache->addProperty($end); - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - - $currentStart = clone $start; - $spentArray = []; - $earnedArray = []; - - /** @var AccountTaskerInterface $tasker */ - $tasker = app(AccountTaskerInterface::class); - - while ($currentStart <= $end) { - $currentEnd = app('navigation')->endOfPeriod($currentStart, '1M'); - $earned = (string)array_sum( - array_map( - function ($item) { - return $item['sum']; - }, - $tasker->getIncomeReport($currentStart, $currentEnd, $accounts) - ) - ); - - $spent = (string)array_sum( - array_map( - function ($item) { - return $item['sum']; - }, - $tasker->getExpenseReport($currentStart, $currentEnd, $accounts) - ) - ); - - $label = $currentStart->format('Y-m') . '-01'; - $spentArray[$label] = bcmul($spent, '-1'); - $earnedArray[$label] = $earned; - $currentStart = app('navigation')->addPeriod($currentStart, '1M', 0); - } - $result = [ - 'spent' => $spentArray, - 'earned' => $earnedArray, - ]; - $cache->store($result); - - return $result; - } } diff --git a/app/Http/Controllers/Import/CallbackController.php b/app/Http/Controllers/Import/CallbackController.php index f85915ac19..97299ec2d7 100644 --- a/app/Http/Controllers/Import/CallbackController.php +++ b/app/Http/Controllers/Import/CallbackController.php @@ -72,4 +72,4 @@ class CallbackController extends Controller return redirect(route('import.job.status.index', [$importJob->key])); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index dbd993aedd..6ca6d052a4 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -25,20 +25,12 @@ namespace FireflyIII\Http\Controllers\Json; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Http\Controllers\Controller; -use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Repositories\Category\CategoryRepositoryInterface; -use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Support\CacheProperties; +use FireflyIII\Support\Http\Controllers\AutoCompleteCollector; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Collection; /** * Class AutoCompleteController. @@ -47,6 +39,7 @@ use Illuminate\Support\Collection; */ class AutoCompleteController extends Controller { + use AutoCompleteCollector; /** * List of all journals. @@ -100,60 +93,44 @@ class AutoCompleteController extends Controller $unfiltered = null; $filtered = null; - // search for all accounts. - if ('all-accounts' === $subject) { - $unfiltered = $this->getAccounts( - [AccountType::REVENUE, AccountType::EXPENSE, AccountType::BENEFICIARY, AccountType::DEFAULT, AccountType::ASSET, AccountType::LOAN, - AccountType::DEBT, AccountType::MORTGAGE] - ); + switch ($subject) { + default: + break; + case 'all-accounts': + $unfiltered = $this->getAccounts( + [AccountType::REVENUE, AccountType::EXPENSE, AccountType::BENEFICIARY, AccountType::DEFAULT, AccountType::ASSET, AccountType::LOAN, + AccountType::DEBT, AccountType::MORTGAGE] + ); + break; + case 'expense-accounts': + $unfiltered = $this->getAccounts([AccountType::EXPENSE, AccountType::BENEFICIARY]); + break; + case 'revenue-accounts': + $unfiltered = $this->getAccounts([AccountType::REVENUE]); + break; + case 'asset-accounts': + $unfiltered = $this->getAccounts([AccountType::ASSET, AccountType::DEFAULT]); + break; + case 'categories': + $unfiltered = $this->getCategories(); + break; + case 'budgets': + $unfiltered = $this->getBudgets(); + break; + case 'tags': + $unfiltered = $this->getTags(); + break; + case 'bills': + $unfiltered = $this->getBills(); + break; + case 'currency-names': + $unfiltered = $this->getCurrencyNames(); + break; + case 'transaction-types': + case 'transaction_types': + $unfiltered = $this->getTransactionTypes(); + break; } - - // search for expense accounts. - if ('expense-accounts' === $subject) { - $unfiltered = $this->getAccounts([AccountType::EXPENSE, AccountType::BENEFICIARY]); - } - - // search for revenue accounts. - if ('revenue-accounts' === $subject) { - $unfiltered = $this->getAccounts([AccountType::REVENUE]); - } - - // search for asset accounts. - if ('asset-accounts' === $subject) { - $unfiltered = $this->getAccounts([AccountType::ASSET, AccountType::DEFAULT]); - } - - // search for categories. - if ('categories' === $subject) { - $unfiltered = $this->getCategories(); - } - - // search for budgets. - if ('budgets' === $subject) { - $unfiltered = $this->getBudgets(); - } - - // search for tags - if ('tags' === $subject) { - $unfiltered = $this->getTags(); - } - - // search for bills - if ('bills' === $subject) { - $unfiltered = $this->getBills(); - } - // search for currency names. - if ('currency-names' === $subject) { - $unfiltered = $this->getCurrencyNames(); - } - if ('transaction_types' === $subject) { - $unfiltered = $this->getTransactionTypes(); - } - if ('transaction-types' === $subject) { - $unfiltered = $this->getTransactionTypes(); - } - - // filter results $filtered = $this->filterResult($unfiltered, $search); if (null === $filtered) { @@ -203,7 +180,8 @@ class AutoCompleteController extends Controller $return = array_filter( $return, function (array $array) use ($search) { $haystack = $array['name']; - $result = stripos($haystack, $search); + $result = stripos($haystack, $search); + return !(false === $result); } ); @@ -227,7 +205,7 @@ class AutoCompleteController extends Controller { $search = (string)$request->get('search'); $cache = new CacheProperties; - $cache->addProperty('ac-revenue-accounts'); + $cache->addProperty('ac-journals'); // very unlikely a user will actually search for this string. $key = '' === $search ? 'skjf0893j89fj2398hd89dh289h2398hr7isd8900828u209ujnxs88929282u' : $search; $cache->addProperty($key); @@ -257,121 +235,4 @@ class AutoCompleteController extends Controller return response()->json($return); } - - /** - * @param array $unfiltered - * @param string $query - * - * @return array|null - */ - private function filterResult(?array $unfiltered, string $query): ?array - { - if (null === $unfiltered) { - return null; // @codeCoverageIgnore - } - if ('' === $query) { - sort($unfiltered); - - return $unfiltered; - } - $return = []; - if ('' !== $query) { - $return = array_values( - array_filter( - $unfiltered, function (string $value) use ($query) { - return !(false === stripos($value, $query)); - }, ARRAY_FILTER_USE_BOTH - ) - ); - } - sort($return); - - - return $return; - } - - /** - * @param string $query - * @param array $types - * - * @return array - */ - private function getAccounts(array $types): array - { - $repository = app(AccountRepositoryInterface::class); - // find everything: - /** @var Collection $collection */ - $collection = $repository->getAccountsByType($types); - $filtered = $collection->filter( - function (Account $account) { - return $account->active === true; - } - ); - $return = array_values(array_unique($filtered->pluck('name')->toArray())); - - return $return; - - } - - /** - * @return array - */ - private function getBills(): array - { - $repository = app(BillRepositoryInterface::class); - - return array_unique($repository->getActiveBills()->pluck('name')->toArray()); - } - - /** - * @return array - */ - private function getBudgets(): array - { - $repository = app(BudgetRepositoryInterface::class); - - return array_unique($repository->getBudgets()->pluck('name')->toArray()); - } - - /** - * @return array - */ - private function getCategories(): array - { - $repository = app(CategoryRepositoryInterface::class); - - return array_unique($repository->getCategories()->pluck('name')->toArray()); - } - - /** - * @return array - */ - private function getCurrencyNames(): array - { - /** @var CurrencyRepositoryInterface $repository */ - $repository = app(CurrencyRepositoryInterface::class); - - return $repository->get()->pluck('name')->toArray(); - } - - /** - * @return array - */ - private function getTags(): array - { - /** @var TagRepositoryInterface $repository */ - $repository = app(TagRepositoryInterface::class); - - return array_unique($repository->get()->pluck('tag')->toArray()); - } - - /** - * @return array - */ - private function getTransactionTypes(): array - { - $repository = app(JournalRepositoryInterface::class); - - return array_unique($repository->getTransactionTypes()->pluck('type')->toArray()); - } } diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index b5e3dc07b6..c0fb2157f4 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -58,10 +58,11 @@ class PreferencesController extends Controller public function index(AccountRepositoryInterface $repository) { $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $accountIds = $accounts->pluck('id')->toArray(); $viewRangePref = app('preferences')->get('viewRange', '1M'); /** @noinspection NullPointerExceptionInspection */ $viewRange = $viewRangePref->data; - $frontPageAccounts = app('preferences')->get('frontPageAccounts', []); + $frontPageAccounts = app('preferences')->get('frontPageAccounts', $accountIds); $language = app('preferences')->get('language', config('firefly.default_language', 'en_US'))->data; $listPageSize = app('preferences')->get('listPageSize', 50)->data; $customFiscalYear = app('preferences')->get('customFiscalYear', 0)->data; @@ -69,6 +70,12 @@ class PreferencesController extends Controller $fiscalYearStart = date('Y') . '-' . $fiscalYearStartStr; $tjOptionalFields = app('preferences')->get('transaction_journal_optional_fields', [])->data; + // an important fallback is that the frontPageAccount array gets refilled automatically + // when it turns up empty. + if (\count($frontPageAccounts->data) === 0) { + $frontPageAccounts = $accountIds; + } + return view( 'preferences.index', compact( @@ -98,7 +105,7 @@ class PreferencesController extends Controller { // front page accounts $frontPageAccounts = []; - if (\is_array($request->get('frontPageAccounts'))) { + if (\is_array($request->get('frontPageAccounts')) && \count($request->get('frontPageAccounts')) > 0) { foreach ($request->get('frontPageAccounts') as $id) { $frontPageAccounts[] = (int)$id; } diff --git a/app/Http/Controllers/Report/ExpenseController.php b/app/Http/Controllers/Report/ExpenseController.php index 73de303fe2..d54486624b 100644 --- a/app/Http/Controllers/Report/ExpenseController.php +++ b/app/Http/Controllers/Report/ExpenseController.php @@ -340,294 +340,4 @@ class ExpenseController extends Controller } - - /** @noinspection MoreThanThreeArgumentsInspection */ - /** - * Group by category (earnings). - * - * @param Collection $assets - * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function earnedByCategory(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info - { - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT])->setAccounts($assets); - $collector->setOpposingAccounts($opposing)->withCategoryInformation(); - $set = $collector->getTransactions(); - $sum = []; - // loop to support multi currency - foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - $categoryName = $transaction->transaction_category_name; - $categoryId = (int)$transaction->transaction_category_id; - // if null, grab from journal: - if (0 === $categoryId) { - $categoryName = $transaction->transaction_journal_category_name; - $categoryId = (int)$transaction->transaction_journal_category_id; - } - if (0 !== $categoryId) { - $categoryName = app('steam')->tryDecrypt($categoryName); - } - - // if not set, set to zero: - if (!isset($sum[$categoryId][$currencyId])) { - $sum[$categoryId] = [ - 'grand_total' => '0', - 'name' => $categoryName, - 'per_currency' => [ - $currencyId => [ - 'sum' => '0', - 'category' => [ - 'id' => $categoryId, - 'name' => $categoryName, - ], - 'currency' => [ - 'symbol' => $transaction->transaction_currency_symbol, - 'dp' => $transaction->transaction_currency_dp, - ], - ], - ], - ]; - } - - // add amount - $sum[$categoryId]['per_currency'][$currencyId]['sum'] = bcadd( - $sum[$categoryId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount - ); - $sum[$categoryId]['grand_total'] = bcadd($sum[$categoryId]['grand_total'], $transaction->transaction_amount); - } - - return $sum; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - /** - * Earned in period for accounts. - * - * @param Collection $assets - * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - protected function earnedInPeriod(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info - { - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT])->setAccounts($assets); - $collector->setOpposingAccounts($opposing); - $set = $collector->getTransactions(); - $sum = [ - 'grand_sum' => '0', - 'per_currency' => [], - ]; - // loop to support multi currency - foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - - // if not set, set to zero: - if (!isset($sum['per_currency'][$currencyId])) { - $sum['per_currency'][$currencyId] = [ - 'sum' => '0', - 'currency' => [ - 'symbol' => $transaction->transaction_currency_symbol, - 'dp' => $transaction->transaction_currency_dp, - ], - ]; - } - - // add amount - $sum['per_currency'][$currencyId]['sum'] = bcadd($sum['per_currency'][$currencyId]['sum'], $transaction->transaction_amount); - $sum['grand_sum'] = bcadd($sum['grand_sum'], $transaction->transaction_amount); - } - - return $sum; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - /** - * Spent by budget. - * - * @param Collection $assets - * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end - * - * @return array - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function spentByBudget(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info - { - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); - $collector->setOpposingAccounts($opposing)->withBudgetInformation(); - $set = $collector->getTransactions(); - $sum = []; - // loop to support multi currency - foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - $budgetName = $transaction->transaction_budget_name; - $budgetId = (int)$transaction->transaction_budget_id; - // if null, grab from journal: - if (0 === $budgetId) { - $budgetName = $transaction->transaction_journal_budget_name; - $budgetId = (int)$transaction->transaction_journal_budget_id; - } - if (0 !== $budgetId) { - $budgetName = app('steam')->tryDecrypt($budgetName); - } - - // if not set, set to zero: - if (!isset($sum[$budgetId][$currencyId])) { - $sum[$budgetId] = [ - 'grand_total' => '0', - 'name' => $budgetName, - 'per_currency' => [ - $currencyId => [ - 'sum' => '0', - 'budget' => [ - 'id' => $budgetId, - 'name' => $budgetName, - ], - 'currency' => [ - 'symbol' => $transaction->transaction_currency_symbol, - 'dp' => $transaction->transaction_currency_dp, - ], - ], - ], - ]; - } - - // add amount - $sum[$budgetId]['per_currency'][$currencyId]['sum'] = bcadd( - $sum[$budgetId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount - ); - $sum[$budgetId]['grand_total'] = bcadd($sum[$budgetId]['grand_total'], $transaction->transaction_amount); - } - - return $sum; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - /** - * Spent by category. - * - * @param Collection $assets - * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end - * - * @return array - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - protected function spentByCategory(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info - { - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); - $collector->setOpposingAccounts($opposing)->withCategoryInformation(); - $set = $collector->getTransactions(); - $sum = []; - // loop to support multi currency - foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - $categoryName = $transaction->transaction_category_name; - $categoryId = (int)$transaction->transaction_category_id; - // if null, grab from journal: - if (0 === $categoryId) { - $categoryName = $transaction->transaction_journal_category_name; - $categoryId = (int)$transaction->transaction_journal_category_id; - } - if (0 !== $categoryId) { - $categoryName = app('steam')->tryDecrypt($categoryName); - } - - // if not set, set to zero: - if (!isset($sum[$categoryId][$currencyId])) { - $sum[$categoryId] = [ - 'grand_total' => '0', - 'name' => $categoryName, - 'per_currency' => [ - $currencyId => [ - 'sum' => '0', - 'category' => [ - 'id' => $categoryId, - 'name' => $categoryName, - ], - 'currency' => [ - 'symbol' => $transaction->transaction_currency_symbol, - 'dp' => $transaction->transaction_currency_dp, - ], - ], - ], - ]; - } - - // add amount - $sum[$categoryId]['per_currency'][$currencyId]['sum'] = bcadd( - $sum[$categoryId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount - ); - $sum[$categoryId]['grand_total'] = bcadd($sum[$categoryId]['grand_total'], $transaction->transaction_amount); - } - - return $sum; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - /** - * Spent in a period. - * - * @param Collection $assets - * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - protected function spentInPeriod(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info - { - /** @var TransactionCollectorInterface $collector */ - $collector = app(TransactionCollectorInterface::class); - $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); - $collector->setOpposingAccounts($opposing); - $set = $collector->getTransactions(); - $sum = [ - 'grand_sum' => '0', - 'per_currency' => [], - ]; - // loop to support multi currency - foreach ($set as $transaction) { - $currencyId = (int)$transaction->transaction_currency_id; - - // if not set, set to zero: - if (!isset($sum['per_currency'][$currencyId])) { - $sum['per_currency'][$currencyId] = [ - 'sum' => '0', - 'currency' => [ - 'symbol' => $transaction->transaction_currency_symbol, - 'dp' => $transaction->transaction_currency_dp, - ], - ]; - } - - // add amount - $sum['per_currency'][$currencyId]['sum'] = bcadd($sum['per_currency'][$currencyId]['sum'], $transaction->transaction_amount); - $sum['grand_sum'] = bcadd($sum['grand_sum'], $transaction->transaction_amount); - } - - return $sum; - } } diff --git a/app/Http/Controllers/Rule/CreateController.php b/app/Http/Controllers/Rule/CreateController.php index 3656586d6f..60c52e102f 100644 --- a/app/Http/Controllers/Rule/CreateController.php +++ b/app/Http/Controllers/Rule/CreateController.php @@ -29,6 +29,8 @@ use FireflyIII\Http\Requests\RuleFormRequest; use FireflyIII\Models\Bill; use FireflyIII\Models\RuleGroup; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; +use FireflyIII\Support\Http\Controllers\AugumentData; +use FireflyIII\Support\Http\Controllers\ModelInformation; use FireflyIII\Support\Http\Controllers\RuleManagement; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -40,7 +42,7 @@ use Throwable; */ class CreateController extends Controller { - use RuleManagement; + use RuleManagement, ModelInformation; /** @var RuleRepositoryInterface Rule repository */ private $ruleRepos; @@ -199,78 +201,4 @@ class CreateController extends Controller return $redirect; } - /** - * Get actions based on a bill. - * - * @param Bill $bill - * - * @return array - */ - protected function getActionsForBill(Bill $bill): array // get info and augument - { - try { - $result = view( - 'rules.partials.action', - [ - 'oldAction' => 'link_to_bill', - 'oldValue' => $bill->name, - 'oldChecked' => false, - 'count' => 1, - ] - )->render(); - // @codeCoverageIgnoreStart - } catch (Throwable $e) { - Log::error(sprintf('Throwable was thrown in getActionsForBill(): %s', $e->getMessage())); - Log::error($e->getTraceAsString()); - $result = 'Could not render view. See log files.'; - } - - // @codeCoverageIgnoreEnd - - return [$result]; - } - - /** - * Create fake triggers to match the bill's properties - * - * @param Bill $bill - * - * @return array - */ - protected function getTriggersForBill(Bill $bill): array // get info and augument - { - $result = []; - $triggers = ['currency_is', 'amount_more', 'amount_less', 'description_contains']; - $values = [ - $bill->transactionCurrency()->first()->name, - round((float)$bill->amount_min, 12), - round((float)$bill->amount_max, 12), - $bill->name, - ]; - foreach ($triggers as $index => $trigger) { - try { - $string = view( - 'rules.partials.trigger', - [ - 'oldTrigger' => $trigger, - 'oldValue' => $values[$index], - 'oldChecked' => false, - 'count' => $index + 1, - ] - )->render(); - // @codeCoverageIgnoreStart - } catch (Throwable $e) { - - Log::debug(sprintf('Throwable was thrown in getTriggersForBill(): %s', $e->getMessage())); - Log::debug($e->getTraceAsString()); - $string = ''; - // @codeCoverageIgnoreEnd - } - if ('' !== $string) { - $result[] = $string; - } - } - - return $result; - } } diff --git a/app/Http/Controllers/Rule/EditController.php b/app/Http/Controllers/Rule/EditController.php index b4f000bb9d..53c2dd44dd 100644 --- a/app/Http/Controllers/Rule/EditController.php +++ b/app/Http/Controllers/Rule/EditController.php @@ -30,6 +30,8 @@ use FireflyIII\Models\Rule; use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleTrigger; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; +use FireflyIII\Support\Http\Controllers\ModelInformation; +use FireflyIII\Support\Http\Controllers\RenderPartialViews; use FireflyIII\Support\Http\Controllers\RuleManagement; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -41,7 +43,7 @@ use Throwable; */ class EditController extends Controller { - use RuleManagement; + use RuleManagement, RenderPartialViews; /** @var RuleRepositoryInterface Rule repository */ private $ruleRepos; @@ -146,81 +148,4 @@ class EditController extends Controller return $redirect; } - - /** - * Get current (from system) rule actions. - * - * @param Rule $rule - * - * @return array - */ - protected function getCurrentActions(Rule $rule): array // get info from object and present. - { - $index = 0; - $actions = []; - $currentActions = $rule->ruleActions()->orderBy('order','ASC')->get(); - /** @var RuleAction $entry */ - foreach ($currentActions as $entry) { - $count = ($index + 1); - try { - $actions[] = view( - 'rules.partials.action', - [ - 'oldAction' => $entry->action_type, - 'oldValue' => $entry->action_value, - 'oldChecked' => $entry->stop_processing, - 'count' => $count, - ] - )->render(); - // @codeCoverageIgnoreStart - } catch (Throwable $e) { - Log::debug(sprintf('Throwable was thrown in getCurrentActions(): %s', $e->getMessage())); - Log::error($e->getTraceAsString()); - } - // @codeCoverageIgnoreEnd - ++$index; - } - - return $actions; - } - - /** - * Get current (from DB) rule triggers. - * - * @param Rule $rule - * - * @return array - * - */ - protected function getCurrentTriggers(Rule $rule): array // get info from object and present. - { - $index = 0; - $triggers = []; - $currentTriggers = $rule->ruleTriggers()->orderBy('order','ASC')->get(); - /** @var RuleTrigger $entry */ - foreach ($currentTriggers as $entry) { - if ('user_action' !== $entry->trigger_type) { - $count = ($index + 1); - try { - $triggers[] = view( - 'rules.partials.trigger', - [ - 'oldTrigger' => $entry->trigger_type, - 'oldValue' => $entry->trigger_value, - 'oldChecked' => $entry->stop_processing, - 'count' => $count, - ] - )->render(); - // @codeCoverageIgnoreStart - } catch (Throwable $e) { - Log::debug(sprintf('Throwable was thrown in getCurrentTriggers(): %s', $e->getMessage())); - Log::error($e->getTraceAsString()); - } - // @codeCoverageIgnoreEnd - ++$index; - } - } - - return $triggers; - } } diff --git a/app/Http/Controllers/System/CronController.php b/app/Http/Controllers/System/CronController.php index 33e57aa517..d38c2f5987 100644 --- a/app/Http/Controllers/System/CronController.php +++ b/app/Http/Controllers/System/CronController.php @@ -23,14 +23,15 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\System; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Support\Cronjobs\RecurringCronjob; +use FireflyIII\Support\Http\Controllers\CronRunner; /** * Class CronController */ class CronController { + use CronRunner; + /** * @param string $token * @@ -43,24 +44,4 @@ class CronController return implode("
\n", $results); } - - /** - * @return string - */ - private function runRecurring(): string - { - /** @var RecurringCronjob $recurring */ - $recurring = app(RecurringCronjob::class); - try { - $result = $recurring->fire(); - } catch (FireflyException $e) { - return $e->getMessage(); - } - if (false === $result) { - return 'The recurring transaction cron job did not fire.'; - } - - return 'The recurring transaction cron job fired successfully.'; - } - -} \ No newline at end of file +} diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php index 3c7a2039b1..711f091db4 100644 --- a/app/Http/Controllers/System/InstallController.php +++ b/app/Http/Controllers/System/InstallController.php @@ -147,7 +147,7 @@ class InstallController extends Controller return response()->json(['error' => true, 'message' => self::BASEDIR_ERROR]); } - return response()->json(['error' => true, 'message' => self::OTHER_ERROR]); + return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]); } return response()->json(['error' => false, 'message' => 'OK']); @@ -174,7 +174,7 @@ class InstallController extends Controller return response()->json(['error' => true, 'message' => self::BASEDIR_ERROR]); } - return response()->json(['error' => true, 'message' => self::OTHER_ERROR]); + return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]); } return response()->json(['error' => false, 'message' => 'OK']); diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 7dba1172fa..040a9a89dd 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -33,6 +33,7 @@ use FireflyIII\Support\Http\Controllers\PeriodOverview; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Collection; +use Log; /** * Class TagController. @@ -250,7 +251,10 @@ class TagController extends Controller public function store(TagFormRequest $request): RedirectResponse { $data = $request->collectTagData(); - $this->repository->store($data); + Log::debug('Data from request', $data); + + $result = $this->repository->store($data); + Log::debug('Data after storage', $result->toArray()); session()->flash('success', (string)trans('firefly.created_tag', ['tag' => $data['tag']])); app('preferences')->mark(); diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index 4f30ed6385..c21be8db8c 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -25,10 +25,8 @@ namespace FireflyIII\Http\Controllers\Transaction; use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; -use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Support\Http\Controllers\ModelInformation; use Illuminate\Http\Request; @@ -163,6 +161,7 @@ class ConvertController extends Controller if ($errors->count() > 0) { Log::error('Errors while converting: ', $errors->toArray()); + return redirect(route('transactions.convert.index', [strtolower($destinationType->type), $journal->id]))->withErrors($errors)->withInput(); } @@ -174,126 +173,4 @@ class ConvertController extends Controller return redirect(route('transactions.show', [$journal->id])); } - - - /** - * Get the destination account. Is complex. - * - * @param TransactionJournal $journal - * @param TransactionType $destinationType - * @param array $data - * - * @return Account - * - * @throws FireflyException - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - protected function getDestinationAccount(TransactionJournal $journal, TransactionType $destinationType, array $data - ): Account // helper for conversion. Get info from obj. - { - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $sourceAccount = $this->repository->getJournalSourceAccounts($journal)->first(); - $destinationAccount = $this->repository->getJournalDestinationAccounts($journal)->first(); - $sourceType = $journal->transactionType; - $joined = $sourceType->type . '-' . $destinationType->type; - switch ($joined) { - default: - throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore - case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: - // one - $destination = $sourceAccount; - break; - case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: - // two - $destination = $accountRepository->findNull((int)$data['destination_account_asset']); - break; - case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: - case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: - // three and five - if ('' === $data['destination_account_expense'] || null === $data['destination_account_expense']) { - // destination is a cash account. - return $accountRepository->getCashAccount(); - } - $data = [ - 'name' => $data['destination_account_expense'], - 'accountType' => 'expense', - 'account_type_id' => null, - 'virtualBalance' => 0, - 'active' => true, - 'iban' => null, - ]; - $destination = $accountRepository->store($data); - break; - case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: - case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: - // four and six - $destination = $destinationAccount; - break; - } - - return $destination; - } - - - /** - * Get the source account. - * - * @param TransactionJournal $journal - * @param TransactionType $destinationType - * @param array $data - * - * @return Account - * - * @throws FireflyException - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - protected function getSourceAccount(TransactionJournal $journal, TransactionType $destinationType, array $data - ): Account // helper for conversion. Get info from obj. - { - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $sourceAccount = $this->repository->getJournalSourceAccounts($journal)->first(); - $destinationAccount = $this->repository->getJournalDestinationAccounts($journal)->first(); - $sourceType = $journal->transactionType; - $joined = $sourceType->type . '-' . $destinationType->type; - switch ($joined) { - default: - throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore - case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: - case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: - - if ('' === $data['source_account_revenue'] || null === $data['source_account_revenue']) { - // destination is a cash account. - return $accountRepository->getCashAccount(); - } - - $data = [ - 'name' => $data['source_account_revenue'], - 'accountType' => 'revenue', - 'virtualBalance' => 0, - 'active' => true, - 'account_type_id' => null, - 'iban' => null, - ]; - $source = $accountRepository->store($data); - break; - case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: - case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: - $source = $sourceAccount; - break; - case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: - $source = $destinationAccount; - break; - case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: - $source = $accountRepository->findNull((int)$data['source_account_asset']); - break; - } - - return $source; - } } diff --git a/app/Http/Controllers/Transaction/MassController.php b/app/Http/Controllers/Transaction/MassController.php index e367da91d0..e15f6b5325 100644 --- a/app/Http/Controllers/Transaction/MassController.php +++ b/app/Http/Controllers/Transaction/MassController.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; use Carbon\Carbon; +use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Helpers\Filter\TransactionViewFilter; @@ -241,6 +242,9 @@ class MassController extends Controller // call repository update function. $repository->update($journal, $data); + // trigger rules + event(new UpdatedTransactionJournal($journal)); + ++$count; } } diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index 8dd1d44ea1..7a2cec0444 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -400,7 +400,7 @@ class SingleController extends Controller session()->flash('info', $this->attachments->getMessages()->get('attachments')); } - event(new StoredTransactionJournal($journal, $data['piggy_bank_id'])); + event(new StoredTransactionJournal($journal)); session()->flash('success_uri', route('transactions.show', [$journal->id])); session()->flash('success', (string)trans('firefly.stored_journal', ['description' => $journal->description])); diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index 2f8ecf1b15..4ba15b5503 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -171,42 +171,4 @@ class SplitController extends Controller return redirect($this->getPreviousUri('transactions.edit-split.uri')); } - - /** - * Get info from old input. - * - * @param $array - * @param $old - * - * @return array - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - protected function updateWithPrevious($array, $old): array // update object with new info - { - if (0 === \count($old) || !isset($old['transactions'])) { - return $array; - } - $old = $old['transactions']; - - foreach ($old as $index => $row) { - if (isset($array[$index])) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $array[$index] = array_merge($array[$index], $row); - continue; - } - // take some info from first transaction, that should at least exist. - $array[$index] = $row; - $array[$index]['currency_id'] = $array[0]['currency_id']; - $array[$index]['currency_code'] = $array[0]['currency_code'] ?? ''; - $array[$index]['currency_symbol'] = $array[0]['currency_symbol'] ?? ''; - $array[$index]['foreign_amount'] = round($array[0]['foreign_destination_amount'] ?? '0', 12); - $array[$index]['foreign_currency_id'] = $array[0]['foreign_currency_id']; - $array[$index]['foreign_currency_code'] = $array[0]['foreign_currency_code']; - $array[$index]['foreign_currency_symbol'] = $array[0]['foreign_currency_symbol']; - } - - return $array; - } } diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index 82c7698769..492574bf23 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -54,12 +54,17 @@ class SecureHeaders sprintf("script-src 'self' 'unsafe-eval' 'unsafe-inline' %s", $google), "style-src 'self' 'unsafe-inline'", "base-uri 'self'", - "form-action 'self'", "font-src 'self'", "connect-src 'self'", "img-src 'self' data: https://api.tiles.mapbox.com", + "manifest-src 'self'", ]; + $route = $request->route(); + if (null !== $route && $route->uri !== 'oauth/authorize') { + $csp[] = "form-action 'self'"; + } + $featurePolicies = [ "geolocation 'none'", "midi 'none'", diff --git a/app/Http/Requests/TagFormRequest.php b/app/Http/Requests/TagFormRequest.php index d778c3af8e..003fcc266c 100644 --- a/app/Http/Requests/TagFormRequest.php +++ b/app/Http/Requests/TagFormRequest.php @@ -92,7 +92,7 @@ class TagFormRequest extends Request 'description' => 'min:1|nullable', 'date' => 'date|nullable', 'latitude' => 'numeric|min:-90|max:90|nullable', - 'longitude' => 'numeric|min:-90|max:90|nullable', + 'longitude' => 'numeric|min:-180|max:180|nullable', 'zoom_level' => 'numeric|min:0|max:80|nullable', ]; } diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index 1e1d5c6729..d595249e59 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -219,10 +219,10 @@ class Amount implements ConverterInterface if (0 === strpos($value, '--')) { $value = substr($value, 2); } - - - $str = preg_replace('/[^\-\(\)\.\,0-9 ]/', '', $value); - $len = \strlen($str); + // have to strip the € because apparantly the Postbank (DE) thinks "1.000,00 €" is a normal way to format a number. + $value = trim((string)str_replace(['€'], '', $value)); + $str = preg_replace('/[^\-\(\)\.\,0-9 ]/', '', $value); + $len = \strlen($str); if ('(' === $str[0] && ')' === $str[$len - 1]) { $str = '-' . substr($str, 1, $len - 2); } diff --git a/app/Import/Converter/RabobankDebitCredit.php b/app/Import/Converter/BankDebitCredit.php similarity index 67% rename from app/Import/Converter/RabobankDebitCredit.php rename to app/Import/Converter/BankDebitCredit.php index 921056eaf3..7b91ef895a 100644 --- a/app/Import/Converter/RabobankDebitCredit.php +++ b/app/Import/Converter/BankDebitCredit.php @@ -1,7 +1,7 @@ . */ + declare(strict_types=1); namespace FireflyIII\Import\Converter; + use Log; /** - * Class RabobankDebitCredit. + * + * Class BankDebitCredit */ -class RabobankDebitCredit implements ConverterInterface +class BankDebitCredit implements ConverterInterface { + /** - * Convert D or A to integer values. + * Convert a value. + * + * @return mixed * * @param $value - * - * @return int */ public function convert($value): int { Log::debug('Going to convert ', ['value' => $value]); - - if ('D' === $value) { - Log::debug('Return -1'); - + $negative = [ + 'D', // Old style Rabobank (NL). Short for "Debit" + 'A', // New style Rabobank (NL). Short for "Af" + 'Af', // ING (NL). + 'Debet', // Triodos (NL) + ]; + if (\in_array(trim($value), $negative, true)) { return -1; } - // old format: - if ('A' === $value) { - Log::debug('Return -1'); - - return -1; - } - - Log::debug('Return 1'); return 1; } -} +} \ No newline at end of file diff --git a/app/Import/JobConfiguration/FinTSConfigurationSteps.php b/app/Import/JobConfiguration/FinTSConfigurationSteps.php index 6f77b61b09..cdb6265d80 100644 --- a/app/Import/JobConfiguration/FinTSConfigurationSteps.php +++ b/app/Import/JobConfiguration/FinTSConfigurationSteps.php @@ -32,4 +32,4 @@ abstract class FinTSConfigurationSteps public const NEW = 'new'; public const CHOOSE_ACCOUNT = 'choose_account'; public const GO_FOR_IMPORT = 'go-for-import'; -} \ No newline at end of file +} diff --git a/app/Import/JobConfiguration/FinTSJobConfiguration.php b/app/Import/JobConfiguration/FinTSJobConfiguration.php index 4b9c337343..dfc9fdfa64 100644 --- a/app/Import/JobConfiguration/FinTSJobConfiguration.php +++ b/app/Import/JobConfiguration/FinTSJobConfiguration.php @@ -131,4 +131,4 @@ class FinTSJobConfiguration implements JobConfigurationInterface } -} \ No newline at end of file +} diff --git a/app/Import/JobConfiguration/YnabJobConfiguration.php b/app/Import/JobConfiguration/YnabJobConfiguration.php index b74ef30fbb..1fabb496c7 100644 --- a/app/Import/JobConfiguration/YnabJobConfiguration.php +++ b/app/Import/JobConfiguration/YnabJobConfiguration.php @@ -138,4 +138,4 @@ class YnabJobConfiguration implements JobConfigurationInterface return $handler; } -} \ No newline at end of file +} diff --git a/app/Import/Prerequisites/YnabPrerequisites.php b/app/Import/Prerequisites/YnabPrerequisites.php index 187d188199..8ad488d7c0 100644 --- a/app/Import/Prerequisites/YnabPrerequisites.php +++ b/app/Import/Prerequisites/YnabPrerequisites.php @@ -143,4 +143,4 @@ class YnabPrerequisites implements PrerequisitesInterface return true; } -} \ No newline at end of file +} diff --git a/app/Import/Routine/FinTSRoutine.php b/app/Import/Routine/FinTSRoutine.php index 7248c10a3f..43b099fc5b 100644 --- a/app/Import/Routine/FinTSRoutine.php +++ b/app/Import/Routine/FinTSRoutine.php @@ -85,4 +85,4 @@ class FinTSRoutine implements RoutineInterface $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Import/Routine/YnabRoutine.php b/app/Import/Routine/YnabRoutine.php index f49cdd38c7..71ff3fb970 100644 --- a/app/Import/Routine/YnabRoutine.php +++ b/app/Import/Routine/YnabRoutine.php @@ -140,4 +140,4 @@ class YnabRoutine implements RoutineInterface $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Jobs/CreateRecurringTransactions.php b/app/Jobs/CreateRecurringTransactions.php index bf5b7f1f0b..55e5bca7e0 100644 --- a/app/Jobs/CreateRecurringTransactions.php +++ b/app/Jobs/CreateRecurringTransactions.php @@ -1,4 +1,25 @@ . + */ + declare(strict_types=1); @@ -27,6 +48,8 @@ namespace FireflyIII\Jobs; use Carbon\Carbon; use FireflyIII\Events\RequestedReportOnJournals; use FireflyIII\Events\StoredTransactionJournal; +use FireflyIII\Factory\PiggyBankEventFactory; +use FireflyIII\Factory\PiggyBankFactory; use FireflyIII\Models\Recurrence; use FireflyIII\Models\RecurrenceMeta; use FireflyIII\Models\RecurrenceRepetition; @@ -335,9 +358,23 @@ class CreateRecurringTransactions implements ShouldQueue // get piggy bank ID from meta data: $piggyBankId = $this->getPiggyId($recurrence); + Log::debug(sprintf('Piggy bank ID for recurrence #%d is #%d', $recurrence->id, $piggyBankId)); // trigger event: - event(new StoredTransactionJournal($journal, $piggyBankId)); + event(new StoredTransactionJournal($journal)); + + // link to piggy bank: + /** @var PiggyBankFactory $factory */ + $factory = app(PiggyBankFactory::class); + $factory->setUser($recurrence->user); + + $piggyBank = $factory->find($piggyBankId, null); + if (null !== $piggyBank) { + /** @var PiggyBankEventFactory $factory */ + $factory = app(PiggyBankEventFactory::class); + $factory->create($journal, $piggyBank); + } + $collection->push($journal); // update recurring thing: diff --git a/app/Models/Account.php b/app/Models/Account.php index c5e01d1346..125b4da2e6 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -143,49 +143,6 @@ class Account extends Model return $name; } - /** - * @param $value - * - * @return string - * - * @throws FireflyException - */ - public function getIbanAttribute($value): string - { - if ('' === (string)$value) { - return ''; - } - try { - $result = Crypt::decrypt($value); - } catch (DecryptException $e) { - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - throw new FireflyException('Cannot decrypt value "' . $value . '" for account #' . $this->id); - } - if (null === $result) { - return ''; - } - - return $result; - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getNameAttribute($value): ?string - { - if ($this->encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - /** * Returns the opening balance. * @@ -237,31 +194,6 @@ class Account extends Model $query->whereIn('account_types.type', $types); } - /** - * @param $value - * - * @codeCoverageIgnore - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setIbanAttribute($value): void - { - $this->attributes['iban'] = Crypt::encrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setNameAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php index 8c700089e7..fa59a669cc 100644 --- a/app/Models/Attachment.php +++ b/app/Models/Attachment.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Models; use Carbon\Carbon; -use Crypt; use FireflyIII\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -115,70 +114,6 @@ class Attachment extends Model return sprintf('at-%s.data', (string)$this->id); } - /** - * @param $value - * - * @codeCoverageIgnore - * @return null|string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getDescriptionAttribute($value): ?string - { - if (null === $value || '' === $value) { - return null; - } - - return Crypt::decrypt($value); - } - - /** - * @param $value - * - * @codeCoverageIgnore - * @return null|string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getFilenameAttribute($value): ?string - { - if (null === $value || '' === $value) { - return null; - } - - return Crypt::decrypt($value); - } - - /** - * @param $value - * - * @codeCoverageIgnore - * @return null|string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getMimeAttribute($value): ?string - { - if (null === $value || '' === $value) { - return null; - } - - return Crypt::decrypt($value); - } - - /** - * @param $value - * - * @codeCoverageIgnore - * @return null|string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getTitleAttribute($value): ?string - { - if (null === $value || '' === $value) { - return null; - } - - return Crypt::decrypt($value); - } - /** * @codeCoverageIgnore * Get all of the notes. @@ -188,57 +123,6 @@ class Attachment extends Model return $this->morphMany(Note::class, 'noteable'); } - /** - * @codeCoverageIgnore - * - * @param string|null $value - */ - public function setDescriptionAttribute(string $value = null): void - { - if (null !== $value) { - $this->attributes['description'] = Crypt::encrypt($value); - } - - } - - /** - * @codeCoverageIgnore - * - * @param string $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setFilenameAttribute(string $value): void - { - $this->attributes['filename'] = Crypt::encrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param string $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setMimeAttribute(string $value): void - { - $this->attributes['mime'] = Crypt::encrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param string $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setTitleAttribute(string $value = null): void - { - if (null !== $value) { - $this->attributes['title'] = Crypt::encrypt($value); - } - } - /** * @codeCoverageIgnore * @return BelongsTo diff --git a/app/Models/Bill.php b/app/Models/Bill.php index 610d2695ce..d1ed5548bf 100644 --- a/app/Models/Bill.php +++ b/app/Models/Bill.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Models; use Carbon\Carbon; -use Crypt; use FireflyIII\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -80,7 +79,7 @@ class Bill extends Model /** @var array Fields that can be filled */ protected $fillable - = ['name', 'match', 'amount_min', 'match_encrypted', 'name_encrypted', 'user_id', 'amount_max', 'date', 'repeat_freq', 'skip', + = ['name', 'match', 'amount_min', 'user_id', 'amount_max', 'date', 'repeat_freq', 'skip', 'automatch', 'active', 'transaction_currency_id']; /** @var array Hidden from view */ protected $hidden = ['amount_min_encrypted', 'amount_max_encrypted', 'name_encrypted', 'match_encrypted']; @@ -117,40 +116,6 @@ class Bill extends Model return $this->morphMany(Attachment::class, 'attachable'); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getMatchAttribute($value): string - { - if (1 === (int)$this->match_encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getNameAttribute($value): ?string - { - if (1 === (int)$this->name_encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - /** * @codeCoverageIgnore * Get all of the notes. @@ -180,32 +145,6 @@ class Bill extends Model $this->attributes['amount_min'] = (string)$value; } - /** - * @param $value - * - * @codeCoverageIgnore - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setMatchAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['match'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['match_encrypted'] = $encrypt; - } - - /** - * @param $value - * - * @codeCoverageIgnore - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setNameAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['name_encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * @return BelongsTo diff --git a/app/Models/Budget.php b/app/Models/Budget.php index d353074508..9c7893d3a1 100644 --- a/app/Models/Budget.php +++ b/app/Models/Budget.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Models; use Carbon\Carbon; -use Crypt; use FireflyIII\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -101,37 +100,6 @@ class Budget extends Model return $this->hasMany(BudgetLimit::class); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getNameAttribute($value): ?string - { - if ($this->encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setNameAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * @return BelongsToMany diff --git a/app/Models/Category.php b/app/Models/Category.php index 3af40d24e1..b7d92b4313 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -88,37 +88,6 @@ class Category extends Model throw new NotFoundHttpException; } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getNameAttribute($value): ?string - { - if ($this->encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setNameAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * @return BelongsToMany diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 289e7f79b3..2763b21ceb 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Models; use Carbon\Carbon; -use Crypt; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -104,23 +103,6 @@ class PiggyBank extends Model return $this->belongsTo(Account::class); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getNameAttribute($value): ?string - { - if ($this->encrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - /** * @codeCoverageIgnore * Get all of the piggy bank's notes. @@ -148,20 +130,6 @@ class PiggyBank extends Model return $this->hasMany(PiggyBankRepetition::class); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setNameAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * diff --git a/app/Models/Preference.php b/app/Models/Preference.php index f52cf40f66..071800e3dd 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -54,6 +54,7 @@ class Preference extends Model = [ 'created_at' => 'datetime', 'updated_at' => 'datetime', + 'data' => 'array', ]; /** @var array Fields that can be filled */ @@ -81,54 +82,6 @@ class Preference extends Model throw new NotFoundHttpException; } - - /** - * @param $value - * - * @return mixed - * - * @throws FireflyException - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - public function getDataAttribute($value) - { - $result = null; - try { - $data = Crypt::decrypt($value); - } catch (DecryptException $e) { - Log::error(sprintf('Could not decrypt preference: %s', $e->getMessage()), ['id' => $this->id, 'name' => $this->name, 'data' => $value]); - throw new FireflyException( - sprintf('Could not decrypt preference #%d. If this error persists, please run "php artisan cache:clear" on the command line.', $this->id) - ); - } - $serialized = true; - try { - unserialize($data, ['allowed_classes' => false]); - } /** @noinspection BadExceptionsProcessingInspection */ catch (Exception $e) { - $serialized = false; - } - if (!$serialized) { - $result = json_decode($data, true); - } - if ($serialized) { - Log::error(sprintf('Preference #%d ("%s") was stored as serialised object. It will be deleted and recreated.', $this->id, $this->name)); - } - - return $result; - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setDataAttribute($value): void - { - $this->attributes['data'] = Crypt::encrypt(json_encode($value)); - } - /** * @codeCoverageIgnore * @return BelongsTo diff --git a/app/Models/Tag.php b/app/Models/Tag.php index 87f5b6eca5..53405628f5 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -40,8 +40,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property int $id * @property \Carbon\Carbon $date * @property int zoomLevel - * @property float longitude * @property float latitude + * @property float longitude * @property string description * @property string amount_sum * @property string tagMode @@ -64,9 +64,11 @@ class Tag extends Model 'deleted_at' => 'datetime', 'date' => 'date', 'zoomLevel' => 'int', + 'latitude' => 'float', + 'longitude' => 'float', ]; /** @var array Fields that can be filled */ - protected $fillable = ['user_id', 'tag', 'date', 'description', 'longitude', 'latitude', 'zoomLevel', 'tagMode']; + protected $fillable = ['user_id', 'tag', 'date', 'description', 'latitude', 'longitude', 'zoomLevel', 'tagMode']; /** * Route binder. Converts the key in the URL to the specified object (or throw 404). @@ -91,63 +93,6 @@ class Tag extends Model throw new NotFoundHttpException; } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getDescriptionAttribute($value): ?string - { - if (null === $value) { - return $value; - } - - return Crypt::decrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function getTagAttribute($value): ?string - { - if (null === $value) { - return null; - } - - return Crypt::decrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setDescriptionAttribute($value): void - { - $this->attributes['description'] = Crypt::encrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setTagAttribute($value): void - { - $this->attributes['tag'] = Crypt::encrypt($value); - } /** * @codeCoverageIgnore diff --git a/app/Models/TransactionGroup.php b/app/Models/TransactionGroup.php new file mode 100644 index 0000000000..9d25ba44db --- /dev/null +++ b/app/Models/TransactionGroup.php @@ -0,0 +1,100 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Models; + +use FireflyIII\User; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\SoftDeletes; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; + + +/** + * Class TransactionGroup. + */ +class TransactionGroup extends Model +{ + use SoftDeletes; + + /** + * The attributes that should be casted to native types. + * + * @var array + */ + protected $casts + = [ + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + 'deleted_at' => 'datetime', + 'title' => 'string', + ]; + + /** @var array Fields that can be filled */ + protected $fillable + = ['user_id', 'title']; + + /** + * Route binder. Converts the key in the URL to the specified object (or throw 404). + * + * @param string $value + * + * @return TransactionGroup + * @throws NotFoundHttpException + */ + public static function routeBinder(string $value): TransactionGroup + { + if (auth()->check()) { + $groupId = (int)$value; + /** @var User $user */ + $user = auth()->user(); + /** @var TransactionGroup $group */ + $group = $user->transactionGroups()->where('transaction_groups.id', $groupId) + ->first(['transaction_groups.*']); + if (null !== $group) { + return $group; + } + } + + throw new NotFoundHttpException; + } + + /** + * @codeCoverageIgnore + * @return BelongsToMany + */ + public function transactionJournals(): BelongsToMany + { + return $this->belongsToMany(TransactionJournal::class); + } + + /** + * @codeCoverageIgnore + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + +} diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 9220b3a867..1cba19f5ed 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -188,23 +188,14 @@ class TransactionJournal extends Model /** * @codeCoverageIgnore - * - * @param $value - * - * @return string|null - * @throws \Illuminate\Contracts\Encryption\DecryptException + * @return BelongsToMany */ - public function getDescriptionAttribute($value): ?string + public function transactionGroups(): BelongsToMany { - if ($this->encrypted) { - return Crypt::decrypt($value); - } - - return $value; + return $this->belongsToMany(Category::class); } /** - * @codeCoverageIgnore * @return bool */ public function isDeposit(): bool @@ -315,20 +306,6 @@ class TransactionJournal extends Model } } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setDescriptionAttribute($value): void - { - $encrypt = config('firefly.encryption'); - $this->attributes['description'] = $encrypt ? Crypt::encrypt($value) : $value; - $this->attributes['encrypted'] = $encrypt; - } - /** * @codeCoverageIgnore * @return HasMany diff --git a/app/Models/TransactionJournalLink.php b/app/Models/TransactionJournalLink.php index 8107ce07a0..bedf702a47 100644 --- a/app/Models/TransactionJournalLink.php +++ b/app/Models/TransactionJournalLink.php @@ -93,22 +93,6 @@ class TransactionJournalLink extends Model return $this->belongsTo(TransactionJournal::class, 'destination_id'); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @return null|string - */ - public function getCommentAttribute($value): ?string - { - if (null !== $value) { - return app('steam')->tryDecrypt($value); - } - - return null; - } - /** * @codeCoverageIgnore * @return BelongsTo @@ -127,23 +111,6 @@ class TransactionJournalLink extends Model return $this->morphMany(Note::class, 'noteable'); } - /** - * @codeCoverageIgnore - * - * @param $value - * - * @throws \Illuminate\Contracts\Encryption\EncryptException - */ - public function setCommentAttribute($value): void - { - if (null !== $value && \strlen($value) > 0) { - $this->attributes['comment'] = Crypt::encrypt($value); - - return; - } - $this->attributes['comment'] = null; - } - /** * @codeCoverageIgnore * @return BelongsTo diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 396c2589ad..07b9dc9ced 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -185,7 +185,11 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind(FiscalHelperInterface::class, FiscalHelper::class); $this->app->bind(BalanceReportHelperInterface::class, BalanceReportHelper::class); $this->app->bind(BudgetReportHelperInterface::class, BudgetReportHelper::class); - $this->app->bind(ExchangeRateInterface::class, FixerIOv2::class); + $class = (string)config(sprintf('firefly.cer_providers.%s', (string)config('firefly.cer_provider'))); + if('' === $class) { + throw new FireflyException('Invalid currency exchange rate provider. Cannot continue.'); + } + $this->app->bind(ExchangeRateInterface::class, $class); // password verifier thing $this->app->bind(Verifier::class, PwndVerifierV2::class); diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index a4c3b4bb31..2695684119 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -37,6 +37,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Services\Internal\Destroy\BudgetDestroyService; use FireflyIII\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -185,11 +186,9 @@ class BudgetRepository implements BudgetRepositoryInterface */ public function destroy(Budget $budget): bool { - try { - $budget->delete(); - } catch (Exception $e) { - Log::error(sprintf('Could not delete budget: %s', $e->getMessage())); - } + /** @var BudgetDestroyService $service */ + $service = app(BudgetDestroyService::class); + $service->destroy($budget); return true; } @@ -220,26 +219,6 @@ class BudgetRepository implements BudgetRepositoryInterface } } - /** - * Find a budget. - * - * @param string $name - * - * @return Budget|null - */ - public function findByName(string $name): ?Budget - { - $budgets = $this->user->budgets()->get(['budgets.*']); - /** @var Budget $budget */ - foreach ($budgets as $budget) { - if ($budget->name === $name) { - return $budget; - } - } - - return null; - } - /** * Find a budget or return NULL * @@ -401,6 +380,26 @@ class BudgetRepository implements BudgetRepositoryInterface return $amount; } + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array + { + $return = []; + $availableBudgets = $this->user->availableBudgets() + ->where('start_date', $start->format('Y-m-d 00:00:00')) + ->where('end_date', $end->format('Y-m-d 00:00:00'))->get(); + /** @var AvailableBudget $availableBudget */ + foreach ($availableBudgets as $availableBudget) { + $return[$availableBudget->transaction_currency_id] = $availableBudget->amount; + } + + return $return; + } + /** * Returns all available budget objects. * @@ -441,6 +440,8 @@ class BudgetRepository implements BudgetRepositoryInterface return bcdiv($total, (string)$days); } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Budget $budget * @param Carbon $start @@ -506,7 +507,6 @@ class BudgetRepository implements BudgetRepositoryInterface return $set; } - /** @noinspection MoreThanThreeArgumentsInspection */ /** * This method is being used to generate the budget overview in the year/multi-year report. Its used * in both the year/multi-year budget overview AND in the accompanying chart. @@ -600,6 +600,8 @@ class BudgetRepository implements BudgetRepositoryInterface return $set; } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Collection $accounts * @param Carbon $start @@ -634,7 +636,6 @@ class BudgetRepository implements BudgetRepositoryInterface return $result; } - /** @noinspection MoreThanThreeArgumentsInspection */ /** * @param TransactionCurrency $currency * @param Carbon $start @@ -662,6 +663,8 @@ class BudgetRepository implements BudgetRepositoryInterface return $availableBudget; } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Budget $budget * @param int $order @@ -672,8 +675,6 @@ class BudgetRepository implements BudgetRepositoryInterface $budget->save(); } - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @param User $user */ @@ -814,7 +815,7 @@ class BudgetRepository implements BudgetRepositoryInterface $collector->setAllAssetAccounts(); } - $set = $collector->getTransactions(); + $set = $collector->getTransactions(); $return = []; $total = []; $currencies = []; @@ -923,6 +924,8 @@ class BudgetRepository implements BudgetRepositoryInterface return $budget; } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param AvailableBudget $availableBudget * @param array $data @@ -952,8 +955,6 @@ class BudgetRepository implements BudgetRepositoryInterface } - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @param BudgetLimit $budgetLimit * @param array $data diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 627687d6e5..e2cd595ec0 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -80,15 +80,6 @@ interface BudgetRepositoryInterface */ public function destroyBudgetLimit(BudgetLimit $budgetLimit): void; - /** - * Find a budget. - * - * @param string $name - * - * @return Budget|null - */ - public function findByName(string $name): ?Budget; - /** * @param int|null $budgetId * @@ -128,6 +119,14 @@ interface BudgetRepositoryInterface */ public function getAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end): string; + /** + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array; + /** * Returns all available budget objects. * diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index 70b63ca744..9bb76ab7b4 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -116,6 +116,68 @@ class CategoryRepository implements CategoryRepositoryInterface return $collector->getTransactions(); } + /** + * @param Collection $categories + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function earnedInPeriodPerCurrency(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): array + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setUser($this->user); + $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT]); + + if ($categories->count() > 0) { + $collector->setCategories($categories); + } + if ($categories->count() === 0) { + $collector->setCategories($this->getCategories()); + } + + if ($accounts->count() > 0) { + $collector->setAccounts($accounts); + } + if (0 === $accounts->count()) { + $collector->setAllAssetAccounts(); + } + + $set = $collector->getTransactions(); + $return = []; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $jrnlCatId = (int)$transaction->transaction_journal_category_id; + $transCatId = (int)$transaction->transaction_category_id; + $categoryId = max($jrnlCatId, $transCatId); + $currencyId = (int)$transaction->transaction_currency_id; + $name = $transaction->transaction_category_name; + $name = '' === (string)$name ? $transaction->transaction_journal_category_name : $name; + // make array for category: + if (!isset($return[$categoryId])) { + $return[$categoryId] = [ + 'name' => $name, + 'earned' => [], + ]; + } + if (!isset($return[$categoryId]['earned'][$currencyId])) { + $return[$categoryId]['earned'][$currencyId] = [ + 'earned' => '0', + 'currency_id' => $currencyId, + 'currency_symbol' => $transaction->transaction_currency_symbol, + 'currency_code' => $transaction->transaction_currency_code, + 'currency_decimal_places' => $transaction->transaction_currency_dp, + ]; + } + $return[$categoryId]['earned'][$currencyId]['earned'] + = bcadd($return[$categoryId]['earned'][$currencyId]['earned'], $transaction->transaction_amount); + } + + return $return; + } + /** * Find a category. * @@ -187,6 +249,8 @@ class CategoryRepository implements CategoryRepositoryInterface return $this->user->categories()->whereIn('id', $categoryIds)->get(); } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * Returns a list of all the categories belonging to a user. * @@ -205,8 +269,6 @@ class CategoryRepository implements CategoryRepositoryInterface return $set; } - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @param Category $category * @param Collection $accounts @@ -237,6 +299,8 @@ class CategoryRepository implements CategoryRepositoryInterface return $lastJournalDate; } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Collection $categories * @param Collection $accounts @@ -282,8 +346,6 @@ class CategoryRepository implements CategoryRepositoryInterface return $data; } - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @param Collection $accounts * @param Carbon $start @@ -367,6 +429,8 @@ class CategoryRepository implements CategoryRepositoryInterface return $data; } + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Collection $accounts * @param Carbon $start @@ -419,6 +483,7 @@ class CategoryRepository implements CategoryRepositoryInterface } /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param Collection $categories * @param Collection $accounts @@ -435,7 +500,6 @@ class CategoryRepository implements CategoryRepositoryInterface return (string)$set->sum('transaction_amount'); } - /** @noinspection MoreThanThreeArgumentsInspection */ /** * @param Collection $categories * @param Collection $accounts @@ -500,9 +564,17 @@ class CategoryRepository implements CategoryRepositoryInterface $return = []; /** @var Transaction $transaction */ foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - $return[$currencyId] = $return[$currencyId] ?? '0'; - $return[$currencyId] = bcadd($return[$currencyId], $transaction->transaction_amount); + $currencyId = $transaction->transaction_currency_id; + if (!isset($return[$currencyId])) { + $return[$currencyId] = [ + 'spent' => '0', + 'currency_id' => $currencyId, + 'currency_symbol' => $transaction->transaction_currency_symbol, + 'currency_code' => $transaction->transaction_currency_code, + 'currency_decimal_places' => $transaction->transaction_currency_dp, + ]; + } + $return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $transaction->transaction_amount); } return $return; @@ -521,7 +593,14 @@ class CategoryRepository implements CategoryRepositoryInterface /** @var TransactionCollectorInterface $collector */ $collector = app(TransactionCollectorInterface::class); $collector->setUser($this->user); - $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setCategories($categories); + $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); + + if ($categories->count() > 0) { + $collector->setCategories($categories); + } + if ($categories->count() === 0) { + $collector->setCategories($this->getCategories()); + } if ($accounts->count() > 0) { $collector->setAccounts($accounts); @@ -534,9 +613,31 @@ class CategoryRepository implements CategoryRepositoryInterface $return = []; /** @var Transaction $transaction */ foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; - $return[$currencyId] = $return[$currencyId] ?? '0'; - $return[$currencyId] = bcadd($return[$currencyId], $transaction->transaction_amount); + $jrnlCatId = (int)$transaction->transaction_journal_category_id; + $transCatId = (int)$transaction->transaction_category_id; + $categoryId = max($jrnlCatId, $transCatId); + $currencyId = (int)$transaction->transaction_currency_id; + $name = $transaction->transaction_category_name; + $name = '' === (string)$name ? $transaction->transaction_journal_category_name : $name; + + // make array for category: + if (!isset($return[$categoryId])) { + $return[$categoryId] = [ + 'name' => $name, + 'spent' => [], + ]; + } + if (!isset($return[$categoryId]['spent'][$currencyId])) { + $return[$categoryId]['spent'][$currencyId] = [ + 'spent' => '0', + 'currency_id' => $currencyId, + 'currency_symbol' => $transaction->transaction_currency_symbol, + 'currency_code' => $transaction->transaction_currency_code, + 'currency_decimal_places' => $transaction->transaction_currency_dp, + ]; + } + $return[$categoryId]['spent'][$currencyId]['spent'] + = bcadd($return[$categoryId]['spent'][$currencyId]['spent'], $transaction->transaction_amount); } return $return; @@ -690,4 +791,59 @@ class CategoryRepository implements CategoryRepositoryInterface return null; } + + /** + * A very cryptic method name that means: + * + * Get me the amount earned in this period, grouped per currency, where no category was set. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function earnedInPeriodPcWoCategory(Collection $accounts, Carbon $start, Carbon $end): array + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setUser($this->user); + $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT])->withoutCategory(); + + if ($accounts->count() > 0) { + $collector->setAccounts($accounts); + } + if (0 === $accounts->count()) { + $collector->setAllAssetAccounts(); + } + + $set = $collector->getTransactions(); + $set = $set->filter( + function (Transaction $transaction) { + if (bccomp($transaction->transaction_amount, '0') === 1) { + return $transaction; + } + + return null; + } + ); + + $return = []; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = $transaction->transaction_currency_id; + if (!isset($return[$currencyId])) { + $return[$currencyId] = [ + 'spent' => '0', + 'currency_id' => $currencyId, + 'currency_symbol' => $transaction->transaction_currency_symbol, + 'currency_code' => $transaction->transaction_currency_code, + 'currency_decimal_places' => $transaction->transaction_currency_dp, + ]; + } + $return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $transaction->transaction_amount); + } + + return $return; + } } diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index c4944fe8ba..2afe953766 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -191,10 +191,23 @@ interface CategoryRepositoryInterface * @param Carbon $start * @param Carbon $end * - * @return string + * @return array */ public function spentInPeriodPcWoCategory(Collection $accounts, Carbon $start, Carbon $end): array; + /** + * A very cryptic method name that means: + * + * Get me the amount earned in this period, grouped per currency, where no category was set. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function earnedInPeriodPcWoCategory(Collection $accounts, Carbon $start, Carbon $end): array; + /** * @param Collection $categories * @param Collection $accounts @@ -205,6 +218,16 @@ interface CategoryRepositoryInterface */ public function spentInPeriodPerCurrency(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): array; + /** + * @param Collection $categories + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function earnedInPeriodPerCurrency(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): array; + /** * @param Collection $accounts * @param Carbon $start diff --git a/app/Repositories/Recurring/RecurringRepository.php b/app/Repositories/Recurring/RecurringRepository.php index 7c83d0064d..82b8b086fd 100644 --- a/app/Repositories/Recurring/RecurringRepository.php +++ b/app/Repositories/Recurring/RecurringRepository.php @@ -39,20 +39,20 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Services\Internal\Destroy\RecurrenceDestroyService; use FireflyIII\Services\Internal\Update\RecurrenceUpdateService; +use FireflyIII\Support\Repositories\Recurring\CalculateRangeOccurrences; +use FireflyIII\Support\Repositories\Recurring\CalculateXOccurrences; +use FireflyIII\Support\Repositories\Recurring\FiltersWeekends; use FireflyIII\User; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Log; /** - * * Class RecurringRepository - * - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class RecurringRepository implements RecurringRepositoryInterface { + use CalculateRangeOccurrences, CalculateXOccurrences, FiltersWeekends; /** @var User */ private $user; @@ -453,451 +453,4 @@ class RecurringRepository implements RecurringRepositoryInterface return $service->update($recurrence, $data); } - - /** - * Filters out all weekend entries, if necessary. - * - * @param RecurrenceRepetition $repetition - * @param array $dates - * - * @return array - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - private function filterWeekends(RecurrenceRepetition $repetition, array $dates): array - { - if ((int)$repetition->weekend === RecurrenceRepetition::WEEKEND_DO_NOTHING) { - Log::debug('Repetition will not be filtered on weekend days.'); - - return $dates; - } - $return = []; - /** @var Carbon $date */ - foreach ($dates as $date) { - $isWeekend = $date->isWeekend(); - if (!$isWeekend) { - $return[] = clone $date; - Log::debug(sprintf('Date is %s, not a weekend date.', $date->format('D d M Y'))); - continue; - } - - // is weekend and must set back to Friday? - if ($repetition->weekend === RecurrenceRepetition::WEEKEND_TO_FRIDAY) { - $clone = clone $date; - $clone->addDays(5 - $date->dayOfWeekIso); - Log::debug( - sprintf('Date is %s, and this is in the weekend, so corrected to %s (Friday).', $date->format('D d M Y'), $clone->format('D d M Y')) - ); - $return[] = clone $clone; - continue; - } - - // postpone to Monday? - if ($repetition->weekend === RecurrenceRepetition::WEEKEND_TO_MONDAY) { - $clone = clone $date; - $clone->addDays(8 - $date->dayOfWeekIso); - Log::debug( - sprintf('Date is %s, and this is in the weekend, so corrected to %s (Monday).', $date->format('D d M Y'), $clone->format('D d M Y')) - ); - $return[] = $clone; - continue; - } - Log::debug(sprintf('Date is %s, removed from final result', $date->format('D d M Y'))); - } - - // filter unique dates - Log::debug(sprintf('Count before filtering: %d', \count($dates))); - $collection = new Collection($return); - $filtered = $collection->unique(); - $return = $filtered->toArray(); - - Log::debug(sprintf('Count after filtering: %d', \count($return))); - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. - * - * @param Carbon $start - * @param Carbon $end - * @param int $skipMod - * - * @return array - */ - private function getDailyInRange(Carbon $start, Carbon $end, int $skipMod): array - { - $return = []; - $attempts = 0; - Log::debug('Rep is daily. Start of loop.'); - while ($start <= $end) { - Log::debug(sprintf('Mutator is now: %s', $start->format('Y-m-d'))); - if (0 === $attempts % $skipMod) { - Log::debug(sprintf('Attempts modulo skipmod is zero, include %s', $start->format('Y-m-d'))); - $return[] = clone $start; - } - $start->addDay(); - $attempts++; - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. - * - * @param Carbon $start - * @param Carbon $end - * @param int $skipMod - * @param string $moment - * - * @return array - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function getMonthlyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array - { - $return = []; - $attempts = 0; - $dayOfMonth = (int)$moment; - Log::debug(sprintf('Day of month in repetition is %d', $dayOfMonth)); - Log::debug(sprintf('Start is %s.', $start->format('Y-m-d'))); - Log::debug(sprintf('End is %s.', $end->format('Y-m-d'))); - if ($start->day > $dayOfMonth) { - Log::debug('Add a month.'); - // day has passed already, add a month. - $start->addMonth(); - } - Log::debug(sprintf('Start is now %s.', $start->format('Y-m-d'))); - Log::debug('Start loop.'); - while ($start < $end) { - Log::debug(sprintf('Mutator is now %s.', $start->format('Y-m-d'))); - $domCorrected = min($dayOfMonth, $start->daysInMonth); - Log::debug(sprintf('DoM corrected is %d', $domCorrected)); - $start->day = $domCorrected; - Log::debug(sprintf('Mutator is now %s.', $start->format('Y-m-d'))); - Log::debug(sprintf('$attempts %% $skipMod === 0 is %s', var_export(0 === $attempts % $skipMod, true))); - Log::debug(sprintf('$start->lte($mutator) is %s', var_export($start->lte($start), true))); - Log::debug(sprintf('$end->gte($mutator) is %s', var_export($end->gte($start), true))); - if (0 === $attempts % $skipMod && $start->lte($start) && $end->gte($start)) { - Log::debug(sprintf('ADD %s to return!', $start->format('Y-m-d'))); - $return[] = clone $start; - } - $attempts++; - $start->endOfMonth()->startOfDay()->addDay(); - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. - * - * @param Carbon $start - * @param Carbon $end - * @param int $skipMod - * @param string $moment - * - * @return array - */ - private function getNdomInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array - { - $return = []; - $attempts = 0; - $start->startOfMonth(); - // this feels a bit like a cop out but why reinvent the wheel? - $counters = [1 => 'first', 2 => 'second', 3 => 'third', 4 => 'fourth', 5 => 'fifth',]; - $daysOfWeek = [1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday',]; - $parts = explode(',', $moment); - while ($start <= $end) { - $string = sprintf('%s %s of %s %s', $counters[$parts[0]], $daysOfWeek[$parts[1]], $start->format('F'), $start->format('Y')); - $newCarbon = new Carbon($string); - if (0 === $attempts % $skipMod) { - $return[] = clone $newCarbon; - } - $attempts++; - $start->endOfMonth()->addDay(); - } - - return $return; - } - - /** - * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. - * - * @param Carbon $start - * @param Carbon $end - * @param int $skipMod - * @param string $moment - * - * @return array - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function getWeeklyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array - { - $return = []; - $attempts = 0; - Log::debug('Rep is weekly.'); - // monday = 1 - // sunday = 7 - $dayOfWeek = (int)$moment; - Log::debug(sprintf('DoW in repetition is %d, in mutator is %d', $dayOfWeek, $start->dayOfWeekIso)); - if ($start->dayOfWeekIso > $dayOfWeek) { - // day has already passed this week, add one week: - $start->addWeek(); - Log::debug(sprintf('Jump to next week, so mutator is now: %s', $start->format('Y-m-d'))); - } - // today is wednesday (3), expected is friday (5): add two days. - // today is friday (5), expected is monday (1), subtract four days. - Log::debug(sprintf('Mutator is now: %s', $start->format('Y-m-d'))); - $dayDifference = $dayOfWeek - $start->dayOfWeekIso; - $start->addDays($dayDifference); - Log::debug(sprintf('Mutator is now: %s', $start->format('Y-m-d'))); - while ($start <= $end) { - if (0 === $attempts % $skipMod && $start->lte($start) && $end->gte($start)) { - Log::debug('Date is in range of start+end, add to set.'); - $return[] = clone $start; - } - $attempts++; - $start->addWeek(); - Log::debug(sprintf('Mutator is now (end of loop): %s', $start->format('Y-m-d'))); - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Calculates the number of daily occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip - * over $skipMod -1 recurrences. - * - * @param Carbon $date - * @param int $count - * @param int $skipMod - * - * @return array - */ - private function getXDailyOccurrences(Carbon $date, int $count, int $skipMod): array - { - $return = []; - $mutator = clone $date; - $total = 0; - $attempts = 0; - while ($total < $count) { - $mutator->addDay(); - if (0 === $attempts % $skipMod) { - $return[] = clone $mutator; - $total++; - } - $attempts++; - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Calculates the number of monthly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip - * over $skipMod -1 recurrences. - * - * @param Carbon $date - * @param int $count - * @param int $skipMod - * @param string $moment - * - * @return array - */ - private function getXMonthlyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array - { - $return = []; - $mutator = clone $date; - $total = 0; - $attempts = 0; - $mutator->addDay(); // always assume today has passed. - $dayOfMonth = (int)$moment; - if ($mutator->day > $dayOfMonth) { - // day has passed already, add a month. - $mutator->addMonth(); - } - - while ($total < $count) { - $domCorrected = min($dayOfMonth, $mutator->daysInMonth); - $mutator->day = $domCorrected; - if (0 === $attempts % $skipMod) { - $return[] = clone $mutator; - $total++; - } - $attempts++; - $mutator->endOfMonth()->addDay(); - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Calculates the number of NDOM occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip - * over $skipMod -1 recurrences. - * - * @param Carbon $date - * @param int $count - * @param int $skipMod - * @param string $moment - * - * @return array - */ - private function getXNDomOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array - { - $return = []; - $total = 0; - $attempts = 0; - $mutator = clone $date; - $mutator->addDay(); // always assume today has passed. - $mutator->startOfMonth(); - // this feels a bit like a cop out but why reinvent the wheel? - $counters = [1 => 'first', 2 => 'second', 3 => 'third', 4 => 'fourth', 5 => 'fifth',]; - $daysOfWeek = [1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday',]; - $parts = explode(',', $moment); - - while ($total < $count) { - $string = sprintf('%s %s of %s %s', $counters[$parts[0]], $daysOfWeek[$parts[1]], $mutator->format('F'), $mutator->format('Y')); - $newCarbon = new Carbon($string); - if (0 === $attempts % $skipMod) { - $return[] = clone $newCarbon; - $total++; - } - $attempts++; - $mutator->endOfMonth()->addDay(); - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Calculates the number of weekly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip - * over $skipMod -1 recurrences. - * - * @param Carbon $date - * @param int $count - * @param int $skipMod - * @param string $moment - * - * @return array - */ - private function getXWeeklyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array - { - $return = []; - $total = 0; - $attempts = 0; - $mutator = clone $date; - // monday = 1 - // sunday = 7 - $mutator->addDay(); // always assume today has passed. - $dayOfWeek = (int)$moment; - if ($mutator->dayOfWeekIso > $dayOfWeek) { - // day has already passed this week, add one week: - $mutator->addWeek(); - } - // today is wednesday (3), expected is friday (5): add two days. - // today is friday (5), expected is monday (1), subtract four days. - $dayDifference = $dayOfWeek - $mutator->dayOfWeekIso; - $mutator->addDays($dayDifference); - - while ($total < $count) { - if (0 === $attempts % $skipMod) { - $return[] = clone $mutator; - $total++; - } - $attempts++; - $mutator->addWeek(); - } - - return $return; - } - - /** @noinspection MoreThanThreeArgumentsInspection */ - - /** - * Calculates the number of yearly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip - * over $skipMod -1 recurrences. - * - * @param Carbon $date - * @param int $count - * @param int $skipMod - * @param string $moment - * - * @return array - */ - private function getXYearlyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array - { - $return = []; - $mutator = clone $date; - $total = 0; - $attempts = 0; - $date = new Carbon($moment); - $date->year = $mutator->year; - if ($mutator > $date) { - $date->addYear(); - } - $obj = clone $date; - while ($total < $count) { - if (0 === $attempts % $skipMod) { - $return[] = clone $obj; - $total++; - } - $obj->addYears(1); - $attempts++; - } - - return $return; - - } - - /** - * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. - * - * @param Carbon $start - * @param Carbon $end - * @param int $skipMod - * @param string $moment - * - * @return array - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function getYearlyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array - { - $attempts = 0; - $date = new Carbon($moment); - $date->year = $start->year; - $return = []; - if ($start > $date) { - $date->addYear(); - - } - - // is $date between $start and $end? - $obj = clone $date; - $count = 0; - while ($obj <= $end && $obj >= $start && $count < 10) { - if (0 === $attempts % $skipMod) { - $return[] = clone $obj; - } - $obj->addYears(1); - $count++; - $attempts++; - } - - return $return; - - } } diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index f6db933e0a..b3f074b4dd 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -253,10 +253,9 @@ class TagRepository implements TagRepositoryInterface public function store(array $data): Tag { /** @var TagFactory $factory */ - $factory = new TagFactory; + $factory = app(TagFactory::class); $factory->setUser($this->user); return $factory->create($data); - } /** diff --git a/app/Rules/IsAssetAccountId.php b/app/Rules/IsAssetAccountId.php index c50e897ca1..9a59f823ee 100644 --- a/app/Rules/IsAssetAccountId.php +++ b/app/Rules/IsAssetAccountId.php @@ -65,4 +65,4 @@ class IsAssetAccountId implements Rule return true; } -} \ No newline at end of file +} diff --git a/app/Rules/IsBoolean.php b/app/Rules/IsBoolean.php index 2f385db2f4..b23314e657 100644 --- a/app/Rules/IsBoolean.php +++ b/app/Rules/IsBoolean.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + namespace FireflyIII\Rules; use Illuminate\Contracts\Validation\Rule; diff --git a/app/Rules/ZeroOrMore.php b/app/Rules/ZeroOrMore.php index 07e1d8c46b..0683275733 100644 --- a/app/Rules/ZeroOrMore.php +++ b/app/Rules/ZeroOrMore.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + namespace FireflyIII\Rules; use Illuminate\Contracts\Validation\Rule; diff --git a/app/Services/Currency/RatesApiIOv1.php b/app/Services/Currency/RatesApiIOv1.php new file mode 100644 index 0000000000..2c606ddfec --- /dev/null +++ b/app/Services/Currency/RatesApiIOv1.php @@ -0,0 +1,125 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Services\Currency; + +use Carbon\Carbon; +use Exception; +use FireflyIII\Models\CurrencyExchangeRate; +use FireflyIII\Models\TransactionCurrency; +use FireflyIII\User; +use GuzzleHttp\Client; +use GuzzleHttp\Exception\GuzzleException; +use Log; + +/** + * Class RatesApiIOv1. + */ +class RatesApiIOv1 implements ExchangeRateInterface +{ + /** @var User */ + protected $user; + + /** + * Constructor. + */ + public function __construct() + { + if ('testing' === config('app.env')) { + Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); + } + } + + /** + * @param TransactionCurrency $fromCurrency + * @param TransactionCurrency $toCurrency + * @param Carbon $date + * + * @return CurrencyExchangeRate + */ + public function getRate(TransactionCurrency $fromCurrency, TransactionCurrency $toCurrency, Carbon $date): CurrencyExchangeRate + { + // create new exchange rate with default values. + $rate = 0; + $exchangeRate = new CurrencyExchangeRate; + $exchangeRate->user()->associate($this->user); + $exchangeRate->fromCurrency()->associate($fromCurrency); + $exchangeRate->toCurrency()->associate($toCurrency); + $exchangeRate->date = $date; + $exchangeRate->rate = $rate; + $exchangeRate->updated_at = new Carbon; + $exchangeRate->created_at = new Carbon; + + // build URI + $uri = sprintf( + 'https://ratesapi.io/api/%s?base=%s&symbols=%s', + $date->format('Y-m-d'), $fromCurrency->code, $toCurrency->code + ); + Log::debug(sprintf('Going to request exchange rate using URI %s', $uri)); + $client = new Client; + try { + $res = $client->request('GET', $uri); + $statusCode = $res->getStatusCode(); + $body = $res->getBody()->getContents(); + } catch (GuzzleException|Exception $e) { + // don't care about error + $body = sprintf('Guzzle exception: %s', $e->getMessage()); + $statusCode = 500; + } + Log::debug(sprintf('Result status code is %d', $statusCode)); + Log::debug(sprintf('Result body is: %s', $body)); + + $content = null; + if (200 !== $statusCode) { + Log::error(sprintf('Something went wrong. Received error code %d and body "%s" from RatesApiIO.', $statusCode, $body)); + } + $success = false; + // get rate from body: + if (200 === $statusCode) { + $content = json_decode($body, true); + $success = true; + } + if (null !== $content && true === $success) { + $code = $toCurrency->code; + $rate = (float)($content['rates'][$code] ?? 0); + Log::debug('Got the following rates from RatesApi: ', $content['rates'] ?? []); + } + + $exchangeRate->rate = $rate; + if (0.0 !== $rate) { + Log::debug('Rate is not zero, save it!'); + $exchangeRate->save(); + } + + return $exchangeRate; + } + + /** + * @param User $user + * + * @return mixed|void + */ + public function setUser(User $user) + { + $this->user = $user; + } +} diff --git a/app/Services/Internal/Destroy/BudgetDestroyService.php b/app/Services/Internal/Destroy/BudgetDestroyService.php new file mode 100644 index 0000000000..4f1f1b06cf --- /dev/null +++ b/app/Services/Internal/Destroy/BudgetDestroyService.php @@ -0,0 +1,63 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\Destroy; + +use DB; +use Exception; +use FireflyIII\Models\Budget; +use Log; + +/** + * Class BudgetDestroyService + */ +class BudgetDestroyService +{ + /** + * Constructor. + */ + public function __construct() + { + if ('testing' === config('app.env')) { + Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); + } + } + + /** + * @param Budget $budget + */ + public function destroy(Budget $budget): void + { + try { + $budget->delete(); + } catch (Exception $e) { // @codeCoverageIgnore + Log::error(sprintf('Could not delete budget: %s', $e->getMessage())); // @codeCoverageIgnore + } + + // also delete all relations between categories and transaction journals: + DB::table('budget_transaction_journal')->where('budget_id', (int)$budget->id)->delete(); + + // also delete all relations between categories and transactions: + DB::table('budget_transaction')->where('budget_id', (int)$budget->id)->delete(); + } +} diff --git a/app/Services/Internal/Destroy/CategoryDestroyService.php b/app/Services/Internal/Destroy/CategoryDestroyService.php index 7a00e06942..d8d34ab00b 100644 --- a/app/Services/Internal/Destroy/CategoryDestroyService.php +++ b/app/Services/Internal/Destroy/CategoryDestroyService.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Destroy; +use DB; use Exception; use FireflyIII\Models\Category; use Log; @@ -52,5 +53,11 @@ class CategoryDestroyService } catch (Exception $e) { // @codeCoverageIgnore Log::error(sprintf('Could not delete category: %s', $e->getMessage())); // @codeCoverageIgnore } + + // also delete all relations between categories and transaction journals: + DB::table('category_transaction_journal')->where('category_id', (int)$category->id)->delete(); + + // also delete all relations between categories and transactions: + DB::table('category_transaction')->where('category_id', (int)$category->id)->delete(); } } diff --git a/app/Services/Internal/Support/TransactionServiceTrait.php b/app/Services/Internal/Support/TransactionServiceTrait.php index 207ef8da81..0f76b5dd1b 100644 --- a/app/Services/Internal/Support/TransactionServiceTrait.php +++ b/app/Services/Internal/Support/TransactionServiceTrait.php @@ -217,6 +217,11 @@ trait TransactionServiceTrait return; } + // enable currency if not enabled: + if(false === $currency->enabled) { + $currency->enabled = true; + $currency->save(); + } $transaction->foreign_currency_id = $currency->id; $transaction->save(); diff --git a/app/Services/Internal/Update/RecurrenceUpdateService.php b/app/Services/Internal/Update/RecurrenceUpdateService.php index 7205b4c9ff..0fe5f18be7 100644 --- a/app/Services/Internal/Update/RecurrenceUpdateService.php +++ b/app/Services/Internal/Update/RecurrenceUpdateService.php @@ -64,11 +64,12 @@ class RecurrenceUpdateService $recurrence->apply_rules = $data['recurrence']['apply_rules'] ?? $recurrence->apply_rules; $recurrence->active = $data['recurrence']['active'] ?? $recurrence->active; + if (isset($data['recurrence']['repetition_end'])) { - if (\in_array($data['recurrence']['repetition_end'], ['forever ', 'until_date'])) { + if (\in_array($data['recurrence']['repetition_end'], ['forever', 'until_date'])) { $recurrence->repetitions = 0; } - if (\in_array($data['recurrence']['repetition_end'], ['forever ', 'times'])) { + if (\in_array($data['recurrence']['repetition_end'], ['forever', 'times'])) { $recurrence->repeat_until = null; } } diff --git a/app/Services/Ynab/Request/GetAccountsRequest.php b/app/Services/Ynab/Request/GetAccountsRequest.php index c6530c7c18..81c4a1f5be 100644 --- a/app/Services/Ynab/Request/GetAccountsRequest.php +++ b/app/Services/Ynab/Request/GetAccountsRequest.php @@ -51,4 +51,4 @@ class GetAccountsRequest extends YnabRequest // expect data in [data][accounts] $this->accounts = $result['data']['accounts'] ?? []; } -} \ No newline at end of file +} diff --git a/app/Services/Ynab/Request/GetBudgetsRequest.php b/app/Services/Ynab/Request/GetBudgetsRequest.php index 5cff5aff26..b087467b3f 100644 --- a/app/Services/Ynab/Request/GetBudgetsRequest.php +++ b/app/Services/Ynab/Request/GetBudgetsRequest.php @@ -67,4 +67,4 @@ class GetBudgetsRequest extends YnabRequest } $this->budgets = $freshBudgets; } -} \ No newline at end of file +} diff --git a/app/Services/Ynab/Request/GetTransactionsRequest.php b/app/Services/Ynab/Request/GetTransactionsRequest.php index 8e8c9c5b55..bc6e23cd9e 100644 --- a/app/Services/Ynab/Request/GetTransactionsRequest.php +++ b/app/Services/Ynab/Request/GetTransactionsRequest.php @@ -55,4 +55,4 @@ class GetTransactionsRequest extends YnabRequest // expect data in [data][transactions] $this->transactions = $result['data']['transactions'] ?? []; } -} \ No newline at end of file +} diff --git a/app/Services/Ynab/Request/YnabRequest.php b/app/Services/Ynab/Request/YnabRequest.php index 382f1d3003..26eb6a3800 100644 --- a/app/Services/Ynab/Request/YnabRequest.php +++ b/app/Services/Ynab/Request/YnabRequest.php @@ -98,4 +98,4 @@ abstract class YnabRequest $this->token = $token; } -} \ No newline at end of file +} diff --git a/app/Support/Binder/CLIToken.php b/app/Support/Binder/CLIToken.php index 62a750f4bf..a13c7990b6 100644 --- a/app/Support/Binder/CLIToken.php +++ b/app/Support/Binder/CLIToken.php @@ -59,4 +59,4 @@ class CLIToken implements BinderInterface } throw new NotFoundHttpException; } -} \ No newline at end of file +} diff --git a/app/Support/Binder/ConfigurationName.php b/app/Support/Binder/ConfigurationName.php index f075f0d9f2..9b4f6751a5 100644 --- a/app/Support/Binder/ConfigurationName.php +++ b/app/Support/Binder/ConfigurationName.php @@ -48,4 +48,4 @@ class ConfigurationName implements BinderInterface } throw new NotFoundHttpException; } -} \ No newline at end of file +} diff --git a/app/Support/Binder/Date.php b/app/Support/Binder/Date.php index 5105c208ce..55aed73c56 100644 --- a/app/Support/Binder/Date.php +++ b/app/Support/Binder/Date.php @@ -47,15 +47,26 @@ class Date implements BinderInterface $fiscalHelper = app(FiscalHelperInterface::class); $magicWords = [ - 'currentMonthStart' => Carbon::now()->startOfMonth(), - 'currentMonthEnd' => Carbon::now()->endOfMonth(), - 'currentYearStart' => Carbon::now()->startOfYear(), - 'currentYearEnd' => Carbon::now()->endOfYear(), - 'currentFiscalYearStart' => $fiscalHelper->startOfFiscalYear(Carbon::now()), - 'currentFiscalYearEnd' => $fiscalHelper->endOfFiscalYear(Carbon::now()), + 'currentMonthStart' => Carbon::now()->startOfMonth(), + 'currentMonthEnd' => Carbon::now()->endOfMonth(), + 'currentYearStart' => Carbon::now()->startOfYear(), + 'currentYearEnd' => Carbon::now()->endOfYear(), + + 'previousMonthStart' => Carbon::now()->startOfMonth()->subDay()->startOfMonth(), + 'previousMonthEnd' => Carbon::now()->startOfMonth()->subDay()->endOfMonth(), + 'previousYearStart' => Carbon::now()->startOfYear()->subDay()->startOfYear(), + 'previousYearEnd' => Carbon::now()->startOfYear()->subDay()->endOfYear(), + + 'currentFiscalYearStart' => $fiscalHelper->startOfFiscalYear(Carbon::now()), + 'currentFiscalYearEnd' => $fiscalHelper->endOfFiscalYear(Carbon::now()), + 'previousFiscalYearStart' => $fiscalHelper->startOfFiscalYear(Carbon::now())->subYear(), + 'previousFiscalYearEnd' => $fiscalHelper->endOfFiscalYear(Carbon::now())->subYear(), ]; if (isset($magicWords[$value])) { - return $magicWords[$value]; + $return = $magicWords[$value]; + Log::debug(sprintf('User requests "%s", so will return "%s"', $value, $return)); + + return $return; } try { diff --git a/app/Support/Cronjobs/AbstractCronjob.php b/app/Support/Cronjobs/AbstractCronjob.php index 3eebb176be..bfd6904908 100644 --- a/app/Support/Cronjobs/AbstractCronjob.php +++ b/app/Support/Cronjobs/AbstractCronjob.php @@ -36,4 +36,4 @@ abstract class AbstractCronjob */ abstract public function fire(): bool; -} \ No newline at end of file +} diff --git a/app/Support/Cronjobs/RecurringCronjob.php b/app/Support/Cronjobs/RecurringCronjob.php index c75e11ad29..9dea5b326b 100644 --- a/app/Support/Cronjobs/RecurringCronjob.php +++ b/app/Support/Cronjobs/RecurringCronjob.php @@ -81,4 +81,4 @@ class RecurringCronjob extends AbstractCronjob $job->handle(); app('fireflyconfig')->set('last_rt_job', time()); } -} \ No newline at end of file +} diff --git a/app/Support/Facades/Steam.php b/app/Support/Facades/Steam.php index d30951d449..e598027bf5 100644 --- a/app/Support/Facades/Steam.php +++ b/app/Support/Facades/Steam.php @@ -39,7 +39,6 @@ use Illuminate\Support\Facades\Facade; * @method string negative(string $amount) * @method string|null opposite(string $amount = null) * @method int phpBytes(string $string) - * @method tryDecrypt($value) * @method string positive(string $amount) * * @codeCoverageIgnore diff --git a/app/Support/FinTS/FinTS.php b/app/Support/FinTS/FinTS.php index 1b1d1afadb..f297f379cd 100644 --- a/app/Support/FinTS/FinTS.php +++ b/app/Support/FinTS/FinTS.php @@ -118,4 +118,4 @@ class FinTS throw new FireflyException($exception->getMessage()); } } -} \ No newline at end of file +} diff --git a/app/Support/FinTS/MetadataParser.php b/app/Support/FinTS/MetadataParser.php index 73f17405a2..7b22363f45 100644 --- a/app/Support/FinTS/MetadataParser.php +++ b/app/Support/FinTS/MetadataParser.php @@ -46,4 +46,4 @@ class MetadataParser return $finTSDescription; } -} \ No newline at end of file +} diff --git a/app/Support/Http/Api/AccountFilter.php b/app/Support/Http/Api/AccountFilter.php index 4b257514a4..3e7594c9ec 100644 --- a/app/Support/Http/Api/AccountFilter.php +++ b/app/Support/Http/Api/AccountFilter.php @@ -87,4 +87,4 @@ trait AccountFilter return $return; // @codeCoverageIgnore } -} \ No newline at end of file +} diff --git a/app/Support/Http/Api/TransactionFilter.php b/app/Support/Http/Api/TransactionFilter.php index e2f0f82ea5..2759945819 100644 --- a/app/Support/Http/Api/TransactionFilter.php +++ b/app/Support/Http/Api/TransactionFilter.php @@ -66,4 +66,4 @@ trait TransactionFilter return $return; } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/AugumentData.php b/app/Support/Http/Controllers/AugumentData.php index bd014b77c1..4fd45db2fb 100644 --- a/app/Support/Http/Controllers/AugumentData.php +++ b/app/Support/Http/Controllers/AugumentData.php @@ -24,16 +24,22 @@ declare(strict_types=1); namespace FireflyIII\Support\Http\Controllers; use Carbon\Carbon; +use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; +use Log; +use Throwable; /** * Trait AugumentData @@ -41,6 +47,8 @@ use Illuminate\Support\Collection; */ trait AugumentData { + + /** * Searches for the opposing account. * @@ -68,6 +76,148 @@ trait AugumentData return $combined; } + /** + * Group by category (earnings). + * + * @param Collection $assets + * @param Collection $opposing + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function earnedByCategory(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT])->setAccounts($assets); + $collector->setOpposingAccounts($opposing)->withCategoryInformation(); + $set = $collector->getTransactions(); + $sum = []; + // loop to support multi currency + foreach ($set as $transaction) { + $currencyId = $transaction->transaction_currency_id; + $categoryName = $transaction->transaction_category_name; + $categoryId = (int)$transaction->transaction_category_id; + // if null, grab from journal: + if (0 === $categoryId) { + $categoryName = $transaction->transaction_journal_category_name; + $categoryId = (int)$transaction->transaction_journal_category_id; + } + + // if not set, set to zero: + if (!isset($sum[$categoryId][$currencyId])) { + $sum[$categoryId] = [ + 'grand_total' => '0', + 'name' => $categoryName, + 'per_currency' => [ + $currencyId => [ + 'sum' => '0', + 'category' => [ + 'id' => $categoryId, + 'name' => $categoryName, + ], + 'currency' => [ + 'symbol' => $transaction->transaction_currency_symbol, + 'dp' => $transaction->transaction_currency_dp, + ], + ], + ], + ]; + } + + // add amount + $sum[$categoryId]['per_currency'][$currencyId]['sum'] = bcadd( + $sum[$categoryId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount + ); + $sum[$categoryId]['grand_total'] = bcadd($sum[$categoryId]['grand_total'], $transaction->transaction_amount); + } + + return $sum; + } + + /** + * Earned in period for accounts. + * + * @param Collection $assets + * @param Collection $opposing + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + protected function earnedInPeriod(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setRange($start, $end)->setTypes([TransactionType::DEPOSIT])->setAccounts($assets); + $collector->setOpposingAccounts($opposing); + $set = $collector->getTransactions(); + $sum = [ + 'grand_sum' => '0', + 'per_currency' => [], + ]; + // loop to support multi currency + foreach ($set as $transaction) { + $currencyId = $transaction->transaction_currency_id; + + // if not set, set to zero: + if (!isset($sum['per_currency'][$currencyId])) { + $sum['per_currency'][$currencyId] = [ + 'sum' => '0', + 'currency' => [ + 'symbol' => $transaction->transaction_currency_symbol, + 'dp' => $transaction->transaction_currency_dp, + ], + ]; + } + + // add amount + $sum['per_currency'][$currencyId]['sum'] = bcadd($sum['per_currency'][$currencyId]['sum'], $transaction->transaction_amount); + $sum['grand_sum'] = bcadd($sum['grand_sum'], $transaction->transaction_amount); + } + + return $sum; + } + + /** + * Small helper function for the revenue and expense account charts. + * + * @param array $names + * + * @return array + */ + protected function expandNames(array $names): array + { + $result = []; + foreach ($names as $entry) { + $result[$entry['name']] = 0; + } + + return $result; + } + + /** + * Small helper function for the revenue and expense account charts. + * + * @param Collection $accounts + * + * @return array + */ + protected function extractNames(Collection $accounts): array + { + $return = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $return[$account->id] = $account->name; + } + + return $return; + } + /** * Returns the budget limits belonging to the given budget and valid on the given day. * @@ -144,6 +294,39 @@ trait AugumentData return $return; } + /** + * Get the amount of money budgeted in a period. + * + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + protected function getBudgetedInPeriod(Budget $budget, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + + $key = app('navigation')->preferredCarbonFormat($start, $end); + $range = app('navigation')->preferredRangeFormat($start, $end); + $current = clone $start; + $budgeted = []; + while ($current < $end) { + /** @var Carbon $currentStart */ + $currentStart = app('navigation')->startOfPeriod($current, $range); + /** @var Carbon $currentEnd */ + $currentEnd = app('navigation')->endOfPeriod($current, $range); + $budgetLimits = $repository->getBudgetLimits($budget, $currentStart, $currentEnd); + $index = $currentStart->format($key); + $budgeted[$index] = $budgetLimits->sum('amount'); + $currentEnd->addDay(); + $current = clone $currentEnd; + } + + return $budgeted; + } + /** * Get the category names from a set of category ID's. Small helper function for some of the charts. * @@ -168,6 +351,84 @@ trait AugumentData return $return; } + /** + * Get the expenses for a budget in a date range. + * + * @param Collection $limits + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getExpensesForBudget(Collection $limits, Budget $budget, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + + $return = []; + if (0 === $limits->count()) { + $spent = $repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); + if (0 !== bccomp($spent, '0')) { + $return[$budget->name]['spent'] = bcmul($spent, '-1'); + $return[$budget->name]['left'] = 0; + $return[$budget->name]['overspent'] = 0; + } + + return $return; + } + + $rows = $this->spentInPeriodMulti($budget, $limits); + foreach ($rows as $name => $row) { + if (0 !== bccomp($row['spent'], '0') || 0 !== bccomp($row['left'], '0')) { + $return[$name] = $row; + } + } + unset($rows); + + return $return; + } + + /** + * Gets all budget limits for a budget. + * + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return Collection + */ + protected function getLimits(Budget $budget, Carbon $start, Carbon $end): Collection // get data + augment with info + { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + // properties for cache + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($budget->id); + $cache->addProperty('get-limits'); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $set = $repository->getBudgetLimits($budget, $start, $end); + $limits = new Collection(); + + /** @var BudgetLimit $entry */ + foreach ($set as $entry) { + $entry->spent = $repository->spentInPeriod(new Collection([$budget]), new Collection(), $entry->start_date, $entry->end_date); + $limits->push($entry); + } + $cache->store($limits); + + return $set; + } + + /** * Helper function that groups expenses. * @@ -260,4 +521,271 @@ trait AugumentData return $grouped; } -} \ No newline at end of file + + + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Spent by budget. + * + * @param Collection $assets + * @param Collection $opposing + * @param Carbon $start + * @param Carbon $end + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function spentByBudget(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); + $collector->setOpposingAccounts($opposing)->withBudgetInformation(); + $set = $collector->getTransactions(); + $sum = []; + // loop to support multi currency + foreach ($set as $transaction) { + $currencyId = $transaction->transaction_currency_id; + $budgetName = $transaction->transaction_budget_name; + $budgetId = (int)$transaction->transaction_budget_id; + // if null, grab from journal: + if (0 === $budgetId) { + $budgetName = $transaction->transaction_journal_budget_name; + $budgetId = (int)$transaction->transaction_journal_budget_id; + } + + // if not set, set to zero: + if (!isset($sum[$budgetId][$currencyId])) { + $sum[$budgetId] = [ + 'grand_total' => '0', + 'name' => $budgetName, + 'per_currency' => [ + $currencyId => [ + 'sum' => '0', + 'budget' => [ + 'id' => $budgetId, + 'name' => $budgetName, + ], + 'currency' => [ + 'symbol' => $transaction->transaction_currency_symbol, + 'dp' => $transaction->transaction_currency_dp, + ], + ], + ], + ]; + } + + // add amount + $sum[$budgetId]['per_currency'][$currencyId]['sum'] = bcadd( + $sum[$budgetId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount + ); + $sum[$budgetId]['grand_total'] = bcadd($sum[$budgetId]['grand_total'], $transaction->transaction_amount); + } + + return $sum; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Spent by category. + * + * @param Collection $assets + * @param Collection $opposing + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function spentByCategory(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); + $collector->setOpposingAccounts($opposing)->withCategoryInformation(); + $set = $collector->getTransactions(); + $sum = []; + // loop to support multi currency + foreach ($set as $transaction) { + $currencyId = $transaction->transaction_currency_id; + $categoryName = $transaction->transaction_category_name; + $categoryId = (int)$transaction->transaction_category_id; + // if null, grab from journal: + if (0 === $categoryId) { + $categoryName = $transaction->transaction_journal_category_name; + $categoryId = (int)$transaction->transaction_journal_category_id; + } + + // if not set, set to zero: + if (!isset($sum[$categoryId][$currencyId])) { + $sum[$categoryId] = [ + 'grand_total' => '0', + 'name' => $categoryName, + 'per_currency' => [ + $currencyId => [ + 'sum' => '0', + 'category' => [ + 'id' => $categoryId, + 'name' => $categoryName, + ], + 'currency' => [ + 'symbol' => $transaction->transaction_currency_symbol, + 'dp' => $transaction->transaction_currency_dp, + ], + ], + ], + ]; + } + + // add amount + $sum[$categoryId]['per_currency'][$currencyId]['sum'] = bcadd( + $sum[$categoryId]['per_currency'][$currencyId]['sum'], $transaction->transaction_amount + ); + $sum[$categoryId]['grand_total'] = bcadd($sum[$categoryId]['grand_total'], $transaction->transaction_amount); + } + + return $sum; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Spent in a period. + * + * @param Collection $assets + * @param Collection $opposing + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + protected function spentInPeriod(Collection $assets, Collection $opposing, Carbon $start, Carbon $end): array // get data + augment with info + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL])->setAccounts($assets); + $collector->setOpposingAccounts($opposing); + $set = $collector->getTransactions(); + $sum = [ + 'grand_sum' => '0', + 'per_currency' => [], + ]; + // loop to support multi currency + foreach ($set as $transaction) { + $currencyId = (int)$transaction->transaction_currency_id; + + // if not set, set to zero: + if (!isset($sum['per_currency'][$currencyId])) { + $sum['per_currency'][$currencyId] = [ + 'sum' => '0', + 'currency' => [ + 'symbol' => $transaction->transaction_currency_symbol, + 'dp' => $transaction->transaction_currency_dp, + ], + ]; + } + + // add amount + $sum['per_currency'][$currencyId]['sum'] = bcadd($sum['per_currency'][$currencyId]['sum'], $transaction->transaction_amount); + $sum['grand_sum'] = bcadd($sum['grand_sum'], $transaction->transaction_amount); + } + + return $sum; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * + * Returns an array with the following values: + * 0 => + * 'name' => name of budget + repetition + * 'left' => left in budget repetition (always zero) + * 'overspent' => spent more than budget repetition? (always zero) + * 'spent' => actually spent in period for budget + * 1 => (etc) + * + * @param Budget $budget + * @param Collection $limits + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * + */ + protected function spentInPeriodMulti(Budget $budget, Collection $limits): array // get data + augment with info + { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + + $return = []; + $format = (string)trans('config.month_and_day'); + $name = $budget->name; + /** @var BudgetLimit $budgetLimit */ + foreach ($limits as $budgetLimit) { + $expenses = $repository->spentInPeriod(new Collection([$budget]), new Collection, $budgetLimit->start_date, $budgetLimit->end_date); + $expenses = app('steam')->positive($expenses); + + if ($limits->count() > 1) { + $name = $budget->name . ' ' . trans( + 'firefly.between_dates', + [ + 'start' => $budgetLimit->start_date->formatLocalized($format), + 'end' => $budgetLimit->end_date->formatLocalized($format), + ] + ); + } + $amount = $budgetLimit->amount; + $leftInLimit = bcsub($amount, $expenses); + $hasOverspent = bccomp($leftInLimit, '0') === -1; + $left = $hasOverspent ? '0' : bcsub($amount, $expenses); + $spent = $hasOverspent ? $amount : $expenses; + $overspent = $hasOverspent ? app('steam')->positive($leftInLimit) : '0'; + + $return[$name] = [ + 'left' => $left, + 'overspent' => $overspent, + 'spent' => $spent, + ]; + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Returns an array with the following values: + * 'name' => "no budget" in local language + * 'repetition_left' => left in budget repetition (always zero) + * 'repetition_overspent' => spent more than budget repetition? (always zero) + * 'spent' => actually spent in period for budget. + * + * @param Carbon $start + * @param Carbon $end + * + * @return string + */ + protected function spentInPeriodWithout(Carbon $start, Carbon $end): string // get data + augment with info + { + // collector + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $types = [TransactionType::WITHDRAWAL]; + $collector->setAllAssetAccounts()->setTypes($types)->setRange($start, $end)->withoutBudget(); + $transactions = $collector->getTransactions(); + $sum = '0'; + /** @var Transaction $entry */ + foreach ($transactions as $entry) { + $sum = bcadd($entry->transaction_amount, $sum); + } + + return $sum; + } +} diff --git a/app/Support/Http/Controllers/AutoCompleteCollector.php b/app/Support/Http/Controllers/AutoCompleteCollector.php new file mode 100644 index 0000000000..719640f082 --- /dev/null +++ b/app/Support/Http/Controllers/AutoCompleteCollector.php @@ -0,0 +1,155 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Support\Http\Controllers; + +use FireflyIII\Models\Account; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use FireflyIII\Repositories\Tag\TagRepositoryInterface; +use Illuminate\Support\Collection; + +/** + * Trait AutoCompleteCollector + */ +trait AutoCompleteCollector +{ + + /** + * @param array $unfiltered + * @param string $query + * + * @return array|null + */ + protected function filterResult(?array $unfiltered, string $query): ?array + { + if (null === $unfiltered) { + return null; // @codeCoverageIgnore + } + if ('' === $query) { + sort($unfiltered); + + return $unfiltered; + } + $return = []; + if ('' !== $query) { + $return = array_values( + array_filter( + $unfiltered, function (string $value) use ($query) { + return !(false === stripos($value, $query)); + }, ARRAY_FILTER_USE_BOTH + ) + ); + } + sort($return); + + + return $return; + } + + /** + * @param array $types + * + * @return array + */ + protected function getAccounts(array $types): array + { + $repository = app(AccountRepositoryInterface::class); + // find everything: + /** @var Collection $collection */ + $collection = $repository->getAccountsByType($types); + $filtered = $collection->filter( + function (Account $account) { + return true === $account->active; + } + ); + + return array_values(array_unique($filtered->pluck('name')->toArray())); + } + + /** + * @return array + */ + protected function getBills(): array + { + $repository = app(BillRepositoryInterface::class); + + return array_unique($repository->getActiveBills()->pluck('name')->toArray()); + } + + /** + * @return array + */ + protected function getBudgets(): array + { + $repository = app(BudgetRepositoryInterface::class); + + return array_unique($repository->getBudgets()->pluck('name')->toArray()); + } + + /** + * @return array + */ + protected function getCategories(): array + { + $repository = app(CategoryRepositoryInterface::class); + + return array_unique($repository->getCategories()->pluck('name')->toArray()); + } + + /** + * @return array + */ + protected function getCurrencyNames(): array + { + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + + return $repository->get()->pluck('name')->toArray(); + } + + /** + * @return array + */ + protected function getTags(): array + { + /** @var TagRepositoryInterface $repository */ + $repository = app(TagRepositoryInterface::class); + + return array_unique($repository->get()->pluck('tag')->toArray()); + } + + /** + * @return array + */ + protected function getTransactionTypes(): array + { + $repository = app(JournalRepositoryInterface::class); + + return array_unique($repository->getTransactionTypes()->pluck('type')->toArray()); + } +} diff --git a/app/Support/Http/Controllers/BasicDataSupport.php b/app/Support/Http/Controllers/BasicDataSupport.php index 0a1809542b..6d578e0780 100644 --- a/app/Support/Http/Controllers/BasicDataSupport.php +++ b/app/Support/Http/Controllers/BasicDataSupport.php @@ -90,4 +90,6 @@ trait BasicDataSupport return $result; } -} \ No newline at end of file + + +} diff --git a/app/Support/Http/Controllers/ChartGeneration.php b/app/Support/Http/Controllers/ChartGeneration.php new file mode 100644 index 0000000000..ddf24454f9 --- /dev/null +++ b/app/Support/Http/Controllers/ChartGeneration.php @@ -0,0 +1,262 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Support\Http\Controllers; + +use Carbon\Carbon; +use FireflyIII\Generator\Chart\Basic\GeneratorInterface; +use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; +use FireflyIII\Models\Category; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Account\AccountTaskerInterface; +use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use FireflyIII\Support\CacheProperties; +use Illuminate\Support\Collection; +use Log; + +/** + * Trait ChartGeneration + */ +trait ChartGeneration +{ + /** + * Shows an overview of the account balances for a set of accounts. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function accountBalanceChart(Collection $accounts, Carbon $start, Carbon $end): array // chart helper method. + { + + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('chart.account.account-balance-chart'); + $cache->addProperty($accounts); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + Log::debug('Regenerate chart.account.account-balance-chart from scratch.'); + /** @var GeneratorInterface $generator */ + $generator = app(GeneratorInterface::class); + + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + /** @var AccountRepositoryInterface $accountRepos */ + $accountRepos = app(AccountRepositoryInterface::class); + + $default = app('amount')->getDefaultCurrency(); + $chartData = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $currency = $repository->findNull((int)$accountRepos->getMetaValue($account, 'currency_id')); + if (null === $currency) { + $currency = $default; + } + $currentSet = [ + 'label' => $account->name, + 'currency_symbol' => $currency->symbol, + 'entries' => [], + ]; + + $currentStart = clone $start; + $range = app('steam')->balanceInRange($account, $start, clone $end); + $previous = array_values($range)[0]; + while ($currentStart <= $end) { + $format = $currentStart->format('Y-m-d'); + $label = $currentStart->formatLocalized((string)trans('config.month_and_day')); + $balance = isset($range[$format]) ? round($range[$format], 12) : $previous; + $previous = $balance; + $currentStart->addDay(); + $currentSet['entries'][$label] = $balance; + } + $chartData[] = $currentSet; + } + $data = $generator->multiSet($chartData); + $cache->store($data); + + return $data; + } + + /** + * Collects the incomes and expenses for the given periods, grouped per month. Will cache its results. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function getChartData(Collection $accounts, Carbon $start, Carbon $end): array // chart helper function + { + $cache = new CacheProperties; + $cache->addProperty('chart.report.get-chart-data'); + $cache->addProperty($start); + $cache->addProperty($accounts); + $cache->addProperty($end); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $currentStart = clone $start; + $spentArray = []; + $earnedArray = []; + + /** @var AccountTaskerInterface $tasker */ + $tasker = app(AccountTaskerInterface::class); + + while ($currentStart <= $end) { + $currentEnd = app('navigation')->endOfPeriod($currentStart, '1M'); + $earned = (string)array_sum( + array_map( + function ($item) { + return $item['sum']; + }, + $tasker->getIncomeReport($currentStart, $currentEnd, $accounts) + ) + ); + + $spent = (string)array_sum( + array_map( + function ($item) { + return $item['sum']; + }, + $tasker->getExpenseReport($currentStart, $currentEnd, $accounts) + ) + ); + + $label = $currentStart->format('Y-m') . '-01'; + $spentArray[$label] = bcmul($spent, '-1'); + $earnedArray[$label] = $earned; + $currentStart = app('navigation')->addPeriod($currentStart, '1M', 0); + } + $result = [ + 'spent' => $spentArray, + 'earned' => $earnedArray, + ]; + $cache->store($result); + + return $result; + } + + /** + * Chart for a specific period (start and end). + * + * + * @param Category $category + * @param Carbon $start + * @param Carbon $end + * + * @return array + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function makePeriodChart(Category $category, Carbon $start, Carbon $end): array // chart helper method. + { + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($category->id); + $cache->addProperty('chart.category.period-chart'); + + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $repository = app(CategoryRepositoryInterface::class); + /** @var GeneratorInterface $generator */ + $generator = app(GeneratorInterface::class); + + // chart data + $chartData = [ + [ + 'label' => (string)trans('firefly.spent'), + 'entries' => [], + 'type' => 'bar', + 'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red + ], + [ + 'label' => (string)trans('firefly.earned'), + 'entries' => [], + 'type' => 'bar', + 'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green + ], + [ + 'label' => (string)trans('firefly.sum'), + 'entries' => [], + 'type' => 'line', + 'fill' => false, + ], + ]; + + $step = $this->calculateStep($start, $end); + + + while ($start <= $end) { + $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $start, $start); + $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $start, $start); + $sum = bcadd($spent, $earned); + $label = trim(app('navigation')->periodShow($start, $step)); + $chartData[0]['entries'][$label] = round(bcmul($spent, '-1'), 12); + $chartData[1]['entries'][$label] = round($earned, 12); + $chartData[2]['entries'][$label] = round($sum, 12); + + switch ($step) { + default: + case '1D': + $start->addDay(); + break; + case '1W': + $start->addDays(7); + break; + case '1M': + $start->addMonth(); + break; + case '1Y': + $start->addYear(); + break; + } + } + + $data = $generator->multiSet($chartData); + $cache->store($data); + + return $data; + } + +} \ No newline at end of file diff --git a/app/Support/Http/Controllers/CreateStuff.php b/app/Support/Http/Controllers/CreateStuff.php index 6fc4a3e798..94d3a5b997 100644 --- a/app/Support/Http/Controllers/CreateStuff.php +++ b/app/Support/Http/Controllers/CreateStuff.php @@ -216,4 +216,4 @@ trait CreateStuff throw new FireflyException($e->getMessage()); } } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/CronRunner.php b/app/Support/Http/Controllers/CronRunner.php new file mode 100644 index 0000000000..3bbb3d34c0 --- /dev/null +++ b/app/Support/Http/Controllers/CronRunner.php @@ -0,0 +1,53 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Support\Http\Controllers; + +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Support\Cronjobs\RecurringCronjob; + +/** + * Trait CronRunner + */ +trait CronRunner +{ + /** + * @return string + */ + protected function runRecurring(): string + { + /** @var RecurringCronjob $recurring */ + $recurring = app(RecurringCronjob::class); + try { + $result = $recurring->fire(); + } catch (FireflyException $e) { + return $e->getMessage(); + } + if (false === $result) { + return 'The recurring transaction cron job did not fire.'; + } + + return 'The recurring transaction cron job fired successfully.'; + } + +} diff --git a/app/Support/Http/Controllers/GetConfigurationData.php b/app/Support/Http/Controllers/GetConfigurationData.php index 61aaccdfef..c67dd7a000 100644 --- a/app/Support/Http/Controllers/GetConfigurationData.php +++ b/app/Support/Http/Controllers/GetConfigurationData.php @@ -250,4 +250,4 @@ trait GetConfigurationData request()->session()->flash('warning', trans('firefly.recurring_cron_long_ago')); } } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/ModelInformation.php b/app/Support/Http/Controllers/ModelInformation.php index 688a1b12ca..658c2b8da7 100644 --- a/app/Support/Http/Controllers/ModelInformation.php +++ b/app/Support/Http/Controllers/ModelInformation.php @@ -23,9 +23,15 @@ declare(strict_types=1); namespace FireflyIII\Support\Http\Controllers; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Models\Account; +use FireflyIII\Models\Bill; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use Log; +use Throwable; /** * Trait ModelInformation @@ -33,6 +39,205 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface; */ trait ModelInformation { + /** + * Get actions based on a bill. + * + * @param Bill $bill + * + * @return array + */ + protected function getActionsForBill(Bill $bill): array // get info and augument + { + try { + $result = view( + 'rules.partials.action', + [ + 'oldAction' => 'link_to_bill', + 'oldValue' => $bill->name, + 'oldChecked' => false, + 'count' => 1, + ] + )->render(); + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + Log::error(sprintf('Throwable was thrown in getActionsForBill(): %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + $result = 'Could not render view. See log files.'; + } + + // @codeCoverageIgnoreEnd + + return [$result]; + } + + /** + * Get the destination account. Is complex. + * + * @param TransactionJournal $journal + * @param TransactionType $destinationType + * @param array $data + * + * @return Account + * + * @throws FireflyException + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getDestinationAccount(TransactionJournal $journal, TransactionType $destinationType, array $data + ): Account // helper for conversion. Get info from obj. + { + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + /** @var JournalRepositoryInterface $journalRepos */ + $journalRepos = app(JournalRepositoryInterface::class); + $sourceAccount = $journalRepos->getJournalSourceAccounts($journal)->first(); + $destinationAccount = $journalRepos->getJournalDestinationAccounts($journal)->first(); + $sourceType = $journal->transactionType; + $joined = $sourceType->type . '-' . $destinationType->type; + switch ($joined) { + default: + throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore + case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: + // one + $destination = $sourceAccount; + break; + case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: + // two + $destination = $accountRepository->findNull((int)$data['destination_account_asset']); + break; + case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: + case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: + // three and five + if ('' === $data['destination_account_expense'] || null === $data['destination_account_expense']) { + // destination is a cash account. + return $accountRepository->getCashAccount(); + } + $data = [ + 'name' => $data['destination_account_expense'], + 'accountType' => 'expense', + 'account_type_id' => null, + 'virtualBalance' => 0, + 'active' => true, + 'iban' => null, + ]; + $destination = $accountRepository->store($data); + break; + case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: + case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: + // four and six + $destination = $destinationAccount; + break; + } + + return $destination; + } + + /** + * Get the source account. + * + * @param TransactionJournal $journal + * @param TransactionType $destinationType + * @param array $data + * + * @return Account + * + * @throws FireflyException + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getSourceAccount(TransactionJournal $journal, TransactionType $destinationType, array $data + ): Account // helper for conversion. Get info from obj. + { + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + /** @var JournalRepositoryInterface $journalRepos */ + $journalRepos = app(JournalRepositoryInterface::class); + $sourceAccount = $journalRepos->getJournalSourceAccounts($journal)->first(); + $destinationAccount = $journalRepos->getJournalDestinationAccounts($journal)->first(); + $sourceType = $journal->transactionType; + $joined = $sourceType->type . '-' . $destinationType->type; + switch ($joined) { + default: + throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore + case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: + case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: + + if ('' === $data['source_account_revenue'] || null === $data['source_account_revenue']) { + // destination is a cash account. + return $accountRepository->getCashAccount(); + } + + $data = [ + 'name' => $data['source_account_revenue'], + 'accountType' => 'revenue', + 'virtualBalance' => 0, + 'active' => true, + 'account_type_id' => null, + 'iban' => null, + ]; + $source = $accountRepository->store($data); + break; + case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: + case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: + $source = $sourceAccount; + break; + case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: + $source = $destinationAccount; + break; + case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: + $source = $accountRepository->findNull((int)$data['source_account_asset']); + break; + } + + return $source; + } + + /** + * Create fake triggers to match the bill's properties + * + * @param Bill $bill + * + * @return array + */ + protected function getTriggersForBill(Bill $bill): array // get info and augument + { + $result = []; + $triggers = ['currency_is', 'amount_more', 'amount_less', 'description_contains']; + $values = [ + $bill->transactionCurrency()->first()->name, + round((float)$bill->amount_min, 12), + round((float)$bill->amount_max, 12), + $bill->name, + ]; + foreach ($triggers as $index => $trigger) { + try { + $string = view( + 'rules.partials.trigger', + [ + 'oldTrigger' => $trigger, + 'oldValue' => $values[$index], + 'oldChecked' => false, + 'count' => $index + 1, + ] + )->render(); + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + + Log::debug(sprintf('Throwable was thrown in getTriggersForBill(): %s', $e->getMessage())); + Log::debug($e->getTraceAsString()); + $string = ''; + // @codeCoverageIgnoreEnd + } + if ('' !== $string) { + $result[] = $string; + } + } + + return $result; + } + /** * Is transaction opening balance? * @@ -62,4 +267,4 @@ trait ModelInformation return $count > 2; } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php index 5d92acdbf9..16251024e9 100644 --- a/app/Support/Http/Controllers/PeriodOverview.php +++ b/app/Support/Http/Controllers/PeriodOverview.php @@ -38,10 +38,13 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; +use Log; /** * Trait PeriodOverview. * + * TODO verify this all works as expected. + * * - Group expenses, income, etc. under this period. * - Returns collection of arrays. Possible fields are: * - start (string), @@ -55,6 +58,7 @@ use Illuminate\Support\Collection; */ trait PeriodOverview { + /** * This method returns "period entries", so nov-2015, dec-2015, etc etc (this depends on the users session range) * and for each period, the amount of money spent and earned. This is a complex operation which is cached for @@ -255,6 +259,95 @@ trait PeriodOverview return $entries; } + /** + * TODO has to be synced with the others. + * + * Show period overview for no category view. + * + * @param Carbon $theDate + * + * @return Collection + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function getNoCategoryPeriodOverview(Carbon $theDate): Collection // period overview method. + { + Log::debug(sprintf('Now in getNoCategoryPeriodOverview(%s)', $theDate->format('Y-m-d'))); + $range = app('preferences')->get('viewRange', '1M')->data; + $first = $this->journalRepos->firstNull(); + $start = null === $first ? new Carbon : $first->date; + $end = $theDate ?? new Carbon; + + Log::debug(sprintf('Start for getNoCategoryPeriodOverview() is %s', $start->format('Y-m-d'))); + Log::debug(sprintf('End for getNoCategoryPeriodOverview() is %s', $end->format('Y-m-d'))); + + // properties for cache + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('no-category-period-entries'); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $dates = app('navigation')->blockPeriods($start, $end, $range); + $entries = new Collection; + + foreach ($dates as $date) { + + // count journals without category in this period: + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() + ->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); + $collector->removeFilter(InternalTransferFilter::class); + $count = $collector->getTransactions()->count(); + + // amount transferred + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() + ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); + $collector->removeFilter(InternalTransferFilter::class); + $transferred = app('steam')->positive((string)$collector->getTransactions()->sum('transaction_amount')); + + // amount spent + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::WITHDRAWAL] + ); + $spent = $collector->getTransactions()->sum('transaction_amount'); + + // amount earned + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::DEPOSIT] + ); + $earned = $collector->getTransactions()->sum('transaction_amount'); + /** @noinspection PhpUndefinedMethodInspection */ + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); + $entries->push( + [ + 'string' => $dateStr, + 'name' => $dateName, + 'count' => $count, + 'spent' => $spent, + 'earned' => $earned, + 'transferred' => $transferred, + 'start' => clone $date['start'], + 'end' => clone $date['end'], + ] + ); + } + Log::debug('End of loops'); + $cache->store($entries); + + return $entries; + } + /** * This shows a period overview for a tag. It goes back in time and lists all relevant transactions and sums. * @@ -456,4 +549,4 @@ trait PeriodOverview return $return; } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/RenderPartialViews.php b/app/Support/Http/Controllers/RenderPartialViews.php index 06958f437d..384116ece4 100644 --- a/app/Support/Http/Controllers/RenderPartialViews.php +++ b/app/Support/Http/Controllers/RenderPartialViews.php @@ -23,11 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Support\Http\Controllers; - use FireflyIII\Helpers\Collection\BalanceLine; use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; +use FireflyIII\Models\Rule; +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\RuleTrigger; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; @@ -43,6 +45,7 @@ use Throwable; */ trait RenderPartialViews { + /** * Get options for account report. * @@ -103,7 +106,7 @@ trait RenderPartialViews break; case BalanceLine::ROLE_DEFAULTROLE === $role && null === $budget && null !== $account: // normal row without a budget: - $budget = new Budget; + $budget = new Budget; $journals = $popupHelper->balanceForNoBudget($account, $attributes); $budget->name = (string)trans('firefly.no_budget'); break; @@ -254,6 +257,85 @@ trait RenderPartialViews return $view; } + /** + * Get current (from system) rule actions. + * + * @param Rule $rule + * + * @return array + */ + protected function getCurrentActions(Rule $rule): array // get info from object and present. + { + $index = 0; + $actions = []; + // todo must be repos + $currentActions = $rule->ruleActions()->orderBy('order', 'ASC')->get(); + /** @var RuleAction $entry */ + foreach ($currentActions as $entry) { + $count = ($index + 1); + try { + $actions[] = view( + 'rules.partials.action', + [ + 'oldAction' => $entry->action_type, + 'oldValue' => $entry->action_value, + 'oldChecked' => $entry->stop_processing, + 'count' => $count, + ] + )->render(); + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + Log::debug(sprintf('Throwable was thrown in getCurrentActions(): %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + } + // @codeCoverageIgnoreEnd + ++$index; + } + + return $actions; + } + + /** + * Get current (from DB) rule triggers. + * + * @param Rule $rule + * + * @return array + * + */ + protected function getCurrentTriggers(Rule $rule): array // get info from object and present. + { + $index = 0; + $triggers = []; + // todo must be repos + $currentTriggers = $rule->ruleTriggers()->orderBy('order', 'ASC')->get(); + /** @var RuleTrigger $entry */ + foreach ($currentTriggers as $entry) { + if ('user_action' !== $entry->trigger_type) { + $count = ($index + 1); + try { + $triggers[] = view( + 'rules.partials.trigger', + [ + 'oldTrigger' => $entry->trigger_type, + 'oldValue' => $entry->trigger_value, + 'oldChecked' => $entry->stop_processing, + 'count' => $count, + ] + )->render(); + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + Log::debug(sprintf('Throwable was thrown in getCurrentTriggers(): %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + } + // @codeCoverageIgnoreEnd + ++$index; + } + } + + return $triggers; + } + /** * Returns all the incomes that went to the given asset account. * @@ -326,4 +408,4 @@ trait RenderPartialViews return $result; } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/RequestInformation.php b/app/Support/Http/Controllers/RequestInformation.php index f92b3e2432..b3c0d29cb1 100644 --- a/app/Support/Http/Controllers/RequestInformation.php +++ b/app/Support/Http/Controllers/RequestInformation.php @@ -54,6 +54,43 @@ use Symfony\Component\HttpFoundation\ParameterBag; */ trait RequestInformation { + /** + * Get info from old input. + * + * @param $array + * @param $old + * + * @return array + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function updateWithPrevious($array, $old): array // update object with new info + { + if (0 === \count($old) || !isset($old['transactions'])) { + return $array; + } + $old = $old['transactions']; + + foreach ($old as $index => $row) { + if (isset($array[$index])) { + /** @noinspection SlowArrayOperationsInLoopInspection */ + $array[$index] = array_merge($array[$index], $row); + continue; + } + // take some info from first transaction, that should at least exist. + $array[$index] = $row; + $array[$index]['currency_id'] = $array[0]['currency_id']; + $array[$index]['currency_code'] = $array[0]['currency_code'] ?? ''; + $array[$index]['currency_symbol'] = $array[0]['currency_symbol'] ?? ''; + $array[$index]['foreign_amount'] = round($array[0]['foreign_destination_amount'] ?? '0', 12); + $array[$index]['foreign_currency_id'] = $array[0]['foreign_currency_id']; + $array[$index]['foreign_currency_code'] = $array[0]['foreign_currency_code']; + $array[$index]['foreign_currency_symbol'] = $array[0]['foreign_currency_symbol']; + } + + return $array; + } /** * Create data-array from a journal. @@ -66,8 +103,10 @@ trait RequestInformation */ protected function arrayFromJournal(Request $request, TransactionJournal $journal): array // convert user input. { - $sourceAccounts = $this->repository->getJournalSourceAccounts($journal); - $destinationAccounts = $this->repository->getJournalDestinationAccounts($journal); + /** @var JournalRepositoryInterface $repository */ + $repository = app(JournalRepositoryInterface::class); + $sourceAccounts = $repository->getJournalSourceAccounts($journal); + $destinationAccounts = $repository->getJournalDestinationAccounts($journal); $array = [ 'journal_description' => $request->old('journal_description', $journal->description), 'journal_amount' => '0', @@ -82,14 +121,14 @@ trait RequestInformation 'tags' => implode(',', $journal->tags->pluck('tag')->toArray()), // all custom fields: - 'interest_date' => $request->old('interest_date', $this->repository->getMetaField($journal, 'interest_date')), - 'book_date' => $request->old('book_date', $this->repository->getMetaField($journal, 'book_date')), - 'process_date' => $request->old('process_date', $this->repository->getMetaField($journal, 'process_date')), - 'due_date' => $request->old('due_date', $this->repository->getMetaField($journal, 'due_date')), - 'payment_date' => $request->old('payment_date', $this->repository->getMetaField($journal, 'payment_date')), - 'invoice_date' => $request->old('invoice_date', $this->repository->getMetaField($journal, 'invoice_date')), - 'internal_reference' => $request->old('internal_reference', $this->repository->getMetaField($journal, 'internal_reference')), - 'notes' => $request->old('notes', $this->repository->getNoteText($journal)), + 'interest_date' => $request->old('interest_date', $repository->getMetaField($journal, 'interest_date')), + 'book_date' => $request->old('book_date', $repository->getMetaField($journal, 'book_date')), + 'process_date' => $request->old('process_date', $repository->getMetaField($journal, 'process_date')), + 'due_date' => $request->old('due_date', $repository->getMetaField($journal, 'due_date')), + 'payment_date' => $request->old('payment_date', $repository->getMetaField($journal, 'payment_date')), + 'invoice_date' => $request->old('invoice_date', $repository->getMetaField($journal, 'invoice_date')), + 'internal_reference' => $request->old('internal_reference', $repository->getMetaField($journal, 'internal_reference')), + 'notes' => $request->old('notes', $repository->getNoteText($journal)), // transactions. 'transactions' => $this->getTransactionDataFromJournal($journal), @@ -403,4 +442,4 @@ trait RequestInformation ); } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/TransactionCalculation.php b/app/Support/Http/Controllers/TransactionCalculation.php index 6c318fa90b..16280749b3 100644 --- a/app/Support/Http/Controllers/TransactionCalculation.php +++ b/app/Support/Http/Controllers/TransactionCalculation.php @@ -199,4 +199,4 @@ trait TransactionCalculation return $collector->getTransactions(); } -} \ No newline at end of file +} diff --git a/app/Support/Http/Controllers/UserNavigation.php b/app/Support/Http/Controllers/UserNavigation.php index dbf0274c07..cac0d91f92 100644 --- a/app/Support/Http/Controllers/UserNavigation.php +++ b/app/Support/Http/Controllers/UserNavigation.php @@ -149,4 +149,4 @@ trait UserNavigation Log::debug(sprintf('Will put previous URI in cache under key %s: %s', $identifier, $url)); } } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php b/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php index 7f3ce9a511..dcfcbdc4ff 100644 --- a/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php +++ b/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php @@ -120,4 +120,4 @@ class ChooseAccountHandler implements FinTSConfigurationInterface $this->accountRepository = app(AccountRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php b/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php index 81bfd45c8c..8e5233219e 100644 --- a/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php +++ b/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php @@ -50,4 +50,4 @@ interface FinTSConfigurationInterface * @param ImportJob $importJob */ public function setImportJob(ImportJob $importJob): void; -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/FinTS/NewFinTSJobHandler.php b/app/Support/Import/JobConfiguration/FinTS/NewFinTSJobHandler.php index b3f30a6da9..362c458aa5 100644 --- a/app/Support/Import/JobConfiguration/FinTS/NewFinTSJobHandler.php +++ b/app/Support/Import/JobConfiguration/FinTS/NewFinTSJobHandler.php @@ -107,4 +107,4 @@ class NewFinTSJobHandler implements FinTSConfigurationInterface $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/Ynab/NewYnabJobHandler.php b/app/Support/Import/JobConfiguration/Ynab/NewYnabJobHandler.php index 5a9ddaccda..4291309779 100644 --- a/app/Support/Import/JobConfiguration/Ynab/NewYnabJobHandler.php +++ b/app/Support/Import/JobConfiguration/Ynab/NewYnabJobHandler.php @@ -255,4 +255,4 @@ class NewYnabJobHandler implements YnabJobConfigurationInterface return true; } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/Ynab/SelectAccountsHandler.php b/app/Support/Import/JobConfiguration/Ynab/SelectAccountsHandler.php index 4dbf8fa49b..bc48b7e615 100644 --- a/app/Support/Import/JobConfiguration/Ynab/SelectAccountsHandler.php +++ b/app/Support/Import/JobConfiguration/Ynab/SelectAccountsHandler.php @@ -86,10 +86,11 @@ class SelectAccountsHandler implements YnabJobConfigurationInterface $applyRules = 1 === (int)($data['apply_rules'] ?? 0); foreach ($mapping as $ynabId => $localId) { // validate each - $ynabId = $this->validYnabAccount($ynabId); - $accountId = $this->validLocalAccount((int)$localId); - $final[$ynabId] = $accountId; - + $ynabId = $this->validYnabAccount($ynabId); + $accountId = $this->validLocalAccount((int)$localId); + if ($accountId !== 0) { + $final[$ynabId] = $accountId; + } } Log::debug('Final mapping is:', $final); $messages = new MessageBag; @@ -234,4 +235,4 @@ class SelectAccountsHandler implements YnabJobConfigurationInterface return ''; } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php b/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php index 92a14d57c1..1c3ddbe546 100644 --- a/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php +++ b/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php @@ -182,4 +182,4 @@ class SelectBudgetHandler implements YnabJobConfigurationInterface return false; } -} \ No newline at end of file +} diff --git a/app/Support/Import/JobConfiguration/Ynab/YnabJobConfigurationInterface.php b/app/Support/Import/JobConfiguration/Ynab/YnabJobConfigurationInterface.php index 539f26dc44..37d96bb6c7 100644 --- a/app/Support/Import/JobConfiguration/Ynab/YnabJobConfigurationInterface.php +++ b/app/Support/Import/JobConfiguration/Ynab/YnabJobConfigurationInterface.php @@ -69,4 +69,4 @@ interface YnabJobConfigurationInterface * @param ImportJob $importJob */ public function setImportJob(ImportJob $importJob): void; -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Bunq/PaymentConverter.php b/app/Support/Import/Routine/Bunq/PaymentConverter.php index d5da24f9b8..cff39a747a 100644 --- a/app/Support/Import/Routine/Bunq/PaymentConverter.php +++ b/app/Support/Import/Routine/Bunq/PaymentConverter.php @@ -241,4 +241,4 @@ class PaymentConverter } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/File/CurrencyMapper.php b/app/Support/Import/Routine/File/CurrencyMapper.php index 83821c019f..fcb589b909 100644 --- a/app/Support/Import/Routine/File/CurrencyMapper.php +++ b/app/Support/Import/Routine/File/CurrencyMapper.php @@ -80,6 +80,7 @@ class CurrencyMapper 'code' => $data['code'], 'name' => $data['name'] ?? $data['code'], 'symbol' => $data['symbol'] ?? $data['code'], + 'enabled' => true, 'decimal_places' => 2, ]; diff --git a/app/Support/Import/Routine/File/OFXProcessor.php b/app/Support/Import/Routine/File/OFXProcessor.php index a4fd1b4758..438f48f50d 100644 --- a/app/Support/Import/Routine/File/OFXProcessor.php +++ b/app/Support/Import/Routine/File/OFXProcessor.php @@ -75,7 +75,7 @@ class OFXProcessor implements FileProcessorInterface foreach ($ofx->bankAccounts as $bankAccount) { /** @var Transaction $transaction */ foreach ($bankAccount->statement->transactions as $transaction) { - var_dump($transaction); + //var_dump($transaction); } } @@ -117,4 +117,4 @@ class OFXProcessor implements FileProcessorInterface $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php index 16bb14fafb..d11d8b1c86 100644 --- a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php +++ b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php @@ -186,4 +186,4 @@ class StageImportDataHandler return $storeData; } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/GetAccountsHandler.php b/app/Support/Import/Routine/Ynab/GetAccountsHandler.php index a0c05fd195..75632769d5 100644 --- a/app/Support/Import/Routine/Ynab/GetAccountsHandler.php +++ b/app/Support/Import/Routine/Ynab/GetAccountsHandler.php @@ -77,4 +77,4 @@ class GetAccountsHandler $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/ImportDataHandler.php b/app/Support/Import/Routine/Ynab/ImportDataHandler.php index 4986bd78ea..c572118da8 100644 --- a/app/Support/Import/Routine/Ynab/ImportDataHandler.php +++ b/app/Support/Import/Routine/Ynab/ImportDataHandler.php @@ -275,4 +275,4 @@ class ImportDataHandler return $request->transactions; } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/StageGetAccessHandler.php b/app/Support/Import/Routine/Ynab/StageGetAccessHandler.php index c155a4e0ca..dafcb89bfa 100644 --- a/app/Support/Import/Routine/Ynab/StageGetAccessHandler.php +++ b/app/Support/Import/Routine/Ynab/StageGetAccessHandler.php @@ -105,4 +105,4 @@ class StageGetAccessHandler $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/StageGetBudgetsHandler.php b/app/Support/Import/Routine/Ynab/StageGetBudgetsHandler.php index fd8c3dbeb6..bd0d6e2d6b 100644 --- a/app/Support/Import/Routine/Ynab/StageGetBudgetsHandler.php +++ b/app/Support/Import/Routine/Ynab/StageGetBudgetsHandler.php @@ -72,4 +72,4 @@ class StageGetBudgetsHandler $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/StageGetTransactionsHandler.php b/app/Support/Import/Routine/Ynab/StageGetTransactionsHandler.php index 9c87cf78d5..37e0f16dcf 100644 --- a/app/Support/Import/Routine/Ynab/StageGetTransactionsHandler.php +++ b/app/Support/Import/Routine/Ynab/StageGetTransactionsHandler.php @@ -52,4 +52,4 @@ class StageGetTransactionsHandler $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Import/Routine/Ynab/StageMatchAccountsHandler.php b/app/Support/Import/Routine/Ynab/StageMatchAccountsHandler.php index 5944f8514c..5e0293f456 100644 --- a/app/Support/Import/Routine/Ynab/StageMatchAccountsHandler.php +++ b/app/Support/Import/Routine/Ynab/StageMatchAccountsHandler.php @@ -54,4 +54,4 @@ class StageMatchAccountsHandler $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } -} \ No newline at end of file +} diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index bef0a248bf..0b7b4262ad 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -24,6 +24,7 @@ namespace FireflyIII\Support; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\FiscalHelperInterface; use Log; /** @@ -175,7 +176,7 @@ class Navigation '6M' => 6, ]; - $subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', 'year', 'yearly']; + $subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', '1Y', 'year', 'yearly']; // if the range is custom, the end of the period // is another X days (x is the difference between start) @@ -583,7 +584,6 @@ class Navigation '1W' => 'endOfWeek', '1M' => 'endOfMonth', '3M' => 'lastOfQuarter', - '1Y' => 'endOfYear', 'custom' => 'startOfMonth', // this only happens in test situations. ]; $end = clone $start; @@ -604,6 +604,16 @@ class Navigation return $end; } + + // make sure 1Y takes the fiscal year into account. + if ('1Y' === $range) { + /** @var FiscalHelperInterface $fiscalHelper */ + $fiscalHelper = app(FiscalHelperInterface::class); + + return $fiscalHelper->endOfFiscalYear($end); + } + + throw new FireflyException(sprintf('updateEndDate cannot handle range "%s"', $range)); } @@ -622,7 +632,6 @@ class Navigation '1W' => 'startOfWeek', '1M' => 'startOfMonth', '3M' => 'firstOfQuarter', - '1Y' => 'startOfYear', 'custom' => 'startOfMonth', // this only happens in test situations. ]; if (isset($functionMap[$range])) { @@ -641,6 +650,15 @@ class Navigation return $start; } + + // make sure 1Y takes the fiscal year into account. + if ('1Y' === $range) { + /** @var FiscalHelperInterface $fiscalHelper */ + $fiscalHelper = app(FiscalHelperInterface::class); + + return $fiscalHelper->startOfFiscalYear($start); + } + throw new FireflyException(sprintf('updateStartDate cannot handle range "%s"', $range)); } } diff --git a/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php b/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php new file mode 100644 index 0000000000..bb19a14ac7 --- /dev/null +++ b/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php @@ -0,0 +1,203 @@ +format('Y-m-d'))); + if (0 === $attempts % $skipMod) { + Log::debug(sprintf('Attempts modulo skipmod is zero, include %s', $start->format('Y-m-d'))); + $return[] = clone $start; + } + $start->addDay(); + $attempts++; + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + /** + * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. + * + * @param Carbon $start + * @param Carbon $end + * @param int $skipMod + * @param string $moment + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getMonthlyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array + { + $return = []; + $attempts = 0; + $dayOfMonth = (int)$moment; + Log::debug(sprintf('Day of month in repetition is %d', $dayOfMonth)); + Log::debug(sprintf('Start is %s.', $start->format('Y-m-d'))); + Log::debug(sprintf('End is %s.', $end->format('Y-m-d'))); + if ($start->day > $dayOfMonth) { + Log::debug('Add a month.'); + // day has passed already, add a month. + $start->addMonth(); + } + Log::debug(sprintf('Start is now %s.', $start->format('Y-m-d'))); + Log::debug('Start loop.'); + while ($start < $end) { + Log::debug(sprintf('Mutator is now %s.', $start->format('Y-m-d'))); + $domCorrected = min($dayOfMonth, $start->daysInMonth); + Log::debug(sprintf('DoM corrected is %d', $domCorrected)); + $start->day = $domCorrected; + Log::debug(sprintf('Mutator is now %s.', $start->format('Y-m-d'))); + Log::debug(sprintf('$attempts %% $skipMod === 0 is %s', var_export(0 === $attempts % $skipMod, true))); + Log::debug(sprintf('$start->lte($mutator) is %s', var_export($start->lte($start), true))); + Log::debug(sprintf('$end->gte($mutator) is %s', var_export($end->gte($start), true))); + if (0 === $attempts % $skipMod && $start->lte($start) && $end->gte($start)) { + Log::debug(sprintf('ADD %s to return!', $start->format('Y-m-d'))); + $return[] = clone $start; + } + $attempts++; + $start->endOfMonth()->startOfDay()->addDay(); + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. + * + * @param Carbon $start + * @param Carbon $end + * @param int $skipMod + * @param string $moment + * + * @return array + */ + protected function getNdomInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array + { + $return = []; + $attempts = 0; + $start->startOfMonth(); + // this feels a bit like a cop out but why reinvent the wheel? + $counters = [1 => 'first', 2 => 'second', 3 => 'third', 4 => 'fourth', 5 => 'fifth',]; + $daysOfWeek = [1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday',]; + $parts = explode(',', $moment); + while ($start <= $end) { + $string = sprintf('%s %s of %s %s', $counters[$parts[0]], $daysOfWeek[$parts[1]], $start->format('F'), $start->format('Y')); + $newCarbon = new Carbon($string); + if (0 === $attempts % $skipMod) { + $return[] = clone $newCarbon; + } + $attempts++; + $start->endOfMonth()->addDay(); + } + + return $return; + } + + /** + * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. + * + * @param Carbon $start + * @param Carbon $end + * @param int $skipMod + * @param string $moment + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getWeeklyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array + { + $return = []; + $attempts = 0; + Log::debug('Rep is weekly.'); + // monday = 1 + // sunday = 7 + $dayOfWeek = (int)$moment; + Log::debug(sprintf('DoW in repetition is %d, in mutator is %d', $dayOfWeek, $start->dayOfWeekIso)); + if ($start->dayOfWeekIso > $dayOfWeek) { + // day has already passed this week, add one week: + $start->addWeek(); + Log::debug(sprintf('Jump to next week, so mutator is now: %s', $start->format('Y-m-d'))); + } + // today is wednesday (3), expected is friday (5): add two days. + // today is friday (5), expected is monday (1), subtract four days. + Log::debug(sprintf('Mutator is now: %s', $start->format('Y-m-d'))); + $dayDifference = $dayOfWeek - $start->dayOfWeekIso; + $start->addDays($dayDifference); + Log::debug(sprintf('Mutator is now: %s', $start->format('Y-m-d'))); + while ($start <= $end) { + if (0 === $attempts % $skipMod && $start->lte($start) && $end->gte($start)) { + Log::debug('Date is in range of start+end, add to set.'); + $return[] = clone $start; + } + $attempts++; + $start->addWeek(); + Log::debug(sprintf('Mutator is now (end of loop): %s', $start->format('Y-m-d'))); + } + + return $return; + } + /** + * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. + * + * @param Carbon $start + * @param Carbon $end + * @param int $skipMod + * @param string $moment + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function getYearlyInRange(Carbon $start, Carbon $end, int $skipMod, string $moment): array + { + $attempts = 0; + $date = new Carbon($moment); + $date->year = $start->year; + $return = []; + if ($start > $date) { + $date->addYear(); + + } + + // is $date between $start and $end? + $obj = clone $date; + $count = 0; + while ($obj <= $end && $obj >= $start && $count < 10) { + if (0 === $attempts % $skipMod) { + $return[] = clone $obj; + } + $obj->addYears(1); + $count++; + $attempts++; + } + + return $return; + + } +} \ No newline at end of file diff --git a/app/Support/Repositories/Recurring/CalculateXOccurrences.php b/app/Support/Repositories/Recurring/CalculateXOccurrences.php new file mode 100644 index 0000000000..9d586ad4d1 --- /dev/null +++ b/app/Support/Repositories/Recurring/CalculateXOccurrences.php @@ -0,0 +1,202 @@ +addDay(); + if (0 === $attempts % $skipMod) { + $return[] = clone $mutator; + $total++; + } + $attempts++; + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Calculates the number of monthly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip + * over $skipMod -1 recurrences. + * + * @param Carbon $date + * @param int $count + * @param int $skipMod + * @param string $moment + * + * @return array + */ + protected function getXMonthlyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array + { + $return = []; + $mutator = clone $date; + $total = 0; + $attempts = 0; + $dayOfMonth = (int)$moment; + if ($mutator->day > $dayOfMonth) { + // day has passed already, add a month. + $mutator->addMonth(); + } + + while ($total < $count) { + $domCorrected = min($dayOfMonth, $mutator->daysInMonth); + $mutator->day = $domCorrected; + if (0 === $attempts % $skipMod) { + $return[] = clone $mutator; + $total++; + } + $attempts++; + $mutator->endOfMonth()->addDay(); + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + /** + * Calculates the number of NDOM occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip + * over $skipMod -1 recurrences. + * + * @param Carbon $date + * @param int $count + * @param int $skipMod + * @param string $moment + * + * @return array + */ + protected function getXNDomOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array + { + $return = []; + $total = 0; + $attempts = 0; + $mutator = clone $date; + $mutator->addDay(); // always assume today has passed. + $mutator->startOfMonth(); + // this feels a bit like a cop out but why reinvent the wheel? + $counters = [1 => 'first', 2 => 'second', 3 => 'third', 4 => 'fourth', 5 => 'fifth',]; + $daysOfWeek = [1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday',]; + $parts = explode(',', $moment); + + while ($total < $count) { + $string = sprintf('%s %s of %s %s', $counters[$parts[0]], $daysOfWeek[$parts[1]], $mutator->format('F'), $mutator->format('Y')); + $newCarbon = new Carbon($string); + if (0 === $attempts % $skipMod) { + $return[] = clone $newCarbon; + $total++; + } + $attempts++; + $mutator->endOfMonth()->addDay(); + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Calculates the number of weekly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip + * over $skipMod -1 recurrences. + * + * @param Carbon $date + * @param int $count + * @param int $skipMod + * @param string $moment + * + * @return array + */ + protected function getXWeeklyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array + { + $return = []; + $total = 0; + $attempts = 0; + $mutator = clone $date; + // monday = 1 + // sunday = 7 + $mutator->addDay(); // always assume today has passed. + $dayOfWeek = (int)$moment; + if ($mutator->dayOfWeekIso > $dayOfWeek) { + // day has already passed this week, add one week: + $mutator->addWeek(); + } + // today is wednesday (3), expected is friday (5): add two days. + // today is friday (5), expected is monday (1), subtract four days. + $dayDifference = $dayOfWeek - $mutator->dayOfWeekIso; + $mutator->addDays($dayDifference); + + while ($total < $count) { + if (0 === $attempts % $skipMod) { + $return[] = clone $mutator; + $total++; + } + $attempts++; + $mutator->addWeek(); + } + + return $return; + } + + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Calculates the number of yearly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip + * over $skipMod -1 recurrences. + * + * @param Carbon $date + * @param int $count + * @param int $skipMod + * @param string $moment + * + * @return array + */ + protected function getXYearlyOccurrences(Carbon $date, int $count, int $skipMod, string $moment): array + { + $return = []; + $mutator = clone $date; + $total = 0; + $attempts = 0; + $date = new Carbon($moment); + $date->year = $mutator->year; + if ($mutator > $date) { + $date->addYear(); + } + $obj = clone $date; + while ($total < $count) { + if (0 === $attempts % $skipMod) { + $return[] = clone $obj; + $total++; + } + $obj->addYears(1); + $attempts++; + } + + return $return; + + } +} \ No newline at end of file diff --git a/app/Support/Repositories/Recurring/FiltersWeekends.php b/app/Support/Repositories/Recurring/FiltersWeekends.php new file mode 100644 index 0000000000..1c0e1c8e87 --- /dev/null +++ b/app/Support/Repositories/Recurring/FiltersWeekends.php @@ -0,0 +1,78 @@ +weekend === RecurrenceRepetition::WEEKEND_DO_NOTHING) { + Log::debug('Repetition will not be filtered on weekend days.'); + + return $dates; + } + $return = []; + /** @var Carbon $date */ + foreach ($dates as $date) { + $isWeekend = $date->isWeekend(); + if (!$isWeekend) { + $return[] = clone $date; + Log::debug(sprintf('Date is %s, not a weekend date.', $date->format('D d M Y'))); + continue; + } + + // is weekend and must set back to Friday? + if ($repetition->weekend === RecurrenceRepetition::WEEKEND_TO_FRIDAY) { + $clone = clone $date; + $clone->addDays(5 - $date->dayOfWeekIso); + Log::debug( + sprintf('Date is %s, and this is in the weekend, so corrected to %s (Friday).', $date->format('D d M Y'), $clone->format('D d M Y')) + ); + $return[] = clone $clone; + continue; + } + + // postpone to Monday? + if ($repetition->weekend === RecurrenceRepetition::WEEKEND_TO_MONDAY) { + $clone = clone $date; + $clone->addDays(8 - $date->dayOfWeekIso); + Log::debug( + sprintf('Date is %s, and this is in the weekend, so corrected to %s (Monday).', $date->format('D d M Y'), $clone->format('D d M Y')) + ); + $return[] = $clone; + continue; + } + Log::debug(sprintf('Date is %s, removed from final result', $date->format('D d M Y'))); + } + + // filter unique dates + Log::debug(sprintf('Count before filtering: %d', \count($dates))); + $collection = new Collection($return); + $filtered = $collection->unique(); + $return = $filtered->toArray(); + + Log::debug(sprintf('Count after filtering: %d', \count($return))); + + return $return; + } +} \ No newline at end of file diff --git a/app/Support/Search/Modifier.php b/app/Support/Search/Modifier.php index bb2979a658..076d19a9e0 100644 --- a/app/Support/Search/Modifier.php +++ b/app/Support/Search/Modifier.php @@ -63,12 +63,12 @@ class Modifier $res = true; switch ($modifier['type']) { case 'source': - $name = app('steam')->tryDecrypt($transaction->account_name); + $name = $transaction->account_name; $res = self::stringCompare($name, $modifier['value']); Log::debug(sprintf('Source is %s? %s', $modifier['value'], var_export($res, true))); break; case 'destination': - $name = app('steam')->tryDecrypt($transaction->opposing_account_name); + $name = $transaction->opposing_account_name; $res = self::stringCompare($name, $modifier['value']); Log::debug(sprintf('Destination is %s? %s', $modifier['value'], var_export($res, true))); break; @@ -81,7 +81,7 @@ class Modifier Log::debug(sprintf('Budget is %s? %s', $modifier['value'], var_export($res, true))); break; case 'bill': - $name = app('steam')->tryDecrypt($transaction->bill_name); + $name = $transaction->bill_name; $res = self::stringCompare($name, $modifier['value']); Log::debug(sprintf('Bill is %s? %s', $modifier['value'], var_export($res, true))); break; @@ -171,11 +171,11 @@ class Modifier { $journalBudget = ''; if (null !== $transaction->transaction_journal_budget_name) { - $journalBudget = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); + $journalBudget = $transaction->transaction_journal_budget_name; } $transactionBudget = ''; if (null !== $transaction->transaction_budget_name) { - $journalBudget = app('steam')->tryDecrypt($transaction->transaction_budget_name); + $journalBudget = $transaction->transaction_budget_name; } return self::stringCompare($journalBudget, $search) || self::stringCompare($transactionBudget, $search); @@ -191,11 +191,11 @@ class Modifier { $journalCategory = ''; if (null !== $transaction->transaction_journal_category_name) { - $journalCategory = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); + $journalCategory = $transaction->transaction_journal_category_name; } $transactionCategory = ''; if (null !== $transaction->transaction_category_name) { - $journalCategory = app('steam')->tryDecrypt($transaction->transaction_category_name); + $journalCategory = $transaction->transaction_category_name; } return self::stringCompare($journalCategory, $search) || self::stringCompare($transactionCategory, $search); diff --git a/app/Support/Steam.php b/app/Support/Steam.php index beab2ebab1..73362b1f50 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -377,22 +377,6 @@ class Steam return trim($string); } - /** - * @param int $isEncrypted - * @param $value - * - * @return string - * @throws \Illuminate\Contracts\Encryption\DecryptException - */ - public function decrypt(int $isEncrypted, string $value): string - { - if (1 === $isEncrypted) { - return Crypt::decrypt($value); - } - - return $value; - } - /** * @param array $accounts * @@ -490,19 +474,4 @@ class Steam return $amount; } - /** - * @param $value - * - * @return mixed - */ - public function tryDecrypt($value) - { - try { - $value = Crypt::decrypt($value); - } catch (DecryptException $e) { - // do not care. - } - - return $value; - } } diff --git a/app/Support/Twig/Extension/Transaction.php b/app/Support/Twig/Extension/Transaction.php index 88aac67bcd..5ce96139e8 100644 --- a/app/Support/Twig/Extension/Transaction.php +++ b/app/Support/Twig/Extension/Transaction.php @@ -131,13 +131,13 @@ class Transaction extends Twig_Extension $txt = ''; // journal has a budget: if (null !== $transaction->transaction_journal_budget_id) { - $name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); + $name = $transaction->transaction_journal_budget_name; $txt = sprintf('%s', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name); } // transaction has a budget if (null !== $transaction->transaction_budget_id && '' === $txt) { - $name = app('steam')->tryDecrypt($transaction->transaction_budget_name); + $name = $transaction->transaction_budget_name; $txt = sprintf('%s', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); } @@ -169,13 +169,13 @@ class Transaction extends Twig_Extension $txt = ''; // journal has a category: if (null !== $transaction->transaction_journal_category_id) { - $name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); + $name = $transaction->transaction_journal_category_name; $txt = sprintf('%s', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name); } // transaction has a category: if (null !== $transaction->transaction_category_id && '' === $txt) { - $name = app('steam')->tryDecrypt($transaction->transaction_category_name); + $name = $transaction->transaction_category_name; $txt = sprintf('%s', route('categories.show', [$transaction->transaction_category_id]), $name, $name); } @@ -224,7 +224,7 @@ class Transaction extends Twig_Extension return '—'; } - $name = app('steam')->tryDecrypt($transaction->account_name); + $name = $transaction->account_name; $iban = $transaction->account_iban; $transactionId = (int)$transaction->account_id; $type = $transaction->account_type; @@ -255,7 +255,7 @@ class Transaction extends Twig_Extension return ''; } - $name = app('steam')->tryDecrypt($other->name); + $name = $other->name; $transactionId = $other->account_id; $type = $other->type; } @@ -384,7 +384,7 @@ class Transaction extends Twig_Extension } // if the amount is negative, assume that the current account (the one in $transaction) is indeed the source account. - $name = app('steam')->tryDecrypt($transaction->account_name); + $name = $transaction->account_name; $transactionId = (int)$transaction->account_id; $type = $transaction->account_type; $iban = $transaction->account_iban; @@ -408,7 +408,7 @@ class Transaction extends Twig_Extension ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); - $name = app('steam')->tryDecrypt($other->name); + $name = $other->name; $transactionId = $other->account_id; $type = $other->type; } diff --git a/app/TransactionRules/Actions/ConvertToDeposit.php b/app/TransactionRules/Actions/ConvertToDeposit.php index 47888b8762..b5f5321a1d 100644 --- a/app/TransactionRules/Actions/ConvertToDeposit.php +++ b/app/TransactionRules/Actions/ConvertToDeposit.php @@ -206,4 +206,4 @@ class ConvertToDeposit implements ActionInterface return true; } -} \ No newline at end of file +} diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index afd3bfd3a6..b4dbe20d50 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -204,4 +204,4 @@ class ConvertToTransfer implements ActionInterface return true; } -} \ No newline at end of file +} diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index adbd338d9e..3729ec340a 100644 --- a/app/TransactionRules/Actions/ConvertToWithdrawal.php +++ b/app/TransactionRules/Actions/ConvertToWithdrawal.php @@ -209,4 +209,4 @@ class ConvertToWithdrawal implements ActionInterface return true; } -} \ No newline at end of file +} diff --git a/app/Transformers/AbstractTransformer.php b/app/Transformers/AbstractTransformer.php index d7e6ee4954..1ad57a7af3 100644 --- a/app/Transformers/AbstractTransformer.php +++ b/app/Transformers/AbstractTransformer.php @@ -50,4 +50,4 @@ class AbstractTransformer extends TransformerAbstract { $this->parameters = $parameters; } -} \ No newline at end of file +} diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index 8976eec112..53f45f5344 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -70,43 +70,14 @@ class AccountTransformer extends AbstractTransformer $liabilityType = '' === $liabilityType ? null : $liabilityType; // get account role (will only work if the type is asset. - $accountRole = $this->repository->getMetaValue($account, 'accountRole'); - if ('asset' !== $accountType || '' === (string)$accountRole) { - $accountRole = null; - } + $accountRole = $this->getAccountRole($account, $accountType); + $date = $this->getDate(); - // get currency. If not 0, get from repository. TODO test me. - $currency = $this->repository->getAccountCurrency($account); - $currencyId = null; - $currencyCode = null; - $decimalPlaces = 2; - $currencySymbol = null; - if (null !== $currency) { - $currencyId = $currency->id; - $currencyCode = $currency->code; - $decimalPlaces = $currency->decimal_places; - $currencySymbol = $currency->symbol; - } + [$currencyId, $currencyCode, $currencySymbol, $decimalPlaces] = $this->getCurrency($account); + [$creditCardType, $monthlyPaymentDate] = $this->getCCInfo($account, $accountRole, $accountType); + [$openingBalance, $openingBalanceDate] = $this->getOpeningBalance($account, $accountType, $decimalPlaces); + [$interest, $interestPeriod] = $this->getInterest($account, $accountType); - $date = new Carbon; - if (null !== $this->parameters->get('date')) { - $date = $this->parameters->get('date'); - } - - $monthlyPaymentDate = null; - $creditCardType = null; - if ('ccAsset' === $accountRole && 'asset' === $accountType) { - $creditCardType = $this->repository->getMetaValue($account, 'ccType'); - $monthlyPaymentDate = $this->repository->getMetaValue($account, 'ccMonthlyPaymentDate'); - } - - $openingBalance = null; - $openingBalanceDate = null; - if (\in_array($accountType, ['asset', 'liabilities'], true)) { - $amount = $this->repository->getOpeningBalanceAmount($account); - $openingBalance = null === $amount ? null : round($amount, $decimalPlaces); - $openingBalanceDate = $this->repository->getOpeningBalanceDate($account); - } $liabilityAmount = null; $liabilityStart = null; if (null !== $liabilityType) { @@ -114,13 +85,8 @@ class AccountTransformer extends AbstractTransformer $liabilityStart = $openingBalanceDate; } - $interest = null; - $interestPeriod = null; - if ('liabilities' === $accountType) { - $interest = $this->repository->getMetaValue($account, 'interest'); - $interestPeriod = $this->repository->getMetaValue($account, 'interest_period'); - } - $includeNetworth = '0' !== $this->repository->getMetaValue($account, 'include_net_worth'); + + $includeNetWorth = '0' !== $this->repository->getMetaValue($account, 'include_net_worth'); $data = [ 'id' => (int)$account->id, @@ -150,7 +116,7 @@ class AccountTransformer extends AbstractTransformer 'liability_start_date' => $liabilityStart, 'interest' => $interest, 'interest_period' => $interestPeriod, - 'include_net_worth' => $includeNetworth, + 'include_net_worth' => $includeNetWorth, 'links' => [ [ 'rel' => 'self', @@ -161,4 +127,114 @@ class AccountTransformer extends AbstractTransformer return $data; } + + /** + * @param Account $account + * + * @param string $accountType + * + * @return string|null + */ + private function getAccountRole(Account $account, string $accountType): ?string + { + $accountRole = $this->repository->getMetaValue($account, 'accountRole'); + if ('asset' !== $accountType || '' === (string)$accountRole) { + $accountRole = null; + } + + return $accountRole; + } + + /** + * @param Account $account + * @param string|null $accountRole + * @param string $accountType + * + * @return array + */ + private function getCCInfo(Account $account, ?string $accountRole, string $accountType): array + { + $monthlyPaymentDate = null; + $creditCardType = null; + if ('ccAsset' === $accountRole && 'asset' === $accountType) { + $creditCardType = $this->repository->getMetaValue($account, 'ccType'); + $monthlyPaymentDate = $this->repository->getMetaValue($account, 'ccMonthlyPaymentDate'); + } + + return [$creditCardType, $monthlyPaymentDate]; + } + + /** + * @param Account $account + * + * @return array + */ + private function getCurrency(Account $account): array + { + $currency = $this->repository->getAccountCurrency($account); + $currencyId = null; + $currencyCode = null; + $decimalPlaces = 2; + $currencySymbol = null; + if (null !== $currency) { + $currencyId = $currency->id; + $currencyCode = $currency->code; + $decimalPlaces = $currency->decimal_places; + $currencySymbol = $currency->symbol; + } + + return [$currencyId, $currencyCode, $currencySymbol, $decimalPlaces]; + } + + /** + * @return Carbon + */ + private function getDate(): Carbon + { + $date = new Carbon; + if (null !== $this->parameters->get('date')) { + $date = $this->parameters->get('date'); + } + + return $date; + } + + /** + * @param Account $account + * @param string $accountType + * + * @return array + */ + private function getInterest(Account $account, string $accountType): array + { + $interest = null; + $interestPeriod = null; + if ('liabilities' === $accountType) { + $interest = $this->repository->getMetaValue($account, 'interest'); + $interestPeriod = $this->repository->getMetaValue($account, 'interest_period'); + } + + return [$interest, $interestPeriod]; + } + + /** + * @param Account $account + * @param string $accountType + * + * @param int $decimalPlaces + * + * @return array + */ + private function getOpeningBalance(Account $account, string $accountType, int $decimalPlaces): array + { + $openingBalance = null; + $openingBalanceDate = null; + if (\in_array($accountType, ['asset', 'liabilities'], true)) { + $amount = $this->repository->getOpeningBalanceAmount($account); + $openingBalance = null === $amount ? null : round($amount, $decimalPlaces); + $openingBalanceDate = $this->repository->getOpeningBalanceDate($account); + } + + return [$openingBalance, $openingBalanceDate]; + } } diff --git a/app/Transformers/PiggyBankTransformer.php b/app/Transformers/PiggyBankTransformer.php index 63cb9232c2..f922c3ff03 100644 --- a/app/Transformers/PiggyBankTransformer.php +++ b/app/Transformers/PiggyBankTransformer.php @@ -104,6 +104,7 @@ class PiggyBankTransformer extends AbstractTransformer 'created_at' => $piggyBank->created_at->toAtomString(), 'updated_at' => $piggyBank->updated_at->toAtomString(), 'account_id' => $piggyBank->account_id, + 'account_name' => $piggyBank->account->name, 'name' => $piggyBank->name, 'currency_id' => $currency->id, 'currency_code' => $currency->code, diff --git a/app/User.php b/app/User.php index 17a64c29c9..6d4a7c848e 100644 --- a/app/User.php +++ b/app/User.php @@ -42,6 +42,7 @@ use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -320,6 +321,17 @@ class User extends Authenticatable return $this->hasMany(Tag::class); } + /** + * @codeCoverageIgnore + * Link to transaction groups. + * + * @return HasMany + */ + public function transactionGroups(): HasMany + { + return $this->hasMany(TransactionGroup::class); + } + /** * @codeCoverageIgnore * Link to transaction journals. diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index 0d90a18d1e..66a9e571fe 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -467,7 +467,6 @@ class FireflyValidator extends Validator */ public function validateUniqueObjectForUser($attribute, $value, $parameters): bool { - $value = $this->tryDecrypt($value); [$table, $field] = $parameters; $exclude = (int)($parameters[2] ?? 0.0); @@ -486,7 +485,7 @@ class FireflyValidator extends Validator ->where('id', '!=', $exclude)->get([$field]); foreach ($set as $entry) { - $fieldValue = $this->tryDecrypt($entry->$field); + $fieldValue = $entry->$field; if ($fieldValue === $value) { return false; @@ -518,7 +517,7 @@ class FireflyValidator extends Validator /** @var PiggyBank $entry */ foreach ($set as $entry) { - $fieldValue = $this->tryDecrypt($entry->name); + $fieldValue = $entry->name; if ($fieldValue === $value) { return false; } @@ -527,22 +526,6 @@ class FireflyValidator extends Validator return true; } - /** - * @param $value - * - * @return mixed - */ - private function tryDecrypt($value) - { - try { - $value = Crypt::decrypt($value); - } catch (DecryptException $e) { - //Log::debug(sprintf('Could not decrypt. %s', $e->getMessage())); - } - - return $value; - } - /** * @return bool */ @@ -554,7 +537,7 @@ class FireflyValidator extends Validator $user = User::find($this->data['user_id']); $type = AccountType::find($this->data['account_type_id'])->first(); - $value = $this->tryDecrypt($this->data['name']); + $value = $this->data['name']; $set = $user->accounts()->where('account_type_id', $type->id)->get(); /** @var Account $entry */ @@ -579,7 +562,7 @@ class FireflyValidator extends Validator $type = $existingAccount->accountType; $ignore = $existingAccount->id; - $value = $this->tryDecrypt($value); + $value = $value; /** @var Collection $set */ $set = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); @@ -603,7 +586,6 @@ class FireflyValidator extends Validator { $type = AccountType::find($this->data['account_type_id'])->first(); $ignore = (int)($parameters[0] ?? 0.0); - $value = $this->tryDecrypt($value); /** @var Collection $set */ $set = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); diff --git a/app/Validation/TransactionValidation.php b/app/Validation/TransactionValidation.php index cac645acdd..4f46b3fc1e 100644 --- a/app/Validation/TransactionValidation.php +++ b/app/Validation/TransactionValidation.php @@ -115,7 +115,7 @@ trait TransactionValidation $journalDescription = (string)($data['description'] ?? null); $validDescriptions = 0; foreach ($transactions as $index => $transaction) { - if (\strlen((string)($transaction['description'] ?? null)) > 0) { + if ('' !== (string)($transaction['description'] ?? null)) { $validDescriptions++; } } diff --git a/changelog.md b/changelog.md index 7253c24fbd..26960597e4 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,72 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.7.10] - 2019-02-03 +### Added +- [Issue 2037](https://github.com/firefly-iii/firefly-iii/issues/2037) Added some new magic keywords to reports. +- Added a new currency exchange rate service, [ratesapi.io](https://ratesapi.io/), that does not require expensive API keys. Built by [@BoGnY](https://github.com/BoGnY). +- Added Chinese Traditional translations. Thanks! + +### Changed +- [Issue 1977](https://github.com/firefly-iii/firefly-iii/issues/1977) Docker image now includes memcached support +- [Issue 2031](https://github.com/firefly-iii/firefly-iii/issues/2031) A new generic debit/credit indicator for imports. +- The new Docker image no longer has the capability to run cron jobs, and will no longer generate your recurring transactions for you. This has been done to simplify the build and make sure your Docker container runs one service, as it should. To set up a cron job for your new Docker container, [check out the documentation](https://docs.firefly-iii.org/en/latest/installation/cronjob.html). +- Due to a change in the database structure, this upgrade will reset your preferences. Sorry about that. + +### Deprecated +- I will no longer accept PR's that introduce new currencies. + +### Removed +- Firefly III no longer encrypts the database and will [decrypt the database]() on its first run. + +### Fixed +- [Issue 1923](https://github.com/firefly-iii/firefly-iii/issues/1923) Broken window position for date picker. +- [Issue 1967](https://github.com/firefly-iii/firefly-iii/issues/1967) Attachments were hidden in bill view. +- [Issue 1927](https://github.com/firefly-iii/firefly-iii/issues/1927) It was impossible to make recurring transactions skip. +- [Issue 1929](https://github.com/firefly-iii/firefly-iii/issues/1929) Fix the recurring transactions calendar overview. +- [Issue 1933](https://github.com/firefly-iii/firefly-iii/issues/1933) Fixed a bug that made it impossible to authenticate to FreeIPA servers. +- [Issue 1938](https://github.com/firefly-iii/firefly-iii/issues/1938) The importer can now handle the insane way Postbank (DE) formats its numbers. +- [Issue 1942](https://github.com/firefly-iii/firefly-iii/issues/1942) Favicons are relative so Scriptaculous installations work better. +- [Issue 1944](https://github.com/firefly-iii/firefly-iii/issues/1944) Make sure that the search allows you to mass-select transactions. +- [Issue 1945](https://github.com/firefly-iii/firefly-iii/issues/1945) Slight UI change so the drop-down menu renders better. +- [Issue 1955](https://github.com/firefly-iii/firefly-iii/issues/1955) Fixed a bug in the category report. +- [Issue 1968](https://github.com/firefly-iii/firefly-iii/issues/1968) The yearly range would jump to 1-Jan / 1-Jan instead of 1-Jan / 31-Dec +- [Issue 1975](https://github.com/firefly-iii/firefly-iii/issues/1975) Fixed explanation for missing credit card liabilities. +- [Issue 1979](https://github.com/firefly-iii/firefly-iii/issues/1979) Make sure tags are trimmed. +- [Issue 1983](https://github.com/firefly-iii/firefly-iii/issues/1983) Could not use your favorite decimal separator. +- [Issue 1989](https://github.com/firefly-iii/firefly-iii/issues/1989) Bug in YNAB importer forced you to select all accounts. +- [Issue 1990](https://github.com/firefly-iii/firefly-iii/issues/1990) Rule description was invisible in edit screen. +- [Issue 1996](https://github.com/firefly-iii/firefly-iii/issues/1996) Deleted budget would inadvertently also hide transactions. +- [Issue 2001](https://github.com/firefly-iii/firefly-iii/issues/2001) Various issues with tag chart view. +- [Issue 2009](https://github.com/firefly-iii/firefly-iii/issues/2009) Could not change recurrence back to "forever". +- [Issue 2033](https://github.com/firefly-iii/firefly-iii/issues/2033) Longitude can go from -180 to 180. +- [Issue 2034](https://github.com/firefly-iii/firefly-iii/issues/2034) Rules were not being triggered in mass-edit. +- #2043 In rare instances the repetition of a recurring transaction was displayed incorrectly. +- Fixed broken translations in the recurring transactions overview. +- When you create a recurring transfer you make make it fill (or empty) a piggy bank. This was not working, despite a fix in 4.7.8. +- Fixed a bug where the importer would not be capable of creating new currencies. +- Rule trigger tester would skip the amount. + +### Security +- OAuth2 form can now submit back to original requester. + +### API (0.9.1) +- Submitting transactions with a disabled currency will auto-enable the currency. +- The documentation now states that "Deposit" is a possible return when you get a transaction. +- "savingAsset" was incorrectly documented as "savingsAsset". +- Account endpoint can now return type "reconciliation" and "initial-balance" correctly. +- New API endpoint under `/summary/basic` that gives you a basic overview of the user's finances. +- New API endpoints under `/chart/*` to allow you to render charts. +- `/accounts/x/transactions` now supports the limit query parameter. +- `/budgets/x/transactions` now supports the limit query parameter. +- `/available_budgets` now supports custom start and end date parameters. +- New endpoint `/preferences/prefName` to retrieve a single preference. +- Added field `account_name` to all piggy banks. +- New tag cloud in API. + + +See the [API docs](https://api-docs.firefly-iii.org/) for more information. + ## [4.7.9] - 2018-12-25 ### Added - [Issue 1622](https://github.com/firefly-iii/firefly-iii/issues/1622) Can now unlink a transaction from a bill. @@ -1398,3 +1464,6 @@ An intermediate release because something in the Twig and Twigbridge libraries i ### Security - Initial release. + +### API +- Initial release \ No newline at end of file diff --git a/composer.json b/composer.json index 31b18ae0f6..c2c83fb78a 100644 --- a/composer.json +++ b/composer.json @@ -59,6 +59,7 @@ "ext-bcmath": "*", "ext-curl": "*", "ext-gd": "*", + "ext-tokenizer": "*", "ext-intl": "*", "ext-xml": "*", "ext-ldap": "*", @@ -132,6 +133,7 @@ ], "post-update-cmd": [ "@php artisan firefly:upgrade-database", + "@php artisan firefly:decrypt-all", "@php artisan firefly:verify", "@php artisan firefly:instructions update", "@php artisan passport:install" diff --git a/composer.lock b/composer.lock index ef8ccc9302..e8cc91569d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "791c69c034bda61790ac6e2f5ef3ae51", + "content-hash": "32e27901ae7f82adcc39e379836e298f", "packages": [ { "name": "adldap2/adldap2", @@ -591,16 +591,16 @@ }, { "name": "doctrine/dbal", - "version": "v2.9.1", + "version": "v2.9.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "ec74d6e300d78fbc896669c3ca57ef9719adc9c6" + "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec74d6e300d78fbc896669c3ca57ef9719adc9c6", - "reference": "ec74d6e300d78fbc896669c3ca57ef9719adc9c6", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", + "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", "shasum": "" }, "require": { @@ -669,7 +669,7 @@ "php", "queryobject" ], - "time": "2018-12-14T04:51:13+00:00" + "time": "2018-12-31T03:27:51+00:00" }, { "name": "doctrine/event-manager", @@ -1020,16 +1020,16 @@ }, { "name": "fideloper/proxy", - "version": "4.0.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a" + "reference": "177c79a2d1f9970f89ee2fb4c12b429af38b6dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/cf8a0ca4b85659b9557e206c90110a6a4dba980a", - "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/177c79a2d1f9970f89ee2fb4c12b429af38b6dfb", + "reference": "177c79a2d1f9970f89ee2fb4c12b429af38b6dfb", "shasum": "" }, "require": { @@ -1070,7 +1070,7 @@ "proxy", "trusted proxy" ], - "time": "2018-02-07T20:20:57+00:00" + "time": "2019-01-10T14:06:47+00:00" }, { "name": "firebase/php-jwt", @@ -1303,16 +1303,16 @@ }, { "name": "laravel/framework", - "version": "v5.7.19", + "version": "v5.7.24", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c" + "reference": "2ede55db4b8201ed0450fa7e7a4d7220aa29bc34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", - "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", + "url": "https://api.github.com/repos/laravel/framework/zipball/2ede55db4b8201ed0450fa7e7a4d7220aa29bc34", + "reference": "2ede55db4b8201ed0450fa7e7a4d7220aa29bc34", "shasum": "" }, "require": { @@ -1386,7 +1386,7 @@ "moontoast/math": "^1.1", "orchestra/testbench-core": "3.7.*", "pda/pheanstalk": "^3.0", - "phpunit/phpunit": "^7.0", + "phpunit/phpunit": "^7.5", "predis/predis": "^1.1.1", "symfony/css-selector": "^4.1", "symfony/dom-crawler": "^4.1", @@ -1445,7 +1445,7 @@ "framework", "laravel" ], - "time": "2018-12-18T14:00:38+00:00" + "time": "2019-01-29T22:13:46+00:00" }, { "name": "laravel/nexmo-notification-channel", @@ -1506,19 +1506,20 @@ }, { "name": "laravel/passport", - "version": "v7.0.3", + "version": "v7.1.0", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "404b345775c91cd04443e77e8d6164b9727a3448" + "reference": "b0c0dcbb8d7d61ba814b1e2cb404dbb4e1d8a852" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/404b345775c91cd04443e77e8d6164b9727a3448", - "reference": "404b345775c91cd04443e77e8d6164b9727a3448", + "url": "https://api.github.com/repos/laravel/passport/zipball/b0c0dcbb8d7d61ba814b1e2cb404dbb4e1d8a852", + "reference": "b0c0dcbb8d7d61ba814b1e2cb404dbb4e1d8a852", "shasum": "" }, "require": { + "ext-json": "*", "firebase/php-jwt": "~3.0|~4.0|~5.0", "guzzlehttp/guzzle": "~6.0", "illuminate/auth": "~5.6", @@ -1537,12 +1538,12 @@ }, "require-dev": { "mockery/mockery": "~1.0", - "phpunit/phpunit": "~6.0" + "phpunit/phpunit": "~7.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "7.0-dev" }, "laravel": { "providers": [ @@ -1571,7 +1572,7 @@ "oauth", "passport" ], - "time": "2018-10-22T14:47:22+00:00" + "time": "2019-01-22T14:41:41+00:00" }, { "name": "laravel/slack-notification-channel", @@ -1758,16 +1759,16 @@ }, { "name": "league/commonmark", - "version": "0.18.0", + "version": "0.18.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "006af077d4b1b7eb1d9760964f9f984ba188632c" + "reference": "e5029f74ba39e043ce4b3ca6c05dc719d8aafd94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/006af077d4b1b7eb1d9760964f9f984ba188632c", - "reference": "006af077d4b1b7eb1d9760964f9f984ba188632c", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/e5029f74ba39e043ce4b3ca6c05dc719d8aafd94", + "reference": "e5029f74ba39e043ce4b3ca6c05dc719d8aafd94", "shasum": "" }, "require": { @@ -1816,14 +1817,14 @@ "role": "Lead Developer" } ], - "description": "Markdown parser for PHP based on the CommonMark spec", + "description": "PHP Markdown parser based on the CommonMark spec", "homepage": "https://github.com/thephpleague/commonmark", "keywords": [ "commonmark", "markdown", "parser" ], - "time": "2018-09-18T13:13:55+00:00" + "time": "2018-12-30T01:55:29+00:00" }, { "name": "league/csv", @@ -1944,16 +1945,16 @@ }, { "name": "league/flysystem", - "version": "1.0.49", + "version": "1.0.50", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd" + "reference": "dab4e7624efa543a943be978008f439c333f2249" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a63cc83d8a931b271be45148fa39ba7156782ffd", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/dab4e7624efa543a943be978008f439c333f2249", + "reference": "dab4e7624efa543a943be978008f439c333f2249", "shasum": "" }, "require": { @@ -2024,7 +2025,7 @@ "sftp", "storage" ], - "time": "2018-11-23T23:41:29+00:00" + "time": "2019-02-01T08:50:36+00:00" }, { "name": "league/flysystem-replicate-adapter", @@ -2074,16 +2075,16 @@ }, { "name": "league/flysystem-sftp", - "version": "1.0.17", + "version": "1.0.18", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-sftp.git", - "reference": "49e216f1074b42e3ff344809e700672c2a3264ed" + "reference": "61bc5a6ade892b5ac81e62b8c21be2c1798acc2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-sftp/zipball/49e216f1074b42e3ff344809e700672c2a3264ed", - "reference": "49e216f1074b42e3ff344809e700672c2a3264ed", + "url": "https://api.github.com/repos/thephpleague/flysystem-sftp/zipball/61bc5a6ade892b5ac81e62b8c21be2c1798acc2a", + "reference": "61bc5a6ade892b5ac81e62b8c21be2c1798acc2a", "shasum": "" }, "require": { @@ -2112,7 +2113,7 @@ } ], "description": "Flysystem adapter for SFTP", - "time": "2018-10-14T21:07:28+00:00" + "time": "2019-01-07T11:56:21+00:00" }, { "name": "league/fractal", @@ -2411,16 +2412,16 @@ }, { "name": "nesbot/carbon", - "version": "1.36.1", + "version": "1.36.2", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983" + "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/63da8cdf89d7a5efe43aabc794365f6e7b7b8983", - "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", + "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", "shasum": "" }, "require": { @@ -2465,20 +2466,20 @@ "datetime", "time" ], - "time": "2018-11-22T18:23:02+00:00" + "time": "2018-12-28T10:07:33+00:00" }, { "name": "nexmo/client", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/Nexmo/nexmo-php.git", - "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4" + "reference": "3dc03ca1dab726a23b757110897740e54304fc65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/01809cc1e17a5af275913c49bb5d444eb6cc06d4", - "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4", + "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/3dc03ca1dab726a23b757110897740e54304fc65", + "reference": "3dc03ca1dab726a23b757110897740e54304fc65", "shasum": "" }, "require": { @@ -2513,20 +2514,20 @@ } ], "description": "PHP Client for using Nexmo's API.", - "time": "2018-12-17T10:47:50+00:00" + "time": "2019-01-02T09:06:47+00:00" }, { "name": "opis/closure", - "version": "3.1.2", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c" + "reference": "41f5da65d75cf473e5ee582df8fc7f2c733ce9d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/de00c69a2328d3ee5baa71fc584dc643222a574c", - "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c", + "url": "https://api.github.com/repos/opis/closure/zipball/41f5da65d75cf473e5ee582df8fc7f2c733ce9d6", + "reference": "41f5da65d75cf473e5ee582df8fc7f2c733ce9d6", "shasum": "" }, "require": { @@ -2539,7 +2540,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -2574,20 +2575,20 @@ "serialization", "serialize" ], - "time": "2018-12-16T21:48:23+00:00" + "time": "2019-01-14T14:45:33+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.2.2", + "version": "v2.2.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33" + "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/eccf915f45f911bfb189d1d1638d940ec6ee6e33", - "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/55af0dc01992b4d0da7f6372e2eac097bbbaffdb", + "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb", "shasum": "" }, "require": { @@ -2595,7 +2596,7 @@ }, "require-dev": { "phpunit/phpunit": "^6|^7", - "vimeo/psalm": "^1" + "vimeo/psalm": "^1|^2" }, "type": "library", "autoload": { @@ -2636,7 +2637,7 @@ "hex2bin", "rfc4648" ], - "time": "2018-03-10T19:47:49+00:00" + "time": "2019-01-03T20:26:31+00:00" }, { "name": "paragonie/random_compat", @@ -2851,16 +2852,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.13", + "version": "2.0.14", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "42603ce3f42a27f7e14e54feab95db7b680ad473" + "reference": "8ebfcadbf30524aeb75b2c446bc2519d5b321478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/42603ce3f42a27f7e14e54feab95db7b680ad473", - "reference": "42603ce3f42a27f7e14e54feab95db7b680ad473", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/8ebfcadbf30524aeb75b2c446bc2519d5b321478", + "reference": "8ebfcadbf30524aeb75b2c446bc2519d5b321478", "shasum": "" }, "require": { @@ -2939,7 +2940,7 @@ "x.509", "x509" ], - "time": "2018-12-16T17:45:25+00:00" + "time": "2019-01-27T19:37:29+00:00" }, { "name": "pragmarx/google2fa", @@ -3522,16 +3523,16 @@ }, { "name": "symfony/console", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0" + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0", - "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", "shasum": "" }, "require": { @@ -3587,7 +3588,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-11-27T07:40:44+00:00" + "time": "2019-01-04T15:13:53+00:00" }, { "name": "symfony/contracts", @@ -3659,16 +3660,16 @@ }, { "name": "symfony/css-selector", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd" + "reference": "76dac1dbe2830213e95892c7c2ec1edd74113ea4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", - "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/76dac1dbe2830213e95892c7c2ec1edd74113ea4", + "reference": "76dac1dbe2830213e95892c7c2ec1edd74113ea4", "shasum": "" }, "require": { @@ -3708,20 +3709,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:52:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/debug", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276" + "reference": "64cb33c81e37d19b7715d4a6a4d49c1c382066dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276", - "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276", + "url": "https://api.github.com/repos/symfony/debug/zipball/64cb33c81e37d19b7715d4a6a4d49c1c382066dd", + "reference": "64cb33c81e37d19b7715d4a6a4d49c1c382066dd", "shasum": "" }, "require": { @@ -3764,20 +3765,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-11-28T18:24:18+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "921f49c3158a276d27c0d770a5a347a3b718b328" + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328", - "reference": "921f49c3158a276d27c0d770a5a347a3b718b328", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/887de6d34c86cf0cb6cbf910afb170cdb743cb5e", + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e", "shasum": "" }, "require": { @@ -3828,20 +3829,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-12-01T08:52:38+00:00" + "time": "2019-01-05T16:37:49+00:00" }, { "name": "symfony/finder", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d" + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d", - "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d", + "url": "https://api.github.com/repos/symfony/finder/zipball/9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", "shasum": "" }, "require": { @@ -3877,20 +3878,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:52:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851" + "reference": "a633d422a09242064ba24e44a6e1494c5126de86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", - "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a633d422a09242064ba24e44a6e1494c5126de86", + "reference": "a633d422a09242064ba24e44a6e1494c5126de86", "shasum": "" }, "require": { @@ -3931,20 +3932,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-11-26T10:55:26+00:00" + "time": "2019-01-05T16:37:49+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624" + "reference": "83de6543328917c18d5498eeb6bb6d36f7aab31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624", - "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/83de6543328917c18d5498eeb6bb6d36f7aab31b", + "reference": "83de6543328917c18d5498eeb6bb6d36f7aab31b", "shasum": "" }, "require": { @@ -4020,7 +4021,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-12-06T17:39:52+00:00" + "time": "2019-01-06T16:19:23+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4067,7 +4068,7 @@ }, { "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "email": "backendtea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", @@ -4304,16 +4305,16 @@ }, { "name": "symfony/process", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0" + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/2b341009ccec76837a7f46f59641b431e4d4c2b0", - "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0", + "url": "https://api.github.com/repos/symfony/process/zipball/ea043ab5d8ed13b467a9087d81cb876aee7f689a", + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a", "shasum": "" }, "require": { @@ -4349,7 +4350,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-11-20T16:22:05+00:00" + "time": "2019-01-03T14:48:52+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -4414,16 +4415,16 @@ }, { "name": "symfony/routing", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "649460207e77da6c545326c7f53618d23ad2c866" + "reference": "e69b7a13a0b58af378a49b49dd7084462de16cee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866", - "reference": "649460207e77da6c545326c7f53618d23ad2c866", + "url": "https://api.github.com/repos/symfony/routing/zipball/e69b7a13a0b58af378a49b49dd7084462de16cee", + "reference": "e69b7a13a0b58af378a49b49dd7084462de16cee", "shasum": "" }, "require": { @@ -4487,20 +4488,20 @@ "uri", "url" ], - "time": "2018-12-03T22:08:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/translation", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6" + "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6", - "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6", + "url": "https://api.github.com/repos/symfony/translation/zipball/939fb792d73f2ce80e6ae9019d205fc480f1c9a0", + "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0", "shasum": "" }, "require": { @@ -4560,20 +4561,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-12-06T10:45:32+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "db61258540350725f4beb6b84006e32398acd120" + "reference": "85bde661b178173d85c6f11ea9d03b61d1212bb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120", - "reference": "db61258540350725f4beb6b84006e32398acd120", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/85bde661b178173d85c6f11ea9d03b61d1212bb2", + "reference": "85bde661b178173d85c6f11ea9d03b61d1212bb2", "shasum": "" }, "require": { @@ -4587,6 +4588,7 @@ }, "require-dev": { "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, @@ -4635,7 +4637,7 @@ "debug", "dump" ], - "time": "2018-11-25T12:50:42+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -4686,20 +4688,20 @@ }, { "name": "twig/twig", - "version": "v1.36.0", + "version": "v1.37.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "730c9c4471b5152d23061feb02b03382264c8a15" + "reference": "66be9366c76cbf23e82e7171d47cbfa54a057a62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/730c9c4471b5152d23061feb02b03382264c8a15", - "reference": "730c9c4471b5152d23061feb02b03382264c8a15", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/66be9366c76cbf23e82e7171d47cbfa54a057a62", + "reference": "66be9366c76cbf23e82e7171d47cbfa54a057a62", "shasum": "" }, "require": { - "php": ">=5.3.3", + "php": ">=5.4.0", "symfony/polyfill-ctype": "^1.8" }, "require-dev": { @@ -4710,7 +4712,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.36-dev" + "dev-master": "1.37-dev" } }, "autoload": { @@ -4748,24 +4750,25 @@ "keywords": [ "templating" ], - "time": "2018-12-16T10:34:11+00:00" + "time": "2019-01-14T14:59:29+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v2.5.1", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2a7dcf7e3e02dc5e701004e51a6f304b713107d5", + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.9", + "symfony/polyfill-ctype": "^1.9" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.0" @@ -4773,7 +4776,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -4798,7 +4801,7 @@ "env", "environment" ], - "time": "2018-07-29T20:33:41+00:00" + "time": "2019-01-29T11:11:52+00:00" }, { "name": "zendframework/zend-diactoros", @@ -4991,16 +4994,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660" + "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660", - "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d", + "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d", "shasum": "" }, "require": { @@ -5043,20 +5046,20 @@ "ssl", "tls" ], - "time": "2018-10-18T06:09:13+00:00" + "time": "2019-01-28T09:30:10+00:00" }, { "name": "composer/composer", - "version": "1.8.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "d8aef3af866b28786ce9b8647e52c42496436669" + "reference": "a6a3b44581398b7135c7baa0557b7c5b10808b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/d8aef3af866b28786ce9b8647e52c42496436669", - "reference": "d8aef3af866b28786ce9b8647e52c42496436669", + "url": "https://api.github.com/repos/composer/composer/zipball/a6a3b44581398b7135c7baa0557b7c5b10808b47", + "reference": "a6a3b44581398b7135c7baa0557b7c5b10808b47", "shasum": "" }, "require": { @@ -5123,7 +5126,7 @@ "dependency", "package" ], - "time": "2018-12-03T09:31:16+00:00" + "time": "2019-01-30T07:31:34+00:00" }, { "name": "composer/semver", @@ -5250,16 +5253,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "dc523135366eb68f22268d069ea7749486458562" + "reference": "d17708133b6c276d6e42ef887a877866b909d892" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/dc523135366eb68f22268d069ea7749486458562", - "reference": "dc523135366eb68f22268d069ea7749486458562", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", + "reference": "d17708133b6c276d6e42ef887a877866b909d892", "shasum": "" }, "require": { @@ -5290,7 +5293,7 @@ "Xdebug", "performance" ], - "time": "2018-11-29T10:59:02+00:00" + "time": "2019-01-28T20:25:53+00:00" }, { "name": "doctrine/instantiator", @@ -5555,23 +5558,23 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.7", + "version": "5.2.8", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "8560d4314577199ba51bf2032f02cd1315587c23" + "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23", - "reference": "8560d4314577199ba51bf2032f02cd1315587c23", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/dcb6e1006bb5fd1e392b4daa68932880f37550d4", + "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.1", + "friendsofphp/php-cs-fixer": "~2.2.20", "json-schema/json-schema-test-suite": "1.2.0", "phpunit/phpunit": "^4.8.35" }, @@ -5617,7 +5620,7 @@ "json", "schema" ], - "time": "2018-02-14T22:26:30+00:00" + "time": "2019-01-14T23:55:14+00:00" }, { "name": "mockery/mockery", @@ -6386,16 +6389,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.5.1", + "version": "7.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c23d78776ad415d5506e0679723cb461d71f488f" + "reference": "2cb759721e53bc05f56487f628c6b9fbb6c18746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c23d78776ad415d5506e0679723cb461d71f488f", - "reference": "c23d78776ad415d5506e0679723cb461d71f488f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2cb759721e53bc05f56487f628c6b9fbb6c18746", + "reference": "2cb759721e53bc05f56487f628c6b9fbb6c18746", "shasum": "" }, "require": { @@ -6466,7 +6469,7 @@ "testing", "xunit" ], - "time": "2018-12-12T07:20:32+00:00" + "time": "2019-02-01T05:24:07+00:00" }, { "name": "roave/security-advisories", @@ -6474,12 +6477,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "3557820049b07ea0fd088e4151ec200f474b58de" + "reference": "db876706aacd4ffbd1c253358d19a651e50e65c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/3557820049b07ea0fd088e4151ec200f474b58de", - "reference": "3557820049b07ea0fd088e4151ec200f474b58de", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/db876706aacd4ffbd1c253358d19a651e50e65c2", + "reference": "db876706aacd4ffbd1c253358d19a651e50e65c2", "shasum": "" }, "conflict": { @@ -6488,6 +6491,7 @@ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", "brightlocal/phpwhois": "<=4.2.5", @@ -6516,7 +6520,6 @@ "drupal/core": ">=7,<7.60|>=8,<8.5.8|>=8.6,<8.6.2", "drupal/drupal": ">=7,<7.60|>=8,<8.5.8|>=8.6,<8.6.2", "erusev/parsedown": "<1.7", - "ezsystems/ezplatform": "<1.7.8.1|>=1.8,<1.13.4.1|>=2,<2.2.3.1|>=2.3,<2.3.2.1", "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", @@ -6543,6 +6546,7 @@ "la-haute-societe/tcpdf": "<6.2.22", "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": ">=0.15.6,<0.18.1", "magento/magento1ce": "<1.9.4", "magento/magento1ee": ">=1.9,<1.14.4", "magento/product-community-edition": ">=2,<2.2.7", @@ -6556,6 +6560,7 @@ "pagarme/pagarme-php": ">=0,<3", "paragonie/random_compat": "<2", "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", "phpoffice/phpexcel": "<=1.8.1", "phpoffice/phpspreadsheet": "<=1.5", @@ -6576,7 +6581,7 @@ "silverstripe/userforms": "<3", "simple-updates/phpwhois": "<=1", "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.15.2", + "simplesamlphp/simplesamlphp": "<1.16.3", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "slim/slim": "<2.6", "smarty/smarty": "<3.1.33", @@ -6610,13 +6615,13 @@ "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1,<2.1.2|>=2.1.0-beta1,<2.1.3", + "thelia/thelia": ">=2.1.0-beta1,<2.1.3|>=2.1,<2.1.2", "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.20", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.21|>=9,<9.5.2", - "typo3/cms-core": ">=8,<8.7.21|>=9,<9.5.2", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.23|>=9,<9.5.4", + "typo3/cms-core": ">=8,<8.7.23|>=9,<9.5.4", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "ua-parser/uap-php": "<3.8", @@ -6668,7 +6673,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2018-12-14T13:12:19+00:00" + "time": "2019-01-22T18:37:22+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6837,28 +6842,31 @@ }, { "name": "sebastian/environment", - "version": "4.0.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", - "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^7.4" + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -6883,7 +6891,7 @@ "environment", "hhvm" ], - "time": "2018-11-25T09:31:21+00:00" + "time": "2019-02-01T05:27:49+00:00" }, { "name": "sebastian/exporter", @@ -7328,16 +7336,16 @@ }, { "name": "symfony/config", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "005d9a083d03f588677d15391a716b1ac9b887c0" + "reference": "a7a7d0a0244cfc82f040729ccf769e6cf55a78fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0", - "reference": "005d9a083d03f588677d15391a716b1ac9b887c0", + "url": "https://api.github.com/repos/symfony/config/zipball/a7a7d0a0244cfc82f040729ccf769e6cf55a78fb", + "reference": "a7a7d0a0244cfc82f040729ccf769e6cf55a78fb", "shasum": "" }, "require": { @@ -7387,20 +7395,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-11-30T22:21:14+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/filesystem", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "2f4c8b999b3b7cadb2a69390b01af70886753710" + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710", - "reference": "2f4c8b999b3b7cadb2a69390b01af70886753710", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", "shasum": "" }, "require": { @@ -7437,20 +7445,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:52:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "ec076716412274e51f8a7ea675d9515e5c311123" + "reference": "af62b35760fc92c8dbdce659b4eebdfe0e6a0472" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123", - "reference": "ec076716412274e51f8a7ea675d9515e5c311123", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/af62b35760fc92c8dbdce659b4eebdfe0e6a0472", + "reference": "af62b35760fc92c8dbdce659b4eebdfe0e6a0472", "shasum": "" }, "require": { @@ -7487,20 +7495,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:52:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/yaml", - "version": "v4.2.1", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c41175c801e3edfda90f32e292619d10c27103d7" + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7", - "reference": "c41175c801e3edfda90f32e292619d10c27103d7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", "shasum": "" }, "require": { @@ -7546,7 +7554,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:52:12+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "theseer/tokenizer", @@ -7590,20 +7598,21 @@ }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "phpunit/phpunit": "^4.6", @@ -7636,7 +7645,7 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2018-12-25T11:19:39+00:00" } ], "aliases": [], @@ -7652,6 +7661,7 @@ "ext-bcmath": "*", "ext-curl": "*", "ext-gd": "*", + "ext-tokenizer": "*", "ext-intl": "*", "ext-xml": "*", "ext-ldap": "*", diff --git a/config/adldap.php b/config/adldap.php index 4b879bcc0c..76303d5b62 100644 --- a/config/adldap.php +++ b/config/adldap.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + use Adldap\Schemas\ActiveDirectory; use Adldap\Schemas\FreeIPA; use Adldap\Schemas\OpenLDAP; diff --git a/config/adldap_auth.php b/config/adldap_auth.php index ec1ce2674c..88da45871b 100644 --- a/config/adldap_auth.php +++ b/config/adldap_auth.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + use Adldap\Laravel\Scopes\UidScope; use Adldap\Laravel\Scopes\UpnScope; @@ -9,9 +31,7 @@ $scopes = [ UidScope::class, ]; if ('FreeIPA' === env('ADLDAP_CONNECTION_SCHEME')) { - $scopes = [ - UpnScope::class, - ]; + $scopes = []; } if ('ActiveDirectory' === env('ADLDAP_CONNECTION_SCHEME')) { $scopes = [ diff --git a/config/csv.php b/config/csv.php index 19c61a31cb..02303455ee 100644 --- a/config/csv.php +++ b/config/csv.php @@ -141,102 +141,108 @@ return [ 'field' => 'external-id', ], - 'currency-symbol' => [ + 'currency-symbol' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'CurrencySymbol', 'field' => 'currency', 'mapper' => 'TransactionCurrencies', ], - 'description' => [ + 'description' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'description', ], - 'date-transaction' => [ + 'date-transaction' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date', ], - 'date-interest' => [ + 'date-interest' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-interest', ], - 'date-book' => [ + 'date-book' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-book', ], - 'date-process' => [ + 'date-process' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-process', ], - 'date-due' => [ + 'date-due' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-due', ], - 'date-payment' => [ + 'date-payment' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-payment', ], - 'date-invoice' => [ + 'date-invoice' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Date', 'field' => 'date-invoice', ], - 'budget-id' => [ + 'budget-id' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'BudgetId', 'field' => 'budget', 'mapper' => 'Budgets', ], - 'budget-name' => [ + 'budget-name' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'BudgetName', 'field' => 'budget', 'mapper' => 'Budgets', ], - 'rabo-debit-credit' => [ + 'rabo-debit-credit' => [ 'mappable' => false, 'pre-process-map' => false, - 'converter' => 'RabobankDebitCredit', + 'converter' => 'BankDebitCredit', 'field' => 'amount-modifier', ], - 'ing-debit-credit' => [ + 'ing-debit-credit' => [ 'mappable' => false, 'pre-process-map' => false, - 'converter' => 'INGDebitCredit', + 'converter' => 'BankDebitCredit', 'field' => 'amount-modifier', ], - 'category-id' => [ + 'generic-debit-credit' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'BankDebitCredit', + 'field' => 'amount-modifier', + ], + 'category-id' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'CategoryId', 'field' => 'category', 'mapper' => 'Categories', ], - 'category-name' => [ + 'category-name' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'CategoryName', 'field' => 'category', 'mapper' => 'Categories', ], - 'tags-comma' => [ + 'tags-comma' => [ 'mappable' => false, 'pre-process-map' => true, 'pre-process-mapper' => 'TagsComma', @@ -244,7 +250,7 @@ return [ 'converter' => 'TagsComma', 'mapper' => 'Tags', ], - 'tags-space' => [ + 'tags-space' => [ 'mappable' => false, 'pre-process-map' => true, 'pre-process-mapper' => 'TagsSpace', @@ -252,21 +258,21 @@ return [ 'converter' => 'TagsSpace', 'mapper' => 'Tags', ], - 'account-id' => [ + 'account-id' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'asset-account-id', 'converter' => 'AccountId', 'mapper' => 'AssetAccounts', ], - 'account-name' => [ + 'account-name' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'asset-account-name', 'converter' => 'AssetAccountName', 'mapper' => 'AssetAccounts', ], - 'account-iban' => [ + 'account-iban' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'asset-account-iban', @@ -274,78 +280,78 @@ return [ 'mapper' => 'AssetAccountIbans', ], - 'account-number' => [ + 'account-number' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'asset-account-number', 'converter' => 'AssetAccountNumber', 'mapper' => 'AssetAccounts', ], - 'account-bic' => [ + 'account-bic' => [ 'mappable' => false, 'pre-process-map' => false, 'field' => 'asset-account-bic', 'converter' => 'AccountBic', ], - 'opposing-id' => [ + 'opposing-id' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'opposing-account-id', 'converter' => 'AccountId', 'mapper' => 'OpposingAccounts', ], - 'opposing-bic' => [ + 'opposing-bic' => [ 'mappable' => false, 'pre-process-map' => false, 'field' => 'opposing-account-bic', 'converter' => 'AccountBic', ], - 'opposing-name' => [ + 'opposing-name' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'opposing-account-name', 'converter' => 'OpposingAccountName', 'mapper' => 'OpposingAccounts', ], - 'opposing-iban' => [ + 'opposing-iban' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'opposing-account-iban', 'converter' => 'OpposingAccountIban', 'mapper' => 'OpposingAccountIbans', ], - 'opposing-number' => [ + 'opposing-number' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'opposing-account-number', 'converter' => 'OpposingAccountNumber', 'mapper' => 'OpposingAccounts', ], - 'amount' => [ + 'amount' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Amount', 'field' => 'amount', ], - 'amount_debit' => [ + 'amount_debit' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'AmountDebit', 'field' => 'amount_debit', ], - 'amount_credit' => [ + 'amount_credit' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'AmountCredit', 'field' => 'amount_credit', ], - 'amount_negated' => [ + 'amount_negated' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'AmountNegated', 'field' => 'amount_negated', ], - 'amount_foreign' => [ + 'amount_foreign' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Amount', @@ -353,63 +359,63 @@ return [ ], // SEPA end to end ID - 'sepa-ct-id' => [ + 'sepa-ct-id' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_ct_id', ], // SEPA opposing account identifier - 'sepa-ct-op' => [ + 'sepa-ct-op' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_ct_op', ], // SEPA Direct Debit Mandate Identifier - 'sepa-db' => [ + 'sepa-db' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_db', ], // SEPA clearing code - 'sepa-cc' => [ + 'sepa-cc' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_cc', ], // SEPA country - 'sepa-country' => [ + 'sepa-country' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_country', ], // SEPA external purpose - 'sepa-ep' => [ + 'sepa-ep' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_ep', ], // SEPA creditor identifier - 'sepa-ci' => [ + 'sepa-ci' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_ci', ], // SEPA Batch ID - 'sepa-batch-id' => [ + 'sepa-batch-id' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', 'field' => 'sepa_batch', ], // Internal reference - 'internal-reference' => [ + 'internal-reference' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', diff --git a/config/firefly.php b/config/firefly.php index c78d788a74..2056381f44 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -24,6 +24,8 @@ declare(strict_types=1); use FireflyIII\Export\Exporter\CsvExporter; +use FireflyIII\Services\Currency\FixerIOv2; +use FireflyIII\Services\Currency\RatesApiIOv1; use FireflyIII\TransactionRules\Actions\AddTag; use FireflyIII\TransactionRules\Actions\AppendDescription; use FireflyIII\TransactionRules\Actions\AppendNotes; @@ -91,9 +93,9 @@ return [ 'is_demo_site' => false, ], 'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true, - 'version' => '4.7.9', - 'api_version' => '0.9.0', - 'db_version' => 6, + 'version' => '4.7.10', + 'api_version' => '0.9.1', + 'db_version' => 7, 'maxUploadSize' => 15242880, 'send_error_message' => env('SEND_ERROR_MESSAGE', true), 'site_owner' => env('SITE_OWNER', ''), @@ -111,6 +113,7 @@ return [ 'analytics_id' => env('ANALYTICS_ID', ''), 'disable_frame_header' => env('DISABLE_FRAME_HEADER', false), 'login_provider' => envNonEmpty('LOGIN_PROVIDER', 'eloquent'), + 'cer_provider' => envNonEmpty('CER_PROVIDER', 'fixer'), 'allowedMimes' => [ /* plain files */ 'text/plain', @@ -239,17 +242,19 @@ return [ ], 'shortNamesByFullName' => [ - 'Default account' => 'asset', - 'Asset account' => 'asset', - 'Import account' => 'import', - 'Expense account' => 'expense', - 'Beneficiary account' => 'expense', - 'Revenue account' => 'revenue', - 'Cash account' => 'cash', - 'Credit card' => 'liabilities', - 'Loan' => 'liabilities', - 'Debt' => 'liabilities', - 'Mortgage' => 'liabilities', + 'Default account' => 'asset', + 'Asset account' => 'asset', + 'Import account' => 'import', + 'Expense account' => 'expense', + 'Beneficiary account' => 'expense', + 'Revenue account' => 'revenue', + 'Cash account' => 'cash', + 'Initial balance account' => 'initial-balance', + 'Reconciliation account' => 'reconciliation', + 'Credit card' => 'liabilities', + 'Loan' => 'liabilities', + 'Debt' => 'liabilities', + 'Mortgage' => 'liabilities', ], 'shortLiabilityNameByFullName' => [ 'Credit card' => 'creditcard', @@ -258,32 +263,29 @@ return [ 'Mortgage' => 'mortgage', ], 'languages' => [ - // completed languages 'en_US' => ['name_locale' => 'English', 'name_english' => 'English'], - 'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish'], // 2018-10-26: 96% - 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German'], // 2018-10-26: 100% - 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], // 2018-10-26: 100% - //'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], // 2018-12-23: 65% - 'it_IT' => ['name_locale' => 'Italiano', 'name_english' => 'Italian'], // 2018-10-26: 100% - 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch'], // 2018-10-26: 100% - 'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish '], // 2018-10-26: 76% - 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], // 2018-10-26: 77% - 'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], // 2018-10-26: 80% - 'zh_TW' => ['name_locale' => 'Chinese Traditional', 'name_english' => 'Chinese Traditional'], // 2018-12-23: 99% + 'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish'], // 2019-01-28: 93% + 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German'], // 2019-01-28: 99% + 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], // 2019-01-28: 99% + //'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], // 2019-01-28: 65% + 'it_IT' => ['name_locale' => 'Italiano', 'name_english' => 'Italian'], // 2019-01-28: 100% + 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch'], // 2019-01-28: 100% + 'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish '], // 2019-01-28: 85% + 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], // 2019-01-28: 80% + 'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], // 2019-01-28: 83% + 'zh_TW' => ['name_locale' => 'Chinese Traditional', 'name_english' => 'Chinese Traditional'], // 2019-01-28: 99% + 'zh_CN' => ['name_locale' => 'Chinese Simplified', 'name_english' => 'Chinese Simplified'], // 2019-01-28: 99% //'tr_TR' => ['name_locale' => 'Türkçe', 'name_english' => 'Turkish'], // 2018-12-23: 70% - - // - - // very far away: - //'nb_NO' => ['name_locale' => 'Norwegian', 'name_english' => 'Norwegian'], // 2018-10-26: 52% - //'ca_ES' => ['name_locale' => 'Catalan', 'name_english' => 'Catalan'], // 2018-10-26: 0% - //'cs_CZ' => ['name_locale' => 'Czech', 'name_english' => 'Czech'], // 2018-10-26: 8% - //'he_IL' => ['name_locale' => 'Hebrew', 'name_english' => 'Hebrew'], // 2018-10-26: 3% - //'hu_HU' => ['name_locale' => 'Hungarian', 'name_english' => 'Hungarian'], // 2018-10-26: 40% - - //'sv_SE' => ['name_locale' => 'Svenska', 'name_english' => 'Swedish'], // 2018-11-21: 1% - //'sl_SI' => ['name_locale' => 'Slovenian', 'name_english' => 'Slovenian'], // 2018-10-26: 10% - //'uk_UA' => ['name_locale' => 'Ukranian', 'name_english' => 'Ukranian'], // 2018-10-26: 3% + //'nb_NO' => ['name_locale' => 'Norwegian', 'name_english' => 'Norwegian'], // 2019-01-28: 52% + //'ca_ES' => ['name_locale' => 'Catalan', 'name_english' => 'Catalan'], // 2019-01-28: 0% + //'ja_JA' => ['name_locale' => 'Japanese', 'name_english' => 'Japanese'], // 2019-01-28: 0% + //'cs_CZ' => ['name_locale' => 'Czech', 'name_english' => 'Czech'], // 2019-01-28: 8% + //'he_IL' => ['name_locale' => 'Hebrew', 'name_english' => 'Hebrew'], // 2019-01-28: 2% + //'hu_HU' => ['name_locale' => 'Hungarian', 'name_english' => 'Hungarian'], // 2019-01-28: 40% + //'sv_SE' => ['name_locale' => 'Svenska', 'name_english' => 'Swedish'], // 2019-01-28: 1% + //'sr_CS' => ['name_locale' => 'Serbian (Latin)', 'name_english' => 'Serbian (Latin)'], // 2019-01-28: 0% + //'sl_SI' => ['name_locale' => 'Slovenian', 'name_english' => 'Slovenian'], // 2019-01-28: 10% + //'uk_UA' => ['name_locale' => 'Ukranian', 'name_english' => 'Ukranian'], // 2019-01-28: 4% ], @@ -295,7 +297,7 @@ return [ 'transfer' => ['Transfer'], 'transfers' => ['Transfer'], ], - 'transactionTypesToShort' => [ + 'transactionTypesToShort' => [ 'Withdrawal' => 'withdrawal', 'Deposit' => 'deposit', 'Transfer' => 'transfer', @@ -477,4 +479,8 @@ return [ 'search_modifiers' => ['amount_is', 'amount', 'amount_max', 'amount_min', 'amount_less', 'amount_more', 'source', 'destination', 'category', 'budget', 'bill', 'type', 'date', 'date_before', 'date_after', 'on', 'before', 'after'], // tag notes has_attachments + 'cer_providers' => [ + 'fixer' => FixerIOv2::class, + 'ratesapi' => RatesApiIOv1::class, + ], ]; diff --git a/config/upgrade.php b/config/upgrade.php index ea56f43e47..03a7782640 100644 --- a/config/upgrade.php +++ b/config/upgrade.php @@ -25,23 +25,25 @@ return [ 'text' => [ 'upgrade' => [ - '4.3' => 'Make sure you run the migrations and clear your cache. If you need more help, please check Github or the Firefly III website.', - '4.6.3' => 'This will be the last version to require PHP7.0. Future versions will require PHP7.1 minimum.', - '4.6.4' => 'This version of Firefly III requires PHP7.1.', - '4.7.3' => 'This version of Firefly III handles bills differently. See http://bit.ly/FF3-new-bills for more information.', - '4.7.4' => 'This version of Firefly III has a new import routine. See http://bit.ly/FF3-new-import for more information.', - '4.7.6' => 'This will be the last version to require PHP7.1. Future versions will require PHP7.2 minimum.', - '4.7.7' => 'This version of Firefly III requires PHP7.2.', + '4.3' => 'Make sure you run the migrations and clear your cache. If you need more help, please check Github or the Firefly III website.', + '4.6.3' => 'This will be the last version to require PHP7.0. Future versions will require PHP7.1 minimum.', + '4.6.4' => 'This version of Firefly III requires PHP7.1.', + '4.7.3' => 'This version of Firefly III handles bills differently. See http://bit.ly/FF3-new-bills for more information.', + '4.7.4' => 'This version of Firefly III has a new import routine. See http://bit.ly/FF3-new-import for more information.', + '4.7.6' => 'This will be the last version to require PHP7.1. Future versions will require PHP7.2 minimum.', + '4.7.7' => 'This version of Firefly III requires PHP7.2.', + '4.7.10' => 'Firefly III no longer encrypts database values. To protect your data, make sure you use TDE or FDE. Read more: https://bit.ly/FF3-encryption', ], 'install' => [ - '4.3' => 'Welcome to Firefly! Make sure you follow the installation guide. If you need more help, please check Github or the Firefly III website. The installation guide has a FAQ which you should check out as well.', - '4.6.3' => 'This will be the last version to require PHP7.0. Future versions will require PHP7.1 minimum.', - '4.6.4' => 'This version of Firefly III requires PHP7.1.', - '4.7.3' => 'This version of Firefly III handles bills differently. See http://bit.ly/FF3-new-bills for more information.', - '4.7.4' => 'This version of Firefly III has a new import routine. See http://bit.ly/FF3-new-import for more information.', - '4.7.6' => 'This will be the last version to require PHP7.1. Future versions will require PHP7.2 minimum.', - '4.7.7' => 'This version of Firefly III requires PHP7.2.', + '4.3' => 'Welcome to Firefly! Make sure you follow the installation guide. If you need more help, please check Github or the Firefly III website. The installation guide has a FAQ which you should check out as well.', + '4.6.3' => 'This will be the last version to require PHP7.0. Future versions will require PHP7.1 minimum.', + '4.6.4' => 'This version of Firefly III requires PHP7.1.', + '4.7.3' => 'This version of Firefly III handles bills differently. See http://bit.ly/FF3-new-bills for more information.', + '4.7.4' => 'This version of Firefly III has a new import routine. See http://bit.ly/FF3-new-import for more information.', + '4.7.6' => 'This will be the last version to require PHP7.1. Future versions will require PHP7.2 minimum.', + '4.7.7' => 'This version of Firefly III requires PHP7.2.', + '4.7.10' => 'Firefly III no longer encrypts database values. To protect your data, make sure you use TDE or FDE. Read more: https://bit.ly/FF3-encryption', ], ], ]; diff --git a/database/factories/AccountFactory.php b/database/factories/AccountFactory.php index 055cb4cbb6..a48207abdf 100644 --- a/database/factories/AccountFactory.php +++ b/database/factories/AccountFactory.php @@ -37,4 +37,4 @@ $factory->define( 'active' => true, ]; } -); \ No newline at end of file +); diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index a4728e7945..ad3dc9dc58 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -1,4 +1,26 @@ . + */ + +declare(strict_types=1); /** * UserFactory.php * Copyright (c) 2018 thegrumpydictator@gmail.com diff --git a/database/migrations/2018_06_08_200526_changes_for_v475.php b/database/migrations/2018_06_08_200526_changes_for_v475.php index 427d74bc65..003c556ea4 100644 --- a/database/migrations/2018_06_08_200526_changes_for_v475.php +++ b/database/migrations/2018_06_08_200526_changes_for_v475.php @@ -1,4 +1,25 @@ . + */ + declare(strict_types=1); use Illuminate\Database\Migrations\Migration; @@ -50,10 +71,6 @@ class ChangesForV475 extends Migration $table->boolean('apply_rules')->default(true); $table->boolean('active')->default(true); - // also separate: - // category, budget, tags, notes, bill, piggy bank - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('transaction_type_id')->references('id')->on('transaction_types')->onDelete('cascade'); } diff --git a/database/migrations/2018_09_05_195147_changes_for_v477.php b/database/migrations/2018_09_05_195147_changes_for_v477.php index ba6ca35dcd..d155d5694a 100644 --- a/database/migrations/2018_09_05_195147_changes_for_v477.php +++ b/database/migrations/2018_09_05_195147_changes_for_v477.php @@ -1,5 +1,27 @@ . + */ + +declare(strict_types=1); + use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; diff --git a/database/migrations/2018_11_06_172532_changes_for_v479.php b/database/migrations/2018_11_06_172532_changes_for_v479.php index 039d0eec1b..2f79e4d015 100644 --- a/database/migrations/2018_11_06_172532_changes_for_v479.php +++ b/database/migrations/2018_11_06_172532_changes_for_v479.php @@ -1,4 +1,26 @@ . + */ + +declare(strict_types=1); use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; diff --git a/database/migrations/2019_01_28_193833_changes_for_v4710.php b/database/migrations/2019_01_28_193833_changes_for_v4710.php new file mode 100644 index 0000000000..011305f270 --- /dev/null +++ b/database/migrations/2019_01_28_193833_changes_for_v4710.php @@ -0,0 +1,60 @@ +increments('id'); + $table->timestamps(); + $table->softDeletes(); + $table->integer('user_id', false, true); + $table->string('title', 1024)->nullable(); + + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + } + ); + } + + if (!Schema::hasTable('group_journals')) { + Schema::create( + 'group_journals', + function (Blueprint $table) { + $table->increments('id'); + $table->integer('transaction_group_id', false, true); + $table->integer('transaction_journal_id', false, true); + + $table->foreign('transaction_group_id')->references('id')->on('transaction_groups')->onDelete('cascade'); + $table->foreign('transaction_journal_id')->references('id')->on('transaction_journals')->onDelete('cascade'); + + // unique combi: + $table->unique(['transaction_group_id', 'transaction_journal_id'],'unique_in_group'); + } + ); + } + + } +} diff --git a/database/seeds/TransactionCurrencySeeder.php b/database/seeds/TransactionCurrencySeeder.php index a3990f794a..0a49b642ab 100644 --- a/database/seeds/TransactionCurrencySeeder.php +++ b/database/seeds/TransactionCurrencySeeder.php @@ -68,6 +68,7 @@ class TransactionCurrencySeeder extends Seeder // PLEASE ADD NEW CURRENCIES BELOW THIS LINE $currencies[] = ['code' => 'ILS', 'name' => 'Israeli new shekel', 'symbol' => '₪', 'decimal_places' => 2]; $currencies[] = ['code' => 'CHF', 'name' => 'Swiss franc', 'symbol' => 'CHF', 'decimal_places' => 2]; + $currencies[] = ['code' => 'HRK', 'name' => 'Croatian kuna', 'symbol' => 'kn', 'decimal_places' => 2]; foreach ($currencies as $currency) { try { diff --git a/package-lock.json b/package-lock.json deleted file mode 100755 index 6346cac6c4..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,9400 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0" - } - }, - "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.2.2", - "@babel/helpers": "7.2.0", - "@babel/parser": "7.2.3", - "@babel/template": "7.2.2", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2", - "convert-source-map": "1.6.0", - "debug": "4.1.1", - "json5": "2.1.0", - "lodash": "4.17.11", - "resolve": "1.9.0", - "semver": "5.6.0", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", - "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", - "dev": true, - "requires": { - "@babel/types": "7.2.2", - "jsesc": "2.5.2", - "lodash": "4.17.11", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "7.1.0", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", - "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", - "dev": true, - "requires": { - "@babel/types": "7.2.2", - "esutils": "2.0.2" - } - }, - "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/types": "7.2.2", - "lodash": "4.17.11" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0", - "@babel/template": "7.2.2", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-module-transforms": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", - "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/template": "7.2.2", - "@babel/types": "7.2.2", - "lodash": "4.17.11" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-wrap-function": "7.2.0", - "@babel/template": "7.2.2", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-replace-supers": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", - "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "7.0.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, - "requires": { - "@babel/template": "7.2.2", - "@babel/types": "7.2.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "dev": true, - "requires": { - "@babel/types": "7.2.2" - } - }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/template": "7.2.2", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", - "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", - "dev": true, - "requires": { - "@babel/template": "7.2.2", - "@babel/traverse": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", - "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0", - "@babel/plugin-syntax-async-generators": "7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-json-strings": "7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", - "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.4.0" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", - "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", - "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "lodash": "4.17.11" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", - "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-define-map": "7.1.0", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.2.3", - "@babel/helper-split-export-declaration": "7.0.0", - "globals": "11.9.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", - "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", - "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.4.0" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", - "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", - "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "7.2.2", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", - "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "7.2.2", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-simple-access": "7.1.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", - "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "7.2.2", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.2.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", - "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "7.1.0", - "@babel/helper-get-function-arity": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz", - "integrity": "sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", - "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.2.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", - "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", - "dev": true, - "requires": { - "regenerator-transform": "0.13.3" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", - "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "resolve": "1.9.0", - "semver": "5.6.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", - "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", - "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.4.0" - } - }, - "@babel/preset-env": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.3.tgz", - "integrity": "sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-async-generator-functions": "7.2.0", - "@babel/plugin-proposal-json-strings": "7.2.0", - "@babel/plugin-proposal-object-rest-spread": "7.2.0", - "@babel/plugin-proposal-optional-catch-binding": "7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "7.2.0", - "@babel/plugin-syntax-async-generators": "7.2.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0", - "@babel/plugin-transform-arrow-functions": "7.2.0", - "@babel/plugin-transform-async-to-generator": "7.2.0", - "@babel/plugin-transform-block-scoped-functions": "7.2.0", - "@babel/plugin-transform-block-scoping": "7.2.0", - "@babel/plugin-transform-classes": "7.2.2", - "@babel/plugin-transform-computed-properties": "7.2.0", - "@babel/plugin-transform-destructuring": "7.2.0", - "@babel/plugin-transform-dotall-regex": "7.2.0", - "@babel/plugin-transform-duplicate-keys": "7.2.0", - "@babel/plugin-transform-exponentiation-operator": "7.2.0", - "@babel/plugin-transform-for-of": "7.2.0", - "@babel/plugin-transform-function-name": "7.2.0", - "@babel/plugin-transform-literals": "7.2.0", - "@babel/plugin-transform-modules-amd": "7.2.0", - "@babel/plugin-transform-modules-commonjs": "7.2.0", - "@babel/plugin-transform-modules-systemjs": "7.2.0", - "@babel/plugin-transform-modules-umd": "7.2.0", - "@babel/plugin-transform-new-target": "7.0.0", - "@babel/plugin-transform-object-super": "7.2.0", - "@babel/plugin-transform-parameters": "7.2.0", - "@babel/plugin-transform-regenerator": "7.0.0", - "@babel/plugin-transform-shorthand-properties": "7.2.0", - "@babel/plugin-transform-spread": "7.2.2", - "@babel/plugin-transform-sticky-regex": "7.2.0", - "@babel/plugin-transform-template-literals": "7.2.0", - "@babel/plugin-transform-typeof-symbol": "7.2.0", - "@babel/plugin-transform-unicode-regex": "7.2.0", - "browserslist": "4.3.6", - "invariant": "2.2.4", - "js-levenshtein": "1.1.4", - "semver": "5.6.0" - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-transform-react-display-name": "7.2.0", - "@babel/plugin-transform-react-jsx": "7.2.0", - "@babel/plugin-transform-react-jsx-self": "7.2.0", - "@babel/plugin-transform-react-jsx-source": "7.2.0" - } - }, - "@babel/runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", - "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", - "dev": true, - "requires": { - "regenerator-runtime": "0.12.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.2.3", - "@babel/types": "7.2.2" - } - }, - "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.2.2", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/parser": "7.2.3", - "@babel/types": "7.2.2", - "debug": "4.1.1", - "globals": "11.9.0", - "lodash": "4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", - "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@types/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", - "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", - "dev": true - }, - "@vue/component-compiler-utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.3.1.tgz", - "integrity": "sha512-8VuzMhHTf5UU7+HvBeEbBmYiNLvRxIXtDpvxUl5x26WBPgKmQuuJVFY3dN3GFgnWK9Rveh/u/8NF4quhdUUQ1Q==", - "dev": true, - "requires": { - "consolidate": "0.15.1", - "hash-sum": "1.0.2", - "lru-cache": "4.1.5", - "merge-source-map": "1.1.0", - "postcss": "6.0.23", - "postcss-selector-parser": "3.1.1", - "prettier": "1.13.7", - "source-map": "0.5.7", - "vue-template-es2015-compiler": "1.6.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "2.1.21", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "5.7.3" - } - }, - "adjust-sourcemap-loader": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz", - "integrity": "sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "1.2.1", - "loader-utils": "1.1.0", - "lodash.assign": "4.2.0", - "lodash.defaults": "3.1.2", - "object-path": "0.9.2", - "regex-parser": "2.2.9" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "3.2.0", - "lodash.restparam": "3.6.1" - }, - "dependencies": { - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._createassigner": "3.1.1", - "lodash.keys": "3.1.2" - } - } - } - } - } - }, - "ajv": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", - "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.3" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "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==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.3.tgz", - "integrity": "sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "caniuse-lite": "1.0.30000923", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "axios": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "dev": true, - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "1.1.6" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" - } - }, - "babel-loader": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", - "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", - "dev": true, - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "util.promisify": "1.0.0" - } - }, - "babel-merge": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-2.0.1.tgz", - "integrity": "sha512-puTQQxuzS+0JlMyVdfsTVaCgzqjBXKPMv7oUANpYcHFY+7IptWZ4PZDYX+qBxrRMtrriuBA44LkKpS99EJzqVA==", - "dev": true, - "requires": { - "@babel/core": "7.2.2", - "deepmerge": "2.2.1", - "object.omit": "3.0.0" - } - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "1.0.3" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "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==", - "dev": true - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", - "dev": true - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "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==", - "dev": true - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "2.1.2", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "bootstrap": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.2.1.tgz", - "integrity": "sha512-tt/7vIv3Gm2mnd/WeDx36nfGGHleil0Wg8IeB7eMrVkY0fZ5iTaBisSh8oNANc2IBsCc6vCgCNTIM/IEN0+50Q==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.1", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.7" - } - }, - "browserslist": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz", - "integrity": "sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000923", - "electron-to-chromium": "1.3.96", - "node-releases": "1.1.2" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "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==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", - "dev": true, - "requires": { - "bluebird": "3.5.3", - "chownr": "1.1.1", - "figgy-pudding": "3.5.1", - "glob": "7.1.3", - "graceful-fs": "4.1.15", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "3.0.3" - } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "caniuse-lite": "1.0.30000923", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000923", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz", - "integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w==", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" - }, - "dependencies": { - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.12.1", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "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.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "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, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "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" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "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" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "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 - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "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 - }, - "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.5", - "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, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "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.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.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 - }, - "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.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "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": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "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 - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, - "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==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", - "dev": true, - "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "1.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "1.5.1", - "chalk": "2.4.1", - "q": "1.5.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", - "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", - "dev": true, - "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", - "dev": true, - "requires": { - "mime-db": "1.37.0" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, - "requires": { - "accepts": "1.3.5", - "bytes": "3.0.0", - "compressible": "2.0.15", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.2", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "concatenate": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/concatenate/-/concatenate-0.0.2.tgz", - "integrity": "sha1-C0nW6MQQR9dyjNyNYqCGYjOXtJ8=", - "dev": true, - "requires": { - "globs": "0.1.4" - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "3.5.3" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "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==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", - "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", - "dev": true, - "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.1" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "cross-env": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", - "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.0.6", - "randomfill": "1.0.4" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "source-map": "0.6.1", - "source-map-resolve": "0.5.2", - "urix": "0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "7.0.7", - "timsort": "0.3.0" - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.1", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash": "4.17.11", - "postcss": "6.0.23", - "postcss-modules-extract-imports": "1.2.1", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.1", - "source-list-map": "2.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.2", - "domutils": "1.7.0", - "nth-check": "1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.2", - "regexpu-core": "1.0.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } - } - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", - "dev": true, - "requires": { - "mdn-data": "1.1.4", - "source-map": "0.5.7" - } - }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", - "dev": true - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, - "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.8.tgz", - "integrity": "sha512-5GIY0VzAHORpbKiL3rMXp4w4M1Ki+XlXgEXyuWXVd3h6hlASb+9Vo76dNP56/elLMVBBsUfusCo1q56uW0UWig==", - "dev": true, - "requires": { - "cosmiconfig": "5.0.7", - "cssnano-preset-default": "4.0.6", - "is-resolvable": "1.1.0", - "postcss": "7.0.7" - } - }, - "cssnano-preset-default": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.6.tgz", - "integrity": "sha512-UPboYbFaJFtDUhJ4fqctThWbbyF4q01/7UhsZbLzp35l+nUxtzh1SifoVlEfyLM3n3Z0htd8B1YlCxy9i+bQvg==", - "dev": true, - "requires": { - "css-declaration-sorter": "4.0.1", - "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.7", - "postcss-calc": "7.0.1", - "postcss-colormin": "4.0.2", - "postcss-convert-values": "4.0.1", - "postcss-discard-comments": "4.0.1", - "postcss-discard-duplicates": "4.0.2", - "postcss-discard-empty": "4.0.1", - "postcss-discard-overridden": "4.0.1", - "postcss-merge-longhand": "4.0.10", - "postcss-merge-rules": "4.0.2", - "postcss-minify-font-values": "4.0.2", - "postcss-minify-gradients": "4.0.1", - "postcss-minify-params": "4.0.1", - "postcss-minify-selectors": "4.0.1", - "postcss-normalize-charset": "4.0.1", - "postcss-normalize-display-values": "4.0.1", - "postcss-normalize-positions": "4.0.1", - "postcss-normalize-repeat-style": "4.0.1", - "postcss-normalize-string": "4.0.1", - "postcss-normalize-timing-functions": "4.0.1", - "postcss-normalize-unicode": "4.0.1", - "postcss-normalize-url": "4.0.1", - "postcss-normalize-whitespace": "4.0.1", - "postcss-ordered-values": "4.1.1", - "postcss-reduce-initial": "4.0.2", - "postcss-reduce-transforms": "4.0.1", - "postcss-svgo": "4.0.1", - "postcss-unique-selectors": "4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "1.1.4", - "source-map": "0.5.7" - } - } - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "dev": true - }, - "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", - "dev": true, - "requires": { - "execa": "0.10.0", - "ip-regex": "2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.3", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "1.1.1" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.2" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", - "dev": true - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz", - "integrity": "sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q==", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "memory-fs": "0.4.1", - "tapable": "1.1.1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", - "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", - "dev": true, - "requires": { - "stackframe": "1.0.4" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" - } - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "0.11.23", - "through": "2.3.8" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "6.0.5", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", - "qs": "6.5.2", - "range-parser": "1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "extract-text-webpack-plugin": { - "version": "4.0.0-beta.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", - "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", - "dev": true, - "requires": { - "async": "2.6.1", - "loader-utils": "1.1.0", - "schema-utils": "0.4.7", - "webpack-sources": "1.3.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-glob": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz", - "integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "@nodelib/fs.stat": "1.1.3", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.3", - "micromatch": "3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" - } - } - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "error-stack-parser": "2.0.2", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - }, - "globby": { - "version": "8.0.1", - "resolved": "http://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.4", - "glob": "7.1.3", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "globs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz", - "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==", - "dev": true, - "requires": { - "glob": "7.1.3" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", - "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", - "dev": true, - "requires": { - "es6-templates": "0.2.3", - "fastparse": "1.1.2", - "html-minifier": "3.5.21", - "loader-utils": "1.1.0", - "object-assign": "4.1.1" - } - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.1", - "commander": "2.17.1", - "he": "1.2.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.9" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.4.0" - } - }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.5.10", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "dev": true, - "requires": { - "http-proxy": "1.17.0", - "is-glob": "4.0.0", - "lodash": "4.17.11", - "micromatch": "3.1.10" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "6.0.23" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imagemin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.0.0.tgz", - "integrity": "sha512-m4Mxwt2QvCp1F85HXoTungXk0Y6XzuvQGqrK9qEddQfo/7x4aZjRENmyXXfc29ei4Mk55rW002bORG86YM3/aQ==", - "dev": true, - "requires": { - "file-type": "8.1.0", - "globby": "8.0.1", - "make-dir": "1.3.0", - "p-pipe": "1.2.0", - "pify": "3.0.0", - "replace-ext": "1.0.0" - } - }, - "img-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.1.tgz", - "integrity": "sha512-0jDJqexgzOuq3zlXwFTBKJlMcaP1uXyl5t4Qu6b1IgXb3IwBDjPfVylBC8vHFIIESDw/S+5QkBbtBrt4T8wESA==", - "dev": true, - "requires": { - "loader-utils": "1.1.0" - } - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", - "dev": true, - "requires": { - "default-gateway": "2.7.2", - "ipaddr.js": "1.8.0" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.12.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "hex-color-regex": "1.1.0", - "hsl-regex": "1.0.0", - "hsla-regex": "1.0.0", - "rgb-regex": "1.0.1", - "rgba-regex": "1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.3" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "1.1.2" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "1.0.0" - } - }, - "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", - "dev": true - }, - "js-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "laravel-mix": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-4.0.12.tgz", - "integrity": "sha512-N5FKifKLxMpQ2fFXgX4R7kBoor3iWT/tEXS2jwSmsmwD6WQg6eQwJfHenm4WNkVeYhq5MW3V+PZuI4Vu85HrsA==", - "dev": true, - "requires": { - "@babel/core": "7.2.2", - "@babel/plugin-proposal-object-rest-spread": "7.2.0", - "@babel/plugin-transform-runtime": "7.2.0", - "@babel/preset-env": "7.2.3", - "@babel/runtime": "7.2.0", - "autoprefixer": "9.4.3", - "babel-loader": "8.0.4", - "babel-merge": "2.0.1", - "chokidar": "2.0.4", - "clean-css": "4.2.1", - "concatenate": "0.0.2", - "css-loader": "1.0.1", - "dotenv": "6.2.0", - "dotenv-expand": "4.2.0", - "extract-text-webpack-plugin": "4.0.0-beta.0", - "file-loader": "2.0.0", - "friendly-errors-webpack-plugin": "1.7.0", - "fs-extra": "7.0.1", - "glob": "7.1.3", - "html-loader": "0.5.5", - "imagemin": "6.0.0", - "img-loader": "3.0.1", - "lodash": "4.17.11", - "md5": "2.2.1", - "optimize-css-assets-webpack-plugin": "5.0.1", - "postcss-loader": "3.0.0", - "style-loader": "0.23.1", - "terser": "3.13.1", - "terser-webpack-plugin": "1.2.0", - "vue-loader": "15.4.2", - "webpack": "4.28.2", - "webpack-cli": "3.1.2", - "webpack-dev-server": "3.1.13", - "webpack-merge": "4.1.5", - "webpack-notifier": "1.7.0", - "yargs": "12.0.5" - } - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "4.17.11", - "webpack-sources": "1.3.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "2.0.0" - } - }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9", - "lodash.restparam": "3.6.1" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "1.37.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.3" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "1.1.4" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.4", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-notifier": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", - "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", - "dev": true, - "requires": { - "growly": "1.3.0", - "semver": "5.6.0", - "shellwords": "0.1.1", - "which": "1.3.0" - } - }, - "node-releases": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.2.tgz", - "integrity": "sha512-j1gEV/zX821yxdWp/1vBMN0pSUjuH9oGUdLCb4PfUko6ZW7KdRs3Z+QGGwDUhYtSpQvdVVyLd2V0YvLsmdg5jQ==", - "dev": true, - "requires": { - "semver": "5.6.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.12.0" - } - }, - "object.omit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "dev": true, - "requires": { - "is-extendable": "1.0.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.12.0", - "function-bind": "1.1.1", - "has": "1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", - "dev": true, - "requires": { - "cssnano": "4.1.8", - "last-call-webpack-plugin": "3.0.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "1.4.4" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "0.10.0", - "lcid": "2.0.0", - "mem": "4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", - "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "2.3.2" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "popper.js": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.6.tgz", - "integrity": "sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA==", - "dev": true - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.7.tgz", - "integrity": "sha512-HThWSJEPkupqew2fnuQMEI2YcTj/8gMV3n80cMdJsKxfIh5tHf7nM5JigNX6LxVMqo6zkgQNAI88hyFvBk41Pg==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", - "dev": true, - "requires": { - "css-unit-converter": "1.1.1", - "postcss": "7.0.7", - "postcss-selector-parser": "5.0.0", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-colormin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.2.tgz", - "integrity": "sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "color": "3.1.0", - "has": "1.0.3", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-discard-comments": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz", - "integrity": "sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "4.0.0", - "import-cwd": "2.1.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "postcss": "7.0.7", - "postcss-load-config": "2.0.0", - "schema-utils": "1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.10.tgz", - "integrity": "sha512-hME10s6CSjm9nlVIcO1ukR7Jr5RisTaaC1y83jWCivpuBtPohA3pZE7cGTIVSYjXvLnXozHTiVOkG4dnnl756g==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1", - "stylehacks": "4.0.1" - } - }, - "postcss-merge-rules": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz", - "integrity": "sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "caniuse-api": "3.0.0", - "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.7", - "postcss-selector-parser": "3.1.1", - "vendors": "1.0.2" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-minify-gradients": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz", - "integrity": "sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "4.0.0", - "is-color-stop": "1.1.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-minify-params": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz", - "integrity": "sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg==", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "browserslist": "4.3.6", - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz", - "integrity": "sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg==", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "7.0.7", - "postcss-selector-parser": "3.1.1" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "6.0.23" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.23" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "7.0.7" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-positions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz", - "integrity": "sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz", - "integrity": "sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "4.0.0", - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-string": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz", - "integrity": "sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ==", - "dev": true, - "requires": { - "has": "1.0.3", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz", - "integrity": "sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w==", - "dev": true, - "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "3.3.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz", - "integrity": "sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw==", - "dev": true, - "requires": { - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-ordered-values": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz", - "integrity": "sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-reduce-initial": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz", - "integrity": "sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "caniuse-api": "3.0.0", - "has": "1.0.3", - "postcss": "7.0.7" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz", - "integrity": "sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA==", - "dev": true, - "requires": { - "cssnano-util-get-match": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "2.0.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.1.tgz", - "integrity": "sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw==", - "dev": true, - "requires": { - "is-svg": "3.0.0", - "postcss": "7.0.7", - "postcss-value-parser": "3.3.1", - "svgo": "1.1.1" - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "7.0.7", - "uniqs": "2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "prettier": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", - "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dev": true, - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "3.6.1", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "react": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", - "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", - "dev": true, - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "scheduler": "0.12.0" - } - }, - "react-dom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", - "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", - "dev": true, - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "scheduler": "0.12.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", - "dev": true, - "requires": { - "regenerate": "1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", - "dev": true, - "requires": { - "private": "0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regex-parser": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.9.tgz", - "integrity": "sha512-VncXxOF6uFlYog5prG2j+e2UGJeam5MfNiJnB/qEgo4KTnMm2XrELCg4rNZ6IlaEUZnGlb8aB6lXowCRQtTkkA==", - "dev": true - }, - "regexpu-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", - "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.5.0", - "regjsparser": "0.6.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", - "dev": true, - "requires": { - "path-parse": "1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-2.3.1.tgz", - "integrity": "sha512-tpt4A/tOT8jxRDa91RbBV4c22AGj+WllOxT8rYSYhT2XDdL33Nca9HudwVx4mvP9PLokz+wpCu44tWUGVMYYLA==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "1.2.0", - "camelcase": "4.1.0", - "convert-source-map": "1.6.0", - "loader-utils": "1.1.0", - "lodash.defaults": "4.2.0", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.5.7", - "urix": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "0.3.5", - "css": "2.2.4" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "1.2.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.15.2.tgz", - "integrity": "sha512-YFncPpx3ewKEhMg9sWdCxKUpPN/jwVLa0Q9iO2tcV5Y5Z/YAlFV6k6JaQwq3tmbN6FXKjUYElXRHcG0g4D1zkQ==", - "dev": true, - "requires": { - "chokidar": "2.0.4" - } - }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", - "dev": true, - "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "neo-async": "2.6.0", - "pify": "3.0.0", - "semver": "5.6.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "scheduler": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", - "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", - "dev": true, - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-keywords": "3.2.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "1.3.5", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.21", - "parseurl": "1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", - "dev": true, - "requires": { - "is-extendable": "0.1.1", - "kind-of": "5.1.0", - "mixin-object": "2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "0.3.2" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.2" - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "dev": true, - "requires": { - "debug": "3.2.6", - "eventsource": "1.0.7", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", - "dev": true, - "requires": { - "debug": "4.1.1", - "handle-thing": "2.0.0", - "http-deceiver": "1.2.7", - "select-hose": "2.0.0", - "spdy-transport": "3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "4.1.1", - "detect-node": "2.0.4", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "3.1.0", - "wbuf": "1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "readable-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.0.tgz", - "integrity": "sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.1.tgz", - "integrity": "sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w==", - "dev": true, - "requires": { - "browserslist": "4.3.6", - "postcss": "7.0.7", - "postcss-selector-parser": "3.1.1" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "svgo": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz", - "integrity": "sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g==", - "dev": true, - "requires": { - "coa": "2.0.2", - "colors": "1.1.2", - "css-select": "2.0.2", - "css-select-base-adapter": "0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "1.1.0", - "csso": "3.5.1", - "js-yaml": "3.12.0", - "mkdirp": "0.5.1", - "object.values": "1.0.4", - "sax": "1.2.4", - "stable": "0.1.8", - "unquote": "1.1.1", - "util.promisify": "1.0.0" - } - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "terser": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.13.1.tgz", - "integrity": "sha512-ogyZye4DFqOtMzT92Y3Nxxw8OvXmL39HOALro4fc+EUYFFF9G/kk0znkvwMz6PPYgBtdKAodh3FPR70eugdaQA==", - "dev": true, - "requires": { - "commander": "2.17.1", - "source-map": "0.6.1", - "source-map-support": "0.5.9" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.0.tgz", - "integrity": "sha512-QW7RACLS89RalHtLDb0s8+Iqcs/IAEw1rnVrV+mS7Gx1kgPG8o1g33JhAGDgc/CQ84hLsTW5WrAMdVysh692yg==", - "dev": true, - "requires": { - "cacache": "11.3.2", - "find-cache-dir": "2.0.0", - "schema-utils": "1.0.0", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "terser": "3.13.1", - "webpack-sources": "1.3.0", - "worker-farm": "1.6.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.21" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "requires": { - "commander": "2.17.1", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "1.0.4", - "unicode-property-aliases-ecmascript": "1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "2.0.1" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "2.1.1" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", - "dev": true, - "requires": { - "querystringify": "2.1.0", - "requires-port": "1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.0.3" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vue-hot-reload-api": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz", - "integrity": "sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==", - "dev": true - }, - "vue-loader": { - "version": "15.4.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.4.2.tgz", - "integrity": "sha512-nVV27GNIA9MeoD8yQ3dkUzwlAaAsWeYSWZHsu/K04KCD339lW0Jv2sJWsjj3721SP7sl2lYdPmjcHgkWQSp5bg==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "2.3.1", - "hash-sum": "1.0.2", - "loader-utils": "1.1.0", - "vue-hot-reload-api": "2.3.1", - "vue-style-loader": "4.1.2" - } - }, - "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", - "dev": true, - "requires": { - "hash-sum": "1.0.2", - "loader-utils": "1.1.0" - } - }, - "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==", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.15", - "neo-async": "2.6.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "1.0.1" - } - }, - "webpack": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.2.tgz", - "integrity": "sha512-PK3uVg3/NuNVOjPfYleFI6JF7khO7c2kIlksH7mivQm+QDcwiqV1x6+q89dDeOioh5FNxJHr3LKbDu3oSAhl9g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.6.2", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.1", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.0", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.7", - "tapable": "1.1.1", - "terser-webpack-plugin": "1.2.0", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" - } - }, - "webpack-cli": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", - "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "global-modules-path": "2.3.1", - "import-local": "2.0.0", - "interpret": "1.1.0", - "loader-utils": "1.1.0", - "supports-color": "5.5.0", - "v8-compile-cache": "2.0.2", - "yargs": "12.0.5" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", - "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "2.4.0", - "range-parser": "1.2.0", - "webpack-log": "2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.13.tgz", - "integrity": "sha512-o+crjlyTDCAnkZe1CGlP2XLGCgnMN6oSotYdB+r5OGbnf52Dl9T/fCOdKObvanl1jEnMuLBVDnjTXEmCMMksww==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "2.0.4", - "compression": "1.7.3", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.4", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.18.0", - "import-local": "2.0.0", - "internal-ip": "3.0.1", - "ip": "1.1.5", - "killable": "1.0.1", - "loglevel": "1.6.1", - "opn": "5.4.0", - "portfinder": "1.0.20", - "schema-utils": "1.0.0", - "selfsigned": "1.10.4", - "semver": "5.6.0", - "serve-index": "1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "4.0.0", - "strip-ansi": "3.0.1", - "supports-color": "5.5.0", - "url": "0.11.0", - "webpack-dev-middleware": "3.4.0", - "webpack-log": "2.0.0", - "yargs": "12.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" - } - }, - "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "2.0.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "10.1.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "uuid": "3.3.2" - } - }, - "webpack-merge": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.5.tgz", - "integrity": "sha512-sVcM+MMJv6DO0C0GLLltx8mUlGMKXE0zBsuMqZ9jz2X9gsekALw6Rs0cAfTWc97VuWS6NpVUa78959zANnMMLQ==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "webpack-notifier": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.7.0.tgz", - "integrity": "sha512-L3UKrl500xk0VDYKkwQxy5/BPhBWsZ2xHsAx2Qe3dVKYUEk9+y690RcNTMIUcVOK2fRgK7KK3PA4ccOq1h+fTg==", - "dev": true, - "requires": { - "node-notifier": "5.3.0", - "object-assign": "4.1.1", - "strip-ansi": "3.0.1" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": "0.5.0", - "websocket-extensions": "0.1.3" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" - } - } - } -} diff --git a/package.json b/package.json index 470bc90640..bd9df38cf5 100755 --- a/package.json +++ b/package.json @@ -3,26 +3,22 @@ "scripts": { "dev": "npm run development", "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "watch": "npm run development -- --watch", + "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", "watch-poll": "npm run watch -- --watch-poll", "hot": "cross-env 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": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" }, "devDependencies": { - "@babel/preset-react": "^7.0.0", - "axios": "^0.18", - "babel-preset-react": "^6.23.0", - "bootstrap": "^4.0.0", + "axios": "^0.17", + "bootstrap-sass": "^3.3.7", "cross-env": "^5.1", - "jquery": "^3.2", - "laravel-mix": "^4.0.7", - "lodash": "^4.17.5", - "popper.js": "^1.12", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "resolve-url-loader": "^2.3.1", - "sass": "^1.15.2", - "sass-loader": "^7.1.0" + "jquery": "^3.1.1", + "laravel-mix": "^1.0", + "lodash": "^4.17.4", + "vue": "^2.5.7" + }, + "dependencies": { + "font-awesome": "^4.7.0" } } diff --git a/phpunit.coverage.specific.xml b/phpunit.coverage.specific.xml index 9448630a43..da7d5b821d 100644 --- a/phpunit.coverage.specific.xml +++ b/phpunit.coverage.specific.xml @@ -1,4 +1,24 @@ + + + + + + + + diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 2d60117130..1e2e701dc1 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,4 +1,3 @@ { - "/js/app.js": "/js/app.js", - "/css/app.css": "/css/app.css" -} + "/v1/js/app.js": "/v1/js/app.js" +} \ No newline at end of file diff --git a/public/v1/js/app.js b/public/v1/js/app.js index 16deb1ca6c..5b86336397 100644 --- a/public/v1/js/app.js +++ b/public/v1/js/app.js @@ -1 +1 @@ -!function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=12)}([function(t,e,n){"use strict";var r=n(6),i=n(21),o=Object.prototype.toString;function a(t){return"[object Array]"===o.call(t)}function s(t){return null!==t&&"object"==typeof t}function u(t){return"[object Function]"===o.call(t)}function c(t,e){if(null!==t&&void 0!==t)if("object"!=typeof t&&(t=[t]),a(t))for(var n=0,r=t.length;n=200&&t<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],function(t){u.headers[t]={}}),r.forEach(["post","put","patch"],function(t){u.headers[t]=r.merge(o)}),t.exports=u}).call(e,n(7))},function(t,e){t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var n=function(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var i=(a=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),o=r.sources.map(function(t){return"/*# sourceURL="+r.sourceRoot+t+" */"});return[n].concat(o).concat([i]).join("\n")}var a;return[n].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},i=0;in.parts.length&&(r.parts.length=n.parts.length)}else{var a=[];for(i=0;i1)for(var n=1;n>>1,q=[["ary",T],["bind",g],["bindKey",y],["curry",_],["curryRight",w],["flip",$],["partial",x],["partialRight",C],["rearg",k]],B="[object Arguments]",H="[object Array]",U="[object AsyncFunction]",W="[object Boolean]",z="[object Date]",V="[object DOMException]",X="[object Error]",K="[object Function]",J="[object GeneratorFunction]",G="[object Map]",Q="[object Number]",Y="[object Null]",Z="[object Object]",tt="[object Proxy]",et="[object RegExp]",nt="[object Set]",rt="[object String]",it="[object Symbol]",ot="[object Undefined]",at="[object WeakMap]",st="[object WeakSet]",ut="[object ArrayBuffer]",ct="[object DataView]",lt="[object Float32Array]",ft="[object Float64Array]",pt="[object Int8Array]",dt="[object Int16Array]",ht="[object Int32Array]",vt="[object Uint8Array]",mt="[object Uint8ClampedArray]",gt="[object Uint16Array]",yt="[object Uint32Array]",bt=/\b__p \+= '';/g,_t=/\b(__p \+=) '' \+/g,wt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,xt=/&(?:amp|lt|gt|quot|#39);/g,Ct=/[&<>"']/g,Tt=RegExp(xt.source),kt=RegExp(Ct.source),$t=/<%-([\s\S]+?)%>/g,At=/<%([\s\S]+?)%>/g,St=/<%=([\s\S]+?)%>/g,Et=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ot=/^\w*$/,jt=/^\./,Nt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Dt=/[\\^$.*+?()[\]{}|]/g,It=RegExp(Dt.source),Lt=/^\s+|\s+$/g,Rt=/^\s+/,Pt=/\s+$/,Ft=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Mt=/\{\n\/\* \[wrapped with (.+)\] \*/,qt=/,? & /,Bt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ht=/\\(\\)?/g,Ut=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Wt=/\w*$/,zt=/^[-+]0x[0-9a-f]+$/i,Vt=/^0b[01]+$/i,Xt=/^\[object .+?Constructor\]$/,Kt=/^0o[0-7]+$/i,Jt=/^(?:0|[1-9]\d*)$/,Gt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Qt=/($^)/,Yt=/['\n\r\u2028\u2029\\]/g,Zt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",te="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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",ee="[\\ud800-\\udfff]",ne="["+te+"]",re="["+Zt+"]",ie="\\d+",oe="[\\u2700-\\u27bf]",ae="[a-z\\xdf-\\xf6\\xf8-\\xff]",se="[^\\ud800-\\udfff"+te+ie+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ue="\\ud83c[\\udffb-\\udfff]",ce="[^\\ud800-\\udfff]",le="(?:\\ud83c[\\udde6-\\uddff]){2}",fe="[\\ud800-\\udbff][\\udc00-\\udfff]",pe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",de="(?:"+ae+"|"+se+")",he="(?:"+pe+"|"+se+")",ve="(?:"+re+"|"+ue+")"+"?",me="[\\ufe0e\\ufe0f]?"+ve+("(?:\\u200d(?:"+[ce,le,fe].join("|")+")[\\ufe0e\\ufe0f]?"+ve+")*"),ge="(?:"+[oe,le,fe].join("|")+")"+me,ye="(?:"+[ce+re+"?",re,le,fe,ee].join("|")+")",be=RegExp("['’]","g"),_e=RegExp(re,"g"),we=RegExp(ue+"(?="+ue+")|"+ye+me,"g"),xe=RegExp([pe+"?"+ae+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[ne,pe,"$"].join("|")+")",he+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[ne,pe+de,"$"].join("|")+")",pe+"?"+de+"+(?:['’](?:d|ll|m|re|s|t|ve))?",pe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)","\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)",ie,ge].join("|"),"g"),Ce=RegExp("[\\u200d\\ud800-\\udfff"+Zt+"\\ufe0e\\ufe0f]"),Te=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ke=["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"],$e=-1,Ae={};Ae[lt]=Ae[ft]=Ae[pt]=Ae[dt]=Ae[ht]=Ae[vt]=Ae[mt]=Ae[gt]=Ae[yt]=!0,Ae[B]=Ae[H]=Ae[ut]=Ae[W]=Ae[ct]=Ae[z]=Ae[X]=Ae[K]=Ae[G]=Ae[Q]=Ae[Z]=Ae[et]=Ae[nt]=Ae[rt]=Ae[at]=!1;var Se={};Se[B]=Se[H]=Se[ut]=Se[ct]=Se[W]=Se[z]=Se[lt]=Se[ft]=Se[pt]=Se[dt]=Se[ht]=Se[G]=Se[Q]=Se[Z]=Se[et]=Se[nt]=Se[rt]=Se[it]=Se[vt]=Se[mt]=Se[gt]=Se[yt]=!0,Se[X]=Se[K]=Se[at]=!1;var Ee={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Oe=parseFloat,je=parseInt,Ne="object"==typeof t&&t&&t.Object===Object&&t,De="object"==typeof self&&self&&self.Object===Object&&self,Ie=Ne||De||Function("return this")(),Le="object"==typeof e&&e&&!e.nodeType&&e,Re=Le&&"object"==typeof r&&r&&!r.nodeType&&r,Pe=Re&&Re.exports===Le,Fe=Pe&&Ne.process,Me=function(){try{return Fe&&Fe.binding&&Fe.binding("util")}catch(t){}}(),qe=Me&&Me.isArrayBuffer,Be=Me&&Me.isDate,He=Me&&Me.isMap,Ue=Me&&Me.isRegExp,We=Me&&Me.isSet,ze=Me&&Me.isTypedArray;function Ve(t,e){return t.set(e[0],e[1]),t}function Xe(t,e){return t.add(e),t}function Ke(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function Je(t,e,n,r){for(var i=-1,o=null==t?0:t.length;++i-1}function en(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function Tn(t,e){for(var n=t.length;n--&&fn(e,t[n],0)>-1;);return n}var kn=mn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),$n=mn({"&":"&","<":"<",">":">",'"':""","'":"'"});function An(t){return"\\"+Ee[t]}function Sn(t){return Ce.test(t)}function En(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function On(t,e){return function(n){return t(e(n))}}function jn(t,e){for(var n=-1,r=t.length,i=0,o=[];++n",""":'"',"'":"'"});var Pn=function t(e){var n,r=(e=null==e?Ie:Pn.defaults(Ie.Object(),e,Pn.pick(Ie,ke))).Array,i=e.Date,Zt=e.Error,te=e.Function,ee=e.Math,ne=e.Object,re=e.RegExp,ie=e.String,oe=e.TypeError,ae=r.prototype,se=te.prototype,ue=ne.prototype,ce=e["__core-js_shared__"],le=se.toString,fe=ue.hasOwnProperty,pe=0,de=(n=/[^.]+$/.exec(ce&&ce.keys&&ce.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",he=ue.toString,ve=le.call(ne),me=Ie._,ge=re("^"+le.call(fe).replace(Dt,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ye=Pe?e.Buffer:o,we=e.Symbol,Ce=e.Uint8Array,Ee=ye?ye.allocUnsafe:o,Ne=On(ne.getPrototypeOf,ne),De=ne.create,Le=ue.propertyIsEnumerable,Re=ae.splice,Fe=we?we.isConcatSpreadable:o,Me=we?we.iterator:o,un=we?we.toStringTag:o,mn=function(){try{var t=Ho(ne,"defineProperty");return t({},"",{}),t}catch(t){}}(),Fn=e.clearTimeout!==Ie.clearTimeout&&e.clearTimeout,Mn=i&&i.now!==Ie.Date.now&&i.now,qn=e.setTimeout!==Ie.setTimeout&&e.setTimeout,Bn=ee.ceil,Hn=ee.floor,Un=ne.getOwnPropertySymbols,Wn=ye?ye.isBuffer:o,zn=e.isFinite,Vn=ae.join,Xn=On(ne.keys,ne),Kn=ee.max,Jn=ee.min,Gn=i.now,Qn=e.parseInt,Yn=ee.random,Zn=ae.reverse,tr=Ho(e,"DataView"),er=Ho(e,"Map"),nr=Ho(e,"Promise"),rr=Ho(e,"Set"),ir=Ho(e,"WeakMap"),or=Ho(ne,"create"),ar=ir&&new ir,sr={},ur=da(tr),cr=da(er),lr=da(nr),fr=da(rr),pr=da(ir),dr=we?we.prototype:o,hr=dr?dr.valueOf:o,vr=dr?dr.toString:o;function mr(t){if(Os(t)&&!bs(t)&&!(t instanceof _r)){if(t instanceof br)return t;if(fe.call(t,"__wrapped__"))return ha(t)}return new br(t)}var gr=function(){function t(){}return function(e){if(!Es(e))return{};if(De)return De(e);t.prototype=e;var n=new t;return t.prototype=o,n}}();function yr(){}function br(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=o}function _r(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=P,this.__views__=[]}function wr(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Fr(t,e,n,r,i,a){var s,u=e&p,c=e&d,l=e&h;if(n&&(s=i?n(t,r,i,a):n(t)),s!==o)return s;if(!Es(t))return t;var f=bs(t);if(f){if(s=function(t){var e=t.length,n=t.constructor(e);return e&&"string"==typeof t[0]&&fe.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!u)return oo(t,s)}else{var v=zo(t),m=v==K||v==J;if(Cs(t))return Zi(t,u);if(v==Z||v==B||m&&!i){if(s=c||m?{}:Xo(t),!u)return c?function(t,e){return ao(t,Wo(t),e)}(t,function(t,e){return t&&ao(e,su(e),t)}(s,t)):function(t,e){return ao(t,Uo(t),e)}(t,Ir(s,t))}else{if(!Se[v])return i?t:{};s=function(t,e,n,r){var i,o,a,s=t.constructor;switch(e){case ut:return to(t);case W:case z:return new s(+t);case ct:return function(t,e){var n=e?to(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,r);case lt:case ft:case pt:case dt:case ht:case vt:case mt:case gt:case yt:return eo(t,r);case G:return function(t,e,n){return on(e?n(En(t),p):En(t),Ve,new t.constructor)}(t,r,n);case Q:case rt:return new s(t);case et:return(a=new(o=t).constructor(o.source,Wt.exec(o))).lastIndex=o.lastIndex,a;case nt:return function(t,e,n){return on(e?n(Nn(t),p):Nn(t),Xe,new t.constructor)}(t,r,n);case it:return i=t,hr?ne(hr.call(i)):{}}}(t,v,Fr,u)}}a||(a=new kr);var g=a.get(t);if(g)return g;a.set(t,s);var y=f?o:(l?c?Lo:Io:c?su:au)(t);return Ge(y||t,function(r,i){y&&(r=t[i=r]),jr(s,i,Fr(r,e,n,i,t,a))}),s}function Mr(t,e,n){var r=n.length;if(null==t)return!r;for(t=ne(t);r--;){var i=n[r],a=e[i],s=t[i];if(s===o&&!(i in t)||!a(s))return!1}return!0}function qr(t,e,n){if("function"!=typeof t)throw new oe(u);return aa(function(){t.apply(o,n)},e)}function Br(t,e,n,r){var i=-1,o=tn,s=!0,u=t.length,c=[],l=e.length;if(!u)return c;n&&(e=nn(e,_n(n))),r?(o=en,s=!1):e.length>=a&&(o=xn,s=!1,e=new Tr(e));t:for(;++i-1},xr.prototype.set=function(t,e){var n=this.__data__,r=Nr(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Cr.prototype.clear=function(){this.size=0,this.__data__={hash:new wr,map:new(er||xr),string:new wr}},Cr.prototype.delete=function(t){var e=qo(this,t).delete(t);return this.size-=e?1:0,e},Cr.prototype.get=function(t){return qo(this,t).get(t)},Cr.prototype.has=function(t){return qo(this,t).has(t)},Cr.prototype.set=function(t,e){var n=qo(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Tr.prototype.add=Tr.prototype.push=function(t){return this.__data__.set(t,c),this},Tr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.clear=function(){this.__data__=new xr,this.size=0},kr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},kr.prototype.get=function(t){return this.__data__.get(t)},kr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof xr){var r=n.__data__;if(!er||r.length0&&n(s)?e>1?Xr(s,e-1,n,r,i):rn(i,s):r||(i[i.length]=s)}return i}var Kr=lo(),Jr=lo(!0);function Gr(t,e){return t&&Kr(t,e,au)}function Qr(t,e){return t&&Jr(t,e,au)}function Yr(t,e){return Ze(e,function(e){return $s(t[e])})}function Zr(t,e){for(var n=0,r=(e=Ji(e,t)).length;null!=t&&ne}function ri(t,e){return null!=t&&fe.call(t,e)}function ii(t,e){return null!=t&&e in ne(t)}function oi(t,e,n){for(var i=n?en:tn,a=t[0].length,s=t.length,u=s,c=r(s),l=1/0,f=[];u--;){var p=t[u];u&&e&&(p=nn(p,_n(e))),l=Jn(p.length,l),c[u]=!n&&(e||a>=120&&p.length>=120)?new Tr(u&&p):o}p=t[0];var d=-1,h=c[0];t:for(;++d=s)return u;var c=n[r];return u*("desc"==c?-1:1)}}return t.index-e.index}(t,e,n)})}function wi(t,e,n){for(var r=-1,i=e.length,o={};++r-1;)s!==t&&Re.call(s,u,1),Re.call(t,u,1);return t}function Ci(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==o){var o=i;Jo(i)?Re.call(t,i,1):Bi(t,i)}}return t}function Ti(t,e){return t+Hn(Yn()*(e-t+1))}function ki(t,e){var n="";if(!t||e<1||e>I)return n;do{e%2&&(n+=t),(e=Hn(e/2))&&(t+=t)}while(e);return n}function $i(t,e){return sa(ra(t,e,Nu),t+"")}function Ai(t){return Ar(vu(t))}function Si(t,e){var n=vu(t);return la(n,Pr(e,0,n.length))}function Ei(t,e,n,r){if(!Es(t))return t;for(var i=-1,a=(e=Ji(e,t)).length,s=a-1,u=t;null!=u&&++io?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var a=r(o);++i>>1,a=t[o];null!==a&&!Ps(a)&&(n?a<=e:a=a){var l=e?null:$o(t);if(l)return Nn(l);s=!1,i=xn,c=new Tr}else c=e?[]:u;t:for(;++r=r?t:Di(t,e,n)}var Yi=Fn||function(t){return Ie.clearTimeout(t)};function Zi(t,e){if(e)return t.slice();var n=t.length,r=Ee?Ee(n):new t.constructor(n);return t.copy(r),r}function to(t){var e=new t.constructor(t.byteLength);return new Ce(e).set(new Ce(t)),e}function eo(t,e){var n=e?to(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function no(t,e){if(t!==e){var n=t!==o,r=null===t,i=t==t,a=Ps(t),s=e!==o,u=null===e,c=e==e,l=Ps(e);if(!u&&!l&&!a&&t>e||a&&s&&c&&!u&&!l||r&&s&&c||!n&&c||!i)return 1;if(!r&&!a&&!l&&t1?n[i-1]:o,s=i>2?n[2]:o;for(a=t.length>3&&"function"==typeof a?(i--,a):o,s&&Go(n[0],n[1],s)&&(a=i<3?o:a,i=1),e=ne(e);++r-1?i[a?e[s]:s]:o}}function mo(t){return Do(function(e){var n=e.length,r=n,i=br.prototype.thru;for(t&&e.reverse();r--;){var a=e[r];if("function"!=typeof a)throw new oe(u);if(i&&!s&&"wrapper"==Po(a))var s=new br([],!0)}for(r=s?r:n;++r1&&_.reverse(),p&&lu))return!1;var l=a.get(t);if(l&&a.get(e))return l==e;var f=-1,p=!0,d=n&m?new Tr:o;for(a.set(t,e),a.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ft,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Ge(q,function(n){var r="_."+n[0];e&n[1]&&!tn(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(Mt);return e?e[1].split(qt):[]}(r),n)))}function ca(t){var e=0,n=0;return function(){var r=Gn(),i=O-(r-n);if(n=r,i>0){if(++e>=E)return arguments[0]}else e=0;return t.apply(o,arguments)}}function la(t,e){var n=-1,r=t.length,i=r-1;for(e=e===o?r:e;++n1?t[e-1]:o;return Ia(t,n="function"==typeof n?(t.pop(),n):o)});function Ba(t){var e=mr(t);return e.__chain__=!0,e}function Ha(t,e){return e(t)}var Ua=Do(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,i=function(e){return Rr(e,t)};return!(e>1||this.__actions__.length)&&r instanceof _r&&Jo(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:Ha,args:[i],thisArg:o}),new br(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(o),t})):this.thru(i)});var Wa=so(function(t,e,n){fe.call(t,n)?++t[n]:Lr(t,n,1)});var za=vo(ya),Va=vo(ba);function Xa(t,e){return(bs(t)?Ge:Hr)(t,Mo(e,3))}function Ka(t,e){return(bs(t)?Qe:Ur)(t,Mo(e,3))}var Ja=so(function(t,e,n){fe.call(t,n)?t[n].push(e):Lr(t,n,[e])});var Ga=$i(function(t,e,n){var i=-1,o="function"==typeof e,a=ws(t)?r(t.length):[];return Hr(t,function(t){a[++i]=o?Ke(e,t,n):ai(t,e,n)}),a}),Qa=so(function(t,e,n){Lr(t,n,e)});function Ya(t,e){return(bs(t)?nn:vi)(t,Mo(e,3))}var Za=so(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});var ts=$i(function(t,e){if(null==t)return[];var n=e.length;return n>1&&Go(t,e[0],e[1])?e=[]:n>2&&Go(e[0],e[1],e[2])&&(e=[e[0]]),_i(t,Xr(e,1),[])}),es=Mn||function(){return Ie.Date.now()};function ns(t,e,n){return e=n?o:e,e=t&&null==e?t.length:e,So(t,T,o,o,o,o,e)}function rs(t,e){var n;if("function"!=typeof e)throw new oe(u);return t=Us(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=o),n}}var is=$i(function(t,e,n){var r=g;if(n.length){var i=jn(n,Fo(is));r|=x}return So(t,r,e,n,i)}),os=$i(function(t,e,n){var r=g|y;if(n.length){var i=jn(n,Fo(os));r|=x}return So(e,r,t,n,i)});function as(t,e,n){var r,i,a,s,c,l,f=0,p=!1,d=!1,h=!0;if("function"!=typeof t)throw new oe(u);function v(e){var n=r,a=i;return r=i=o,f=e,s=t.apply(a,n)}function m(t){var n=t-l;return l===o||n>=e||n<0||d&&t-f>=a}function g(){var t=es();if(m(t))return y(t);c=aa(g,function(t){var n=e-(t-l);return d?Jn(n,a-(t-f)):n}(t))}function y(t){return c=o,h&&r?v(t):(r=i=o,s)}function b(){var t=es(),n=m(t);if(r=arguments,i=this,l=t,n){if(c===o)return function(t){return f=t,c=aa(g,e),p?v(t):s}(l);if(d)return c=aa(g,e),v(l)}return c===o&&(c=aa(g,e)),s}return e=zs(e)||0,Es(n)&&(p=!!n.leading,a=(d="maxWait"in n)?Kn(zs(n.maxWait)||0,e):a,h="trailing"in n?!!n.trailing:h),b.cancel=function(){c!==o&&Yi(c),f=0,r=l=i=c=o},b.flush=function(){return c===o?s:y(es())},b}var ss=$i(function(t,e){return qr(t,1,e)}),us=$i(function(t,e,n){return qr(t,zs(e)||0,n)});function cs(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new oe(u);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(cs.Cache||Cr),n}function ls(t){if("function"!=typeof t)throw new oe(u);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}cs.Cache=Cr;var fs=Gi(function(t,e){var n=(e=1==e.length&&bs(e[0])?nn(e[0],_n(Mo())):nn(Xr(e,1),_n(Mo()))).length;return $i(function(r){for(var i=-1,o=Jn(r.length,n);++i=e}),ys=si(function(){return arguments}())?si:function(t){return Os(t)&&fe.call(t,"callee")&&!Le.call(t,"callee")},bs=r.isArray,_s=qe?_n(qe):function(t){return Os(t)&&ei(t)==ut};function ws(t){return null!=t&&Ss(t.length)&&!$s(t)}function xs(t){return Os(t)&&ws(t)}var Cs=Wn||zu,Ts=Be?_n(Be):function(t){return Os(t)&&ei(t)==z};function ks(t){if(!Os(t))return!1;var e=ei(t);return e==X||e==V||"string"==typeof t.message&&"string"==typeof t.name&&!Ds(t)}function $s(t){if(!Es(t))return!1;var e=ei(t);return e==K||e==J||e==U||e==tt}function As(t){return"number"==typeof t&&t==Us(t)}function Ss(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=I}function Es(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Os(t){return null!=t&&"object"==typeof t}var js=He?_n(He):function(t){return Os(t)&&zo(t)==G};function Ns(t){return"number"==typeof t||Os(t)&&ei(t)==Q}function Ds(t){if(!Os(t)||ei(t)!=Z)return!1;var e=Ne(t);if(null===e)return!0;var n=fe.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&le.call(n)==ve}var Is=Ue?_n(Ue):function(t){return Os(t)&&ei(t)==et};var Ls=We?_n(We):function(t){return Os(t)&&zo(t)==nt};function Rs(t){return"string"==typeof t||!bs(t)&&Os(t)&&ei(t)==rt}function Ps(t){return"symbol"==typeof t||Os(t)&&ei(t)==it}var Fs=ze?_n(ze):function(t){return Os(t)&&Ss(t.length)&&!!Ae[ei(t)]};var Ms=Co(hi),qs=Co(function(t,e){return t<=e});function Bs(t){if(!t)return[];if(ws(t))return Rs(t)?Ln(t):oo(t);if(Me&&t[Me])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Me]());var e=zo(t);return(e==G?En:e==nt?Nn:vu)(t)}function Hs(t){return t?(t=zs(t))===D||t===-D?(t<0?-1:1)*L:t==t?t:0:0===t?t:0}function Us(t){var e=Hs(t),n=e%1;return e==e?n?e-n:e:0}function Ws(t){return t?Pr(Us(t),0,P):0}function zs(t){if("number"==typeof t)return t;if(Ps(t))return R;if(Es(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Es(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Lt,"");var n=Vt.test(t);return n||Kt.test(t)?je(t.slice(2),n?2:8):zt.test(t)?R:+t}function Vs(t){return ao(t,su(t))}function Xs(t){return null==t?"":Mi(t)}var Ks=uo(function(t,e){if(ta(e)||ws(e))ao(e,au(e),t);else for(var n in e)fe.call(e,n)&&jr(t,n,e[n])}),Js=uo(function(t,e){ao(e,su(e),t)}),Gs=uo(function(t,e,n,r){ao(e,su(e),t,r)}),Qs=uo(function(t,e,n,r){ao(e,au(e),t,r)}),Ys=Do(Rr);var Zs=$i(function(t){return t.push(o,Eo),Ke(Gs,o,t)}),tu=$i(function(t){return t.push(o,Oo),Ke(cu,o,t)});function eu(t,e,n){var r=null==t?o:Zr(t,e);return r===o?n:r}function nu(t,e){return null!=t&&Vo(t,e,ii)}var ru=yo(function(t,e,n){t[e]=n},Eu(Nu)),iu=yo(function(t,e,n){fe.call(t,e)?t[e].push(n):t[e]=[n]},Mo),ou=$i(ai);function au(t){return ws(t)?$r(t):pi(t)}function su(t){return ws(t)?$r(t,!0):di(t)}var uu=uo(function(t,e,n){yi(t,e,n)}),cu=uo(function(t,e,n,r){yi(t,e,n,r)}),lu=Do(function(t,e){var n={};if(null==t)return n;var r=!1;e=nn(e,function(e){return e=Ji(e,t),r||(r=e.length>1),e}),ao(t,Lo(t),n),r&&(n=Fr(n,p|d|h,jo));for(var i=e.length;i--;)Bi(n,e[i]);return n});var fu=Do(function(t,e){return null==t?{}:function(t,e){return wi(t,e,function(e,n){return nu(t,n)})}(t,e)});function pu(t,e){if(null==t)return{};var n=nn(Lo(t),function(t){return[t]});return e=Mo(e),wi(t,n,function(t,n){return e(t,n[0])})}var du=Ao(au),hu=Ao(su);function vu(t){return null==t?[]:wn(t,au(t))}var mu=po(function(t,e,n){return e=e.toLowerCase(),t+(n?gu(e):e)});function gu(t){return ku(Xs(t).toLowerCase())}function yu(t){return(t=Xs(t))&&t.replace(Gt,kn).replace(_e,"")}var bu=po(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),_u=po(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),wu=fo("toLowerCase");var xu=po(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()});var Cu=po(function(t,e,n){return t+(n?" ":"")+ku(e)});var Tu=po(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),ku=fo("toUpperCase");function $u(t,e,n){return t=Xs(t),(e=n?o:e)===o?function(t){return Te.test(t)}(t)?function(t){return t.match(xe)||[]}(t):function(t){return t.match(Bt)||[]}(t):t.match(e)||[]}var Au=$i(function(t,e){try{return Ke(t,o,e)}catch(t){return ks(t)?t:new Zt(t)}}),Su=Do(function(t,e){return Ge(e,function(e){e=pa(e),Lr(t,e,is(t[e],t))}),t});function Eu(t){return function(){return t}}var Ou=mo(),ju=mo(!0);function Nu(t){return t}function Du(t){return fi("function"==typeof t?t:Fr(t,p))}var Iu=$i(function(t,e){return function(n){return ai(n,t,e)}}),Lu=$i(function(t,e){return function(n){return ai(t,n,e)}});function Ru(t,e,n){var r=au(e),i=Yr(e,r);null!=n||Es(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=Yr(e,au(e)));var o=!(Es(n)&&"chain"in n&&!n.chain),a=$s(t);return Ge(i,function(n){var r=e[n];t[n]=r,a&&(t.prototype[n]=function(){var e=this.__chain__;if(o||e){var n=t(this.__wrapped__);return(n.__actions__=oo(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,rn([this.value()],arguments))})}),t}function Pu(){}var Fu=_o(nn),Mu=_o(Ye),qu=_o(sn);function Bu(t){return Qo(t)?vn(pa(t)):function(t){return function(e){return Zr(e,t)}}(t)}var Hu=xo(),Uu=xo(!0);function Wu(){return[]}function zu(){return!1}var Vu=bo(function(t,e){return t+e},0),Xu=ko("ceil"),Ku=bo(function(t,e){return t/e},1),Ju=ko("floor");var Gu,Qu=bo(function(t,e){return t*e},1),Yu=ko("round"),Zu=bo(function(t,e){return t-e},0);return mr.after=function(t,e){if("function"!=typeof e)throw new oe(u);return t=Us(t),function(){if(--t<1)return e.apply(this,arguments)}},mr.ary=ns,mr.assign=Ks,mr.assignIn=Js,mr.assignInWith=Gs,mr.assignWith=Qs,mr.at=Ys,mr.before=rs,mr.bind=is,mr.bindAll=Su,mr.bindKey=os,mr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return bs(t)?t:[t]},mr.chain=Ba,mr.chunk=function(t,e,n){e=(n?Go(t,e,n):e===o)?1:Kn(Us(e),0);var i=null==t?0:t.length;if(!i||e<1)return[];for(var a=0,s=0,u=r(Bn(i/e));ai?0:i+n),(r=r===o||r>i?i:Us(r))<0&&(r+=i),r=n>r?0:Ws(r);n>>0)?(t=Xs(t))&&("string"==typeof e||null!=e&&!Is(e))&&!(e=Mi(e))&&Sn(t)?Qi(Ln(t),0,n):t.split(e,n):[]},mr.spread=function(t,e){if("function"!=typeof t)throw new oe(u);return e=null==e?0:Kn(Us(e),0),$i(function(n){var r=n[e],i=Qi(n,0,e);return r&&rn(i,r),Ke(t,this,i)})},mr.tail=function(t){var e=null==t?0:t.length;return e?Di(t,1,e):[]},mr.take=function(t,e,n){return t&&t.length?Di(t,0,(e=n||e===o?1:Us(e))<0?0:e):[]},mr.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?Di(t,(e=r-(e=n||e===o?1:Us(e)))<0?0:e,r):[]},mr.takeRightWhile=function(t,e){return t&&t.length?Ui(t,Mo(e,3),!1,!0):[]},mr.takeWhile=function(t,e){return t&&t.length?Ui(t,Mo(e,3)):[]},mr.tap=function(t,e){return e(t),t},mr.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new oe(u);return Es(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),as(t,e,{leading:r,maxWait:e,trailing:i})},mr.thru=Ha,mr.toArray=Bs,mr.toPairs=du,mr.toPairsIn=hu,mr.toPath=function(t){return bs(t)?nn(t,pa):Ps(t)?[t]:oo(fa(Xs(t)))},mr.toPlainObject=Vs,mr.transform=function(t,e,n){var r=bs(t),i=r||Cs(t)||Fs(t);if(e=Mo(e,4),null==n){var o=t&&t.constructor;n=i?r?new o:[]:Es(t)&&$s(o)?gr(Ne(t)):{}}return(i?Ge:Gr)(t,function(t,r,i){return e(n,t,r,i)}),n},mr.unary=function(t){return ns(t,1)},mr.union=Oa,mr.unionBy=ja,mr.unionWith=Na,mr.uniq=function(t){return t&&t.length?qi(t):[]},mr.uniqBy=function(t,e){return t&&t.length?qi(t,Mo(e,2)):[]},mr.uniqWith=function(t,e){return e="function"==typeof e?e:o,t&&t.length?qi(t,o,e):[]},mr.unset=function(t,e){return null==t||Bi(t,e)},mr.unzip=Da,mr.unzipWith=Ia,mr.update=function(t,e,n){return null==t?t:Hi(t,e,Ki(n))},mr.updateWith=function(t,e,n,r){return r="function"==typeof r?r:o,null==t?t:Hi(t,e,Ki(n),r)},mr.values=vu,mr.valuesIn=function(t){return null==t?[]:wn(t,su(t))},mr.without=La,mr.words=$u,mr.wrap=function(t,e){return ps(Ki(e),t)},mr.xor=Ra,mr.xorBy=Pa,mr.xorWith=Fa,mr.zip=Ma,mr.zipObject=function(t,e){return Vi(t||[],e||[],jr)},mr.zipObjectDeep=function(t,e){return Vi(t||[],e||[],Ei)},mr.zipWith=qa,mr.entries=du,mr.entriesIn=hu,mr.extend=Js,mr.extendWith=Gs,Ru(mr,mr),mr.add=Vu,mr.attempt=Au,mr.camelCase=mu,mr.capitalize=gu,mr.ceil=Xu,mr.clamp=function(t,e,n){return n===o&&(n=e,e=o),n!==o&&(n=(n=zs(n))==n?n:0),e!==o&&(e=(e=zs(e))==e?e:0),Pr(zs(t),e,n)},mr.clone=function(t){return Fr(t,h)},mr.cloneDeep=function(t){return Fr(t,p|h)},mr.cloneDeepWith=function(t,e){return Fr(t,p|h,e="function"==typeof e?e:o)},mr.cloneWith=function(t,e){return Fr(t,h,e="function"==typeof e?e:o)},mr.conformsTo=function(t,e){return null==e||Mr(t,e,au(e))},mr.deburr=yu,mr.defaultTo=function(t,e){return null==t||t!=t?e:t},mr.divide=Ku,mr.endsWith=function(t,e,n){t=Xs(t),e=Mi(e);var r=t.length,i=n=n===o?r:Pr(Us(n),0,r);return(n-=e.length)>=0&&t.slice(n,i)==e},mr.eq=vs,mr.escape=function(t){return(t=Xs(t))&&kt.test(t)?t.replace(Ct,$n):t},mr.escapeRegExp=function(t){return(t=Xs(t))&&It.test(t)?t.replace(Dt,"\\$&"):t},mr.every=function(t,e,n){var r=bs(t)?Ye:Wr;return n&&Go(t,e,n)&&(e=o),r(t,Mo(e,3))},mr.find=za,mr.findIndex=ya,mr.findKey=function(t,e){return cn(t,Mo(e,3),Gr)},mr.findLast=Va,mr.findLastIndex=ba,mr.findLastKey=function(t,e){return cn(t,Mo(e,3),Qr)},mr.floor=Ju,mr.forEach=Xa,mr.forEachRight=Ka,mr.forIn=function(t,e){return null==t?t:Kr(t,Mo(e,3),su)},mr.forInRight=function(t,e){return null==t?t:Jr(t,Mo(e,3),su)},mr.forOwn=function(t,e){return t&&Gr(t,Mo(e,3))},mr.forOwnRight=function(t,e){return t&&Qr(t,Mo(e,3))},mr.get=eu,mr.gt=ms,mr.gte=gs,mr.has=function(t,e){return null!=t&&Vo(t,e,ri)},mr.hasIn=nu,mr.head=wa,mr.identity=Nu,mr.includes=function(t,e,n,r){t=ws(t)?t:vu(t),n=n&&!r?Us(n):0;var i=t.length;return n<0&&(n=Kn(i+n,0)),Rs(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&fn(t,e,n)>-1},mr.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Us(n);return i<0&&(i=Kn(r+i,0)),fn(t,e,i)},mr.inRange=function(t,e,n){return e=Hs(e),n===o?(n=e,e=0):n=Hs(n),function(t,e,n){return t>=Jn(e,n)&&t=-I&&t<=I},mr.isSet=Ls,mr.isString=Rs,mr.isSymbol=Ps,mr.isTypedArray=Fs,mr.isUndefined=function(t){return t===o},mr.isWeakMap=function(t){return Os(t)&&zo(t)==at},mr.isWeakSet=function(t){return Os(t)&&ei(t)==st},mr.join=function(t,e){return null==t?"":Vn.call(t,e)},mr.kebabCase=bu,mr.last=ka,mr.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=r;return n!==o&&(i=(i=Us(n))<0?Kn(r+i,0):Jn(i,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,i):ln(t,dn,i,!0)},mr.lowerCase=_u,mr.lowerFirst=wu,mr.lt=Ms,mr.lte=qs,mr.max=function(t){return t&&t.length?zr(t,Nu,ni):o},mr.maxBy=function(t,e){return t&&t.length?zr(t,Mo(e,2),ni):o},mr.mean=function(t){return hn(t,Nu)},mr.meanBy=function(t,e){return hn(t,Mo(e,2))},mr.min=function(t){return t&&t.length?zr(t,Nu,hi):o},mr.minBy=function(t,e){return t&&t.length?zr(t,Mo(e,2),hi):o},mr.stubArray=Wu,mr.stubFalse=zu,mr.stubObject=function(){return{}},mr.stubString=function(){return""},mr.stubTrue=function(){return!0},mr.multiply=Qu,mr.nth=function(t,e){return t&&t.length?bi(t,Us(e)):o},mr.noConflict=function(){return Ie._===this&&(Ie._=me),this},mr.noop=Pu,mr.now=es,mr.pad=function(t,e,n){t=Xs(t);var r=(e=Us(e))?In(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return wo(Hn(i),n)+t+wo(Bn(i),n)},mr.padEnd=function(t,e,n){t=Xs(t);var r=(e=Us(e))?In(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var i=Yn();return Jn(t+i*(e-t+Oe("1e-"+((i+"").length-1))),e)}return Ti(t,e)},mr.reduce=function(t,e,n){var r=bs(t)?on:gn,i=arguments.length<3;return r(t,Mo(e,4),n,i,Hr)},mr.reduceRight=function(t,e,n){var r=bs(t)?an:gn,i=arguments.length<3;return r(t,Mo(e,4),n,i,Ur)},mr.repeat=function(t,e,n){return e=(n?Go(t,e,n):e===o)?1:Us(e),ki(Xs(t),e)},mr.replace=function(){var t=arguments,e=Xs(t[0]);return t.length<3?e:e.replace(t[1],t[2])},mr.result=function(t,e,n){var r=-1,i=(e=Ji(e,t)).length;for(i||(i=1,t=o);++rI)return[];var n=P,r=Jn(t,P);e=Mo(e),t-=P;for(var i=bn(r,e);++n=a)return t;var u=n-In(r);if(u<1)return r;var c=s?Qi(s,0,u).join(""):t.slice(0,u);if(i===o)return c+r;if(s&&(u+=c.length-u),Is(i)){if(t.slice(u).search(i)){var l,f=c;for(i.global||(i=re(i.source,Xs(Wt.exec(i))+"g")),i.lastIndex=0;l=i.exec(f);)var p=l.index;c=c.slice(0,p===o?u:p)}}else if(t.indexOf(Mi(i),u)!=u){var d=c.lastIndexOf(i);d>-1&&(c=c.slice(0,d))}return c+r},mr.unescape=function(t){return(t=Xs(t))&&Tt.test(t)?t.replace(xt,Rn):t},mr.uniqueId=function(t){var e=++pe;return Xs(t)+e},mr.upperCase=Tu,mr.upperFirst=ku,mr.each=Xa,mr.eachRight=Ka,mr.first=wa,Ru(mr,(Gu={},Gr(mr,function(t,e){fe.call(mr.prototype,e)||(Gu[e]=t)}),Gu),{chain:!1}),mr.VERSION="4.17.4",Ge(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){mr[t].placeholder=mr}),Ge(["drop","take"],function(t,e){_r.prototype[t]=function(n){n=n===o?1:Kn(Us(n),0);var r=this.__filtered__&&!e?new _r(this):this.clone();return r.__filtered__?r.__takeCount__=Jn(n,r.__takeCount__):r.__views__.push({size:Jn(n,P),type:t+(r.__dir__<0?"Right":"")}),r},_r.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),Ge(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==j||3==n;_r.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Mo(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),Ge(["head","last"],function(t,e){var n="take"+(e?"Right":"");_r.prototype[t]=function(){return this[n](1).value()[0]}}),Ge(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");_r.prototype[t]=function(){return this.__filtered__?new _r(this):this[n](1)}}),_r.prototype.compact=function(){return this.filter(Nu)},_r.prototype.find=function(t){return this.filter(t).head()},_r.prototype.findLast=function(t){return this.reverse().find(t)},_r.prototype.invokeMap=$i(function(t,e){return"function"==typeof t?new _r(this):this.map(function(n){return ai(n,t,e)})}),_r.prototype.reject=function(t){return this.filter(ls(Mo(t)))},_r.prototype.slice=function(t,e){t=Us(t);var n=this;return n.__filtered__&&(t>0||e<0)?new _r(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==o&&(n=(e=Us(e))<0?n.dropRight(-e):n.take(e-t)),n)},_r.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},_r.prototype.toArray=function(){return this.take(P)},Gr(_r.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),i=mr[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);i&&(mr.prototype[e]=function(){var e=this.__wrapped__,s=r?[1]:arguments,u=e instanceof _r,c=s[0],l=u||bs(e),f=function(t){var e=i.apply(mr,rn([t],s));return r&&p?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(u=l=!1);var p=this.__chain__,d=!!this.__actions__.length,h=a&&!p,v=u&&!d;if(!a&&l){e=v?e:new _r(this);var m=t.apply(e,s);return m.__actions__.push({func:Ha,args:[f],thisArg:o}),new br(m,p)}return h&&v?t.apply(this,s):(m=this.thru(f),h?r?m.value()[0]:m.value():m)})}),Ge(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);mr.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(bs(i)?i:[],t)}return this[n](function(n){return e.apply(bs(n)?n:[],t)})}}),Gr(_r.prototype,function(t,e){var n=mr[e];if(n){var r=n.name+"";(sr[r]||(sr[r]=[])).push({name:e,func:n})}}),sr[go(o,y).name]=[{name:"wrapper",func:o}],_r.prototype.clone=function(){var t=new _r(this.__wrapped__);return t.__actions__=oo(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=oo(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=oo(this.__views__),t},_r.prototype.reverse=function(){if(this.__filtered__){var t=new _r(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},_r.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=bs(t),r=e<0,i=n?t.length:0,o=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?o:this.__values__[this.__index__++]}},mr.prototype.plant=function(t){for(var e,n=this;n instanceof yr;){var r=ha(n);r.__index__=0,r.__values__=o,e?i.__wrapped__=r:e=r;var i=r;n=n.__wrapped__}return i.__wrapped__=t,e},mr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof _r){var e=t;return this.__actions__.length&&(e=new _r(this)),(e=e.reverse()).__actions__.push({func:Ha,args:[Ea],thisArg:o}),new br(e,this.__chain__)}return this.thru(Ea)},mr.prototype.toJSON=mr.prototype.valueOf=mr.prototype.value=function(){return Wi(this.__wrapped__,this.__actions__)},mr.prototype.first=mr.prototype.head,Me&&(mr.prototype[Me]=function(){return this}),mr}();Ie._=Pn,(i=function(){return Pn}.call(e,n,e,r))===o||(r.exports=i)}).call(this)}).call(e,n(1),n(16)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){var r;!function(e,n){"use strict";"object"==typeof t&&"object"==typeof t.exports?t.exports=e.document?n(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return n(t)}:n(e)}("undefined"!=typeof window?window:this,function(n,i){"use strict";var o=[],a=n.document,s=Object.getPrototypeOf,u=o.slice,c=o.concat,l=o.push,f=o.indexOf,p={},d=p.toString,h=p.hasOwnProperty,v=h.toString,m=v.call(Object),g={},y=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType},b=function(t){return null!=t&&t===t.window},_={type:!0,src:!0,noModule:!0};function w(t,e,n){var r,i=(e=e||a).createElement("script");if(i.text=t,n)for(r in _)n[r]&&(i[r]=n[r]);e.head.appendChild(i).parentNode.removeChild(i)}function x(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?p[d.call(t)]||"object":typeof t}var C=function(t,e){return new C.fn.init(t,e)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function k(t){var e=!!t&&"length"in t&&t.length,n=x(t);return!y(t)&&!b(t)&&("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t)}C.fn=C.prototype={jquery:"3.3.1",constructor:C,length:0,toArray:function(){return u.call(this)},get:function(t){return null==t?u.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=C.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return C.each(this,t)},map:function(t){return this.pushStack(C.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+R+")"+R+"*"),W=new RegExp("="+R+"*([^\\]'\"]*?)"+R+"*\\]","g"),z=new RegExp(M),V=new RegExp("^"+P+"$"),X={ID:new RegExp("^#("+P+")"),CLASS:new RegExp("^\\.("+P+")"),TAG:new RegExp("^("+P+"|[*])"),ATTR:new RegExp("^"+F),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},K=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+R+"?|("+R+")|.)","ig"),tt=function(t,e,n){var r="0x"+e-65536;return r!=r||n?e:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},et=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,nt=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){p()},it=yt(function(t){return!0===t.disabled&&("form"in t||"label"in t)},{dir:"parentNode",next:"legend"});try{N.apply(E=D.call(w.childNodes),w.childNodes),E[w.childNodes.length].nodeType}catch(t){N={apply:E.length?function(t,e){j.apply(t,D.call(e))}:function(t,e){for(var n=t.length,r=0;t[n++]=e[r++];);t.length=n-1}}}function ot(t,e,r,i){var o,s,c,l,f,h,g,y=e&&e.ownerDocument,x=e?e.nodeType:9;if(r=r||[],"string"!=typeof t||!t||1!==x&&9!==x&&11!==x)return r;if(!i&&((e?e.ownerDocument||e:w)!==d&&p(e),e=e||d,v)){if(11!==x&&(f=Q.exec(t)))if(o=f[1]){if(9===x){if(!(c=e.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(y&&(c=y.getElementById(o))&&b(e,c)&&c.id===o)return r.push(c),r}else{if(f[2])return N.apply(r,e.getElementsByTagName(t)),r;if((o=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return N.apply(r,e.getElementsByClassName(o)),r}if(n.qsa&&!$[t+" "]&&(!m||!m.test(t))){if(1!==x)y=e,g=t;else if("object"!==e.nodeName.toLowerCase()){for((l=e.getAttribute("id"))?l=l.replace(et,nt):e.setAttribute("id",l=_),s=(h=a(t)).length;s--;)h[s]="#"+l+" "+gt(h[s]);g=h.join(","),y=Y.test(t)&&vt(e.parentNode)||e}if(g)try{return N.apply(r,y.querySelectorAll(g)),r}catch(t){}finally{l===_&&e.removeAttribute("id")}}}return u(t.replace(B,"$1"),e,r,i)}function at(){var t=[];return function e(n,i){return t.push(n+" ")>r.cacheLength&&delete e[t.shift()],e[n+" "]=i}}function st(t){return t[_]=!0,t}function ut(t){var e=d.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ct(t,e){for(var n=t.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=e}function lt(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ft(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function dt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&it(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ht(t){return st(function(e){return e=+e,st(function(n,r){for(var i,o=t([],n.length,e),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function vt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=ot.support={},o=ot.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&"HTML"!==e.nodeName},p=ot.setDocument=function(t){var e,i,a=t?t.ownerDocument||t:w;return a!==d&&9===a.nodeType&&a.documentElement?(h=(d=a).documentElement,v=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",rt,!1):i.attachEvent&&i.attachEvent("onunload",rt)),n.attributes=ut(function(t){return t.className="i",!t.getAttribute("className")}),n.getElementsByTagName=ut(function(t){return t.appendChild(d.createComment("")),!t.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(d.getElementsByClassName),n.getById=ut(function(t){return h.appendChild(t).id=_,!d.getElementsByName||!d.getElementsByName(_).length}),n.getById?(r.filter.ID=function(t){var e=t.replace(Z,tt);return function(t){return t.getAttribute("id")===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(r.filter.ID=function(t){var e=t.replace(Z,tt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,r,i,o=e.getElementById(t);if(o){if((n=o.getAttributeNode("id"))&&n.value===t)return[o];for(i=e.getElementsByName(t),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===t)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,o=e.getElementsByTagName(t);if("*"===t){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=G.test(d.querySelectorAll))&&(ut(function(t){h.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+R+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\["+R+"*(?:value|"+L+")"),t.querySelectorAll("[id~="+_+"-]").length||m.push("~="),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+_+"+*").length||m.push(".#.+[+~]")}),ut(function(t){t.innerHTML="";var e=d.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name"+R+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),h.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=G.test(y=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ut(function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",M)}),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=G.test(h.compareDocumentPosition),b=e||G.test(h.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},A=e?function(t,e){if(t===e)return f=!0,0;var r=!t.compareDocumentPosition-!e.compareDocumentPosition;return r||(1&(r=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===r?t===d||t.ownerDocument===w&&b(w,t)?-1:e===d||e.ownerDocument===w&&b(w,e)?1:l?I(l,t)-I(l,e):0:4&r?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,r=0,i=t.parentNode,o=e.parentNode,a=[t],s=[e];if(!i||!o)return t===d?-1:e===d?1:i?-1:o?1:l?I(l,t)-I(l,e):0;if(i===o)return lt(t,e);for(n=t;n=n.parentNode;)a.unshift(n);for(n=e;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?lt(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},ot.matches=function(t,e){return ot(t,null,null,e)},ot.matchesSelector=function(t,e){if((t.ownerDocument||t)!==d&&p(t),e=e.replace(W,"='$1']"),n.matchesSelector&&v&&!$[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var r=y.call(t,e);if(r||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(t){}return ot(e,d,null,[t]).length>0},ot.contains=function(t,e){return(t.ownerDocument||t)!==d&&p(t),b(t,e)},ot.attr=function(t,e){(t.ownerDocument||t)!==d&&p(t);var i=r.attrHandle[e.toLowerCase()],o=i&&S.call(r.attrHandle,e.toLowerCase())?i(t,e,!v):void 0;return void 0!==o?o:n.attributes||!v?t.getAttribute(e):(o=t.getAttributeNode(e))&&o.specified?o.value:null},ot.escape=function(t){return(t+"").replace(et,nt)},ot.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},ot.uniqueSort=function(t){var e,r=[],i=0,o=0;if(f=!n.detectDuplicates,l=!n.sortStable&&t.slice(0),t.sort(A),f){for(;e=t[o++];)e===t[o]&&(i=r.push(o));for(;i--;)t.splice(r[i],1)}return l=null,t},i=ot.getText=function(t){var e,n="",r=0,o=t.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=i(t)}else if(3===o||4===o)return t.nodeValue}else for(;e=t[r++];)n+=i(e);return n},(r=ot.selectors={cacheLength:50,createPseudo:st,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(Z,tt),t[3]=(t[3]||t[4]||t[5]||"").replace(Z,tt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||ot.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&ot.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return X.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&z.test(n)&&(e=a(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(Z,tt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=T[t+" "];return e||(e=new RegExp("(^|"+R+")"+t+"("+R+"|$)"))&&T(t,function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,e,n){return function(r){var i=ot.attr(r,t);return null==i?"!="===e:!e||(i+="","="===e?i===n:"!="===e?i!==n:"^="===e?n&&0===i.indexOf(n):"*="===e?n&&i.indexOf(n)>-1:"$="===e?n&&i.slice(-n.length)===n:"~="===e?(" "+i.replace(q," ")+" ").indexOf(n)>-1:"|="===e&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,r,i){var o="nth"!==t.slice(0,3),a="last"!==t.slice(-4),s="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,u){var c,l,f,p,d,h,v=o!==a?"nextSibling":"previousSibling",m=e.parentNode,g=s&&e.nodeName.toLowerCase(),y=!u&&!s,b=!1;if(m){if(o){for(;v;){for(p=e;p=p[v];)if(s?p.nodeName.toLowerCase()===g:1===p.nodeType)return!1;h=v="only"===t&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&y){for(b=(d=(c=(l=(f=(p=m)[_]||(p[_]={}))[p.uniqueID]||(f[p.uniqueID]={}))[t]||[])[0]===x&&c[1])&&c[2],p=d&&m.childNodes[d];p=++d&&p&&p[v]||(b=d=0)||h.pop();)if(1===p.nodeType&&++b&&p===e){l[t]=[x,d,b];break}}else if(y&&(b=d=(c=(l=(f=(p=e)[_]||(p[_]={}))[p.uniqueID]||(f[p.uniqueID]={}))[t]||[])[0]===x&&c[1]),!1===b)for(;(p=++d&&p&&p[v]||(b=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==g:1!==p.nodeType)||!++b||(y&&((l=(f=p[_]||(p[_]={}))[p.uniqueID]||(f[p.uniqueID]={}))[t]=[x,b]),p!==e)););return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(t,e){var n,i=r.pseudos[t]||r.setFilters[t.toLowerCase()]||ot.error("unsupported pseudo: "+t);return i[_]?i(e):i.length>1?(n=[t,t,"",e],r.setFilters.hasOwnProperty(t.toLowerCase())?st(function(t,n){for(var r,o=i(t,e),a=o.length;a--;)t[r=I(t,o[a])]=!(n[r]=o[a])}):function(t){return i(t,0,n)}):i}},pseudos:{not:st(function(t){var e=[],n=[],r=s(t.replace(B,"$1"));return r[_]?st(function(t,e,n,i){for(var o,a=r(t,null,i,[]),s=t.length;s--;)(o=a[s])&&(t[s]=!(e[s]=o))}):function(t,i,o){return e[0]=t,r(e,null,o,n),e[0]=null,!n.pop()}}),has:st(function(t){return function(e){return ot(t,e).length>0}}),contains:st(function(t){return t=t.replace(Z,tt),function(e){return(e.textContent||e.innerText||i(e)).indexOf(t)>-1}}),lang:st(function(t){return V.test(t||"")||ot.error("unsupported lang: "+t),t=t.replace(Z,tt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===h},focus:function(t){return t===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:dt(!1),disabled:dt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!r.pseudos.empty(t)},header:function(t){return J.test(t.nodeName)},input:function(t){return K.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:ht(function(){return[0]}),last:ht(function(t,e){return[e-1]}),eq:ht(function(t,e,n){return[n<0?n+e:n]}),even:ht(function(t,e){for(var n=0;n=0;)t.push(r);return t}),gt:ht(function(t,e,n){for(var r=n<0?n+e:n;++r1?function(e,n,r){for(var i=t.length;i--;)if(!t[i](e,n,r))return!1;return!0}:t[0]}function _t(t,e,n,r,i){for(var o,a=[],s=0,u=t.length,c=null!=e;s-1&&(o[c]=!(a[c]=f))}}else g=_t(g===a?g.splice(h,g.length):g),i?i(null,a,g,u):N.apply(a,g)})}function xt(t){for(var e,n,i,o=t.length,a=r.relative[t[0].type],s=a||r.relative[" "],u=a?1:0,l=yt(function(t){return t===e},s,!0),f=yt(function(t){return I(e,t)>-1},s,!0),p=[function(t,n,r){var i=!a&&(r||n!==c)||((e=n).nodeType?l(t,n,r):f(t,n,r));return e=null,i}];u1&&bt(p),u>1&>(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=t.length>0,o=function(o,a,s,u,l){var f,h,m,g=0,y="0",b=o&&[],_=[],w=c,C=o||i&&r.find.TAG("*",l),T=x+=null==w?1:Math.random()||.1,k=C.length;for(l&&(c=a===d||a||l);y!==k&&null!=(f=C[y]);y++){if(i&&f){for(h=0,a||f.ownerDocument===d||(p(f),s=!v);m=t[h++];)if(m(f,a||d,s)){u.push(f);break}l&&(x=T)}n&&((f=!m&&f)&&g--,o&&b.push(f))}if(g+=y,n&&y!==g){for(h=0;m=e[h++];)m(b,_,a,s);if(o){if(g>0)for(;y--;)b[y]||_[y]||(_[y]=O.call(u));_=_t(_)}N.apply(u,_),l&&!o&&_.length>0&&g+e.length>1&&ot.uniqueSort(u)}return l&&(x=T,c=w),b};return n?st(o):o}(o,i))).selector=t}return s},u=ot.select=function(t,e,n,i){var o,u,c,l,f,p="function"==typeof t&&t,d=!i&&a(t=p.selector||t);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(c=u[0]).type&&9===e.nodeType&&v&&r.relative[u[1].type]){if(!(e=(r.find.ID(c.matches[0].replace(Z,tt),e)||[])[0]))return n;p&&(e=e.parentNode),t=t.slice(u.shift().value.length)}for(o=X.needsContext.test(t)?0:u.length;o--&&(c=u[o],!r.relative[l=c.type]);)if((f=r.find[l])&&(i=f(c.matches[0].replace(Z,tt),Y.test(u[0].type)&&vt(e.parentNode)||e))){if(u.splice(o,1),!(t=i.length&>(u)))return N.apply(n,i),n;break}}return(p||s(t,d))(i,e,!v,n,!e||Y.test(t)&&vt(e.parentNode)||e),n},n.sortStable=_.split("").sort(A).join("")===_,n.detectDuplicates=!!f,p(),n.sortDetached=ut(function(t){return 1&t.compareDocumentPosition(d.createElement("fieldset"))}),ut(function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")})||ct("type|href|height|width",function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),n.attributes&&ut(function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||ct("value",function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue}),ut(function(t){return null==t.getAttribute("disabled")})||ct(L,function(t,e,n){var r;if(!n)return!0===t[e]?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null}),ot}(n);C.find=$,C.expr=$.selectors,C.expr[":"]=C.expr.pseudos,C.uniqueSort=C.unique=$.uniqueSort,C.text=$.getText,C.isXMLDoc=$.isXML,C.contains=$.contains,C.escapeSelector=$.escape;var A=function(t,e,n){for(var r=[],i=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(i&&C(t).is(n))break;r.push(t)}return r},S=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},E=C.expr.match.needsContext;function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var j=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(t,e,n){return y(e)?C.grep(t,function(t,r){return!!e.call(t,r,t)!==n}):e.nodeType?C.grep(t,function(t){return t===e!==n}):"string"!=typeof e?C.grep(t,function(t){return f.call(e,t)>-1!==n}):C.filter(e,t,n)}C.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?C.find.matchesSelector(r,t)?[r]:[]:C.find.matches(t,C.grep(e,function(t){return 1===t.nodeType}))},C.fn.extend({find:function(t){var e,n,r=this.length,i=this;if("string"!=typeof t)return this.pushStack(C(t).filter(function(){for(e=0;e1?C.uniqueSort(n):n},filter:function(t){return this.pushStack(N(this,t||[],!1))},not:function(t){return this.pushStack(N(this,t||[],!0))},is:function(t){return!!N(this,"string"==typeof t&&E.test(t)?C(t):t||[],!1).length}});var D,I=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(C.fn.init=function(t,e,n){var r,i;if(!t)return this;if(n=n||D,"string"==typeof t){if(!(r="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:I.exec(t))||!r[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(r[1]){if(e=e instanceof C?e[0]:e,C.merge(this,C.parseHTML(r[1],e&&e.nodeType?e.ownerDocument||e:a,!0)),j.test(r[1])&&C.isPlainObject(e))for(r in e)y(this[r])?this[r](e[r]):this.attr(r,e[r]);return this}return(i=a.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):y(t)?void 0!==n.ready?n.ready(t):t(C):C.makeArray(t,this)}).prototype=C.fn,D=C(a);var L=/^(?:parents|prev(?:Until|All))/,R={children:!0,contents:!0,next:!0,prev:!0};function P(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}C.fn.extend({has:function(t){var e=C(t,this),n=e.length;return this.filter(function(){for(var t=0;t-1:1===n.nodeType&&C.find.matchesSelector(n,t))){o.push(n);break}return this.pushStack(o.length>1?C.uniqueSort(o):o)},index:function(t){return t?"string"==typeof t?f.call(C(t),this[0]):f.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),C.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return A(t,"parentNode")},parentsUntil:function(t,e,n){return A(t,"parentNode",n)},next:function(t){return P(t,"nextSibling")},prev:function(t){return P(t,"previousSibling")},nextAll:function(t){return A(t,"nextSibling")},prevAll:function(t){return A(t,"previousSibling")},nextUntil:function(t,e,n){return A(t,"nextSibling",n)},prevUntil:function(t,e,n){return A(t,"previousSibling",n)},siblings:function(t){return S((t.parentNode||{}).firstChild,t)},children:function(t){return S(t.firstChild)},contents:function(t){return O(t,"iframe")?t.contentDocument:(O(t,"template")&&(t=t.content||t),C.merge([],t.childNodes))}},function(t,e){C.fn[t]=function(n,r){var i=C.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=C.filter(r,i)),this.length>1&&(R[t]||C.uniqueSort(i),L.test(t)&&i.reverse()),this.pushStack(i)}});var F=/[^\x20\t\r\n\f]+/g;function M(t){return t}function q(t){throw t}function B(t,e,n,r){var i;try{t&&y(i=t.promise)?i.call(t).done(e).fail(n):t&&y(i=t.then)?i.call(t,e,n):e.apply(void 0,[t].slice(r))}catch(t){n.apply(void 0,[t])}}C.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return C.each(t.match(F)||[],function(t,n){e[n]=!0}),e}(t):C.extend({},t);var e,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||t.once,r=e=!0;a.length;s=-1)for(n=a.shift();++s-1;)o.splice(n,1),n<=s&&s--}),this},has:function(t){return t?C.inArray(t,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||e||(o=n=""),this},locked:function(){return!!i},fireWith:function(t,n){return i||(n=[t,(n=n||[]).slice?n.slice():n],a.push(n),e||u()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},C.extend({Deferred:function(t){var e=[["notify","progress",C.Callbacks("memory"),C.Callbacks("memory"),2],["resolve","done",C.Callbacks("once memory"),C.Callbacks("once memory"),0,"resolved"],["reject","fail",C.Callbacks("once memory"),C.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(t){return i.then(null,t)},pipe:function(){var t=arguments;return C.Deferred(function(n){C.each(e,function(e,r){var i=y(t[r[4]])&&t[r[4]];o[r[1]](function(){var t=i&&i.apply(this,arguments);t&&y(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[t]:arguments)})}),t=null}).promise()},then:function(t,r,i){var o=0;function a(t,e,r,i){return function(){var s=this,u=arguments,c=function(){var n,c;if(!(t=o&&(r!==q&&(s=void 0,u=[n]),e.rejectWith(s,u))}};t?l():(C.Deferred.getStackHook&&(l.stackTrace=C.Deferred.getStackHook()),n.setTimeout(l))}}return C.Deferred(function(n){e[0][3].add(a(0,n,y(i)?i:M,n.notifyWith)),e[1][3].add(a(0,n,y(t)?t:M)),e[2][3].add(a(0,n,y(r)?r:q))}).promise()},promise:function(t){return null!=t?C.extend(t,i):i}},o={};return C.each(e,function(t,n){var a=n[2],s=n[5];i[n[1]]=a.add,s&&a.add(function(){r=s},e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),a.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(t){var e=arguments.length,n=e,r=Array(n),i=u.call(arguments),o=C.Deferred(),a=function(t){return function(n){r[t]=this,i[t]=arguments.length>1?u.call(arguments):n,--e||o.resolveWith(r,i)}};if(e<=1&&(B(t,o.done(a(n)).resolve,o.reject,!e),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)B(i[n],a(n),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;C.Deferred.exceptionHook=function(t,e){n.console&&n.console.warn&&t&&H.test(t.name)&&n.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},C.readyException=function(t){n.setTimeout(function(){throw t})};var U=C.Deferred();function W(){a.removeEventListener("DOMContentLoaded",W),n.removeEventListener("load",W),C.ready()}C.fn.ready=function(t){return U.then(t).catch(function(t){C.readyException(t)}),this},C.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--C.readyWait:C.isReady)||(C.isReady=!0,!0!==t&&--C.readyWait>0||U.resolveWith(a,[C]))}}),C.ready.then=U.then,"complete"===a.readyState||"loading"!==a.readyState&&!a.documentElement.doScroll?n.setTimeout(C.ready):(a.addEventListener("DOMContentLoaded",W),n.addEventListener("load",W));var z=function(t,e,n,r,i,o,a){var s=0,u=t.length,c=null==n;if("object"===x(n))for(s in i=!0,n)z(t,e,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,y(r)||(a=!0),c&&(a?(e.call(t,r),e=null):(c=e,e=function(t,e,n){return c.call(C(t),n)})),e))for(;s1,null,!0)},removeData:function(t){return this.each(function(){Z.remove(this,t)})}}),C.extend({queue:function(t,e,n){var r;if(t)return e=(e||"fx")+"queue",r=Y.get(t,e),n&&(!r||Array.isArray(n)?r=Y.access(t,e,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(t,e){e=e||"fx";var n=C.queue(t,e),r=n.length,i=n.shift(),o=C._queueHooks(t,e);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete o.stop,i.call(t,function(){C.dequeue(t,e)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Y.get(t,n)||Y.access(t,n,{empty:C.Callbacks("once memory").add(function(){Y.remove(t,[e+"queue",n])})})}}),C.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]+)/i,ht=/^$|^module$|\/(?:java|ecma)script/i,vt={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function mt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?C.merge([t],n):n}function gt(t,e){for(var n=0,r=t.length;n-1)i&&i.push(o);else if(c=C.contains(o.ownerDocument,o),a=mt(f.appendChild(o),"script"),c&>(a),n)for(l=0;o=a[l++];)ht.test(o.type||"")&&n.push(o);return f}yt=a.createDocumentFragment().appendChild(a.createElement("div")),(bt=a.createElement("input")).setAttribute("type","radio"),bt.setAttribute("checked","checked"),bt.setAttribute("name","t"),yt.appendChild(bt),g.checkClone=yt.cloneNode(!0).cloneNode(!0).lastChild.checked,yt.innerHTML="",g.noCloneChecked=!!yt.cloneNode(!0).lastChild.defaultValue;var xt=a.documentElement,Ct=/^key/,Tt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,kt=/^([^.]*)(?:\.(.+)|)/;function $t(){return!0}function At(){return!1}function St(){try{return a.activeElement}catch(t){}}function Et(t,e,n,r,i,o){var a,s;if("object"==typeof e){for(s in"string"!=typeof n&&(r=r||n,n=void 0),e)Et(t,s,n,r,e[s],o);return t}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=At;else if(!i)return t;return 1===o&&(a=i,(i=function(t){return C().off(t),a.apply(this,arguments)}).guid=a.guid||(a.guid=C.guid++)),t.each(function(){C.event.add(this,e,i,r,n)})}C.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,c,l,f,p,d,h,v,m=Y.get(t);if(m)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&C.find.matchesSelector(xt,i),n.guid||(n.guid=C.guid++),(u=m.events)||(u=m.events={}),(a=m.handle)||(a=m.handle=function(e){return void 0!==C&&C.event.triggered!==e.type?C.event.dispatch.apply(t,arguments):void 0}),c=(e=(e||"").match(F)||[""]).length;c--;)d=v=(s=kt.exec(e[c])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},l=C.extend({type:d,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,l),l.handler.guid||(l.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,l):p.push(l),C.event.global[d]=!0)},remove:function(t,e,n,r,i){var o,a,s,u,c,l,f,p,d,h,v,m=Y.hasData(t)&&Y.get(t);if(m&&(u=m.events)){for(c=(e=(e||"").match(F)||[""]).length;c--;)if(d=v=(s=kt.exec(e[c])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)l=p[o],!i&&v!==l.origType||n&&n.guid!==l.guid||s&&!s.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(o,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(t,l));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(t,h,m.handle)||C.removeEvent(t,d,m.handle),delete u[d])}else for(d in u)C.event.remove(t,d+e[c],n,r,!0);C.isEmptyObject(u)&&Y.remove(t,"handle events")}},dispatch:function(t){var e,n,r,i,o,a,s=C.event.fix(t),u=new Array(arguments.length),c=(Y.get(this,"events")||{})[s.type]||[],l=C.event.special[s.type]||{};for(u[0]=s,e=1;e=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==t.type||!0!==c.disabled)){for(o=[],a={},n=0;n-1:C.find(i,this,null,[c]).length),a[i]&&o.push(r);o.length&&s.push({elem:c,handlers:o})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,jt=/\s*$/g;function It(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&C(t).children("tbody")[0]||t}function Lt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Rt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Pt(t,e){var n,r,i,o,a,s,u,c;if(1===e.nodeType){if(Y.hasData(t)&&(o=Y.access(t),a=Y.set(e,o),c=o.events))for(i in delete a.handle,a.events={},c)for(n=0,r=c[i].length;n1&&"string"==typeof h&&!g.checkClone&&Nt.test(h))return t.each(function(i){var o=t.eq(i);v&&(e[0]=h.call(this,i,o.html())),Ft(o,e,n,r)});if(p&&(o=(i=wt(e,t[0].ownerDocument,!1,t,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=C.map(mt(i,"script"),Lt)).length;f")},clone:function(t,e,n){var r,i,o,a,s,u,c,l=t.cloneNode(!0),f=C.contains(t.ownerDocument,t);if(!(g.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||C.isXMLDoc(t)))for(a=mt(l),r=0,i=(o=mt(t)).length;r0&>(a,!f&&mt(t,"script")),l},cleanData:function(t){for(var e,n,r,i=C.event.special,o=0;void 0!==(n=t[o]);o++)if(G(n)){if(e=n[Y.expando]){if(e.events)for(r in e.events)i[r]?C.event.remove(n,r):C.removeEvent(n,r,e.handle);n[Y.expando]=void 0}n[Z.expando]&&(n[Z.expando]=void 0)}}}),C.fn.extend({detach:function(t){return Mt(this,t,!0)},remove:function(t){return Mt(this,t)},text:function(t){return z(this,function(t){return void 0===t?C.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)})},null,t,arguments.length)},append:function(){return Ft(this,arguments,function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||It(this,t).appendChild(t)})},prepend:function(){return Ft(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=It(this,t);e.insertBefore(t,e.firstChild)}})},before:function(){return Ft(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return Ft(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(C.cleanData(mt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return C.clone(this,t,e)})},html:function(t){return z(this,function(t){var e=this[0]||{},n=0,r=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!jt.test(t)&&!vt[(dt.exec(t)||["",""])[1].toLowerCase()]){t=C.htmlPrefilter(t);try{for(;n=0&&(u+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-o-u-s-.5))),u}function te(t,e,n){var r=Bt(t),i=Ut(t,e,r),o="border-box"===C.css(t,"boxSizing",!1,r),a=o;if(qt.test(i)){if(!n)return i;i="auto"}return a=a&&(g.boxSizingReliable()||i===t.style[e]),("auto"===i||!parseFloat(i)&&"inline"===C.css(t,"display",!1,r))&&(i=t["offset"+e[0].toUpperCase()+e.slice(1)],a=!0),(i=parseFloat(i)||0)+Zt(t,e,n||(o?"border":"content"),a,r,i)+"px"}function ee(t,e,n,r,i){return new ee.prototype.init(t,e,n,r,i)}C.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Ut(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,r){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var i,o,a,s=J(e),u=Vt.test(e),c=t.style;if(u||(e=Qt(s)),a=C.cssHooks[e]||C.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(t,!1,r))?i:c[e];"string"===(o=typeof n)&&(i=it.exec(n))&&i[1]&&(n=ut(t,e,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),g.clearCloneStyle||""!==n||0!==e.indexOf("background")||(c[e]="inherit"),a&&"set"in a&&void 0===(n=a.set(t,n,r))||(u?c.setProperty(e,n):c[e]=n))}},css:function(t,e,n,r){var i,o,a,s=J(e);return Vt.test(e)||(e=Qt(s)),(a=C.cssHooks[e]||C.cssHooks[s])&&"get"in a&&(i=a.get(t,!0,n)),void 0===i&&(i=Ut(t,e,r)),"normal"===i&&e in Kt&&(i=Kt[e]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),C.each(["height","width"],function(t,e){C.cssHooks[e]={get:function(t,n,r){if(n)return!zt.test(C.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?te(t,e,r):st(t,Xt,function(){return te(t,e,r)})},set:function(t,n,r){var i,o=Bt(t),a="border-box"===C.css(t,"boxSizing",!1,o),s=r&&Zt(t,e,r,a,o);return a&&g.scrollboxSize()===o.position&&(s-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(o[e])-Zt(t,e,"border",!1,o)-.5)),s&&(i=it.exec(n))&&"px"!==(i[3]||"px")&&(t.style[e]=n,n=C.css(t,e)),Yt(0,n,s)}}}),C.cssHooks.marginLeft=Wt(g.reliableMarginLeft,function(t,e){if(e)return(parseFloat(Ut(t,"marginLeft"))||t.getBoundingClientRect().left-st(t,{marginLeft:0},function(){return t.getBoundingClientRect().left}))+"px"}),C.each({margin:"",padding:"",border:"Width"},function(t,e){C.cssHooks[t+e]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[t+ot[r]+e]=o[r]||o[r-2]||o[0];return i}},"margin"!==t&&(C.cssHooks[t+e].set=Yt)}),C.fn.extend({css:function(t,e){return z(this,function(t,e,n){var r,i,o={},a=0;if(Array.isArray(e)){for(r=Bt(t),i=e.length;a1)}}),C.Tween=ee,ee.prototype={constructor:ee,init:function(t,e,n,r,i,o){this.elem=t,this.prop=n,this.easing=i||C.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var t=ee.propHooks[this.prop];return t&&t.get?t.get(this):ee.propHooks._default.get(this)},run:function(t){var e,n=ee.propHooks[this.prop];return this.options.duration?this.pos=e=C.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ee.propHooks._default.set(this),this}},ee.prototype.init.prototype=ee.prototype,ee.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=C.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){C.fx.step[t.prop]?C.fx.step[t.prop](t):1!==t.elem.nodeType||null==t.elem.style[C.cssProps[t.prop]]&&!C.cssHooks[t.prop]?t.elem[t.prop]=t.now:C.style(t.elem,t.prop,t.now+t.unit)}}},ee.propHooks.scrollTop=ee.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},C.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},C.fx=ee.prototype.init,C.fx.step={};var ne,re,ie=/^(?:toggle|show|hide)$/,oe=/queueHooks$/;function ae(){re&&(!1===a.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(ae):n.setTimeout(ae,C.fx.interval),C.fx.tick())}function se(){return n.setTimeout(function(){ne=void 0}),ne=Date.now()}function ue(t,e){var n,r=0,i={height:t};for(e=e?1:0;r<4;r+=2-e)i["margin"+(n=ot[r])]=i["padding"+n]=t;return e&&(i.opacity=i.width=t),i}function ce(t,e,n){for(var r,i=(le.tweeners[e]||[]).concat(le.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(t){return this.each(function(){C.removeAttr(this,t)})}}),C.extend({attr:function(t,e,n){var r,i,o=t.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===t.getAttribute?C.prop(t,e,n):(1===o&&C.isXMLDoc(t)||(i=C.attrHooks[e.toLowerCase()]||(C.expr.match.bool.test(e)?fe:void 0)),void 0!==n?null===n?void C.removeAttr(t,e):i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:(t.setAttribute(e,n+""),n):i&&"get"in i&&null!==(r=i.get(t,e))?r:null==(r=C.find.attr(t,e))?void 0:r)},attrHooks:{type:{set:function(t,e){if(!g.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,r=0,i=e&&e.match(F);if(i&&1===t.nodeType)for(;n=i[r++];)t.removeAttribute(n)}}),fe={set:function(t,e,n){return!1===e?C.removeAttr(t,n):t.setAttribute(n,n),n}},C.each(C.expr.match.bool.source.match(/\w+/g),function(t,e){var n=pe[e]||C.find.attr;pe[e]=function(t,e,r){var i,o,a=e.toLowerCase();return r||(o=pe[a],pe[a]=i,i=null!=n(t,e,r)?a:null,pe[a]=o),i}});var de=/^(?:input|select|textarea|button)$/i,he=/^(?:a|area)$/i;function ve(t){return(t.match(F)||[]).join(" ")}function me(t){return t.getAttribute&&t.getAttribute("class")||""}function ge(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(F)||[]}C.fn.extend({prop:function(t,e){return z(this,C.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each(function(){delete this[C.propFix[t]||t]})}}),C.extend({prop:function(t,e,n){var r,i,o=t.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&C.isXMLDoc(t)||(e=C.propFix[e]||e,i=C.propHooks[e]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:t[e]=n:i&&"get"in i&&null!==(r=i.get(t,e))?r:t[e]},propHooks:{tabIndex:{get:function(t){var e=C.find.attr(t,"tabindex");return e?parseInt(e,10):de.test(t.nodeName)||he.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(C.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){C.propFix[this.toLowerCase()]=this}),C.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(y(t))return this.each(function(e){C(this).addClass(t.call(this,e,me(this)))});if((e=ge(t)).length)for(;n=this[u++];)if(i=me(n),r=1===n.nodeType&&" "+ve(i)+" "){for(a=0;o=e[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ve(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(y(t))return this.each(function(e){C(this).removeClass(t.call(this,e,me(this)))});if(!arguments.length)return this.attr("class","");if((e=ge(t)).length)for(;n=this[u++];)if(i=me(n),r=1===n.nodeType&&" "+ve(i)+" "){for(a=0;o=e[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=ve(r))&&n.setAttribute("class",s)}return this},toggleClass:function(t,e){var n=typeof t,r="string"===n||Array.isArray(t);return"boolean"==typeof e&&r?e?this.addClass(t):this.removeClass(t):y(t)?this.each(function(n){C(this).toggleClass(t.call(this,n,me(this),e),e)}):this.each(function(){var e,i,o,a;if(r)for(i=0,o=C(this),a=ge(t);e=a[i++];)o.hasClass(e)?o.removeClass(e):o.addClass(e);else void 0!==t&&"boolean"!==n||((e=me(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Y.get(this,"__className__")||""))})},hasClass:function(t){var e,n,r=0;for(e=" "+t+" ";n=this[r++];)if(1===n.nodeType&&(" "+ve(me(n))+" ").indexOf(e)>-1)return!0;return!1}});var ye=/\r/g;C.fn.extend({val:function(t){var e,n,r,i=this[0];return arguments.length?(r=y(t),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?t.call(this,n,C(this).val()):t)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=C.map(i,function(t){return null==t?"":t+""})),(e=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,i,"value")||(this.value=i))})):i?(e=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(ye,""):null==n?"":n:void 0}}),C.extend({valHooks:{option:{get:function(t){var e=C.find.attr(t,"value");return null!=e?e:ve(C.text(t))}},select:{get:function(t){var e,n,r,i=t.options,o=t.selectedIndex,a="select-one"===t.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(t.selectedIndex=-1),o}}}}),C.each(["radio","checkbox"],function(){C.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=C.inArray(C(t).val(),e)>-1}},g.checkOn||(C.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}),g.focusin="onfocusin"in n;var be=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};C.extend(C.event,{trigger:function(t,e,r,i){var o,s,u,c,l,f,p,d,v=[r||a],m=h.call(t,"type")?t.type:t,g=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=u=r=r||a,3!==r.nodeType&&8!==r.nodeType&&!be.test(m+C.event.triggered)&&(m.indexOf(".")>-1&&(m=(g=m.split(".")).shift(),g.sort()),l=m.indexOf(":")<0&&"on"+m,(t=t[C.expando]?t:new C.Event(m,"object"==typeof t&&t)).isTrigger=i?2:3,t.namespace=g.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),e=null==e?[t]:C.makeArray(e,[t]),p=C.event.special[m]||{},i||!p.trigger||!1!==p.trigger.apply(r,e))){if(!i&&!p.noBubble&&!b(r)){for(c=p.delegateType||m,be.test(c+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(r.ownerDocument||a)&&v.push(u.defaultView||u.parentWindow||n)}for(o=0;(s=v[o++])&&!t.isPropagationStopped();)d=s,t.type=o>1?c:p.bindType||m,(f=(Y.get(s,"events")||{})[t.type]&&Y.get(s,"handle"))&&f.apply(s,e),(f=l&&s[l])&&f.apply&&G(s)&&(t.result=f.apply(s,e),!1===t.result&&t.preventDefault());return t.type=m,i||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(v.pop(),e)||!G(r)||l&&y(r[m])&&!b(r)&&((u=r[l])&&(r[l]=null),C.event.triggered=m,t.isPropagationStopped()&&d.addEventListener(m,_e),r[m](),t.isPropagationStopped()&&d.removeEventListener(m,_e),C.event.triggered=void 0,u&&(r[l]=u)),t.result}},simulate:function(t,e,n){var r=C.extend(new C.Event,n,{type:t,isSimulated:!0});C.event.trigger(r,null,e)}}),C.fn.extend({trigger:function(t,e){return this.each(function(){C.event.trigger(t,e,this)})},triggerHandler:function(t,e){var n=this[0];if(n)return C.event.trigger(t,e,n,!0)}}),g.focusin||C.each({focus:"focusin",blur:"focusout"},function(t,e){var n=function(t){C.event.simulate(e,t.target,C.event.fix(t))};C.event.special[e]={setup:function(){var r=this.ownerDocument||this,i=Y.access(r,e);i||r.addEventListener(t,n,!0),Y.access(r,e,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Y.access(r,e)-1;i?Y.access(r,e,i):(r.removeEventListener(t,n,!0),Y.remove(r,e))}}});var we=n.location,xe=Date.now(),Ce=/\?/;C.parseXML=function(t){var e;if(!t||"string"!=typeof t)return null;try{e=(new n.DOMParser).parseFromString(t,"text/xml")}catch(t){e=void 0}return e&&!e.getElementsByTagName("parsererror").length||C.error("Invalid XML: "+t),e};var Te=/\[\]$/,ke=/\r?\n/g,$e=/^(?:submit|button|image|reset|file)$/i,Ae=/^(?:input|select|textarea|keygen)/i;function Se(t,e,n,r){var i;if(Array.isArray(e))C.each(e,function(e,i){n||Te.test(t)?r(t,i):Se(t+"["+("object"==typeof i&&null!=i?e:"")+"]",i,n,r)});else if(n||"object"!==x(e))r(t,e);else for(i in e)Se(t+"["+i+"]",e[i],n,r)}C.param=function(t,e){var n,r=[],i=function(t,e){var n=y(e)?e():e;r[r.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(t)||t.jquery&&!C.isPlainObject(t))C.each(t,function(){i(this.name,this.value)});else for(n in t)Se(n,t[n],e,i);return r.join("&")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=C.prop(this,"elements");return t?C.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!C(this).is(":disabled")&&Ae.test(this.nodeName)&&!$e.test(t)&&(this.checked||!pt.test(t))}).map(function(t,e){var n=C(this).val();return null==n?null:Array.isArray(n)?C.map(n,function(t){return{name:e.name,value:t.replace(ke,"\r\n")}}):{name:e.name,value:n.replace(ke,"\r\n")}}).get()}});var Ee=/%20/g,Oe=/#.*$/,je=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,De=/^(?:GET|HEAD)$/,Ie=/^\/\//,Le={},Re={},Pe="*/".concat("*"),Fe=a.createElement("a");function Me(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var r,i=0,o=e.toLowerCase().match(F)||[];if(y(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(t[r]=t[r]||[]).unshift(n)):(t[r]=t[r]||[]).push(n)}}function qe(t,e,n,r){var i={},o=t===Re;function a(s){var u;return i[s]=!0,C.each(t[s]||[],function(t,s){var c=s(e,n,r);return"string"!=typeof c||o||i[c]?o?!(u=c):void 0:(e.dataTypes.unshift(c),a(c),!1)}),u}return a(e.dataTypes[0])||!i["*"]&&a("*")}function Be(t,e){var n,r,i=C.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((i[n]?t:r||(r={}))[n]=e[n]);return r&&C.extend(!0,t,r),t}Fe.href=we.href,C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:we.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(we.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Pe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,C.ajaxSettings),e):Be(C.ajaxSettings,t)},ajaxPrefilter:Me(Le),ajaxTransport:Me(Re),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var r,i,o,s,u,c,l,f,p,d,h=C.ajaxSetup({},e),v=h.context||h,m=h.context&&(v.nodeType||v.jquery)?C(v):C.event,g=C.Deferred(),y=C.Callbacks("once memory"),b=h.statusCode||{},_={},w={},x="canceled",T={readyState:0,getResponseHeader:function(t){var e;if(l){if(!s)for(s={};e=Ne.exec(o);)s[e[1].toLowerCase()]=e[2];e=s[t.toLowerCase()]}return null==e?null:e},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(t,e){return null==l&&(t=w[t.toLowerCase()]=w[t.toLowerCase()]||t,_[t]=e),this},overrideMimeType:function(t){return null==l&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(l)T.always(t[T.status]);else for(e in t)b[e]=[b[e],t[e]];return this},abort:function(t){var e=t||x;return r&&r.abort(e),k(0,e),this}};if(g.promise(T),h.url=((t||h.url||we.href)+"").replace(Ie,we.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(F)||[""],null==h.crossDomain){c=a.createElement("a");try{c.href=h.url,c.href=c.href,h.crossDomain=Fe.protocol+"//"+Fe.host!=c.protocol+"//"+c.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=C.param(h.data,h.traditional)),qe(Le,h,e,T),l)return T;for(p in(f=C.event&&h.global)&&0==C.active++&&C.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!De.test(h.type),i=h.url.replace(Oe,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(i.length),h.data&&(h.processData||"string"==typeof h.data)&&(i+=(Ce.test(i)?"&":"?")+h.data,delete h.data),!1===h.cache&&(i=i.replace(je,"$1"),d=(Ce.test(i)?"&":"?")+"_="+xe+++d),h.url=i+d),h.ifModified&&(C.lastModified[i]&&T.setRequestHeader("If-Modified-Since",C.lastModified[i]),C.etag[i]&&T.setRequestHeader("If-None-Match",C.etag[i])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&T.setRequestHeader("Content-Type",h.contentType),T.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Pe+"; q=0.01":""):h.accepts["*"]),h.headers)T.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(v,T,h)||l))return T.abort();if(x="abort",y.add(h.complete),T.done(h.success),T.fail(h.error),r=qe(Re,h,e,T)){if(T.readyState=1,f&&m.trigger("ajaxSend",[T,h]),l)return T;h.async&&h.timeout>0&&(u=n.setTimeout(function(){T.abort("timeout")},h.timeout));try{l=!1,r.send(_,k)}catch(t){if(l)throw t;k(-1,t)}}else k(-1,"No Transport");function k(t,e,a,s){var c,p,d,_,w,x=e;l||(l=!0,u&&n.clearTimeout(u),r=void 0,o=s||"",T.readyState=t>0?4:0,c=t>=200&&t<300||304===t,a&&(_=function(t,e,n){for(var r,i,o,a,s=t.contents,u=t.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=t.mimeType||e.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||t.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,T,a)),_=function(t,e,n,r){var i,o,a,s,u,c={},l=t.dataTypes.slice();if(l[1])for(a in t.converters)c[a.toLowerCase()]=t.converters[a];for(o=l.shift();o;)if(t.responseFields[o]&&(n[t.responseFields[o]]=e),!u&&r&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),u=o,o=l.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=c[u+" "+o]||c["* "+o]))for(i in c)if((s=i.split(" "))[1]===o&&(a=c[u+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[i]:!0!==c[i]&&(o=s[0],l.unshift(s[1]));break}if(!0!==a)if(a&&t.throws)e=a(e);else try{e=a(e)}catch(t){return{state:"parsererror",error:a?t:"No conversion from "+u+" to "+o}}}return{state:"success",data:e}}(h,_,T,c),c?(h.ifModified&&((w=T.getResponseHeader("Last-Modified"))&&(C.lastModified[i]=w),(w=T.getResponseHeader("etag"))&&(C.etag[i]=w)),204===t||"HEAD"===h.type?x="nocontent":304===t?x="notmodified":(x=_.state,p=_.data,c=!(d=_.error))):(d=x,!t&&x||(x="error",t<0&&(t=0))),T.status=t,T.statusText=(e||x)+"",c?g.resolveWith(v,[p,x,T]):g.rejectWith(v,[T,x,d]),T.statusCode(b),b=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[T,h,c?p:d]),y.fireWith(v,[T,x]),f&&(m.trigger("ajaxComplete",[T,h]),--C.active||C.event.trigger("ajaxStop")))}return T},getJSON:function(t,e,n){return C.get(t,e,n,"json")},getScript:function(t,e){return C.get(t,void 0,e,"script")}}),C.each(["get","post"],function(t,e){C[e]=function(t,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),C.ajax(C.extend({url:t,type:e,dataType:i,data:n,success:r},C.isPlainObject(t)&&t))}}),C._evalUrl=function(t){return C.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},C.fn.extend({wrapAll:function(t){var e;return this[0]&&(y(t)&&(t=t.call(this[0])),e=C(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t}).append(this)),this},wrapInner:function(t){return y(t)?this.each(function(e){C(this).wrapInner(t.call(this,e))}):this.each(function(){var e=C(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)})},wrap:function(t){var e=y(t);return this.each(function(n){C(this).wrapAll(e?t.call(this,n):t)})},unwrap:function(t){return this.parent(t).not("body").each(function(){C(this).replaceWith(this.childNodes)}),this}}),C.expr.pseudos.hidden=function(t){return!C.expr.pseudos.visible(t)},C.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},C.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(t){}};var He={0:200,1223:204},Ue=C.ajaxSettings.xhr();g.cors=!!Ue&&"withCredentials"in Ue,g.ajax=Ue=!!Ue,C.ajaxTransport(function(t){var e,r;if(g.cors||Ue&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];for(a in t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);e=function(t){return function(){e&&(e=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===t?s.abort():"error"===t?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(He[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=e(),r=s.onerror=s.ontimeout=e("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout(function(){e&&r()})},e=e("abort");try{s.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}}),C.ajaxPrefilter(function(t){t.crossDomain&&(t.contents.script=!1)}),C.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return C.globalEval(t),t}}}),C.ajaxPrefilter("script",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")}),C.ajaxTransport("script",function(t){var e,n;if(t.crossDomain)return{send:function(r,i){e=C(" -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/resources/views/v1/categories/create.twig b/resources/views/v1/categories/create.twig index 4ebc15071b..fe7d881502 100644 --- a/resources/views/v1/categories/create.twig +++ b/resources/views/v1/categories/create.twig @@ -42,4 +42,4 @@ {% endblock %} {% block scripts %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/resources/views/v1/form/location.twig b/resources/views/v1/form/location.twig index 939bef8ff3..9b789bae62 100644 --- a/resources/views/v1/form/location.twig +++ b/resources/views/v1/form/location.twig @@ -1,7 +1,7 @@
- {% if env('MAPBOX_API_KEY','') == '' %} + {% if config('firefly.mapbox_api_key') == '' %}

{{ trans('firefly.mapbox_api_key')|raw }}

@@ -42,7 +42,7 @@
-{% if env('MAPBOX_API_KEY','') != '' %} +{% if config('firefly.mapbox_api_key') != '' %} {% set latitudevar = name~'_latitude' %} {% set longitudevar = name~'_longitude' %} {% set zoomlevelvar = name~'_zoomlevel' %} diff --git a/resources/views/v1/import/fints/choose_account.twig b/resources/views/v1/import/fints/choose_account.twig index 8b0509dac7..f658988c8b 100644 --- a/resources/views/v1/import/fints/choose_account.twig +++ b/resources/views/v1/import/fints/choose_account.twig @@ -41,4 +41,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/resources/views/v1/import/fints/new.twig b/resources/views/v1/import/fints/new.twig index 2fc1e32b96..839519a627 100644 --- a/resources/views/v1/import/fints/new.twig +++ b/resources/views/v1/import/fints/new.twig @@ -36,4 +36,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/resources/views/v1/import/ynab/redirect.twig b/resources/views/v1/import/ynab/redirect.twig index 56b0a159d4..a0bf532a0c 100644 --- a/resources/views/v1/import/ynab/redirect.twig +++ b/resources/views/v1/import/ynab/redirect.twig @@ -11,4 +11,4 @@ If you are not redirected automatically, follow this link to YNAB.. - \ No newline at end of file + diff --git a/resources/views/v1/javascript/variables.twig b/resources/views/v1/javascript/variables.twig index 3ee7aa17a5..803eb3a4f2 100644 --- a/resources/views/v1/javascript/variables.twig +++ b/resources/views/v1/javascript/variables.twig @@ -58,4 +58,4 @@ var delete_selected_txt = "{{ trans('firefly.delete')|escape('js') }}"; var nextLabel = "{{ trans('firefly.intro_next_label')|escape('js') }}"; var prevLabel = "{{ trans('firefly.intro_prev_label')|escape('js') }}"; var skipLabel = "{{ trans('firefly.intro_skip_label')|escape('js') }}"; -var doneLabel = "{{ trans('firefly.intro_done_label')|escape('js') }}"; \ No newline at end of file +var doneLabel = "{{ trans('firefly.intro_done_label')|escape('js') }}"; diff --git a/resources/views/v1/list/periods.twig b/resources/views/v1/list/periods.twig index c718663582..ac6bcb0dc7 100644 --- a/resources/views/v1/list/periods.twig +++ b/resources/views/v1/list/periods.twig @@ -42,4 +42,4 @@ -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/resources/views/v1/list/transactions.twig b/resources/views/v1/list/transactions.twig index dca2c06736..f122531c9c 100644 --- a/resources/views/v1/list/transactions.twig +++ b/resources/views/v1/list/transactions.twig @@ -77,4 +77,4 @@
{{ transactions.render|raw }}
- \ No newline at end of file + diff --git a/resources/views/v1/partials/favicons.twig b/resources/views/v1/partials/favicons.twig index 3eeda8b8fc..c685dd3340 100644 --- a/resources/views/v1/partials/favicons.twig +++ b/resources/views/v1/partials/favicons.twig @@ -1,11 +1,11 @@ - - - - - - + + + + + + - + diff --git a/resources/views/v1/partials/transaction-row.twig b/resources/views/v1/partials/transaction-row.twig index 846faa54f0..223bb6eb07 100644 --- a/resources/views/v1/partials/transaction-row.twig +++ b/resources/views/v1/partials/transaction-row.twig @@ -71,14 +71,14 @@ {% endif %} - -
+ +
{% if sorting %}{% endif %}
- -
- {% if not SANDSTORM %} -
-
-
-
-

{{ 'command_line_token'|_ }}

-
-
-

- {{ 'explain_command_line_token'|_ }} -

-

- -

-

-

- - -
-

+ {% if SANDSTORM %} +
+
+
+
+

Offer template

+
+
+

+ Block for sandstorm thing +

+
+ +
+
+
+
+
+ {% endif %} + {% if not SANDSTORM %} +
+
+
+
+

{{ 'command_line_token'|_ }}

+
+
+

+ {{ 'explain_command_line_token'|_ }} +

+

+ + +

+

+

+ + +
+

+
-
{% endif %} {% if not SANDSTORM %} -
-
-
-
-

{{ 'pref_two_factor_auth'|_ }}

-
-
-

{{ 'pref_two_factor_auth_help'|_ }}

- {% if enabled2FA == true %} +
+
+
+
+

{{ 'pref_two_factor_auth'|_ }}

+
+
+

{{ 'pref_two_factor_auth_help'|_ }}

+ {% if enabled2FA == true %} - - {% else %} -

-

- - -
-

- {% endif %} + + {% else %} +

+

+ + +
+

+ {% endif %} +
-
{% endif %}
@@ -103,3 +124,34 @@
{% endblock %} +{% block scripts %} + {% if SANDSTORM %} + + {% endif %} +{% endblock %} diff --git a/resources/views/v1/recurring/create.twig b/resources/views/v1/recurring/create.twig index aaf721eedf..c74d674995 100644 --- a/resources/views/v1/recurring/create.twig +++ b/resources/views/v1/recurring/create.twig @@ -17,7 +17,8 @@
{{ ExpandedForm.text('title') }} - {{ ExpandedForm.date('first_date',null, {helpText: trans('firefly.help_first_date')}) }} + {{ preFilled.first_date.format('Y-m-d') }} + {{ ExpandedForm.date('first_date',null, {helpText: trans('firefly.help_first_date'), min: preFilled.first_date}) }} {{ ExpandedForm.select('repetition_type', [], null, {helpText: trans('firefly.change_date_other_options')}) }} {{ ExpandedForm.number('skip', 0) }} {{ ExpandedForm.select('weekend', weekendResponses, null, {helpText: trans('firefly.help_weekend')}) }} @@ -173,7 +174,7 @@