]> git.immae.eu Git - perso/Immae/Config/Nix/NUR.git/commitdiff
Initial commit published for NUR nur_root
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Thu, 13 Dec 2018 20:25:24 +0000 (21:25 +0100)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Thu, 23 May 2019 23:40:13 +0000 (01:40 +0200)
485 files changed:
.gitignore [new file with mode: 0644]
LICENSE [new file with mode: 0644]
config/README.md [new file with mode: 0644]
config/nixRoot [new symlink]
config/overlays.nix [new file with mode: 0644]
default.nix [new file with mode: 0644]
fetch_version [new file with mode: 0755]
lib/node-env.nix [new file with mode: 0644]
libs.nix [new file with mode: 0644]
modules/default.nix [new file with mode: 0644]
modules/myids.nix [new file with mode: 0644]
modules/private/buildbot/common/build_helpers.py [new file with mode: 0644]
modules/private/buildbot/common/master.cfg [new file with mode: 0644]
modules/private/buildbot/default.nix [new file with mode: 0644]
modules/private/buildbot/projects/caldance/__init__.py [new file with mode: 0644]
modules/private/buildbot/projects/cryptoportfolio/__init__.py [new file with mode: 0644]
modules/private/buildbot/projects/test/__init__.py [new file with mode: 0644]
modules/private/certificates.nix [new file with mode: 0644]
modules/private/databases/default.nix [new file with mode: 0644]
modules/private/databases/mariadb.nix [new file with mode: 0644]
modules/private/databases/openldap/default.nix [new file with mode: 0644]
modules/private/databases/openldap/immae.schema [new file with mode: 0644]
modules/private/databases/postgresql.nix [new file with mode: 0644]
modules/private/databases/redis.nix [new file with mode: 0644]
modules/private/default.nix [new file with mode: 0644]
modules/private/dns.nix [new file with mode: 0644]
modules/private/ftp.nix [new file with mode: 0644]
modules/private/gitolite/default.nix [new file with mode: 0644]
modules/private/gitolite/gitolite_ldap_groups.sh [new file with mode: 0755]
modules/private/irc.nix [new file with mode: 0644]
modules/private/mail.nix [new file with mode: 0644]
modules/private/mpd.nix [new file with mode: 0644]
modules/private/pub/default.nix [new file with mode: 0644]
modules/private/pub/restrict [new file with mode: 0644]
modules/private/pub/tmux.restrict.conf [new file with mode: 0644]
modules/private/ssh/default.nix [new file with mode: 0644]
modules/private/ssh/ldap_authorized_keys.sh [new file with mode: 0755]
modules/private/system.nix [new file with mode: 0644]
modules/private/system/eldiron.nix [new file with mode: 0644]
modules/private/tasks/default.nix [new file with mode: 0644]
modules/private/tasks/www/index.php [new file with mode: 0644]
modules/private/websites/aten/builder.nix [new file with mode: 0644]
modules/private/websites/aten/integration.nix [new file with mode: 0644]
modules/private/websites/aten/production.nix [new file with mode: 0644]
modules/private/websites/capitaines/mastodon_static/index.html [new file with mode: 0644]
modules/private/websites/capitaines/mastodon_static/oops.png [new file with mode: 0644]
modules/private/websites/capitaines/production.nix [new file with mode: 0644]
modules/private/websites/chloe/builder.nix [new file with mode: 0644]
modules/private/websites/chloe/config/chmod.php [new file with mode: 0644]
modules/private/websites/chloe/config/connect.php [new file with mode: 0644]
modules/private/websites/chloe/config/ldap.php [new file with mode: 0644]
modules/private/websites/chloe/integration.nix [new file with mode: 0644]
modules/private/websites/chloe/production.nix [new file with mode: 0644]
modules/private/websites/commons/adminer.nix [new file with mode: 0644]
modules/private/websites/connexionswing/builder.nix [new file with mode: 0644]
modules/private/websites/connexionswing/integration.nix [new file with mode: 0644]
modules/private/websites/connexionswing/production.nix [new file with mode: 0644]
modules/private/websites/default.nix [new file with mode: 0644]
modules/private/websites/denisejerome/production.nix [new file with mode: 0644]
modules/private/websites/emilia/moodle/pause.html [new file with mode: 0644]
modules/private/websites/emilia/production.nix [new file with mode: 0644]
modules/private/websites/florian/app.nix [new file with mode: 0644]
modules/private/websites/florian/builder_app.nix [new file with mode: 0644]
modules/private/websites/florian/integration.nix [new file with mode: 0644]
modules/private/websites/florian/production.nix [new file with mode: 0644]
modules/private/websites/immae/production.nix [new file with mode: 0644]
modules/private/websites/immae/release.nix [new file with mode: 0644]
modules/private/websites/immae/temp.nix [new file with mode: 0644]
modules/private/websites/leila/production.nix [new file with mode: 0644]
modules/private/websites/ludivinecassal/builder.nix [new file with mode: 0644]
modules/private/websites/ludivinecassal/integration.nix [new file with mode: 0644]
modules/private/websites/ludivinecassal/production.nix [new file with mode: 0644]
modules/private/websites/nassime/production.nix [new file with mode: 0644]
modules/private/websites/naturaloutil/production.nix [new file with mode: 0644]
modules/private/websites/papa/surveillance.nix [new file with mode: 0644]
modules/private/websites/piedsjaloux/builder.nix [new file with mode: 0644]
modules/private/websites/piedsjaloux/integration.nix [new file with mode: 0644]
modules/private/websites/piedsjaloux/production.nix [new file with mode: 0644]
modules/private/websites/tools/cloud/default.nix [new file with mode: 0644]
modules/private/websites/tools/dav/davical.nix [new file with mode: 0644]
modules/private/websites/tools/dav/default.nix [new file with mode: 0644]
modules/private/websites/tools/db/default.nix [new file with mode: 0644]
modules/private/websites/tools/diaspora/default.nix [new file with mode: 0644]
modules/private/websites/tools/ether/default.nix [new file with mode: 0644]
modules/private/websites/tools/git/default.nix [new file with mode: 0644]
modules/private/websites/tools/git/gitweb.nix [new file with mode: 0644]
modules/private/websites/tools/git/mantisbt.nix [new file with mode: 0644]
modules/private/websites/tools/mastodon/default.nix [new file with mode: 0644]
modules/private/websites/tools/mgoblin/default.nix [new file with mode: 0644]
modules/private/websites/tools/peertube/default.nix [new file with mode: 0644]
modules/private/websites/tools/tools/adminer.nix [new file with mode: 0644]
modules/private/websites/tools/tools/default.nix [new file with mode: 0644]
modules/private/websites/tools/tools/dokuwiki.nix [new file with mode: 0644]
modules/private/websites/tools/tools/kanboard.nix [new file with mode: 0644]
modules/private/websites/tools/tools/ldap.nix [new file with mode: 0644]
modules/private/websites/tools/tools/rainloop.nix [new file with mode: 0644]
modules/private/websites/tools/tools/rompr.nix [new file with mode: 0644]
modules/private/websites/tools/tools/roundcubemail.nix [new file with mode: 0644]
modules/private/websites/tools/tools/shaarli.nix [new file with mode: 0644]
modules/private/websites/tools/tools/ttrss.nix [new file with mode: 0644]
modules/private/websites/tools/tools/wallabag.nix [new file with mode: 0644]
modules/private/websites/tools/tools/ympd.nix [new file with mode: 0644]
modules/private/websites/tools/tools/yourls.nix [new file with mode: 0644]
modules/secrets.nix [new file with mode: 0644]
modules/webapps/diaspora.nix [new file with mode: 0644]
modules/webapps/etherpad-lite.nix [new file with mode: 0644]
modules/webapps/mastodon.nix [new file with mode: 0644]
modules/webapps/mediagoblin.nix [new file with mode: 0644]
modules/webapps/peertube.nix [new file with mode: 0644]
modules/webapps/webstats/default.nix [new file with mode: 0644]
modules/webapps/webstats/goaccess.conf [new file with mode: 0644]
modules/websites/default.nix [new file with mode: 0644]
modules/websites/httpd-service-builder.nix [new file with mode: 0644]
modules/websites/nosslVhost/index.html [new file with mode: 0644]
nix_path_env [new file with mode: 0644]
nixops/.gitignore [new file with mode: 0644]
nixops/Makefile [new file with mode: 0644]
nixops/custom_nixops.nix [new file with mode: 0644]
nixops/eldiron.nix [new file with mode: 0644]
nixops/migrate_hetzner.md [new file with mode: 0644]
nixops/scripts/nixops_wrap [new file with mode: 0755]
nixops/scripts/pull_deployment [new file with mode: 0755]
nixops/scripts/pull_environment [new file with mode: 0755]
nixops/scripts/push_deployment [new file with mode: 0755]
nixops/scripts/push_environment [new file with mode: 0755]
nixops/scripts/setup [new file with mode: 0755]
nixops/ssh/config [new file with mode: 0644]
nixops/state/.gitkeep [new file with mode: 0644]
overlays/bitlbee/bitlbee_long_nicks.patch [new file with mode: 0644]
overlays/bitlbee/default.nix [new file with mode: 0644]
overlays/bundix/default.nix [new file with mode: 0644]
overlays/databases/mysql/default.nix [new file with mode: 0644]
overlays/databases/postgresql/default.nix [new file with mode: 0644]
overlays/databases/postgresql/postgresql_run_socket_path.patch [new file with mode: 0644]
overlays/default.nix [new file with mode: 0644]
overlays/dwm/default.nix [new file with mode: 0644]
overlays/dwm/dwm_config.h [new file with mode: 0644]
overlays/elinks/default.nix [new file with mode: 0644]
overlays/elinks/elinks.json [new file with mode: 0644]
overlays/environments/default.nix [new file with mode: 0644]
overlays/environments/immae-eu.nix [new file with mode: 0644]
overlays/gitweb/default.nix [new file with mode: 0644]
overlays/gitweb/theme/git-favicon.png [new file with mode: 0644]
overlays/gitweb/theme/git-logo.png [new file with mode: 0644]
overlays/gitweb/theme/gitweb.css [new file with mode: 0644]
overlays/gitweb/theme/gitweb.js [new file with mode: 0644]
overlays/goaccess/default.nix [new file with mode: 0644]
overlays/kanboard/default.nix [new file with mode: 0644]
overlays/ldapvi/default.nix [new file with mode: 0644]
overlays/ldapvi/ldapvi.json [new file with mode: 0644]
overlays/lesspipe/default.nix [new file with mode: 0644]
overlays/neomutt/default.nix [new file with mode: 0644]
overlays/nixops/default.nix [new file with mode: 0644]
overlays/pass/default.nix [new file with mode: 0644]
overlays/pass/pass-fix-pass-init.patch [new file with mode: 0644]
overlays/pass/pass.json [new file with mode: 0644]
overlays/pelican/default.nix [new file with mode: 0644]
overlays/pelican/pelican.json [new file with mode: 0644]
overlays/profanity/default.nix [new file with mode: 0644]
overlays/python-packages/buildbot.nix [new file with mode: 0644]
overlays/python-packages/default.nix [new file with mode: 0644]
overlays/sc-im/default.nix [new file with mode: 0644]
overlays/shaarli/default.nix [new file with mode: 0644]
overlays/shaarli/shaarli_ldap.patch [new file with mode: 0644]
overlays/slrn/default.nix [new file with mode: 0644]
overlays/taskwarrior/default.nix [new file with mode: 0644]
overlays/vit/default.nix [new file with mode: 0644]
overlays/vit/vit.json [new file with mode: 0644]
overlays/weboob/default.nix [new file with mode: 0644]
overlays/weechat/default.nix [new file with mode: 0644]
overlays/ympd/default.nix [new file with mode: 0644]
overlays/ympd/ympd-password-env.patch [new file with mode: 0644]
overlays/ympd/ympd.json [new file with mode: 0644]
pkgs/bitlbee-mastodon/default.nix [new file with mode: 0644]
pkgs/boinctui/default.nix [new file with mode: 0644]
pkgs/cnagios/cnagios.json [new file with mode: 0644]
pkgs/cnagios/default.nix [new file with mode: 0644]
pkgs/composer-env/default.nix [new file with mode: 0644]
pkgs/crypto/cardano/daedalus.json [new file with mode: 0644]
pkgs/crypto/cardano/default.nix [new file with mode: 0644]
pkgs/crypto/iota-cli-app/default.nix [new file with mode: 0644]
pkgs/crypto/iota-cli-app/iota-cli-app.json [new file with mode: 0644]
pkgs/crypto/iota-cli-app/node-packages.nix [new file with mode: 0644]
pkgs/crypto/sia/default.nix [new file with mode: 0644]
pkgs/default.nix [new file with mode: 0644]
pkgs/duply/default.nix [new file with mode: 0644]
pkgs/flrn/default.nix [new file with mode: 0644]
pkgs/flrn/flrn.json [new file with mode: 0644]
pkgs/genius/default.nix [new file with mode: 0644]
pkgs/mpd_0_21/default.nix [new file with mode: 0644]
pkgs/mtop/default.nix [new file with mode: 0644]
pkgs/mutt-ics/default.nix [new file with mode: 0644]
pkgs/mutt-ics/mutt-ics.json [new file with mode: 0644]
pkgs/muttprint/0.73-4.diff.gz [new file with mode: 0644]
pkgs/muttprint/default.nix [new file with mode: 0644]
pkgs/muttprint/regex.patch [new file with mode: 0644]
pkgs/muttprint/two_edge.patch [new file with mode: 0644]
pkgs/nagios-cli/default.nix [new file with mode: 0644]
pkgs/nagios-cli/nagios-cli.json [new file with mode: 0644]
pkgs/nagnu/default.nix [new file with mode: 0644]
pkgs/nagnu/nagnu.json [new file with mode: 0644]
pkgs/note/default.nix [new file with mode: 0644]
pkgs/notmuch/notmuch-python/default.nix [new file with mode: 0644]
pkgs/notmuch/notmuch-vim/default.nix [new file with mode: 0644]
pkgs/pg_activity/default.nix [new file with mode: 0644]
pkgs/pg_activity/pg_activity.json [new file with mode: 0644]
pkgs/pgloader/default.nix [new file with mode: 0644]
pkgs/pgloader/pgloader.json [new file with mode: 0644]
pkgs/private/default.nix [new file with mode: 0644]
pkgs/private/webapps/apache-default/default.nix [new file with mode: 0644]
pkgs/private/webapps/apache-default/www/googleb6d69446ff4ca3e5.html [new file with mode: 0644]
pkgs/private/webapps/apache-default/www/index.htm [new file with mode: 0644]
pkgs/private/webapps/apache-default/www/maintenance_immae.html [new file with mode: 0644]
pkgs/private/webapps/apache-default/www/nossl.html [new file with mode: 0644]
pkgs/private/webapps/aten/aten.json [new file with mode: 0644]
pkgs/private/webapps/aten/default.nix [new file with mode: 0644]
pkgs/private/webapps/aten/php-packages.nix [new file with mode: 0644]
pkgs/private/webapps/aten/yarn-packages.nix [new file with mode: 0644]
pkgs/private/webapps/chloe/chloe.json [new file with mode: 0644]
pkgs/private/webapps/chloe/default.nix [new file with mode: 0644]
pkgs/private/webapps/connexionswing/connexionswing.json [new file with mode: 0644]
pkgs/private/webapps/connexionswing/default.nix [new file with mode: 0644]
pkgs/private/webapps/connexionswing/php-packages.nix [new file with mode: 0644]
pkgs/private/webapps/default.nix [new file with mode: 0644]
pkgs/private/webapps/ludivinecassal/default.nix [new file with mode: 0644]
pkgs/private/webapps/ludivinecassal/ludivinecassal.json [new file with mode: 0644]
pkgs/private/webapps/ludivinecassal/php-packages.nix [new file with mode: 0644]
pkgs/private/webapps/piedsjaloux/default.nix [new file with mode: 0644]
pkgs/private/webapps/piedsjaloux/php-packages.nix [new file with mode: 0644]
pkgs/private/webapps/piedsjaloux/piedsjaloux.json [new file with mode: 0644]
pkgs/private/webapps/tellesflorian/default.nix [new file with mode: 0644]
pkgs/private/webapps/tellesflorian/php-packages.nix [new file with mode: 0644]
pkgs/private/webapps/tellesflorian/tellesflorian.json [new file with mode: 0644]
pkgs/pure-ftpd/default.nix [new file with mode: 0644]
pkgs/python-packages/apprise/apprise.json [new file with mode: 0644]
pkgs/python-packages/apprise/default.nix [new file with mode: 0644]
pkgs/python-packages/buildbot/plugins/buildslist/bower.nix [new file with mode: 0644]
pkgs/python-packages/buildbot/plugins/buildslist/buildslist.json [new file with mode: 0644]
pkgs/python-packages/buildbot/plugins/buildslist/default.nix [new file with mode: 0644]
pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix [new file with mode: 0644]
pkgs/python-packages/buildbot/plugins/default.nix [new file with mode: 0644]
pkgs/python-packages/default.nix [new file with mode: 0644]
pkgs/python-packages/wokkel.nix [new file with mode: 0644]
pkgs/slang_1/default.nix [new file with mode: 0644]
pkgs/telegram-cli/default.nix [new file with mode: 0644]
pkgs/telegram-cli/telegram-cli.json [new file with mode: 0644]
pkgs/telegram-cli/telegram-cli.patch [new file with mode: 0644]
pkgs/telegram-history-dump/default.nix [new file with mode: 0644]
pkgs/telegram-history-dump/telegram-history-dump.json [new file with mode: 0644]
pkgs/telegramircd/default.nix [new file with mode: 0644]
pkgs/telegramircd/telegramircd.json [new file with mode: 0644]
pkgs/telethon_sync/default.nix [new file with mode: 0644]
pkgs/terminal-velocity/default.nix [new file with mode: 0644]
pkgs/terminal-velocity/fix_build.patch [new file with mode: 0644]
pkgs/terminal-velocity/python3_support.patch [new file with mode: 0644]
pkgs/terminal-velocity/sort_found_notes.patch [new file with mode: 0644]
pkgs/tiv/default.nix [new file with mode: 0644]
pkgs/tiv/tiv_builder.sh [new file with mode: 0644]
pkgs/unicode/default.nix [new file with mode: 0644]
pkgs/webapps/adminer/default.nix [new file with mode: 0644]
pkgs/webapps/apache-theme/default.nix [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/.htaccess [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/footer.html [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/header.html [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/archive.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/audio.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/authors.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/bin.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/blank.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/bmp.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/c.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/calc.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/cd.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/copying.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/cpp.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/css.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/deb.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/default.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/diff.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/doc.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/draw.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/eps.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/exe.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder-home.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder-open.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder-page.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder-parent.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/folder.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/gif.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/gzip.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/h.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/hpp.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/html.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/ico.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/image.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/install.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/java.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/jpg.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/js.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/json.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/log.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/makefile.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/markdown.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/package.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/pdf.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/php.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/playlist.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/png.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/pres.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/ps.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/psd.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/py.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/rar.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/rb.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/readme.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/rpm.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/rss.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/rtf.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/script.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/source.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/sql.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/tar.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/tex.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/text.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/tiff.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/unknown.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/vcal.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/video.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/xml.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/icons/zip.png [new file with mode: 0644]
pkgs/webapps/apache-theme/theme/style.css [new file with mode: 0644]
pkgs/webapps/awl/default.nix [new file with mode: 0644]
pkgs/webapps/davical/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch [new file with mode: 0644]
pkgs/webapps/davical/default.nix [new file with mode: 0644]
pkgs/webapps/default.nix [new file with mode: 0644]
pkgs/webapps/diaspora/default.nix [new file with mode: 0644]
pkgs/webapps/diaspora/diaspora.json [new file with mode: 0644]
pkgs/webapps/diaspora/gemset.nix [new file with mode: 0644]
pkgs/webapps/diaspora/gemset_ldap.nix [new file with mode: 0644]
pkgs/webapps/diaspora/ldap.patch [new file with mode: 0644]
pkgs/webapps/dokuwiki/default.nix [new file with mode: 0644]
pkgs/webapps/dokuwiki/dokuwiki.json [new file with mode: 0644]
pkgs/webapps/dokuwiki/plugins/farmer.nix [new file with mode: 0644]
pkgs/webapps/dokuwiki/plugins/todo.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/default.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/etherpad-lite.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/libreoffice_patch.diff [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/node-packages.nix [new file with mode: 0644]
pkgs/webapps/infcloud/default.nix [new file with mode: 0644]
pkgs/webapps/infcloud/infcloud_config.js [new file with mode: 0644]
pkgs/webapps/mantisbt_2/bug_report.php.diff [new file with mode: 0644]
pkgs/webapps/mantisbt_2/bug_report_page.php.diff [new file with mode: 0644]
pkgs/webapps/mantisbt_2/bugnote_add.php.diff [new file with mode: 0644]
pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff [new file with mode: 0644]
pkgs/webapps/mantisbt_2/default.nix [new file with mode: 0644]
pkgs/webapps/mantisbt_2/plugins/slack/default.nix [new file with mode: 0644]
pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff [new file with mode: 0644]
pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix [new file with mode: 0644]
pkgs/webapps/mastodon/default.nix [new file with mode: 0644]
pkgs/webapps/mastodon/gemset.nix [new file with mode: 0644]
pkgs/webapps/mastodon/mastodon.json [new file with mode: 0644]
pkgs/webapps/mastodon/yarn-packages.nix [new file with mode: 0644]
pkgs/webapps/mediagoblin/bower-packages.nix [new file with mode: 0644]
pkgs/webapps/mediagoblin/default.nix [new file with mode: 0644]
pkgs/webapps/mediagoblin/ldap_fix.py [new file with mode: 0644]
pkgs/webapps/mediagoblin/mediagoblin.json [new file with mode: 0644]
pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix [new file with mode: 0644]
pkgs/webapps/mediagoblin/tempita.json [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/audioplayer.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/bookmarks.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/calendar.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/carnet.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/contacts.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/deck.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/files_markdown.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/flowupload.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/gpxedit.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/gpxpod.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/keeweb.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/music.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/notes.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/ocsms.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/passman.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/spreed.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/apps/tasks.nix [new file with mode: 0644]
pkgs/webapps/nextcloud/default.nix [new file with mode: 0644]
pkgs/webapps/peertube/default.nix [new file with mode: 0644]
pkgs/webapps/peertube/ldap.patch [new file with mode: 0644]
pkgs/webapps/peertube/ldap_yarn.patch [new file with mode: 0644]
pkgs/webapps/peertube/peertube.json [new file with mode: 0644]
pkgs/webapps/peertube/sendmail.patch [new file with mode: 0644]
pkgs/webapps/peertube/yarn-packages.nix [new file with mode: 0644]
pkgs/webapps/peertube/yarn_fix_bluebird.patch [new file with mode: 0644]
pkgs/webapps/peertube/yarn_fix_bluebird_ldap.patch [new file with mode: 0644]
pkgs/webapps/phpldapadmin/default.nix [new file with mode: 0644]
pkgs/webapps/phpldapadmin/ldap-align-button.patch [new file with mode: 0644]
pkgs/webapps/phpldapadmin/ldap-disable-mcrypt.patch [new file with mode: 0644]
pkgs/webapps/phpldapadmin/ldap-php5_5.patch [new file with mode: 0644]
pkgs/webapps/phpldapadmin/ldap-php7_2.patch [new file with mode: 0644]
pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch [new file with mode: 0644]
pkgs/webapps/rompr/default.nix [new file with mode: 0644]
pkgs/webapps/rompr/rompr.json [new file with mode: 0644]
pkgs/webapps/roundcubemail/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/carddav/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix [new file with mode: 0644]
pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix [new file with mode: 0644]
pkgs/webapps/spip/default.nix [new file with mode: 0644]
pkgs/webapps/spip/spip_ldap_patch.patch [new file with mode: 0644]
pkgs/webapps/spip/spip_mes_options.php [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/Gemfile.lock [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/default.nix [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/fixes.patch [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/gemset.nix [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/taskwarrior-web.json [new file with mode: 0644]
pkgs/webapps/taskwarrior-web/thin.patch [new file with mode: 0644]
pkgs/webapps/ttrss/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/af_feedmod/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/auth_ldap/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/feediron/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/feediron/feediron.json [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/ff_instagram/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix [new file with mode: 0644]
pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json [new file with mode: 0644]
pkgs/webapps/ttrss/tt-rss.json [new file with mode: 0644]
pkgs/webapps/wallabag/default.nix [new file with mode: 0644]
pkgs/webapps/wallabag/ldap.patch [new file with mode: 0644]
pkgs/webapps/yourls/default.nix [new file with mode: 0644]
pkgs/webapps/yourls/plugins/ldap/default.nix [new file with mode: 0644]
pkgs/webapps/yourls/plugins/ldap/ldap.json [new file with mode: 0644]
pkgs/webapps/yourls/yourls.json [new file with mode: 0644]
scripts/make-env [new file with mode: 0755]
scripts/nix_infos [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..feb036e
--- /dev/null
@@ -0,0 +1,2 @@
+/result*
+/versions_log
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..243190c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,24 @@
+The MIT License (MIT)
+
+Copyright (c) 2011-2019 Ismaël Bouya http://www.normalesup.org/~bouya/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+Feel like tipping/donating? https://www.immae.eu/licenses_and_tipping
diff --git a/config/README.md b/config/README.md
new file mode 100644 (file)
index 0000000..542f31e
--- /dev/null
@@ -0,0 +1 @@
+Link this directory to ~/.config/nixpkgs
diff --git a/config/nixRoot b/config/nixRoot
new file mode 120000 (symlink)
index 0000000..a96aa0e
--- /dev/null
@@ -0,0 +1 @@
+..
\ No newline at end of file
diff --git a/config/overlays.nix b/config/overlays.nix
new file mode 100644 (file)
index 0000000..1040d59
--- /dev/null
@@ -0,0 +1 @@
+builtins.attrValues (import ./nixRoot/overlays)
diff --git a/default.nix b/default.nix
new file mode 100644 (file)
index 0000000..c7f515b
--- /dev/null
@@ -0,0 +1,11 @@
+{ pkgs ? import <nixpkgs> {} }:
+let
+  pkgs_ = pkgs;
+  mypkgs = import ./pkgs { pkgs = pkgs_; };
+in
+{
+  lib = import ./libs.nix { pkgs = pkgs_; };
+  modules = import ./modules;
+  overlays = import ./overlays;
+  pkgs = mypkgs;
+} // mypkgs
diff --git a/fetch_version b/fetch_version
new file mode 100755 (executable)
index 0000000..a0325f6
--- /dev/null
@@ -0,0 +1,173 @@
+#!/bin/bash
+
+usage() {
+  echo "$0 file.json"
+  echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url"
+  exit
+}
+
+branch="master"
+while [[ $# -gt 0 ]]; do
+  a="$1"
+  shift
+  case "$a" in
+    *.json)
+      file=$a
+      content=$(cat $a)
+      name="$(echo "$content" | jq -r ".meta.name")"
+      url="$(echo "$content" | jq -r ".meta.url")"
+      branch="$(echo "$content" | jq -r ".meta.branch")"
+      ;;
+    -n|--name)
+      name=$1
+      shift
+      ;;
+    -u|--url)
+      url=$1
+      shift
+      ;;
+    -b|--branch)
+      branch=$1
+      shift
+      ;;
+    -f|--file)
+      file=$1
+      shift
+      ;;
+    -h|--help)
+      usage
+      ;;
+  esac
+done
+if [ -z "$url" ]; then
+  usage
+fi
+if [ -z "$name" ]; then
+  name=$(echo "$url" | cut -d"/" -f5)
+fi
+if [ -z "$file" ]; then
+  file=$name.json
+fi
+
+# function fetch_ledger () {
+#   pushd $HOME/projets/ledger >/dev/null 2>/dev/null
+#   git fetch origin
+#   tag="$(git describe origin/next | sed -e "s/^v//")"
+#   rev="$(git show-ref -s refs/remotes/origin/next)"
+#   sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)"
+#   popd >/dev/null 2>/dev/null
+# }
+
+# awk_describe='BEGIN {
+#   FS = "[ /^]+"
+#   while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
+#     if (!sha)
+#       sha = substr($0, 1, 7)
+#     tag = $3
+#   }
+#   while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
+#     if ($3 ~ "commits")
+#       com = $2
+#   printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
+# }'
+
+function get_ref () {
+  case "$1" in
+    refs/*)
+      echo "$1"
+      ;;
+    *)
+      echo "refs/heads/$1"
+      ;;
+  esac
+}
+
+function get_name () {
+  branch="$1"
+  rev="$2"
+  minirev=${rev:0:7}
+
+  case "$branch" in
+    refs/tags/*)
+      b="${branch#refs/tags/}"
+      echo "${b//\//-}"
+      ;;
+    refs/heads/*)
+      b=${branch#refs/heads/}
+      echo "$minirev-${b//\//-}"
+      ;;
+    refs/*)
+      b=${branch#refs/}
+      echo "$minirev-${b//\//-}"
+      ;;
+    *)
+      echo "$minirev-${branch//\//-}"
+      ;;
+  esac
+}
+
+function fetch_github () {
+  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
+  sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)"
+  # Différent du git-describe et github-spécifique
+  #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//")
+  tag=$(get_name $branch $rev)
+}
+
+function fetch_other () {
+  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
+  sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')"
+  tag=$(get_name $branch $rev)
+}
+
+case "$url" in
+  https://*github.com/*)
+    fetch_github 2>/dev/null
+    owner=$(echo "$url" | cut -d"/" -f4)
+    repo=$(echo "$url" | cut -d"/" -f5)
+
+    F='{
+      "tag": $tag,
+      "meta": {
+        "name": $name,
+        "url": $url,
+        "branch": $branch
+      },
+      "github": {
+        "owner": $owner,
+        "repo": $repo,
+        "rev": $rev,
+        "sha256": $sha,
+        "fetchSubmodules": true
+      }
+    }'
+    ;;
+  *)
+    fetch_other 2>/dev/null
+    F='{
+      "tag": $tag,
+      "meta": {
+        "name": $name,
+        "url": $url,
+        "branch": $branch
+      },
+      "git": {
+        "url": $url,
+        "rev": $rev,
+        "sha256": $sha,
+        "fetchSubmodules": true
+      }
+    }'
+    ;;
+esac
+
+jq -n \
+  --arg name "$name" \
+  --arg owner "$owner" \
+  --arg repo "$repo" \
+  --arg tag "$tag" \
+  --arg rev "$rev" \
+  --arg url "$url" \
+  --arg branch "$branch" \
+  --arg sha "$sha" \
+  "$F" > $file
diff --git a/lib/node-env.nix b/lib/node-env.nix
new file mode 100644 (file)
index 0000000..720e0cc
--- /dev/null
@@ -0,0 +1,542 @@
+# This file originates from node2nix
+
+{stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
+
+let
+  python = if nodejs ? python then nodejs.python else python2;
+
+  # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
+  tarWrapper = runCommand "tarWrapper" {} ''
+    mkdir -p $out/bin
+
+    cat > $out/bin/tar <<EOF
+    #! ${stdenv.shell} -e
+    $(type -p tar) "\$@" --warning=no-unknown-keyword
+    EOF
+
+    chmod +x $out/bin/tar
+  '';
+
+  # Function that generates a TGZ file from a NPM project
+  buildNodeSourceDist =
+    { name, version, src, ... }:
+
+    stdenv.mkDerivation {
+      name = "node-tarball-${name}-${version}";
+      inherit src;
+      buildInputs = [ nodejs ];
+      buildPhase = ''
+        export HOME=$TMPDIR
+        tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
+      '';
+      installPhase = ''
+        mkdir -p $out/tarballs
+        mv $tgzFile $out/tarballs
+        mkdir -p $out/nix-support
+        echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
+      '';
+    };
+
+  includeDependencies = {dependencies}:
+    stdenv.lib.optionalString (dependencies != [])
+      (stdenv.lib.concatMapStrings (dependency:
+        ''
+          # Bundle the dependencies of the package
+          mkdir -p node_modules
+          cd node_modules
+
+          # Only include dependencies if they don't exist. They may also be bundled in the package.
+          if [ ! -e "${dependency.name}" ]
+          then
+              ${composePackage dependency}
+          fi
+
+          cd ..
+        ''
+      ) dependencies);
+
+  # Recursively composes the dependencies of a package
+  composePackage = { name, packageName, src, dependencies ? [], ... }@args:
+    ''
+      DIR=$(pwd)
+      cd $TMPDIR
+
+      unpackFile ${src}
+
+      # Make the base dir in which the target dependency resides first
+      mkdir -p "$(dirname "$DIR/${packageName}")"
+
+      if [ -f "${src}" ]
+      then
+          # Figure out what directory has been unpacked
+          packageDir="$(find . -maxdepth 1 -type d | tail -1)"
+
+          # Restore write permissions to make building work
+          find "$packageDir" -type d -print0 | xargs -0 chmod u+x
+          chmod -R u+w "$packageDir"
+
+          # Move the extracted tarball into the output folder
+          mv "$packageDir" "$DIR/${packageName}"
+      elif [ -d "${src}" ]
+      then
+          # Get a stripped name (without hash) of the source directory.
+          # On old nixpkgs it's already set internally.
+          if [ -z "$strippedName" ]
+          then
+              strippedName="$(stripHash ${src})"
+          fi
+
+          # Restore write permissions to make building work
+          chmod -R u+w "$strippedName"
+
+          # Move the extracted directory into the output folder
+          mv "$strippedName" "$DIR/${packageName}"
+      fi
+
+      # Unset the stripped name to not confuse the next unpack step
+      unset strippedName
+
+      # Include the dependencies of the package
+      cd "$DIR/${packageName}"
+      ${includeDependencies { inherit dependencies; }}
+      cd ..
+      ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+    '';
+
+  pinpointDependencies = {dependencies, production}:
+    let
+      pinpointDependenciesFromPackageJSON = writeTextFile {
+        name = "pinpointDependencies.js";
+        text = ''
+          var fs = require('fs');
+          var path = require('path');
+
+          function resolveDependencyVersion(location, name) {
+              if(location == process.env['NIX_STORE']) {
+                  return null;
+              } else {
+                  var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
+
+                  if(fs.existsSync(dependencyPackageJSON)) {
+                      var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
+
+                      if(dependencyPackageObj.name == name) {
+                          return dependencyPackageObj.version;
+                      }
+                  } else {
+                      return resolveDependencyVersion(path.resolve(location, ".."), name);
+                  }
+              }
+          }
+
+          function replaceDependencies(dependencies) {
+              if(typeof dependencies == "object" && dependencies !== null) {
+                  for(var dependency in dependencies) {
+                      var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
+
+                      if(resolvedVersion === null) {
+                          process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
+                      } else {
+                          dependencies[dependency] = resolvedVersion;
+                      }
+                  }
+              }
+          }
+
+          /* Read the package.json configuration */
+          var packageObj = JSON.parse(fs.readFileSync('./package.json'));
+
+          /* Pinpoint all dependencies */
+          replaceDependencies(packageObj.dependencies);
+          if(process.argv[2] == "development") {
+              replaceDependencies(packageObj.devDependencies);
+          }
+          replaceDependencies(packageObj.optionalDependencies);
+
+          /* Write the fixed package.json file */
+          fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
+        '';
+      };
+    in
+    ''
+      node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
+
+      ${stdenv.lib.optionalString (dependencies != [])
+        ''
+          if [ -d node_modules ]
+          then
+              cd node_modules
+              ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
+              cd ..
+          fi
+        ''}
+    '';
+
+  # Recursively traverses all dependencies of a package and pinpoints all
+  # dependencies in the package.json file to the versions that are actually
+  # being used.
+
+  pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
+    ''
+      if [ -d "${packageName}" ]
+      then
+          cd "${packageName}"
+          ${pinpointDependencies { inherit dependencies production; }}
+          cd ..
+          ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+      fi
+    '';
+
+  # Extract the Node.js source code which is used to compile packages with
+  # native bindings
+  nodeSources = runCommand "node-sources" {} ''
+    tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
+    mv node-* $out
+  '';
+
+  # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
+  addIntegrityFieldsScript = writeTextFile {
+    name = "addintegrityfields.js";
+    text = ''
+      var fs = require('fs');
+      var path = require('path');
+
+      function augmentDependencies(baseDir, dependencies) {
+          for(var dependencyName in dependencies) {
+              var dependency = dependencies[dependencyName];
+
+              // Open package.json and augment metadata fields
+              var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
+              var packageJSONPath = path.join(packageJSONDir, "package.json");
+
+              if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
+                  console.log("Adding metadata fields to: "+packageJSONPath);
+                  var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
+
+                  if(dependency.integrity) {
+                      packageObj["_integrity"] = dependency.integrity;
+                  } else {
+                      packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
+                  }
+
+                  packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
+                  fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
+              }
+
+              // Augment transitive dependencies
+              if(dependency.dependencies !== undefined) {
+                  augmentDependencies(packageJSONDir, dependency.dependencies);
+              }
+          }
+      }
+
+      if(fs.existsSync("./package-lock.json")) {
+          var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
+
+          if(packageLock.lockfileVersion !== 1) {
+             process.stderr.write("Sorry, I only understand lock file version 1!\n");
+             process.exit(1);
+          }
+
+          if(packageLock.dependencies !== undefined) {
+              augmentDependencies(".", packageLock.dependencies);
+          }
+      }
+    '';
+  };
+
+  # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
+  reconstructPackageLock = writeTextFile {
+    name = "addintegrityfields.js";
+    text = ''
+      var fs = require('fs');
+      var path = require('path');
+
+      var packageObj = JSON.parse(fs.readFileSync("package.json"));
+
+      var lockObj = {
+          name: packageObj.name,
+          version: packageObj.version,
+          lockfileVersion: 1,
+          requires: true,
+          dependencies: {}
+      };
+
+      function augmentPackageJSON(filePath, dependencies) {
+          var packageJSON = path.join(filePath, "package.json");
+          if(fs.existsSync(packageJSON)) {
+              var packageObj = JSON.parse(fs.readFileSync(packageJSON));
+              dependencies[packageObj.name] = {
+                  version: packageObj.version,
+                  integrity: "sha1-000000000000000000000000000=",
+                  dependencies: {}
+              };
+              processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
+          }
+      }
+
+      function processDependencies(dir, dependencies) {
+          if(fs.existsSync(dir)) {
+              var files = fs.readdirSync(dir);
+
+              files.forEach(function(entry) {
+                  var filePath = path.join(dir, entry);
+                  var stats = fs.statSync(filePath);
+
+                  if(stats.isDirectory()) {
+                      if(entry.substr(0, 1) == "@") {
+                          // When we encounter a namespace folder, augment all packages belonging to the scope
+                          var pkgFiles = fs.readdirSync(filePath);
+
+                          pkgFiles.forEach(function(entry) {
+                              if(stats.isDirectory()) {
+                                  var pkgFilePath = path.join(filePath, entry);
+                                  augmentPackageJSON(pkgFilePath, dependencies);
+                              }
+                          });
+                      } else {
+                          augmentPackageJSON(filePath, dependencies);
+                      }
+                  }
+              });
+          }
+      }
+
+      processDependencies("node_modules", lockObj.dependencies);
+
+      fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
+    '';
+  };
+
+  # Builds and composes an NPM package including all its dependencies
+  buildNodePackage =
+    { name
+    , packageName
+    , version
+    , dependencies ? []
+    , buildInputs ? []
+    , production ? true
+    , npmFlags ? ""
+    , dontNpmInstall ? false
+    , bypassCache ? false
+    , preRebuild ? ""
+    , dontStrip ? true
+    , unpackPhase ? "true"
+    , buildPhase ? "true"
+    , ... }@args:
+
+    let
+      forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
+      extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
+    in
+    stdenv.mkDerivation ({
+      name = "node-${name}-${version}";
+      buildInputs = [ tarWrapper python nodejs ]
+        ++ stdenv.lib.optional (stdenv.isLinux) utillinux
+        ++ stdenv.lib.optional (stdenv.isDarwin) libtool
+        ++ buildInputs;
+
+      inherit dontStrip; # Stripping may fail a build for some package deployments
+      inherit dontNpmInstall preRebuild unpackPhase buildPhase;
+
+      compositionScript = composePackage args;
+      pinpointDependenciesScript = pinpointDependenciesOfPackage args;
+
+      passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
+
+      installPhase = ''
+        # Create and enter a root node_modules/ folder
+        mkdir -p $out/lib/node_modules
+        cd $out/lib/node_modules
+
+        # Compose the package and all its dependencies
+        source $compositionScriptPath
+
+        # Pinpoint the versions of all dependencies to the ones that are actually being used
+        echo "pinpointing versions of dependencies..."
+        source $pinpointDependenciesScriptPath
+
+        # Patch the shebangs of the bundled modules to prevent them from
+        # calling executables outside the Nix store as much as possible
+        patchShebangs .
+
+        # Deploy the Node.js package by running npm install. Since the
+        # dependencies have been provided already by ourselves, it should not
+        # attempt to install them again, which is good, because we want to make
+        # it Nix's responsibility. If it needs to install any dependencies
+        # anyway (e.g. because the dependency parameters are
+        # incomplete/incorrect), it fails.
+        #
+        # The other responsibilities of NPM are kept -- version checks, build
+        # steps, postprocessing etc.
+
+        export HOME=$TMPDIR
+        cd "${packageName}"
+        runHook preRebuild
+
+        ${stdenv.lib.optionalString bypassCache ''
+          if [ ! -f package-lock.json ]
+          then
+              echo "No package-lock.json file found, reconstructing..."
+              node ${reconstructPackageLock}
+          fi
+
+          node ${addIntegrityFieldsScript}
+        ''}
+
+        npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
+
+        if [ "$dontNpmInstall" != "1" ]
+        then
+            # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
+            rm -f npm-shrinkwrap.json
+
+            npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
+        fi
+
+        # Create symlink to the deployed executable folder, if applicable
+        if [ -d "$out/lib/node_modules/.bin" ]
+        then
+            ln -s $out/lib/node_modules/.bin $out/bin
+        fi
+
+        # Create symlinks to the deployed manual page folders, if applicable
+        if [ -d "$out/lib/node_modules/${packageName}/man" ]
+        then
+            mkdir -p $out/share
+            for dir in "$out/lib/node_modules/${packageName}/man/"*
+            do
+                mkdir -p $out/share/man/$(basename "$dir")
+                for page in "$dir"/*
+                do
+                    ln -s $page $out/share/man/$(basename "$dir")
+                done
+            done
+        fi
+
+        # Run post install hook, if provided
+        runHook postInstall
+      '';
+    } // extraArgs);
+
+  # Builds a development shell
+  buildNodeShell =
+    { name
+    , packageName
+    , version
+    , src
+    , dependencies ? []
+    , buildInputs ? []
+    , production ? true
+    , npmFlags ? ""
+    , dontNpmInstall ? false
+    , bypassCache ? false
+    , dontStrip ? true
+    , unpackPhase ? "true"
+    , buildPhase ? "true"
+    , ... }@args:
+
+    let
+      forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
+
+      extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
+
+      nodeDependencies = stdenv.mkDerivation ({
+        name = "node-dependencies-${name}-${version}";
+
+        buildInputs = [ tarWrapper python nodejs ]
+          ++ stdenv.lib.optional (stdenv.isLinux) utillinux
+          ++ stdenv.lib.optional (stdenv.isDarwin) libtool
+          ++ buildInputs;
+
+        inherit dontStrip; # Stripping may fail a build for some package deployments
+        inherit dontNpmInstall unpackPhase buildPhase;
+
+        includeScript = includeDependencies { inherit dependencies; };
+        pinpointDependenciesScript = pinpointDependenciesOfPackage args;
+
+        passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
+
+        installPhase = ''
+          mkdir -p $out/${packageName}
+          cd $out/${packageName}
+
+          source $includeScriptPath
+
+          # Create fake package.json to make the npm commands work properly
+          cp ${src}/package.json .
+          chmod 644 package.json
+          ${stdenv.lib.optionalString bypassCache ''
+            if [ -f ${src}/package-lock.json ]
+            then
+                cp ${src}/package-lock.json .
+            fi
+          ''}
+
+          # Pinpoint the versions of all dependencies to the ones that are actually being used
+          echo "pinpointing versions of dependencies..."
+          cd ..
+          ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+
+          source $pinpointDependenciesScriptPath
+          cd ${packageName}
+
+          # Patch the shebangs of the bundled modules to prevent them from
+          # calling executables outside the Nix store as much as possible
+          patchShebangs .
+
+          export HOME=$PWD
+
+          ${stdenv.lib.optionalString bypassCache ''
+            if [ ! -f package-lock.json ]
+            then
+                echo "No package-lock.json file found, reconstructing..."
+                node ${reconstructPackageLock}
+            fi
+
+            node ${addIntegrityFieldsScript}
+          ''}
+
+          npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
+
+          ${stdenv.lib.optionalString (!dontNpmInstall) ''
+            # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
+            rm -f npm-shrinkwrap.json
+
+            npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
+          ''}
+
+          cd ..
+          ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+
+          mv ${packageName} lib
+          ln -s $out/lib/node_modules/.bin $out/bin
+        '';
+      } // extraArgs);
+    in
+    stdenv.mkDerivation {
+      name = "node-shell-${name}-${version}";
+
+      buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
+      buildCommand = ''
+        mkdir -p $out/bin
+        cat > $out/bin/shell <<EOF
+        #! ${stdenv.shell} -e
+        $shellHook
+        exec ${stdenv.shell}
+        EOF
+        chmod +x $out/bin/shell
+      '';
+
+      # Provide the dependencies in a development shell through the NODE_PATH environment variable
+      inherit nodeDependencies;
+      shellHook = stdenv.lib.optionalString (dependencies != []) ''
+        export NODE_PATH=$nodeDependencies/lib/node_modules
+      '';
+    };
+in
+{
+  buildNodeSourceDist = stdenv.lib.makeOverridable buildNodeSourceDist;
+  buildNodePackage = stdenv.lib.makeOverridable buildNodePackage;
+  buildNodeShell = stdenv.lib.makeOverridable buildNodeShell;
+}
diff --git a/libs.nix b/libs.nix
new file mode 100644 (file)
index 0000000..2ddfcbb
--- /dev/null
+++ b/libs.nix
@@ -0,0 +1,78 @@
+{ pkgs }:
+with pkgs;
+rec {
+  yarn2nixPackage = let
+    src = builtins.fetchGit {
+      url = "git://github.com/moretea/yarn2nix.git";
+      ref = "master";
+      rev = "780e33a07fd821e09ab5b05223ddb4ca15ac663f";
+    };
+  in
+    (callPackage src {}) // { inherit src; };
+
+  nodeEnv = import ./lib/node-env.nix;
+
+  fetchedGithub = path:
+    let
+      json = lib.importJSON path;
+    in rec {
+      version = json.tag;
+      name = "${json.meta.name}-${version}";
+      src = fetchFromGitHub json.github;
+    };
+
+  fetchedGit = path:
+    let
+      json = lib.importJSON path;
+    in rec {
+      version = json.tag;
+      name = "${json.meta.name}-${version}";
+      src = fetchgit json.git;
+    };
+
+  fetchedGitPrivate = path:
+    let
+      json = lib.importJSON path;
+    in rec {
+      version = json.tag;
+      name = "${json.meta.name}-${version}";
+      src = fetchgitPrivate json.git;
+    };
+
+  wrap = { paths ? [], vars ? {}, file ? null, script ? null, name ? "wrap" }:
+    assert file != null || script != null ||
+      abort "wrap needs 'file' or 'script' argument";
+    with rec {
+      set  = n: v: "--set ${pkgs.lib.escapeShellArg n} " +
+                    "${pkgs.lib.escapeShellArg v}";
+      args = (map (p: "--prefix PATH : ${p}/bin") paths) ++
+            (builtins.attrValues (pkgs.lib.mapAttrs set vars));
+    };
+    runCommand name
+      {
+        f           = if file == null then writeScript name script else file;
+        buildInputs = [ makeWrapper ];
+      }
+      ''
+        makeWrapper "$f" "$out" ${toString args}
+      '';
+
+  # This adds header colors to the builds, but it rebuilds the whole
+  # world from scratch, so only use it to debug!
+  # add it as postHook in derivations
+  immaePostHook = ''
+    header() {
+      echo -ne "\033[1;36m"
+      echo -n "$1"
+      echo -e "\033[0m"
+    }
+
+    echoCmd() {
+      printf "\033[1;34m%s:\033[0m" "$1"
+      shift
+      printf ' %q' "$@"
+      echo
+    }
+  '';
+
+} // (if builtins.pathExists ./lib/private then import ./lib/private else {})
diff --git a/modules/default.nix b/modules/default.nix
new file mode 100644 (file)
index 0000000..acb0bb5
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  myids = ./myids.nix;
+  secrets = ./secrets.nix;
+
+  webstats = ./webapps/webstats;
+  diaspora = ./webapps/diaspora.nix;
+  etherpad-lite = ./webapps/etherpad-lite.nix;
+  mastodon = ./webapps/mastodon.nix;
+  mediagoblin = ./webapps/mediagoblin.nix;
+  peertube = ./webapps/peertube.nix;
+
+  websites = ./websites;
+} // (if builtins.pathExists ./private then import ./private else {})
diff --git a/modules/myids.nix b/modules/myids.nix
new file mode 100644 (file)
index 0000000..4fb2626
--- /dev/null
@@ -0,0 +1,22 @@
+{ ... }:
+{
+  # Check that there is no clash with nixos/modules/misc/ids.nix
+  config = {
+    ids.uids = {
+      peertube = 394;
+      redis = 395;
+      nullmailer = 396;
+      mediagoblin = 397;
+      diaspora = 398;
+      mastodon = 399;
+    };
+    ids.gids = {
+      peertube = 394;
+      redis = 395;
+      nullmailer = 396;
+      mediagoblin = 397;
+      diaspora = 398;
+      mastodon = 399;
+    };
+  };
+}
diff --git a/modules/private/buildbot/common/build_helpers.py b/modules/private/buildbot/common/build_helpers.py
new file mode 100644 (file)
index 0000000..384b1ac
--- /dev/null
@@ -0,0 +1,256 @@
+from buildbot.plugins import util, steps, schedulers
+from buildbot_buildslist import BuildsList
+
+__all__ = [
+        "force_scheduler", "deploy_scheduler", "hook_scheduler",
+        "clean_branch", "package_and_upload", "SlackStatusPush",
+        "XMPPStatusPush"
+        ]
+
+# Small helpers"
+@util.renderer
+def clean_branch(props):
+    if props.hasProperty("branch") and len(props["branch"]) > 0:
+        return props["branch"].replace("/", "_")
+    else:
+        return "HEAD"
+
+def package_and_upload(package, package_dest, package_url):
+    return [
+            steps.ShellCommand(name="build package",
+                logEnviron=False, haltOnFailure=True, workdir="source",
+                command=["git", "archive", "HEAD", "-o", package]),
+
+            steps.FileUpload(name="upload package", workersrc=package,
+                workdir="source", masterdest=package_dest,
+                url=package_url, mode=0o644),
+
+            steps.ShellCommand(name="cleanup package", logEnviron=False,
+                haltOnFailure=True, workdir="source", alwaysRun=True,
+                command=["rm", "-f", package]),
+            ]
+
+# Schedulers
+def force_scheduler(name, builders):
+    return schedulers.ForceScheduler(name=name,
+        label="Force build", buttonName="Force build",
+        reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
+        codebases=[
+            util.CodebaseParameter("",
+                branch=util.StringParameter(
+                    name="branch", label="Git reference (tag, branch)", required=True),
+                revision=util.FixedParameter(name="revision", default=""),
+                repository=util.FixedParameter(name="repository", default=""),
+                project=util.FixedParameter(name="project", default=""),
+                ),
+            ],
+        username=util.FixedParameter(name="username", default="Web button"),
+        builderNames=builders)
+
+def deploy_scheduler(name, builders):
+    return schedulers.ForceScheduler(name=name,
+        builderNames=builders,
+        label="Deploy built package", buttonName="Deploy",
+        username=util.FixedParameter(name="username", default="Web button"),
+        codebases=[
+            util.CodebaseParameter(codebase="",
+                branch=util.FixedParameter(name="branch", default=""),
+                revision=util.FixedParameter(name="revision", default=""),
+                repository=util.FixedParameter(name="repository", default=""),
+                project=util.FixedParameter(name="project", default=""))],
+        reason=util.FixedParameter(name="reason", default="Deploy"),
+        properties=[
+            util.ChoiceStringParameter(label="Environment",
+                name="environment", default="integration",
+                choices=["integration", "production"]),
+            BuildsList(label="Build to deploy", name="build"),
+            ]
+        )
+
+def hook_scheduler(project, timer=10):
+    return schedulers.AnyBranchScheduler(
+            change_filter=util.ChangeFilter(category="hooks", project=project),
+            name=project, treeStableTimer=timer, builderNames=["{}_build".format(project)])
+
+# Slack/XMPP status push
+from buildbot.reporters.http import HttpStatusPushBase
+from twisted.internet import defer
+from twisted.python import log
+from buildbot.util import httpclientservice
+from buildbot.reporters import utils
+from buildbot.process import results
+from twisted.words.protocols.jabber.jid import JID
+from wokkel import client, xmppim
+from functools import partial
+
+class SlackStatusPush(HttpStatusPushBase):
+    name = "SlackStatusPush"
+
+    @defer.inlineCallbacks
+    def reconfigService(self, serverUrl, **kwargs):
+        yield HttpStatusPushBase.reconfigService(self, **kwargs)
+        self._http = yield httpclientservice.HTTPClientService.getService(
+            self.master, serverUrl)
+
+    @defer.inlineCallbacks
+    def send(self, build):
+        yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
+        response = yield self._http.post("", json=self.format(build))
+        if response.code != 200:
+            log.msg("%s: unable to upload status: %s" %
+                    (response.code, response.content))
+
+    def format(self, build):
+        colors = [
+                "#36A64F", # success
+                "#F1E903", # warnings
+                "#DA0505", # failure
+                "#FFFFFF", # skipped
+                "#000000", # exception
+                "#FFFFFF", # retry
+                "#D02CA9", # cancelled
+                ]
+
+        if "environment" in build["properties"]:
+            msg = "{} environment".format(build["properties"]["environment"][0])
+            if "build" in build["properties"]:
+                msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
+        elif len(build["buildset"]["sourcestamps"][0]["branch"]) > 0:
+            msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
+        else:
+            msg = "build"
+
+        if build["complete"]:
+            timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
+            hours, rest = divmod(timedelta, 3600)
+            minutes, seconds = divmod(rest, 60)
+            if hours > 0:
+                duration = "{}h {}min {}s".format(hours, minutes, seconds)
+            elif minutes > 0:
+                duration = "{}min {}s".format(minutes, seconds)
+            else:
+                duration = "{}s".format(seconds)
+
+            text = "Build <{}|{}> of {}'s {} was {} in {}.".format(
+                    build["url"], build["buildid"],
+                    build["builder"]["name"],
+                    msg,
+                    results.Results[build["results"]],
+                    duration,
+                    )
+            fields = [
+                    {
+                        "title": "Build",
+                        "value": "<{}|{}>".format(build["url"], build["buildid"]),
+                        "short": True,
+                        },
+                    {
+                        "title": "Project",
+                        "value": build["builder"]["name"],
+                        "short": True,
+                        },
+                    {
+                        "title": "Build status",
+                        "value": results.Results[build["results"]],
+                        "short": True,
+                        },
+                    {
+                        "title": "Build duration",
+                        "value": duration,
+                        "short": True,
+                        },
+                    ]
+            if "environment" in build["properties"]:
+                fields.append({
+                        "title": "Environment",
+                        "value": build["properties"]["environment"][0],
+                        "short": True,
+                    })
+            if "build" in build["properties"]:
+                fields.append({
+                        "title": "Archive",
+                        "value": build["properties"]["build"][0],
+                        "short": True,
+                    })
+            attachments = [{
+                    "fallback": "",
+                    "color": colors[build["results"]],
+                    "fields": fields
+                    }]
+        else:
+            text = "Build <{}|{}> of {}'s {} started.".format(
+                    build["url"], build["buildid"],
+                    build["builder"]["name"],
+                    msg,
+                    )
+            attachments = []
+
+        return {
+                "username": "Buildbot",
+                "icon_url": "http://docs.buildbot.net/current/_static/icon.png",
+                "text": text,
+                "attachments": attachments,
+                }
+
+class XMPPStatusPush(HttpStatusPushBase):
+    name = "XMPPStatusPush"
+
+    @defer.inlineCallbacks
+    def reconfigService(self, password, recipients, **kwargs):
+        yield HttpStatusPushBase.reconfigService(self, **kwargs)
+        self.password = password
+        self.recipients = recipients
+
+    @defer.inlineCallbacks
+    def send(self, build):
+        yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
+        body = self.format(build)
+        factory = client.DeferredClientFactory(JID("notify_bot@immae.fr/buildbot"), self.password)
+        d = client.clientCreator(factory)
+        def send_message(recipient, stream):
+            message = xmppim.Message(recipient=JID(recipient), body=body)
+            message.stanzaType = 'chat'
+            stream.send(message.toElement())
+            # To allow chaining
+            return stream
+        for recipient in self.recipients:
+            d.addCallback(partial(send_message, recipient))
+        d.addCallback(lambda _: factory.streamManager.xmlstream.sendFooter())
+        d.addErrback(log.err)
+
+    def format(self, build):
+        if "environment" in build["properties"]:
+            msg = "{} environment".format(build["properties"]["environment"][0])
+            if "build" in build["properties"]:
+                msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
+        elif len(build["buildset"]["sourcestamps"][0]["branch"]) > 0:
+            msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
+        else:
+            msg = "build"
+
+        if build["complete"]:
+            timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
+            hours, rest = divmod(timedelta, 3600)
+            minutes, seconds = divmod(rest, 60)
+            if hours > 0:
+                duration = "{}h {}min {}s".format(hours, minutes, seconds)
+            elif minutes > 0:
+                duration = "{}min {}s".format(minutes, seconds)
+            else:
+                duration = "{}s".format(seconds)
+
+            text = "Build {} ( {} ) of {}'s {} was {} in {}.".format(
+                    build["buildid"], build["url"],
+                    build["builder"]["name"],
+                    msg,
+                    results.Results[build["results"]],
+                    duration,
+                    )
+        else:
+            text = "Build {} ( {} ) of {}'s {} started.".format(
+                    build["buildid"], build["url"],
+                    build["builder"]["name"],
+                    msg,
+                    )
+
+        return text
diff --git a/modules/private/buildbot/common/master.cfg b/modules/private/buildbot/common/master.cfg
new file mode 100644 (file)
index 0000000..abe08e0
--- /dev/null
@@ -0,0 +1,69 @@
+# -*- python -*-
+# ex: set filetype=python:
+
+from buildbot.plugins import secrets, util, webhooks
+from buildbot.util import bytes2unicode
+import re
+import os
+from buildbot_config import E, configure
+import json
+
+class CustomBase(webhooks.base):
+    def getChanges(self, request):
+        try:
+            content = request.content.read()
+            args = json.loads(bytes2unicode(content))
+        except Exception as e:
+            raise ValueError("Error loading JSON: " + str(e))
+
+        args.setdefault("comments", "")
+        args.setdefault("repository", "")
+        args.setdefault("author", args.get("who"))
+
+        return ([args], None)
+
+userInfoProvider = util.LdapUserInfo(
+        uri=E.LDAP_URL,
+        bindUser=E.LDAP_ADMIN_USER,
+        bindPw=open(E.SECRETS_FILE + "/ldap", "r").read().rstrip(),
+        accountBase=E.LDAP_BASE,
+        accountPattern=E.LDAP_PATTERN,
+        accountFullName='cn',
+        accountEmail='mail',
+        avatarData="jpegPhoto",
+        groupBase=E.LDAP_BASE,
+        groupName="cn",
+        groupMemberPattern=E.LDAP_GROUP_PATTERN,
+        )
+
+c = BuildmasterConfig = {
+        "title": E.TITLE,
+        "titleURL": E.TITLE_URL,
+        "db": {
+            "db_url": "sqlite:///state.sqlite"
+            },
+        "protocols": { "pb": { "port": E.PB_SOCKET } },
+        "workers": [],
+        "change_source": [],
+        "schedulers": [],
+        "builders": [],
+        "services": [],
+        "secretsProviders": [
+            secrets.SecretInAFile(E.SECRETS_FILE),
+            ],
+        "www": {
+            "change_hook_dialects": { "base": { "custom_class": CustomBase } },
+            "plugins": {
+                "waterfall_view": {},
+                "console_view": {},
+                "grid_view": {},
+                "buildslist": {},
+                },
+            "auth": util.RemoteUserAuth(
+                header=b"X-Remote-User",
+                userInfoProvider=userInfoProvider,
+                headerRegex=re.compile(br"(?P<username>[^ @]+)")),
+            }
+        }
+
+configure(c)
diff --git a/modules/private/buildbot/default.nix b/modules/private/buildbot/default.nix
new file mode 100644 (file)
index 0000000..fa6a6f2
--- /dev/null
@@ -0,0 +1,198 @@
+{ lib, pkgs, config, myconfig, ... }:
+let
+  varDir = "/var/lib/buildbot";
+  buildbot_common = pkgs.python3Packages.buildPythonPackage rec {
+    name = "buildbot_common";
+    src = ./common;
+    format = "other";
+    installPhase = ''
+      mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
+      cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common
+      '';
+  };
+  buildbot = pkgs.python3Packages.buildbot-full;
+in
+{
+  options = {
+    myServices.buildbot.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable buildbot.
+      '';
+    };
+  };
+
+  config = lib.mkIf config.myServices.buildbot.enable {
+    ids.uids.buildbot = myconfig.env.buildbot.user.uid;
+    ids.gids.buildbot = myconfig.env.buildbot.user.gid;
+
+    users.groups.buildbot.gid = config.ids.gids.buildbot;
+    users.users.buildbot = {
+      name = "buildbot";
+      uid = config.ids.uids.buildbot;
+      group = "buildbot";
+      description = "Buildbot user";
+      home = varDir;
+      extraGroups = [ "keys" ];
+    };
+
+    services.websites.tools.vhostConfs.git.extraConfig = lib.attrsets.mapAttrsToList (k: project: ''
+        RedirectMatch permanent "^/buildbot/${project.name}$" "/buildbot/${project.name}/"
+        RewriteEngine On
+        RewriteRule ^/buildbot/${project.name}/ws(.*)$   unix:///run/buildbot/${project.name}.sock|ws://git.immae.eu/ws$1 [P,NE,QSA,L]
+        ProxyPass /buildbot/${project.name}/             unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
+        ProxyPassReverse /buildbot/${project.name}/      unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
+        <Location /buildbot/${project.name}/>
+          Use LDAPConnect
+          Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
+
+          SetEnvIf X-Url-Scheme https HTTPS=1
+          ProxyPreserveHost On
+        </Location>
+        <Location /buildbot/${project.name}/change_hook/base>
+          <RequireAny>
+            Require local
+            Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
+            Include /var/secrets/buildbot/${project.name}/webhook-httpd-include
+          </RequireAny>
+        </Location>
+        '') myconfig.env.buildbot.projects;
+
+    system.activationScripts = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
+      deps = [ "users" "wrappers" ];
+      text = project.activationScript;
+    }) myconfig.env.buildbot.projects;
+
+    secrets.keys = (
+      lib.lists.flatten (
+        lib.attrsets.mapAttrsToList (k: project:
+          lib.attrsets.mapAttrsToList (k: v:
+            {
+              permissions = "0600";
+              user = "buildbot";
+              group = "buildbot";
+              text = v;
+              dest = "buildbot/${project.name}/${k}";
+            }
+          ) project.secrets
+          ++ [
+            {
+              permissions = "0600";
+              user = "wwwrun";
+              group = "wwwrun";
+              text = lib.optionalString (lib.attrsets.hasAttr "webhookTokens" project) ''
+                Require expr "req('Access-Key') in { ${builtins.concatStringsSep ", " (map (x: "'${x}'") project.webhookTokens)} }"
+                '';
+              dest = "buildbot/${project.name}/webhook-httpd-include";
+            }
+          ]
+        ) myconfig.env.buildbot.projects
+      )
+    ) ++ [
+      {
+        permissions = "0600";
+        user = "buildbot";
+        group = "buildbot";
+        text = myconfig.env.buildbot.ldap.password;
+        dest = "buildbot/ldap";
+      }
+      {
+        permissions = "0600";
+        user = "buildbot";
+        group = "buildbot";
+        text = builtins.readFile "${myconfig.privateFiles}/buildbot_ssh_key";
+        dest = "buildbot/ssh_key";
+      }
+    ];
+
+    systemd.services = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
+      description = "Buildbot Continuous Integration Server ${project.name}.";
+      after = [ "network-online.target" ];
+      wantedBy = [ "multi-user.target" ];
+      path = project.packages pkgs ++ (project.pythonPackages buildbot.pythonModule pkgs);
+      preStart = let
+        master-cfg = "${buildbot_common}/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
+        tac_file = pkgs.writeText "buildbot.tac" ''
+            import os
+
+            from twisted.application import service
+            from buildbot.master import BuildMaster
+
+            basedir = '${varDir}/${project.name}'
+            rotateLength = 10000000
+            maxRotatedFiles = 10
+            configfile = '${master-cfg}'
+
+            # Default umask for server
+            umask = None
+
+            # if this is a relocatable tac file, get the directory containing the TAC
+            if basedir == '.':
+                import os
+                basedir = os.path.abspath(os.path.dirname(__file__))
+
+            # note: this line is matched against to check that this is a buildmaster
+            # directory; do not edit it.
+            application = service.Application('buildmaster')
+            from twisted.python.logfile import LogFile
+            from twisted.python.log import ILogObserver, FileLogObserver
+            logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
+                                            maxRotatedFiles=maxRotatedFiles)
+            application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
+
+            m = BuildMaster(basedir, configfile, umask)
+            m.setServiceParent(application)
+            m.log_rotation.rotateLength = rotateLength
+            m.log_rotation.maxRotatedFiles = maxRotatedFiles
+          '';
+      in ''
+      if [ ! -f ${varDir}/${project.name}/buildbot.tac ]; then
+        ${buildbot}/bin/buildbot create-master -c "${master-cfg}" "${varDir}/${project.name}"
+        rm -f ${varDir}/${project.name}/master.cfg.sample
+        rm -f ${varDir}/${project.name}/buildbot.tac
+      fi
+      ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac
+      # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race
+      install -Dm600 -o buildbot -g buildbot -T /var/secrets/buildbot/ssh_key ${varDir}/buildbot_key || true
+      buildbot_secrets=${varDir}/${project.name}/secrets
+      install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets
+      install -Dm600 -o buildbot -g buildbot -T /var/secrets/buildbot/ldap $buildbot_secrets/ldap
+      ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList
+        (k: v: "install -Dm600 -o buildbot -g buildbot -T /var/secrets/buildbot/${project.name}/${k} $buildbot_secrets/${k}") project.secrets
+      )}
+      '';
+      environment = let
+        project_env = lib.attrsets.mapAttrs' (k: v: lib.attrsets.nameValuePair "BUILDBOT_${k}" v) project.environment;
+        buildbot_config = pkgs.python3Packages.buildPythonPackage (rec {
+          name = "buildbot_config-${project.name}";
+          src = ./projects + "/${project.name}";
+          format = "other";
+          installPhase = ''
+            mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
+            cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_config
+            '';
+        });
+        HOME = "${varDir}/${project.name}";
+        PYTHONPATH = "${buildbot.pythonModule.withPackages (self: project.pythonPackages self pkgs ++ [
+          pkgs.python3Packages.wokkel
+          pkgs.python3Packages.treq pkgs.python3Packages.ldap3 buildbot
+          pkgs.python3Packages.buildbot-worker
+          buildbot_common buildbot_config
+        ])}/${buildbot.pythonModule.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${pkgs.python3.pythonForBuild.sitePackages}" else ""}";
+      in project_env // { inherit PYTHONPATH HOME; };
+
+      serviceConfig = {
+        Type = "forking";
+        User = "buildbot";
+        Group = "buildbot";
+        RuntimeDirectory = "buildbot";
+        RuntimeDirectoryPreserve = "yes";
+        StateDirectory = "buildbot";
+        SupplementaryGroups = "keys";
+        WorkingDirectory = "${varDir}/${project.name}";
+        ExecStart = "${buildbot}/bin/buildbot start";
+      };
+    }) myconfig.env.buildbot.projects;
+  };
+}
diff --git a/modules/private/buildbot/projects/caldance/__init__.py b/modules/private/buildbot/projects/caldance/__init__.py
new file mode 100644 (file)
index 0000000..2c0bad5
--- /dev/null
@@ -0,0 +1,190 @@
+from buildbot.plugins import *
+from buildbot_common.build_helpers import *
+import os
+from buildbot.util import bytes2unicode
+import json
+
+__all__ = [ "configure", "E" ]
+
+class E():
+    PROJECT       = "caldance"
+    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
+    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
+    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
+    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
+    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
+    GIT_URL       = "gitolite@git.immae.eu:perso/simon_descarpentries/www.cal-dance.com"
+    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
+    SSH_HOST_KEY  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
+    LDAP_HOST     = "ldap.immae.eu"
+    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
+    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
+
+    PUPPET_HOST = {
+            "integration": "root@caldance.immae.eu",
+            }
+
+    # master.cfg
+    SECRETS_FILE       = os.getcwd() + "/secrets"
+    LDAP_URL           = "ldaps://ldap.immae.eu:636"
+    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_BASE          = "dc=immae,dc=eu"
+    LDAP_PATTERN       = "(uid=%(username)s)"
+    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=caldance,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
+    TITLE_URL          = "https://caldance.immae.eu"
+    TITLE              = "Caldance"
+
+class CustomBase(webhooks.base):
+    def getChanges(self, request):
+        try:
+            content = request.content.read()
+            args = json.loads(bytes2unicode(content))
+        except Exception as e:
+            raise ValueError("Error loading JSON: " + str(e))
+
+        args.setdefault("comments", "")
+        args.setdefault("repository", "")
+        args.setdefault("author", args.get("who", "unknown"))
+
+        if args["category"] == "deploy_webhook":
+            args = {
+                    "category": "deploy_webhook",
+                    "comments": "",
+                    "repository": "",
+                    "author": "webhook",
+                    "project": "Caldance",
+                    "properties": {
+                        "environment": args.get("environment", "integration"),
+                        "build": "caldance_{}.tar.gz".format(args.get("build", "master"))
+                        }
+                    }
+
+        return ([args], None)
+
+def deploy_hook_scheduler(project, timer=1):
+    return schedulers.AnyBranchScheduler(
+            change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
+            name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
+
+def configure(c):
+    c["buildbotURL"] = E.BUILDBOT_URL
+    c["www"]["port"] = E.SOCKET
+
+    c["www"]["change_hook_dialects"]["base"] = {
+            "custom_class": CustomBase
+            }
+    c['workers'].append(worker.LocalWorker("generic-worker"))
+    c['workers'].append(worker.LocalWorker("deploy-worker"))
+
+    c['schedulers'].append(hook_scheduler("Caldance", timer=1))
+    c['schedulers'].append(force_scheduler("force_caldance", ["Caldance_build"]))
+    c['schedulers'].append(deploy_scheduler("deploy_caldance", ["Caldance_deploy"]))
+    c['schedulers'].append(deploy_hook_scheduler("Caldance", timer=1))
+
+    c['builders'].append(factory("caldance"))
+
+    c['builders'].append(deploy_factory("caldance"))
+
+    c['services'].append(SlackStatusPush(
+        name="slack_status_caldance",
+        builders=["Caldance_build", "Caldance_deploy"],
+        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
+    c['services'].append(XMPPStatusPush(
+        name="xmpp_status_caldance",
+        builders=["Caldance_build", "Caldance_deploy"],
+        recipients=E.XMPP_RECIPIENTS,
+        password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
+
+def factory(project, ignore_fails=False):
+    release_file = "{1}/{0}_%(kw:clean_branch)s.tar.gz"
+
+    package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
+    package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
+    package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.Git(logEnviron=False, repourl=E.GIT_URL,
+        sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
+        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
+    factory.addSteps(package_and_upload(package, package_dest, package_url))
+
+    return util.BuilderConfig(
+            name="{}_build".format(project.capitalize()),
+            workernames=["generic-worker"], factory=factory)
+
+def compute_build_infos(project):
+    @util.renderer
+    def compute(props):
+        import re, hashlib
+        build_file = props.getProperty("build")
+        package_dest = "{1}/{0}".format(build_file, E.RELEASE_PATH)
+        version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
+        with open(package_dest, "rb") as f:
+            sha = hashlib.sha256(f.read()).hexdigest()
+        return {
+                "build_version": version,
+                "build_hash": sha,
+                }
+    return compute
+
+@util.renderer
+def puppet_host(props):
+    environment = props["environment"] if props.hasProperty("environment") else "integration"
+    return E.PUPPET_HOST.get(environment, "host.invalid")
+
+def deploy_factory(project):
+    package_dest = util.Interpolate("{0}/%(prop:build)s".format(E.RELEASE_PATH))
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
+    factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
+    factory.addStep(LdapPush(environment=util.Property("environment"),
+        project=project, build_version=util.Property("build_version"),
+        build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
+    factory.addStep(steps.MasterShellCommand(command=[
+        "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
+    return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory)
+
+from twisted.internet import defer
+from buildbot.process.buildstep import FAILURE
+from buildbot.process.buildstep import SUCCESS
+from buildbot.process.buildstep import BuildStep
+
+class LdapPush(BuildStep):
+    name = "LdapPush"
+    renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
+
+    def __init__(self, **kwargs):
+        self.environment = kwargs.pop("environment")
+        self.project = kwargs.pop("project")
+        self.build_version = kwargs.pop("build_version")
+        self.build_hash = kwargs.pop("build_hash")
+        self.ldap_password = kwargs.pop("ldap_password")
+        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
+        super().__init__(**kwargs)
+
+    def run(self):
+        import json
+        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
+        server = Server(self.ldap_host)
+        conn = Connection(server,
+                user=E.LDAP_DN,
+                password=self.ldap_password)
+        conn.bind()
+        obj = ObjectDef("immaePuppetClass", conn)
+        r = Reader(conn, obj,
+                "cn=caldance.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
+        r.search()
+        if len(r) > 0:
+            w = Writer.from_cursor(r)
+            for value in w[0].immaePuppetJson.values:
+                config = json.loads(value)
+                if "role::caldance::{}_version".format(self.project) in config:
+                    config["role::caldance::{}_version".format(self.project)] = self.build_version
+                    config["role::caldance::{}_sha256".format(self.project)] = self.build_hash
+                    w[0].immaePuppetJson -= value
+                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
+                    w.commit()
+                    return defer.succeed(SUCCESS)
+        return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/cryptoportfolio/__init__.py b/modules/private/buildbot/projects/cryptoportfolio/__init__.py
new file mode 100644 (file)
index 0000000..5d70f95
--- /dev/null
@@ -0,0 +1,169 @@
+from buildbot.plugins import *
+from buildbot_common.build_helpers import *
+import os
+
+__all__ = [ "configure", "E" ]
+
+class E():
+    PROJECT       = "cryptoportfolio"
+    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
+    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
+    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
+    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
+    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
+    GIT_URL       = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/{0}.git"
+    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
+    LDAP_HOST     = "ldap.immae.eu"
+    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
+
+    PUPPET_HOST = {
+            "production": "root@cryptoportfolio.immae.eu",
+            "integration": "root@cryptoportfolio-dev.immae.eu"
+            }
+
+    # master.cfg
+    SECRETS_FILE       = os.getcwd() + "/secrets"
+    LDAP_URL           = "ldaps://ldap.immae.eu:636"
+    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_BASE          = "dc=immae,dc=eu"
+    LDAP_PATTERN       = "(uid=%(username)s)"
+    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=cryptoportfolio,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
+    TITLE_URL          = "https://git.immae.eu"
+    TITLE              = "Cryptoportfolio"
+
+# eval .. dans .zshrc_local
+# mkdir -p $BUILD/go
+# export GOPATH=$BUILD/go
+# go get -u github.com/golang/dep/cmd/dep
+# export PATH=$PATH:$BUILD/go/bin
+# go get git.immae.eu/Cryptoportfolio/Front.git
+# cd $BUILD/go/src/git.immae.eu/Cryptoportfolio/Front.git
+# git checkout dev
+# dep ensure
+def configure(c):
+    c["buildbotURL"] = E.BUILDBOT_URL
+    c["www"]["port"] = E.SOCKET
+
+    c['workers'].append(worker.LocalWorker("generic-worker"))
+    c['workers'].append(worker.LocalWorker("deploy-worker"))
+
+    c['schedulers'].append(hook_scheduler("Trader"))
+    c['schedulers'].append(hook_scheduler("Front"))
+    c['schedulers'].append(force_scheduler(
+        "force_cryptoportfolio", ["Trader_build", "Front_build"]))
+    c['schedulers'].append(deploy_scheduler("deploy_cryptoportfolio",
+        ["Trader_deploy", "Front_deploy"]))
+
+    c['builders'].append(factory("trader"))
+    c['builders'].append(factory("front", ignore_fails=True))
+
+    c['builders'].append(deploy_factory("trader"))
+    c['builders'].append(deploy_factory("front"))
+
+    c['services'].append(SlackStatusPush(
+        name="slack_status_cryptoportfolio",
+        builders=["Front_build", "Trader_build", "Front_deploy", "Trader_deploy"],
+        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
+
+def factory(project, ignore_fails=False):
+    release_file = "{1}/{0}/{0}_%(kw:clean_branch)s.tar.gz"
+
+    url = E.GIT_URL.format(project.capitalize())
+
+    package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
+    package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
+    package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.Git(logEnviron=False, repourl=url,
+        mode="full", method="copy"))
+    factory.addStep(steps.ShellCommand(name="make install",
+        logEnviron=False, haltOnFailure=(not ignore_fails),
+        warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
+        command=["make", "install"]))
+    factory.addStep(steps.ShellCommand(name="make test",
+        logEnviron=False, haltOnFailure=(not ignore_fails),
+        warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
+        command=["make", "test"]))
+    factory.addSteps(package_and_upload(package, package_dest, package_url))
+
+    return util.BuilderConfig(
+            name="{}_build".format(project.capitalize()),
+            workernames=["generic-worker"], factory=factory)
+
+def compute_build_infos(project):
+    @util.renderer
+    def compute(props):
+        import re, hashlib
+        build_file = props.getProperty("build")
+        package_dest = "{2}/{0}/{1}".format(project, build_file, E.RELEASE_PATH)
+        version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
+        with open(package_dest, "rb") as f:
+            sha = hashlib.sha256(f.read()).hexdigest()
+        return {
+                "build_version": version,
+                "build_hash": sha,
+                }
+    return compute
+
+@util.renderer
+def puppet_host(props):
+    environment = props["environment"] if props.hasProperty("environment") else "integration"
+    return E.PUPPET_HOST.get(environment, "host.invalid")
+
+def deploy_factory(project):
+    package_dest = util.Interpolate("{1}/{0}/%(prop:build)s".format(project, E.RELEASE_PATH))
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
+    factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
+    factory.addStep(LdapPush(environment=util.Property("environment"),
+        project=project, build_version=util.Property("build_version"),
+        build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
+    factory.addStep(steps.MasterShellCommand(command=[
+        "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
+    return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory)
+
+from twisted.internet import defer
+from buildbot.process.buildstep import FAILURE
+from buildbot.process.buildstep import SUCCESS
+from buildbot.process.buildstep import BuildStep
+
+class LdapPush(BuildStep):
+    name = "LdapPush"
+    renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
+
+    def __init__(self, **kwargs):
+        self.environment = kwargs.pop("environment")
+        self.project = kwargs.pop("project")
+        self.build_version = kwargs.pop("build_version")
+        self.build_hash = kwargs.pop("build_hash")
+        self.ldap_password = kwargs.pop("ldap_password")
+        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
+        super().__init__(**kwargs)
+
+    def run(self):
+        import json
+        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
+        server = Server(self.ldap_host)
+        conn = Connection(server,
+                user=E.LDAP_DN,
+                password=self.ldap_password)
+        conn.bind()
+        obj = ObjectDef("immaePuppetClass", conn)
+        r = Reader(conn, obj,
+                "cn=cryptoportfolio.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
+        r.search()
+        if len(r) > 0:
+            w = Writer.from_cursor(r)
+            for value in w[0].immaePuppetJson.values:
+                config = json.loads(value)
+                if "role::cryptoportfolio::{}_version".format(self.project) in config:
+                    config["role::cryptoportfolio::{}_version".format(self.project)] = self.build_version
+                    config["role::cryptoportfolio::{}_sha256".format(self.project)] = self.build_hash
+                    w[0].immaePuppetJson -= value
+                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
+                    w.commit()
+                    return defer.succeed(SUCCESS)
+        return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/test/__init__.py b/modules/private/buildbot/projects/test/__init__.py
new file mode 100644 (file)
index 0000000..e6b8d51
--- /dev/null
@@ -0,0 +1,188 @@
+from buildbot.plugins import *
+from buildbot_common.build_helpers import *
+import os
+from buildbot.util import bytes2unicode
+import json
+
+__all__ = [ "configure", "E" ]
+
+class E():
+    PROJECT       = "test"
+    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
+    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
+    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
+    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
+    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
+    GIT_URL       = "https://git.immae.eu/perso/Immae/TestProject.git"
+    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
+    PUPPET_HOST   = "root@backup-1.v.immae.eu"
+    LDAP_HOST     = "ldap.immae.eu"
+    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
+    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
+
+    # master.cfg
+    SECRETS_FILE       = os.getcwd() + "/secrets"
+    LDAP_URL           = "ldaps://ldap.immae.eu:636"
+    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_BASE          = "dc=immae,dc=eu"
+    LDAP_PATTERN       = "(uid=%(username)s)"
+    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
+    TITLE_URL          = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
+    TITLE              = "Test project"
+
+class CustomBase(webhooks.base):
+    def getChanges(self, request):
+        try:
+            content = request.content.read()
+            args = json.loads(bytes2unicode(content))
+        except Exception as e:
+            raise ValueError("Error loading JSON: " + str(e))
+
+        args.setdefault("comments", "")
+        args.setdefault("repository", "")
+        args.setdefault("author", args.get("who", "unknown"))
+
+        if args["category"] == "deploy_webhook":
+            args = {
+                    "category": "deploy_webhook",
+                    "comments": "",
+                    "repository": "",
+                    "author": "unknown",
+                    "project": "TestProject",
+                    "properties": {
+                        "environment": args.get("environment", "integration"),
+                        "build": "test_{}.tar.gz".format(args.get("branch", "master"))
+                        }
+                    }
+
+        return ([args], None)
+
+def deploy_hook_scheduler(project, timer=1):
+    return schedulers.AnyBranchScheduler(
+            change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
+            name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
+
+def configure(c):
+    c["buildbotURL"] = E.BUILDBOT_URL
+    c["www"]["port"] = E.SOCKET
+
+    c["www"]["change_hook_dialects"]["base"] = {
+            "custom_class": CustomBase
+            }
+    c['workers'].append(worker.LocalWorker("generic-worker-test"))
+    c['workers'].append(worker.LocalWorker("deploy-worker-test"))
+
+    c['schedulers'].append(hook_scheduler("TestProject", timer=1))
+    c['schedulers'].append(force_scheduler("force_test", ["TestProject_build"]))
+    c['schedulers'].append(deploy_scheduler("deploy_test", ["TestProject_deploy"]))
+    c['schedulers'].append(deploy_hook_scheduler("TestProject", timer=1))
+
+    c['builders'].append(factory())
+    c['builders'].append(deploy_factory())
+
+    c['services'].append(SlackStatusPush(
+        name="slack_status_test_project",
+        builders=["TestProject_build", "TestProject_deploy"],
+        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
+    c['services'].append(XMPPStatusPush(
+        name="xmpp_status_test_project",
+        builders=["TestProject_build", "TestProject_deploy"],
+        recipients=E.XMPP_RECIPIENTS,
+        password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
+
+def factory():
+    package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
+    package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
+    package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.Git(logEnviron=False,
+        repourl=E.GIT_URL, mode="full", method="copy"))
+    factory.addStep(steps.ShellCommand(name="env",
+        logEnviron=False, command=["env"]))
+    factory.addStep(steps.ShellCommand(name="pwd",
+        logEnviron=False, command=["pwd"]))
+    factory.addStep(steps.ShellCommand(name="true",
+        logEnviron=False, command=["true"]))
+    factory.addStep(steps.ShellCommand(name="echo",
+        logEnviron=False, command=["echo", package]))
+    factory.addSteps(package_and_upload(package, package_dest, package_url))
+
+    return util.BuilderConfig(name="TestProject_build", workernames=["generic-worker-test"], factory=factory)
+
+
+def compute_build_infos():
+    @util.renderer
+    def compute(props):
+        import re, hashlib
+        build_file = props.getProperty("build")
+        package_dest = "{}/{}".format(E.RELEASE_PATH, build_file)
+        version = re.match(r"{0}_(.*).tar.gz".format("test"), build_file).group(1)
+        with open(package_dest, "rb") as f:
+            sha = hashlib.sha256(f.read()).hexdigest()
+        return {
+                "build_version": version,
+                "build_hash": sha,
+                }
+    return compute
+
+@util.renderer
+def puppet_host(props):
+    return E.PUPPET_HOST
+
+def deploy_factory():
+    package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
+    factory.addStep(steps.SetProperties(properties=compute_build_infos()))
+    factory.addStep(LdapPush(environment=util.Property("environment"),
+        build_version=util.Property("build_version"),
+        build_hash=util.Property("build_hash"),
+        ldap_password=util.Secret("ldap")))
+    factory.addStep(steps.MasterShellCommand(command=[
+        "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
+    return util.BuilderConfig(name="TestProject_deploy", workernames=["deploy-worker-test"], factory=factory)
+
+from twisted.internet import defer
+from buildbot.process.buildstep import FAILURE
+from buildbot.process.buildstep import SUCCESS
+from buildbot.process.buildstep import BuildStep
+
+class LdapPush(BuildStep):
+    name = "LdapPush"
+    renderables = ["environment", "build_version", "build_hash", "ldap_password"]
+
+    def __init__(self, **kwargs):
+        self.environment = kwargs.pop("environment")
+        self.build_version = kwargs.pop("build_version")
+        self.build_hash = kwargs.pop("build_hash")
+        self.ldap_password = kwargs.pop("ldap_password")
+        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
+        super().__init__(**kwargs)
+
+    def run(self):
+        import json
+        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
+        server = Server(self.ldap_host)
+        conn = Connection(server,
+                user=E.LDAP_DN,
+                password=self.ldap_password)
+        conn.bind()
+        obj = ObjectDef("immaePuppetClass", conn)
+        r = Reader(conn, obj,
+                "cn=test.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
+        r.search()
+        if len(r) > 0:
+            w = Writer.from_cursor(r)
+            for value in w[0].immaePuppetJson.values:
+                config = json.loads(value)
+                if "test_version" in config:
+                    config["test_version"] = self.build_version
+                    config["test_sha256"] = self.build_hash
+                    w[0].immaePuppetJson -= value
+                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
+                    w.commit()
+                    return defer.succeed(SUCCESS)
+        return defer.succeed(FAILURE)
diff --git a/modules/private/certificates.nix b/modules/private/certificates.nix
new file mode 100644 (file)
index 0000000..43f6a23
--- /dev/null
@@ -0,0 +1,52 @@
+{ lib, pkgs, config,  ... }:
+{
+  options.services.myCertificates = {
+    certConfig = lib.mkOption {
+      default = {
+        webroot = "${config.security.acme.directory}/acme-challenge";
+        email = "ismael@bouya.org";
+        postRun = ''
+          systemctl reload httpdTools.service httpdInte.service httpdProd.service
+        '';
+        plugins = [ "cert.pem" "chain.pem" "fullchain.pem" "full.pem" "key.pem" "account_key.json" ];
+      };
+      description = "Default configuration for certificates";
+    };
+  };
+
+  config = {
+    services.websitesCerts = config.services.myCertificates.certConfig;
+    myServices.databasesCerts = config.services.myCertificates.certConfig;
+    myServices.ircCerts = config.services.myCertificates.certConfig;
+
+    security.acme.preliminarySelfsigned = true;
+
+    security.acme.certs = {
+      "eldiron" = config.services.myCertificates.certConfig // {
+        domain = "eldiron.immae.eu";
+      };
+    };
+
+    systemd.services = lib.attrsets.mapAttrs' (k: v:
+      lib.attrsets.nameValuePair "acme-selfsigned-${k}" (lib.mkBefore { script =
+        (lib.optionalString (builtins.elem "cert.pem" v.plugins) ''
+        cp $workdir/server.crt ${config.security.acme.directory}/${k}/cert.pem
+        chown '${v.user}:${v.group}' ${config.security.acme.directory}/${k}/cert.pem
+        chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.directory}/${k}/cert.pem
+        '') +
+        (lib.optionalString (builtins.elem "chain.pem" v.plugins) ''
+        cp $workdir/ca.crt ${config.security.acme.directory}/${k}/chain.pem
+        chown '${v.user}:${v.group}' ${config.security.acme.directory}/${k}/chain.pem
+        chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.directory}/${k}/chain.pem
+        '')
+      ; })
+    ) config.security.acme.certs // {
+      httpdProd.after = [ "acme-selfsigned-certificates.target" ];
+      httpdProd.wants = [ "acme-selfsigned-certificates.target" ];
+      httpdTools.after = [ "acme-selfsigned-certificates.target" ];
+      httpdTools.wants = [ "acme-selfsigned-certificates.target" ];
+      httpdInte.after = [ "acme-selfsigned-certificates.target" ];
+      httpdInte.wants = [ "acme-selfsigned-certificates.target" ];
+    };
+  };
+}
diff --git a/modules/private/databases/default.nix b/modules/private/databases/default.nix
new file mode 100644 (file)
index 0000000..3f7a44b
--- /dev/null
@@ -0,0 +1,63 @@
+{ lib, config, myconfig, ... }:
+let
+  cfg = config.myServices.databases;
+in
+{
+  options.myServices = {
+    databases.enable = lib.mkEnableOption "my databases service";
+    databasesCerts = lib.mkOption {
+      description = "Default databases configurations for certificates as accepted by acme";
+    };
+  };
+
+  config.nixpkgs.overlays = lib.mkIf cfg.enable [ (self: super: {
+    postgresql = self.postgresql_11_custom;
+  }) ];
+
+  config.myServices.databases = lib.mkIf cfg.enable {
+    mariadb = {
+      enable = true;
+      ldapConfig = {
+        inherit (myconfig.env.ldap) host base;
+        inherit (myconfig.env.databases.mysql.pam) dn filter password;
+      };
+      credentials.root = myconfig.env.databases.mysql.systemUsers.root;
+    };
+
+    openldap = {
+      accessFile = "${myconfig.privateFiles}/ldap.conf";
+      baseDn = myconfig.env.ldap.base;
+      rootDn = myconfig.env.ldap.root_dn;
+      rootPw = myconfig.env.ldap.root_pw;
+      enable = true;
+    };
+
+    postgresql = {
+      ldapConfig = {
+        inherit (myconfig.env.ldap) host base;
+        inherit (myconfig.env.databases.postgresql.pam) dn filter password;
+      };
+      replicationLdapConfig = {
+        inherit (myconfig.env.ldap) host base password;
+        dn = myconfig.env.ldap.host_dn;
+      };
+      authorizedHosts = {
+        immaeEu = [{
+          ip4 = [
+            myconfig.env.servers.immaeEu.ips.main.ip4
+            myconfig.env.servers.immaeEu.ips.alt.ip4
+          ];
+        }];
+      };
+      replicationHosts = {
+        backup-1 = {
+          ip4 = [myconfig.env.servers.backup-1.ips.main.ip4];
+          ip6 = myconfig.env.servers.backup-1.ips.main.ip6;
+        };
+      };
+      enable = true;
+    };
+
+    redis.enable = true;
+  };
+}
diff --git a/modules/private/databases/mariadb.nix b/modules/private/databases/mariadb.nix
new file mode 100644 (file)
index 0000000..a7239c0
--- /dev/null
@@ -0,0 +1,149 @@
+{ lib, pkgs, config, ... }:
+let
+    cfg = config.myServices.databases.mariadb;
+in {
+  options.myServices.databases = {
+    mariadb = {
+      enable = lib.mkOption {
+        default = cfg.enable;
+        example = true;
+        description = "Whether to enable mariadb database";
+        type = lib.types.bool;
+      };
+      package = lib.mkOption {
+        type = lib.types.package;
+        default = pkgs.mariadb;
+        description = ''
+          Mariadb package to use.
+          '';
+      };
+      credentials = lib.mkOption {
+        default = {};
+        description = "Credentials";
+        type = lib.types.attrsOf lib.types.str;
+      };
+      ldapConfig = lib.mkOption {
+        description = "LDAP configuration to allow PAM identification via LDAP";
+        type = lib.types.submodule {
+          options = {
+            host = lib.mkOption { type = lib.types.str; };
+            base = lib.mkOption { type = lib.types.str; };
+            dn = lib.mkOption { type = lib.types.str; };
+            password = lib.mkOption { type = lib.types.str; };
+            filter = lib.mkOption { type = lib.types.str; };
+          };
+        };
+      };
+      dataDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/var/lib/mysql";
+        description = ''
+          The directory where Mariadb stores its data.
+        '';
+      };
+      # Output variables
+      socketsDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/run/mysqld";
+        description = ''
+          The directory where Mariadb puts sockets.
+          '';
+      };
+      sockets = lib.mkOption {
+        type = lib.types.attrsOf lib.types.path;
+        default = {
+          mysqld  = "${cfg.socketsDir}/mysqld.sock";
+        };
+        readOnly = true;
+        description = ''
+          Mariadb sockets
+          '';
+      };
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    networking.firewall.allowedTCPPorts = [ 3306 ];
+
+    # for adminer, ssl is implemented with mysqli only, which is
+    # currently disabled because it’s not compatible with pam.
+    # Thus we need to generate two users for each 'remote': one remote
+    # with SSL, and one localhost without SSL.
+    # User identified by LDAP:
+    # CREATE USER foo@% IDENTIFIED VIA pam USING 'mysql' REQUIRE SSL;
+    # CREATE USER foo@localhost IDENTIFIED VIA pam USING 'mysql';
+    services.mysql = {
+      enable = true;
+      package = cfg.package;
+      dataDir = cfg.dataDir;
+      extraOptions = ''
+        ssl_ca = ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
+        ssl_key = ${config.security.acme.directory}/mysql/key.pem
+        ssl_cert = ${config.security.acme.directory}/mysql/fullchain.pem
+        '';
+    };
+
+    users.users.mysql.extraGroups = [ "keys" ];
+    security.acme.certs."mysql" = config.myServices.databasesCerts // {
+      user = "mysql";
+      group = "mysql";
+      plugins = [ "fullchain.pem" "key.pem" "account_key.json" ];
+      domain = "db-1.immae.eu";
+      postRun = ''
+        systemctl restart mysql.service
+      '';
+    };
+
+    secrets.keys = [
+      {
+        dest = "mysql/mysqldump";
+        permissions = "0400";
+        user = "root";
+        group = "root";
+        text = ''
+          [mysqldump]
+          user = root
+          password = ${cfg.credentials.root}
+        '';
+      }
+      {
+        dest = "mysql/pam";
+        permissions = "0400";
+        user = "mysql";
+        group = "mysql";
+        text =  with cfg.ldapConfig; ''
+          host ${host}
+          base ${base}
+          binddn ${dn}
+          bindpw ${password}
+          pam_filter ${filter}
+          ssl start_tls
+        '';
+      }
+    ];
+
+    services.cron = {
+      enable = true;
+      systemCronJobs = [
+        ''
+          30 1,13 * * * root ${cfg.package}/bin/mysqldump --defaults-file=${config.secrets.location}/mysql/mysqldump --all-databases > ${cfg.dataDir}/backup.sql
+        ''
+      ];
+    };
+
+    security.pam.services = let
+      pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
+    in [
+      {
+        name = "mysql";
+        text = ''
+          # https://mariadb.com/kb/en/mariadb/pam-authentication-plugin/
+          auth    required ${pam_ldap} config=${config.secrets.location}/mysql/pam
+          account required ${pam_ldap} config=${config.secrets.location}/mysql/pam
+          '';
+      }
+    ];
+
+  };
+}
+
diff --git a/modules/private/databases/openldap/default.nix b/modules/private/databases/openldap/default.nix
new file mode 100644 (file)
index 0000000..e048d56
--- /dev/null
@@ -0,0 +1,154 @@
+{ lib, pkgs, config, ... }:
+let
+  cfg = config.myServices.databases.openldap;
+  ldapConfig = let
+    kerberosSchema = pkgs.fetchurl {
+      url = "https://raw.githubusercontent.com/krb5/krb5/master/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema";
+      sha256 = "17fnkkf6s3lznsl7wp6914pqsc78d038rh38l638big8z608ksww";
+    };
+    puppetSchema = pkgs.fetchurl {
+      url = "https://raw.githubusercontent.com/puppetlabs/puppet/master/ext/ldap/puppet.schema";
+      sha256 = "11bjf5zfvqlim7p9vddcafs0wiq3v8ys77x8h6fbp9c6bdfh0awh";
+    };
+  in ''
+    include         ${pkgs.openldap}/etc/schema/core.schema
+    include         ${pkgs.openldap}/etc/schema/cosine.schema
+    include         ${pkgs.openldap}/etc/schema/inetorgperson.schema
+    include         ${pkgs.openldap}/etc/schema/nis.schema
+    include         ${puppetSchema}
+    include         ${kerberosSchema}
+    include         ${./immae.schema}
+
+    pidfile         ${cfg.pids.pid}
+    argsfile        ${cfg.pids.args}
+
+    moduleload      back_hdb
+    backend         hdb
+
+    moduleload      memberof
+    database        hdb
+    suffix          "${cfg.baseDn}"
+    rootdn          "${cfg.rootDn}"
+    include         ${config.secrets.location}/ldap/password
+    directory       ${cfg.dataDir}
+    overlay         memberof
+
+    TLSCertificateFile    ${config.security.acme.directory}/ldap/cert.pem
+    TLSCertificateKeyFile ${config.security.acme.directory}/ldap/key.pem
+    TLSCACertificateFile  ${config.security.acme.directory}/ldap/fullchain.pem
+    TLSCACertificatePath  ${pkgs.cacert.unbundled}/etc/ssl/certs/
+    #This makes openldap crash
+    #TLSCipherSuite        DEFAULT
+
+    sasl-host kerberos.immae.eu
+    include ${config.secrets.location}/ldap/access
+    '';
+in
+{
+  options.myServices.databases = {
+    openldap = {
+      enable = lib.mkOption {
+        default = cfg.enable;
+        example = true;
+        description = "Whether to enable ldap";
+        type = lib.types.bool;
+      };
+      baseDn = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Base DN for LDAP
+        '';
+      };
+      rootDn = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Root DN
+        '';
+      };
+      rootPw = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Root (Hashed) password
+        '';
+      };
+      accessFile = lib.mkOption {
+        type = lib.types.path;
+        description = ''
+          The file path that defines the access
+        '';
+      };
+      dataDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/var/lib/openldap";
+        description = ''
+          The directory where Openldap stores its data.
+        '';
+      };
+      socketsDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/run/slapd";
+        description = ''
+          The directory where Openldap puts sockets and pid files.
+          '';
+      };
+      # Output variables
+      pids = lib.mkOption {
+        type = lib.types.attrsOf lib.types.path;
+        default = {
+          pid  = "${cfg.socketsDir}/slapd.pid";
+          args = "${cfg.socketsDir}/slapd.args";
+        };
+        readOnly = true;
+        description = ''
+          Slapd pid files
+          '';
+      };
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = [
+       {
+        dest = "ldap/password";
+        permissions = "0400";
+        user = "openldap";
+        group = "openldap";
+        text = "rootpw          ${cfg.rootPw}";
+      }
+      {
+        dest = "ldap/access";
+        permissions = "0400";
+        user = "openldap";
+        group = "openldap";
+        text = builtins.readFile "${cfg.accessFile}";
+      }
+    ];
+    users.users.openldap.extraGroups = [ "keys" ];
+    networking.firewall.allowedTCPPorts = [ 636 389 ];
+
+    services.cron = {
+      systemCronJobs = [
+        ''
+          35 1,13 * * * root ${pkgs.openldap}/bin/slapcat -v -b "dc=immae,dc=eu" -f ${pkgs.writeText "slapd.conf" ldapConfig} -l ${cfg.dataDir}/backup.ldif | ${pkgs.gnugrep}/bin/grep -v "^# id=[0-9a-f]*$"
+        ''
+      ];
+    };
+
+    security.acme.certs."ldap" = config.myServices.databasesCerts // {
+      user = "openldap";
+      group = "openldap";
+      plugins = [ "fullchain.pem" "key.pem" "cert.pem" "account_key.json" ];
+      domain = "ldap.immae.eu";
+      postRun = ''
+        systemctl restart openldap.service
+      '';
+    };
+
+    services.openldap = {
+      enable = true;
+      dataDir = cfg.dataDir;
+      urlList = [ "ldap://" "ldaps://" ];
+      extraConfig = ldapConfig;
+    };
+  };
+}
diff --git a/modules/private/databases/openldap/immae.schema b/modules/private/databases/openldap/immae.schema
new file mode 100644 (file)
index 0000000..f5ee5d5
--- /dev/null
@@ -0,0 +1,167 @@
+# vim: set filetype=slapd:
+objectIdentifier Immaeroot 1.3.6.1.4.1.50071
+
+objectIdentifier Immae Immaeroot:2
+objectIdentifier ImmaeattributeType Immae:3
+objectIdentifier ImmaeobjectClass Immae:4
+
+# TT-RSS
+attributetype ( ImmaeattributeType:1 NAME 'immaeTtrssLogin'
+       DESC 'login for TTRSS'
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+
+objectclass ( ImmaeobjectClass:1 NAME 'immaeTtrssClass'
+       DESC 'Expansion of the existing object classes for ttrss'
+       SUP top AUXILIARY
+       MUST ( immaeTtrssLogin ) )
+
+# FTP
+attributetype ( ImmaeattributeType:2 NAME 'immaeFtpDirectory'
+       DESC 'home directory for ftp'
+       EQUALITY caseExactIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+
+attributetype ( ImmaeattributeType:3 NAME 'immaeFtpUid'
+       DESC 'user id for ftp'
+       EQUALITY integerMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+
+attributetype ( ImmaeattributeType:4 NAME 'immaeFtpGid'
+       DESC 'group id for ftp'
+       EQUALITY integerMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+
+objectclass ( ImmaeobjectClass:2 NAME 'immaeFtpClass'
+       DESC 'Expansion of the existing object classes for ftp'
+       SUP top AUXILIARY
+       MUST ( immaeFtpDirectory $ immaeFtpGid $ immaeFtpUid ) )
+
+
+# SSH keys
+attributetype ( ImmaeattributeType:5 NAME 'immaeSshKey'
+       DESC 'OpenSSH Public key'
+       EQUALITY octetStringMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
+
+objectClass ( ImmaeobjectClass:3 NAME 'immaeSshClass'
+       DESC 'OpenSSH class'
+       SUP top AUXILIARY
+       MAy ( immaeSSHKey ) )
+
+# Specific access
+attributetype (ImmaeattributeType:6 NAME 'immaeAccessDn'
+       EQUALITY distinguishedNameMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+
+attributetype (ImmaeattributeType:17 NAME 'immaeAccessWriteDn'
+       EQUALITY distinguishedNameMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+
+attributetype (ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
+       EQUALITY distinguishedNameMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+
+objectClass ( ImmaeobjectClass:4 NAME 'immaeAccessClass'
+       DESC 'Access class'
+       SUP top AUXILIARY
+       MAY ( immaeAccessDn $ immaeAccessWriteDn $ immaeAccessReadSubtree ) )
+
+# Xmpp uid
+attributetype ( ImmaeattributeType:7 NAME 'immaeXmppUid'
+       DESC 'user part for Xmpp'
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+
+objectclass ( ImmaeobjectClass:5 NAME 'immaeXmppClass'
+       DESC 'Expansion of the existing object classes for XMPP'
+       SUP top AUXILIARY
+       MUST ( immaeXmppUid ) )
+
+# Postfix accounts
+attributetype ( ImmaeattributeType:8 NAME 'immaePostfixAddress'
+       DESC 'the dovecot address to match as username'
+        EQUALITY caseIgnoreIA5Match
+        SUBSTR caseIgnoreIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+
+attributetype ( ImmaeattributeType:9 NAME 'immaePostfixHome'
+       DESC 'the postfix home directory'
+       EQUALITY caseExactIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+attributetype ( ImmaeattributeType:10 NAME 'immaePostfixMail'
+       DESC 'the dovecot mail location'
+       EQUALITY caseExactIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+attributetype ( ImmaeattributeType:11 NAME 'immaePostfixUid'
+       DESC 'the dovecot uid'
+       EQUALITY caseExactIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid'
+       DESC 'the dovecot gid'
+       EQUALITY caseExactIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass'
+       DESC 'Expansion of the existing object classes for Postfix'
+       SUP top AUXILIARY
+       MUST ( immaePostfixAddress $ immaePostfixHome $
+          immaePostfixMail $ immaePostfixUid $ immaePostfixGid )
+        )
+
+# Tinc informations
+# Domaine = une classe a part ou une partie du dn ?
+# attributetype ( ImmaeattributeType:13 NAME 'immaeTincIpSegment'
+#         DESC 'the internal ip segment in tinc'
+#         EQUALITY caseIgnoreIA5Match
+#         SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+# 
+# attributetype ( ImmaeattributeType:14 NAME 'immaeTincSubdomain'
+#         DESC 'the host subdomain'
+#         EQUALITY caseIgnoreIA5Match
+#         SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+# 
+# attributetype ( ImmaeattributeType:15 NAME 'immaeTincHostname'
+#         DESC 'the host name'
+#         EQUALITY caseIgnoreIA5Match
+#         SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+# 
+# objectclass ( ImmaeobjectClass:7 NAME 'immaeTincHostClass'
+#      DESC 'Expansion of the existing object classes for Tinc'
+#      SUP top AUXILIARY
+#      MUST ( immaeTincInternalIp $ immaeTincSubdomain $
+#         immaeTincHostname )
+#         )
+
+attributetype (ImmaeattributeType:16 NAME 'immaePuppetJson'
+       DESC 'Puppet hiera json'
+       EQUALITY octetStringMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
+
+objectclass ( ImmaeobjectClass:8 NAME 'immaePuppetClass'
+       DESC 'Expansion of the existing object classes for Puppet'
+       SUP top AUXILIARY
+       MUST ( immaePuppetJson )
+        )
+
+attributetype (ImmaeattributeType:19 NAME 'immaeTaskId'
+       DESC 'Taskwarrior server Org:Name:Key'
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+
+objectclass ( ImmaeobjectClass:9 NAME 'immaeTaskClass'
+       DESC 'Expansion of the existing object classes for Task'
+       SUP top AUXILIARY
+       MUST ( immaeTaskId )
+        )
+
+# Last:
+# attributetype (ImmaeattributeType:19 NAME 'immaeTaskId'
+# objectclass ( ImmaeobjectClass:9 NAME 'immaeTaskClass'
+
diff --git a/modules/private/databases/postgresql.nix b/modules/private/databases/postgresql.nix
new file mode 100644 (file)
index 0000000..911a6d1
--- /dev/null
@@ -0,0 +1,220 @@
+{ lib, pkgs, config, ... }:
+let
+    cfg = config.myServices.databases.postgresql;
+in {
+  options.myServices.databases = {
+    postgresql = {
+      enable = lib.mkOption {
+        default = cfg.enable;
+        example = true;
+        description = "Whether to enable postgresql database";
+        type = lib.types.bool;
+      };
+      package = lib.mkOption {
+        type = lib.types.package;
+        default = pkgs.postgresql;
+        description = ''
+          Postgresql package to use.
+          '';
+      };
+      ldapConfig = lib.mkOption {
+        description = "LDAP configuration to allow PAM identification via LDAP";
+        type = lib.types.submodule {
+          options = {
+            host = lib.mkOption { type = lib.types.str; };
+            base = lib.mkOption { type = lib.types.str; };
+            dn = lib.mkOption { type = lib.types.str; };
+            password = lib.mkOption { type = lib.types.str; };
+            filter = lib.mkOption { type = lib.types.str; };
+          };
+        };
+      };
+      replicationLdapConfig = lib.mkOption {
+        description = "LDAP configuration to allow replication";
+        type = lib.types.submodule {
+          options = {
+            host = lib.mkOption { type = lib.types.str; };
+            base = lib.mkOption { type = lib.types.str; };
+            dn = lib.mkOption { type = lib.types.str; };
+            password = lib.mkOption { type = lib.types.str; };
+          };
+        };
+      };
+      authorizedHosts = lib.mkOption {
+        default = {};
+        description = "Hosts to allow connections from";
+        type = lib.types.attrsOf (lib.types.listOf (lib.types.submodule {
+          options = {
+            method = lib.mkOption {
+              default = "md5";
+              type = lib.types.str;
+            };
+            username = lib.mkOption {
+              default = "all";
+              type = lib.types.str;
+            };
+            database = lib.mkOption {
+              default = "all";
+              type = lib.types.str;
+            };
+            ip4 = lib.mkOption {
+              default = [];
+              type = lib.types.listOf lib.types.str;
+            };
+            ip6 = lib.mkOption {
+              default = [];
+              type = lib.types.listOf lib.types.str;
+            };
+          };
+        }));
+      };
+      replicationHosts = lib.mkOption {
+        default = {};
+        description = "Hosts to allow replication from";
+        type = lib.types.attrsOf (lib.types.submodule {
+          options = {
+            ip4 = lib.mkOption {
+              type = lib.types.listOf lib.types.str;
+            };
+            ip6 = lib.mkOption {
+              type = lib.types.listOf lib.types.str;
+            };
+          };
+        });
+      };
+      # Output variables
+      socketsDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/run/postgresql";
+        description = ''
+          The directory where Postgresql puts sockets.
+          '';
+        readOnly = true;
+      };
+      systemdRuntimeDirectory = lib.mkOption {
+        type = lib.types.str;
+        # Use ReadWritePaths= instead if socketsDir is outside of /run
+        default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+          lib.strings.removePrefix "/run/" cfg.socketsDir;
+        description = ''
+        Adjusted Postgresql sockets directory for systemd
+        '';
+        readOnly = true;
+      };
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    networking.firewall.allowedTCPPorts = [ 5432 ];
+
+    security.acme.certs."postgresql" = config.myServices.databasesCerts // {
+      user = "postgres";
+      group = "postgres";
+      plugins = [ "fullchain.pem" "key.pem" "account_key.json" ];
+      domain = "db-1.immae.eu";
+      postRun = ''
+        systemctl reload postgresql.service
+      '';
+    };
+
+    systemd.services.postgresql.serviceConfig = {
+      SupplementaryGroups = "keys";
+      RuntimeDirectory = cfg.systemdRuntimeDirectory;
+    };
+    services.postgresql = {
+      enable = true;
+      package = cfg.package;
+      enableTCPIP = true;
+      extraConfig = ''
+        max_connections = 100
+        wal_level = logical
+        shared_buffers = 512MB
+        work_mem = 10MB
+        max_wal_size = 1GB
+        min_wal_size = 80MB
+        log_timezone = 'Europe/Paris'
+        datestyle = 'iso, mdy'
+        timezone = 'Europe/Paris'
+        lc_messages = 'en_US.UTF-8'
+        lc_monetary = 'en_US.UTF-8'
+        lc_numeric = 'en_US.UTF-8'
+        lc_time = 'en_US.UTF-8'
+        default_text_search_config = 'pg_catalog.english'
+        ssl = on
+        ssl_cert_file = '${config.security.acme.directory}/postgresql/fullchain.pem'
+        ssl_key_file = '${config.security.acme.directory}/postgresql/key.pem'
+        '';
+      authentication = let
+        hosts = builtins.concatStringsSep "\n" (
+          lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v:
+            map (ip6: "hostssl ${v.database}   ${v.username}   ${ip6}/128      ${v.method}") v.ip6
+            ++ map (ip4: "hostssl      ${v.database}   ${v.username}   ${ip4}/32               ${v.method}") v.ip4
+          ) vs) cfg.authorizedHosts
+        ));
+        replication = builtins.concatStringsSep "\n" (
+          lib.lists.flatten (lib.mapAttrsToList (k: v:
+          map (ip6: "hostssl   replication     ${k}    ${ip6}/128      pam pamservice=postgresql_replication") v.ip6
+          ++ map (ip4: "hostssl        replication     ${k}    ${ip4}/32               pam pamservice=postgresql_replication") v.ip4
+          ) cfg.replicationHosts
+        ));
+      in ''
+        local  all     postgres                                ident
+        local  all     all                                     md5
+        ${hosts}
+        hostssl        all     all     all                             pam
+        ${replication}
+      '';
+    };
+
+    secrets.keys = [
+      {
+        dest = "postgresql/pam";
+        permissions = "0400";
+        group = "postgres";
+        user = "postgres";
+        text =  with cfg.ldapConfig; ''
+          host ${host}
+          base ${base}
+          binddn ${dn}
+          bindpw ${password}
+          pam_filter ${filter}
+          ssl start_tls
+        '';
+      }
+      {
+        dest = "postgresql/pam_replication";
+        permissions = "0400";
+        group = "postgres";
+        user = "postgres";
+        text = with cfg.replicationLdapConfig; ''
+          host ${host}
+          base ${base}
+          binddn ${dn}
+          bindpw ${password}
+          pam_login_attribute cn
+          ssl start_tls
+        '';
+      }
+    ];
+
+    security.pam.services = let
+      pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
+    in [
+      {
+        name = "postgresql";
+        text = ''
+          auth    required ${pam_ldap} config=${config.secrets.location}/postgresql/pam
+          account required ${pam_ldap} config=${config.secrets.location}/postgresql/pam
+          '';
+      }
+      {
+        name = "postgresql_replication";
+        text = ''
+          auth    required ${pam_ldap} config=${config.secrets.location}/postgresql/pam_replication
+          account required ${pam_ldap} config=${config.secrets.location}/postgresql/pam_replication
+          '';
+      }
+    ];
+  };
+}
+
diff --git a/modules/private/databases/redis.nix b/modules/private/databases/redis.nix
new file mode 100644 (file)
index 0000000..1ba6eed
--- /dev/null
@@ -0,0 +1,57 @@
+{ lib, config, ... }:
+let
+    cfg = config.myServices.databases.redis;
+in {
+  options.myServices.databases.redis = {
+    enable = lib.mkOption {
+      default = cfg.enable;
+      example = true;
+      description = "Whether to enable redis database";
+      type = lib.types.bool;
+    };
+    socketsDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/run/redis";
+      description = ''
+        The directory where Redis puts sockets.
+        '';
+    };
+    # Output variables
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted redis sockets directory for systemd
+      '';
+      readOnly = true;
+    };
+    sockets = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        redis  = "${cfg.socketsDir}/redis.sock";
+      };
+      readOnly = true;
+      description = ''
+        Redis sockets
+        '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users.redis.uid = config.ids.uids.redis;
+    users.groups.redis.gid = config.ids.gids.redis;
+    services.redis = rec {
+      enable = true;
+      bind = "127.0.0.1";
+      unixSocket = cfg.sockets.redis;
+      extraConfig = ''
+        unixsocketperm 777
+        maxclients 1024
+        '';
+    };
+    systemd.services.redis.serviceConfig.RuntimeDirectory = cfg.systemdRuntimeDirectory;
+  };
+}
+
diff --git a/modules/private/default.nix b/modules/private/default.nix
new file mode 100644 (file)
index 0000000..894efb7
--- /dev/null
@@ -0,0 +1,65 @@
+let
+set = {
+  # adatped from nixpkgs/nixos/modules/services/web-servers/apache-httpd/default.nix
+  httpdInte  = import ../websites/httpd-service-builder.nix { httpdName = "Inte"; withUsers = false; };
+  httpdProd  = import ../websites/httpd-service-builder.nix { httpdName = "Prod"; withUsers = false; };
+  httpdTools = import ../websites/httpd-service-builder.nix { httpdName = "Tools"; withUsers = true; };
+
+  databases  = ./databases;
+  mariadb    = ./databases/mariadb.nix;
+  openldap   = ./databases/openldap;
+  postgresql = ./databases/postgresql.nix;
+  redis      = ./databases/redis.nix;
+
+  websites = ./websites;
+  atenInte = ./websites/aten/integration.nix;
+  atenProd = ./websites/aten/production.nix;
+  capitainesProd = ./websites/capitaines/production.nix;
+  chloeInte = ./websites/chloe/integration.nix;
+  chloeProd = ./websites/chloe/production.nix;
+  connexionswingInte = ./websites/connexionswing/integration.nix;
+  connexionswingProd = ./websites/connexionswing/production.nix;
+  denisejeromeProd = ./websites/denisejerome/production.nix;
+  emiliaProd = ./websites/emilia/production.nix;
+  florianApp = ./websites/florian/app.nix;
+  florianInte = ./websites/florian/integration.nix;
+  florianProd = ./websites/florian/production.nix;
+  immaeProd = ./websites/immae/production.nix;
+  immaeRelease = ./websites/immae/release.nix;
+  immaeTemp = ./websites/immae/temp.nix;
+  leilaProd = ./websites/leila/production.nix;
+  ludivinecassalInte = ./websites/ludivinecassal/integration.nix;
+  ludivinecassalProd = ./websites/ludivinecassal/production.nix;
+  nassimeProd = ./websites/nassime/production.nix;
+  naturaloutilProd = ./websites/naturaloutil/production.nix;
+  papaSurveillance = ./websites/papa/surveillance.nix;
+  piedsjalouxInte = ./websites/piedsjaloux/integration.nix;
+  piedsjalouxProd = ./websites/piedsjaloux/production.nix;
+
+  cloudTool = ./websites/tools/cloud;
+  davTool = ./websites/tools/dav;
+  dbTool = ./websites/tools/db;
+  diasporaTool = ./websites/tools/diaspora;
+  etherTool = ./websites/tools/ether;
+  gitTool = ./websites/tools/git;
+  mastodonTool = ./websites/tools/mastodon;
+  mgoblinTool = ./websites/tools/mgoblin;
+  peertubeTool = ./websites/tools/peertube;
+  toolsTool = ./websites/tools/tools;
+
+  buildbot = ./buildbot;
+  certificates = ./certificates.nix;
+  gitolite = ./gitolite;
+  irc = ./irc.nix;
+  pub = ./pub;
+  tasks = ./tasks;
+  dns = ./dns.nix;
+  ftp = ./ftp.nix;
+  mail = ./mail.nix;
+  mpd = ./mpd.nix;
+  ssh = ./ssh;
+
+  system = ./system.nix;
+};
+in
+builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set))
diff --git a/modules/private/dns.nix b/modules/private/dns.nix
new file mode 100644 (file)
index 0000000..ced8d9b
--- /dev/null
@@ -0,0 +1,132 @@
+{ lib, pkgs, config, myconfig,  ... }:
+{
+  config = let
+    cfg = config.services.bind;
+    configFile = pkgs.writeText "named.conf" ''
+      include "/etc/bind/rndc.key";
+      controls {
+        inet 127.0.0.1 allow {localhost;} keys {"rndc-key";};
+      };
+
+      acl cachenetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.cacheNetworks} };
+      acl badnetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.blockedNetworks} };
+
+      options {
+        listen-on { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOn} };
+        listen-on-v6 { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOnIpv6} };
+        allow-query { cachenetworks; };
+        blackhole { badnetworks; };
+        forward first;
+        forwarders { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.forwarders} };
+        directory "/var/run/named";
+        pid-file "/var/run/named/named.pid";
+        ${cfg.extraOptions}
+      };
+
+      ${cfg.extraConfig}
+
+      ${ lib.concatMapStrings
+          ({ name, file, master ? true, extra ? "", slaves ? [], masters ? [] }:
+            ''
+              zone "${name}" {
+                type ${if master then "master" else "slave"};
+                file "${file}";
+                ${ if lib.lists.length slaves > 0 then
+                  ''
+                    allow-transfer {
+                      ${lib.concatMapStrings (ip: "${ip};\n") slaves}
+                    };
+                  '' else ""}
+                ${ if lib.lists.length masters > 0 then
+                  ''
+                    masters {
+                      ${lib.concatMapStrings (ip: "${ip};\n") masters}
+                    };
+                  '' else ""}
+                allow-query { any; };
+                ${extra}
+              };
+            '')
+          cfg.zones }
+    '';
+  in
+    {
+    networking.firewall.allowedUDPPorts = [ 53 ];
+    networking.firewall.allowedTCPPorts = [ 53 ];
+    services.bind = {
+      enable = true;
+      cacheNetworks = ["any"];
+      configFile = configFile;
+      extraOptions = ''
+        allow-recursion { 127.0.0.1; };
+        allow-transfer  { none; };
+
+        notify-source    ${myconfig.env.servers.eldiron.ips.main.ip4};
+        notify-source-v6 ${lib.head myconfig.env.servers.eldiron.ips.main.ip6};
+        version   none;
+        hostname  none;
+        server-id none;
+        '';
+      zones = with myconfig.env.dns;
+        assert (builtins.substring ((builtins.stringLength soa.email)-1) 1 soa.email) != ".";
+        assert (builtins.substring ((builtins.stringLength soa.primary)-1) 1 soa.primary) != ".";
+        (map (conf: {
+          name = conf.name;
+          master = false;
+          file = "/var/run/named/${conf.name}.zone";
+          masters = if lib.attrsets.hasAttr "masters" conf
+            then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.masters)
+            else [];
+        }) slaveZones)
+        ++ (map (conf: {
+          name = conf.name;
+          master = true;
+          extra = if lib.attrsets.hasAttr "extra" conf then conf.extra else "";
+          slaves = if lib.attrsets.hasAttr "slaves" conf
+            then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.slaves)
+            else [];
+          file = pkgs.writeText "${conf.name}.zone" ''
+              $TTL 10800
+              @ IN SOA ${soa.primary}. ${builtins.replaceStrings ["@"] ["."] soa.email}. ${soa.serial} ${soa.refresh} ${soa.retry} ${soa.expire} ${soa.ttl}
+
+              ${lib.concatStringsSep "\n" (map (x: "@ IN NS ${x}.") (lib.concatMap (n: lib.attrsets.mapAttrsToList (k: v: k) ns.${n}) conf.ns))}
+
+              ${conf.entries}
+
+              ${if lib.attrsets.hasAttr "withEmail" conf && lib.lists.length conf.withEmail > 0 then ''
+              mail IN A     ${myconfig.env.servers.immaeEu.ips.main.ip4}
+              mx-1 IN A     ${myconfig.env.servers.eldiron.ips.main.ip4}
+              ${builtins.concatStringsSep "\n" (map (i: "mail IN AAAA  ${i}") myconfig.env.servers.immaeEu.ips.main.ip6)}
+              ${builtins.concatStringsSep "\n" (map (i: "mx-1 IN AAAA  ${i}") myconfig.env.servers.eldiron.ips.main.ip6)}
+              ${lib.concatStringsSep "\n\n" (map (e:
+              let
+                n = if e.domain == "" then "@" else "${e.domain}  ";
+                suffix = if e.domain == "" then "" else ".${e.domain}";
+              in
+              ''
+              ; ------------------ mail: ${n} ---------------------------
+              ${if e.receive then "${n} IN MX 10 mail.${conf.name}." else ""}
+              ;${if e.receive then "${n} IN MX 50 mx-1.${conf.name}." else ""}
+
+              ; Mail sender authentications
+              ${n}                   IN TXT  "v=spf1 mx ~all"
+              _dmarc${suffix}              IN TXT  "v=DMARC1; p=none; adkim=r; aspf=r; fo=1; rua=mailto:postmaster+rua@immae.eu; ruf=mailto:postmaster+ruf@immae.eu;"
+              ${if e.send then ''
+              immae_eu._domainkey${suffix} IN TXT  ( "v=DKIM1; k=rsa; s=email; "
+                        "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl3vLd8W5YAuumC5+ZT9OV7/14Pmh5JYtwyqKI3cfe9NnAqInt3xO4bZ7oqIxRKWN4SD39vm7O/QOvFdBt00ENOOzdP90s5gKw6eIP/4+vPTh0IWltAsmu9B2agzdtWUE7t2xFKIzEn8l9niRE2QYbVaqZv4sub98vY55fIgFoHtjkmNC7325S8fjDJGp6OPbyhAs6Xl5/adjF"
+                        "0ko4Y2p6RaxLQfjlS0bxmK4Qg6C14pIXHtzVeqOuWrwApqt5+AULSn97iUtqV/IJlEEjC6DUR44t3C/G0G/k46iFclCqRRi0hdPrOHCtZDbtMubnTN9eaUiNpkXh1WnCflHwtjQwIDAQAB" )
+              '' else ""}
+              '') conf.withEmail)}
+              '' + (if conf.name == "immae.eu" then ''
+              ; ----------------- Accept DMARC reports -------------------
+              ${lib.concatStringsSep "\n" (
+                lib.flatten (
+                  map (z: map (e: "${e.domain}${if builtins.stringLength e.domain > 0 then "." else ""}${z.name}._report._dmarc IN TXT \"v=DMARC1;\"") (z.withEmail or [])) masterZones
+                )
+              )}
+              '' else "") else ""}
+            '';
+          }) masterZones);
+    };
+  };
+}
diff --git a/modules/private/ftp.nix b/modules/private/ftp.nix
new file mode 100644 (file)
index 0000000..842d2d6
--- /dev/null
@@ -0,0 +1,118 @@
+{ lib, pkgs, config, myconfig, ... }:
+{
+  options = {
+    services.pure-ftpd.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable pure-ftpd.
+      '';
+    };
+  };
+
+  config = lib.mkIf config.services.pure-ftpd.enable {
+    security.acme.certs."ftp" = config.services.myCertificates.certConfig // {
+      domain = "eldiron.immae.eu";
+      postRun = ''
+        systemctl restart pure-ftpd.service
+      '';
+      extraDomains = { "ftp.immae.eu" = null; };
+    };
+
+    networking = {
+      firewall = {
+        allowedTCPPorts = [ 21 ];
+        allowedTCPPortRanges = [ { from = 40000; to = 50000; } ];
+      };
+    };
+
+    users.users = [
+      {
+        name = "ftp";
+        uid = config.ids.uids.ftp; # 8
+        group = "ftp";
+        description = "Anonymous FTP user";
+        home = "/homeless-shelter";
+        extraGroups = [ "keys" ];
+      }
+    ];
+
+    users.groups.ftp.gid = config.ids.gids.ftp;
+
+    system.activationScripts.pure-ftpd = ''
+      install -m 0755 -o ftp -g ftp -d /var/lib/ftp
+      '';
+
+    secrets.keys = [{
+      dest = "pure-ftpd-ldap";
+      permissions = "0400";
+      user = "ftp";
+      group = "ftp";
+      text = ''
+        LDAPServer          ${myconfig.env.ftp.ldap.host}
+        LDAPPort            389
+        LDAPUseTLS          True
+        LDAPBaseDN          ${myconfig.env.ftp.ldap.base}
+        LDAPBindDN          ${myconfig.env.ftp.ldap.dn}
+        LDAPBindPW          ${myconfig.env.ftp.ldap.password}
+        LDAPDefaultUID      500
+        LDAPForceDefaultUID False
+        LDAPDefaultGID      100
+        LDAPForceDefaultGID False
+        LDAPFilter          ${myconfig.env.ftp.ldap.filter}
+
+        LDAPAuthMethod      BIND
+
+        # Pas de possibilite de donner l'Uid/Gid !
+        # Compile dans pure-ftpd directement avec immaeFtpUid / immaeFtpGid
+        LDAPHomeDir         immaeFtpDirectory
+        '';
+    }];
+
+    systemd.services.pure-ftpd = let
+      configFile = pkgs.writeText "pure-ftpd.conf" ''
+        PassivePortRange             40000 50000
+        ChrootEveryone               yes
+        CreateHomeDir                yes
+        BrokenClientsCompatibility   yes
+        MaxClientsNumber             50
+        Daemonize                    yes
+        MaxClientsPerIP              8
+        VerboseLog                   no
+        DisplayDotFiles              yes
+        AnonymousOnly                no
+        NoAnonymous                  no
+        SyslogFacility               ftp
+        DontResolve                  yes
+        MaxIdleTime                  15
+        LDAPConfigFile               /var/secrets/pure-ftpd-ldap
+        LimitRecursion               10000 8
+        AnonymousCanCreateDirs       no
+        MaxLoad                      4
+        AntiWarez                    yes
+        Umask                        133:022
+        # ftp
+        MinUID                       8
+        AllowUserFXP                 no
+        AllowAnonymousFXP            no
+        ProhibitDotFilesWrite        no
+        ProhibitDotFilesRead         no
+        AutoRename                   no
+        AnonymousCantUpload          no
+        MaxDiskUsage                 99
+        CustomerProof                yes
+        TLS                          1
+        CertFile                     ${config.security.acme.directory}/ftp/full.pem
+        '';
+    in {
+      description = "Pure-FTPd server";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" ];
+
+      serviceConfig.ExecStart = "${pkgs.pure-ftpd}/bin/pure-ftpd ${configFile}";
+      serviceConfig.Type = "forking";
+      serviceConfig.PIDFile = "/run/pure-ftpd.pid";
+    };
+  };
+
+}
diff --git a/modules/private/gitolite/default.nix b/modules/private/gitolite/default.nix
new file mode 100644 (file)
index 0000000..b9914a1
--- /dev/null
@@ -0,0 +1,63 @@
+{ lib, pkgs, config, myconfig, ... }:
+let
+    cfg = config.myServices.gitolite;
+in {
+  options.myServices.gitolite = {
+    enable = lib.mkEnableOption "my gitolite service";
+    gitoliteDir = lib.mkOption {
+      type = lib.types.string;
+      default = "/var/lib/gitolite";
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    networking.firewall.allowedTCPPorts = [ 9418 ];
+
+    services.gitDaemon = {
+      enable = true;
+      user = "gitolite";
+      group = "gitolite";
+      basePath = "${cfg.gitoliteDir}/repositories";
+    };
+
+    system.activationScripts.gitolite = let
+      gitolite_ldap_groups = pkgs.mylibs.wrap {
+        name = "gitolite_ldap_groups.sh";
+        file = ./gitolite_ldap_groups.sh;
+        vars = {
+          LDAP_PASS = myconfig.env.tools.gitolite.ldap.password;
+        };
+        paths = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
+      };
+    in {
+      deps = [ "users" ];
+      text = ''
+        if [ -d ${cfg.gitoliteDir} ]; then
+          ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
+          chmod g+rx ${cfg.gitoliteDir}
+        fi
+        if [ -f ${cfg.gitoliteDir}/projects.list ]; then
+          chmod g+r ${cfg.gitoliteDir}/projects.list
+        fi
+      '';
+    };
+
+    users.users.wwwrun.extraGroups = [ "gitolite" ];
+
+    users.users.gitolite.packages = let
+      python-packages = python-packages: with python-packages; [
+        simplejson
+        urllib3
+        sleekxmpp
+      ];
+    in
+      [
+        (pkgs.python3.withPackages python-packages)
+      ];
+    # Installation: https://git.immae.eu/mantisbt/view.php?id=93
+    services.gitolite = {
+      enable = true;
+      adminPubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXqRbiHw7QoHADNIEuo4nUT9fSOIEBMdJZH0bkQAxXyJFyCM1IMz0pxsHV0wu9tdkkr36bPEUj2aV5bkYLBN6nxcV2Y49X8bjOSCPfx3n6Own1h+NeZVBj4ZByrFmqCbTxUJIZ2bZKcWOFncML39VmWdsVhNjg0X4NBBehqXRIKr2gt3E/ESAxTYJFm0BnU0baciw9cN0bsRGqvFgf5h2P48CIAfwhVcGmPQnnAwabnosYQzRWxR0OygH5Kd8mePh6FheIRIigfXsDO8f/jdxwut8buvNIf3m5EBr3tUbTsvM+eV3M5vKGt7sk8T64DVtepTSdOOWtp+47ktsnHOMh immae@immae.eu";
+    };
+  };
+}
diff --git a/modules/private/gitolite/gitolite_ldap_groups.sh b/modules/private/gitolite/gitolite_ldap_groups.sh
new file mode 100755 (executable)
index 0000000..7db0da4
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+uid_param="$1"
+ldap_host="ldap.immae.eu"
+ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu"
+ldap_bindpw="$LDAP_PASS"
+ldap_searchbase="dc=immae,dc=eu"
+ldap_scope="subtree"
+
+ldap_options="-h ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}"
+
+ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))"
+ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
+
+echo "$ldap_result"
diff --git a/modules/private/irc.nix b/modules/private/irc.nix
new file mode 100644 (file)
index 0000000..b3fe91f
--- /dev/null
@@ -0,0 +1,54 @@
+{ lib, pkgs, config, ... }:
+let
+  cfg = config.myServices.irc;
+in
+{
+  options.myServices = {
+    ircCerts = lib.mkOption {
+      description = "Default ircconfigurations for certificates as accepted by acme";
+    };
+    irc.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable irc stuff.
+      '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    security.acme.certs."irc" = config.myServices.ircCerts // {
+      domain = "irc.immae.eu";
+      postRun = ''
+        systemctl restart stunnel.service
+      '';
+    };
+
+    networking.firewall.allowedTCPPorts = [ 6697 ];
+    services.bitlbee = with pkgs; {
+      enable = true;
+      authMode = "Registered";
+      libpurple_plugins = [
+        purple-hangouts
+        purple-matrix
+      ];
+      plugins = [
+        bitlbee-mastodon
+        bitlbee-facebook
+        bitlbee-discord
+        bitlbee-steam
+      ];
+    };
+
+    services.stunnel = {
+      enable = true;
+      servers = {
+        bitlbee = {
+          accept = 6697;
+          connect = 6667;
+          cert = "${config.security.acme.directory}/irc/full.pem";
+        };
+      };
+    };
+  };
+}
diff --git a/modules/private/mail.nix b/modules/private/mail.nix
new file mode 100644 (file)
index 0000000..611c8b4
--- /dev/null
@@ -0,0 +1,13 @@
+{ lib, pkgs, config, myconfig,  ... }:
+{
+  config.users.users.nullmailer.uid = config.ids.uids.nullmailer;
+  config.users.groups.nullmailer.gid = config.ids.gids.nullmailer;
+
+  config.services.nullmailer = {
+    enable = true;
+    config = {
+      me = myconfig.env.mail.host;
+      remotes = "${myconfig.env.mail.relay} smtp";
+    };
+  };
+}
diff --git a/modules/private/mpd.nix b/modules/private/mpd.nix
new file mode 100644 (file)
index 0000000..9903bdf
--- /dev/null
@@ -0,0 +1,56 @@
+{ lib, pkgs, config, myconfig,  ... }:
+{
+  config = {
+    secrets.keys = [
+      {
+        dest = "mpd";
+        permissions = "0400";
+        text = myconfig.env.mpd.password;
+      }
+      {
+        dest = "mpd-config";
+        permissions = "0400";
+        user = "mpd";
+        group = "mpd";
+        text = ''
+          password "${myconfig.env.mpd.password}@read,add,control,admin"
+        '';
+      }
+    ];
+    networking.firewall.allowedTCPPorts = [ 6600 ];
+    users.users.mpd.extraGroups = [ "wwwrun" "keys" ];
+    systemd.services.mpd.serviceConfig.RuntimeDirectory = "mpd";
+    services.mpd = {
+      enable = true;
+      network.listenAddress = "any";
+      musicDirectory = myconfig.env.mpd.folder;
+      extraConfig = ''
+        include "/var/secrets/mpd-config"
+        audio_output {
+          type            "null"
+          name            "No Output"
+          mixer_type      "none"
+        }
+        audio_output {
+          type            "httpd"
+          name            "OGG"
+          encoder         "vorbis"
+          bind_to_address "/run/mpd/ogg.sock"
+          quality         "5.0"
+          format          "44100:16:1"
+        }
+        audio_output {
+          type            "httpd"
+          name            "MP3"
+          encoder         "lame"
+          bind_to_address "/run/mpd/mp3.sock"
+          quality         "5.0"
+          format          "44100:16:1"
+        }
+
+
+        '';
+    };
+  };
+}
+
diff --git a/modules/private/pub/default.nix b/modules/private/pub/default.nix
new file mode 100644 (file)
index 0000000..c31c8eb
--- /dev/null
@@ -0,0 +1,52 @@
+{ lib, pkgs, config, myconfig,  ... }:
+{
+  options = {
+    myServices.pub.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable pub user.
+      '';
+    };
+  };
+
+  config = lib.mkIf config.myServices.pub.enable {
+    users.users.pub = let
+      restrict = pkgs.runCommand "restrict" { 
+        file = ./restrict;
+        buildInputs = [ pkgs.makeWrapper ];
+      } ''
+        mkdir -p $out/bin
+        cp $file $out/bin/restrict
+        chmod a+x $out/bin/restrict
+        patchShebangs $out/bin/restrict
+        wrapProgram $out/bin/restrict \
+          --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
+          --set TMUX_RESTRICT ${./tmux.restrict.conf}
+      '';
+      purple-hangouts = pkgs.purple-hangouts.overrideAttrs(old: {
+        installPhase = ''
+          install -Dm755 -t $out/lib/purple-2/ libhangouts.so
+          for size in 16 22 24 48; do
+            install -TDm644 hangouts$size.png $out/share/pixmaps/pidgin/protocols/$size/hangouts.png
+          done
+          '';
+      });
+    in {
+      createHome = true;
+      description = "Restricted shell user";
+      home = "/var/lib/pub";
+      uid = myconfig.env.users.pub.uid;
+      useDefaultShell = true;
+      packages = [
+        restrict
+        pkgs.tmux
+        (pkgs.pidgin.override { plugins = [
+          pkgs.purple-plugin-pack purple-hangouts
+          pkgs.purple-discord pkgs.purple-facebook
+          pkgs.telegram-purple
+        ]; })
+        ];
+    };
+  };
+}
diff --git a/modules/private/pub/restrict b/modules/private/pub/restrict
new file mode 100644 (file)
index 0000000..b2f3be3
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+user="$1"
+rootuser="$HOME/$user/"
+mkdir -p $rootuser
+
+orig="$SSH_ORIGINAL_COMMAND"
+if [ -z "$orig" ]; then
+  orig="/bin/bash -l"
+fi
+if [ "${orig:0:7}" = "command" ]; then
+  orig="${orig:8}"
+fi
+
+case "$orig" in
+rsync*)
+        rrsync $HOME/$user/
+        ;;
+*)
+        nix_store_paths() {
+          nix-store -q -R \
+               /run/current-system/sw \
+               /etc/profiles/per-user/pub \
+               /etc/ssl/certs/ca-bundle.crt \
+               | while read i; do
+            printf '%s--ro-bind\0'$i'\0'$i'\0' ''
+          done
+        }
+
+        set -euo pipefail
+        (exec -c bwrap --ro-bind /usr /usr \
+              --args 10 \
+              --dir /tmp \
+              --dir /var \
+              --symlink ../tmp var/tmp \
+              --proc /proc \
+              --dev /dev \
+              --ro-bind /etc/resolv.conf /etc/resolv.conf \
+              --ro-bind /etc/zoneinfo /etc/zoneinfo \
+              --ro-bind /etc/ssl /etc/ssl \
+              --ro-bind /etc/static/ssl/certs /etc/static/ssl/certs \
+              --ro-bind /run/current-system/sw/lib/locale/locale-archive /etc/locale-archive \
+              --ro-bind /run/current-system/sw/bin /bin \
+              --ro-bind /etc/profiles/per-user/pub/bin /bin-pub \
+              --bind /var/lib/pub/$user /var/lib/pub \
+              --dir /var/lib/commons \
+              --ro-bind $TMUX_RESTRICT /var/lib/commons/tmux.restrict.conf \
+              --chdir /var/lib/pub \
+              --unshare-all \
+              --share-net \
+              --dir /run/user/$(id -u) \
+              --setenv TERM "$TERM" \
+              --setenv LOCALE_ARCHIVE "/etc/locale-archive" \
+              --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \
+              --setenv PS1 "$user@pub $ " \
+              --setenv PATH "/bin:/bin-pub" \
+              --setenv HOME "/var/lib/pub" \
+              --file 11 /etc/passwd \
+              --file 12 /etc/group \
+              -- $orig) \
+              10< <(nix_store_paths) \
+              11< <(getent passwd $UID 65534) \
+              12< <(getent group $(id -g) 65534)
+        ;;
+esac
diff --git a/modules/private/pub/tmux.restrict.conf b/modules/private/pub/tmux.restrict.conf
new file mode 100644 (file)
index 0000000..5aefd1c
--- /dev/null
@@ -0,0 +1,43 @@
+# Pour les nostalgiques de screen
+# comme les raccourcis ne sont pas les mêmes, j'évite
+set -g prefix C-a
+unbind-key C-b
+
+unbind-key -a
+bind-key -n C-h list-keys
+bind-key    C-d detach
+bind-key      & confirm-before -p "kill-window #W? (y/n)" kill-window
+
+# même hack que sur screen lorsqu'on veut profiter du scroll du terminal
+# (xterm ...)
+set -g terminal-overrides 'xterm*:smcup@:rmcup@'
+
+#Pour les ctrl+arrow
+set-option -g xterm-keys on
+
+# c'est un minimum (defaut 2000)
+set-option -g history-limit 10000
+
+# lorsque j'ai encore un tmux ailleurs seule
+# sa fenetre active réduit la taille de ma fenetre locale
+setw -g aggressive-resize on
+
+# Pour etre alerté sur un changement dans une autre fenêtre
+setw -g monitor-activity on
+#set -g visual-activity on
+#set -g visual-bell on
+
+set -g base-index 1
+
+# repercuter le contenu de la fenetre dans la barre de titre
+# reference des string : man tmux (status-left)
+set -g set-titles on
+set -g set-titles-string '#H #W #T' # host window command
+
+#Dans les valeurs par defaut deja, avec le ssh-agent
+set -g update-environment "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY PATH"
+
+set -g status off
+set -g status-left ''
+set -g status-right ''
+
diff --git a/modules/private/ssh/default.nix b/modules/private/ssh/default.nix
new file mode 100644 (file)
index 0000000..beedaff
--- /dev/null
@@ -0,0 +1,40 @@
+{ lib, pkgs, config, myconfig, ... }:
+{
+  config = {
+    networking.firewall.allowedTCPPorts = [ 22 ];
+
+    services.openssh.extraConfig = ''
+      AuthorizedKeysCommand     /etc/ssh/ldap_authorized_keys
+      AuthorizedKeysCommandUser nobody
+      '';
+
+    secrets.keys = [{
+      dest = "ssh-ldap";
+      user = "nobody";
+      group = "nogroup";
+      permissions = "0400";
+      text = myconfig.env.sshd.ldap.password;
+    }];
+    system.activationScripts.sshd = {
+      deps = [ "secrets" ];
+      text = ''
+      install -Dm400 -o nobody -g nogroup -T /var/secrets/ssh-ldap /etc/ssh/ldap_password
+      '';
+    };
+    # ssh is strict about parent directory having correct rights, don't
+    # move it in the nix store.
+    environment.etc."ssh/ldap_authorized_keys" = let
+      ldap_authorized_keys =
+        pkgs.mylibs.wrap {
+          name = "ldap_authorized_keys";
+          file = ./ldap_authorized_keys.sh;
+          paths = [ pkgs.which pkgs.gitolite pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils ];
+        };
+    in {
+      enable = true;
+      mode = "0755";
+      user = "root";
+      source = ldap_authorized_keys;
+    };
+  };
+}
diff --git a/modules/private/ssh/ldap_authorized_keys.sh b/modules/private/ssh/ldap_authorized_keys.sh
new file mode 100755 (executable)
index 0000000..d556452
--- /dev/null
@@ -0,0 +1,152 @@
+#!/usr/bin/env bash
+
+LDAPSEARCH=ldapsearch
+KEY="immaeSshKey"
+LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
+LDAP_PASS=$(cat /etc/ssh/ldap_password)
+LDAP_HOST="ldap.immae.eu"
+LDAP_MEMBER="cn=users,cn=ssh,ou=services,dc=immae,dc=eu"
+LDAP_GITOLITE_MEMBER="cn=users,cn=gitolite,ou=services,dc=immae,dc=eu"
+LDAP_PUB_RESTRICT_MEMBER="cn=restrict,cn=pub,ou=services,dc=immae,dc=eu"
+LDAP_PUB_FORWARD_MEMBER="cn=forward,cn=pub,ou=services,dc=immae,dc=eu"
+LDAP_BASE="dc=immae,dc=eu"
+GITOLITE_SHELL=$(which gitolite-shell)
+ECHO=$(which echo)
+
+suitable_for() {
+  type_for="$1"
+  key="$2"
+
+  if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+    echo "$key"
+  else
+    key_type=$(cut -d " " -f 1 <<< "$key")
+
+    if grep -q "\b-$type_for\b" <<< "$key_type"; then
+      echo ""
+    elif grep -q "\b$type_for\b" <<< "$key_type"; then
+      echo $(sed -e "s/^[^ ]* //g" <<< "$key")
+    else
+      echo ""
+    fi
+  fi
+}
+
+clean_key_line() {
+  type_for="$1"
+  line="$2"
+
+  if [[ "$line" == $KEY::* ]]; then
+    # base64 keys should't happen, unless wrong copy-pasting
+    key=""
+  else
+    key=$(sed -e "s/^$KEY: *//" -e "s/ *$//" <<< "$line")
+  fi
+
+  suitable_for "$type_for" "$key"
+}
+
+ldap_search() {
+  $LDAPSEARCH -h $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@"
+}
+
+ldap_keys() {
+  user=$1;
+  if [[ $user == gitolite ]]; then
+    ldap_search '(&(memberOf='$LDAP_GITOLITE_MEMBER')('$KEY'=*))' $KEY | \
+      while read line ;
+      do
+        if [ ! -z "$line" ]; then
+          if [[ $line == dn* ]]; then
+            user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
+            if [ -n "$user" ]; then
+              if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
+                # Capitalize first letter (backward compatibility)
+                user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
+              fi
+            else
+              # Service fake user
+              user=$(sed -n 's/.*cn=\([^,]*\).*/\1/p' <<< "$line")
+            fi
+          elif [[ $line == $KEY* ]]; then
+            key=$(clean_key_line git "$line")
+            if [ ! -z "$key" ]; then
+              if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+                echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
+                echo $key
+              fi
+            fi
+          fi
+        fi
+      done
+    exit 0
+  elif [[ $user == pub ]]; then
+    ldap_search '(&(memberOf='$LDAP_PUB_RESTRICT_MEMBER')('$KEY'=*))' $KEY | \
+      while read line ;
+      do
+        if [ ! -z "$line" ]; then
+          if [[ $line == dn* ]]; then
+            echo ""
+            user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
+            echo "# $user"
+          elif [[ $line == $KEY* ]]; then
+            key=$(clean_key_line pub "$line")
+            key_forward=$(clean_key_line forward "$line")
+            if [ ! -z "$key" ]; then
+              if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+                echo -n 'command="/etc/profiles/per-user/pub/bin/restrict '$user'" '
+                echo $key
+              fi
+            elif [ ! -z "$key_forward" ]; then
+              if [[ $key_forward != *$'\n'* ]] && [[ $key_forward == ssh-* ]]; then
+                echo "# forward only"
+                echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
+                echo $key_forward
+              fi
+            fi
+          fi
+        fi
+      done
+
+    echo ""
+    ldap_search '(&(memberOf='$LDAP_PUB_FORWARD_MEMBER')('$KEY'=*))' $KEY | \
+      while read line ;
+      do
+        if [ ! -z "$line" ]; then
+          if [[ $line == dn* ]]; then
+            echo ""
+            user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
+            echo "# $user"
+          elif [[ $line == $KEY* ]]; then
+            key=$(clean_key_line forward "$line")
+            if [ ! -z "$key" ]; then
+              if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+                echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
+                echo $key
+              fi
+            fi
+          fi
+        fi
+      done
+    exit 0
+  else
+    ldap_search '(&(memberOf='$LDAP_MEMBER')('$KEY'=*)(uid='$user'))' $KEY | \
+      while read line ;
+      do
+        if [ ! -z "$line" ]; then
+          if [[ $line == dn* ]]; then
+            user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
+          elif [[ $line == $KEY* ]]; then
+            key=$(clean_key_line ssh "$line")
+            if [ ! -z "$key" ]; then
+              if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+                echo $key
+              fi
+            fi
+          fi
+        fi
+      done
+  fi
+}
+
+ldap_keys $@
diff --git a/modules/private/system.nix b/modules/private/system.nix
new file mode 100644 (file)
index 0000000..fba504e
--- /dev/null
@@ -0,0 +1,30 @@
+{ pkgs, privateFiles, ... }:
+{
+  config = {
+    nixpkgs.overlays = builtins.attrValues (import ../../overlays);
+    _module.args = {
+      pkgsNext = import <nixpkgsNext> {};
+      pkgsPrevious = import <nixpkgsPrevious> {};
+      myconfig = {
+        inherit privateFiles;
+        env = import "${privateFiles}/environment.nix";
+      };
+    };
+
+    services.journald.extraConfig = ''
+      MaxLevelStore="warning"
+      MaxRetentionSec="1year"
+      '';
+
+    users.users.root.packages = [
+      pkgs.telnet
+      pkgs.htop
+      pkgs.iftop
+    ];
+
+    environment.systemPackages = [
+      pkgs.vim
+    ];
+
+  };
+}
diff --git a/modules/private/system/eldiron.nix b/modules/private/system/eldiron.nix
new file mode 100644 (file)
index 0000000..b71df33
--- /dev/null
@@ -0,0 +1,63 @@
+{ privateFiles }:
+{ config, pkgs, myconfig, ... }:
+{
+  boot.kernelPackages = pkgs.linuxPackages_latest;
+  _module.args.privateFiles = privateFiles;
+
+  networking = {
+    firewall.enable = true;
+    # 176.9.151.89 declared in nixops -> infra / tools
+    interfaces."eth0".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList
+      (n: ips: { address = ips.ip4; prefixLength = 32; })
+      (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") myconfig.env.servers.eldiron.ips);
+    interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
+      (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
+      myconfig.env.servers.eldiron.ips);
+  };
+
+  imports = builtins.attrValues (import ../..);
+
+  myServices.buildbot.enable = true;
+  myServices.databases.enable = true;
+  myServices.gitolite.enable = true;
+  myServices.irc.enable = true;
+  myServices.pub.enable = true;
+  myServices.tasks.enable = true;
+  services.pure-ftpd.enable = true;
+
+  deployment = {
+    targetEnv = "hetzner";
+    hetzner = {
+      robotUser = myconfig.env.hetzner.user;
+      robotPass = myconfig.env.hetzner.pass;
+      mainIPv4 = myconfig.env.servers.eldiron.ips.main.ip4;
+      partitions = ''
+        clearpart --all --initlabel --drives=sda,sdb
+
+        part swap1 --recommended --label=swap1 --fstype=swap --ondisk=sda
+        part swap2 --recommended --label=swap2 --fstype=swap --ondisk=sdb
+
+        part raid.1 --grow --ondisk=sda
+        part raid.2 --grow --ondisk=sdb
+
+        raid / --level=1 --device=md0 --fstype=ext4 --label=root raid.1 raid.2
+      '';
+    };
+  };
+
+  services.cron = {
+    enable = true;
+    systemCronJobs = [
+      ''
+        # The star after /var/lib/* avoids deleting all folders in case of problem
+        0 3,9,15,21 * * * root rsync -e "ssh -i /root/.ssh/id_charon_vpn" -aAXvz --delete --numeric-ids --super --rsync-path="sudo rsync" /var/lib/* immae@immae.eu: > /dev/null
+      ''
+    ];
+  };
+
+  # This value determines the NixOS release with which your system is
+  # to be compatible, in order to avoid breaking some software such as
+  # database servers. You should change this only after NixOS release
+  # notes say you should.
+  system.stateVersion = "18.09"; # Did you read the comment?
+}
diff --git a/modules/private/tasks/default.nix b/modules/private/tasks/default.nix
new file mode 100644 (file)
index 0000000..30f49ee
--- /dev/null
@@ -0,0 +1,327 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.tasks;
+  server_vardir = config.services.taskserver.dataDir;
+  fqdn = "task.immae.eu";
+  user = config.services.taskserver.user;
+  env = myconfig.env.tools.task;
+  group = config.services.taskserver.group;
+  taskserver-user-certs = pkgs.runCommand "taskserver-user-certs" {} ''
+    mkdir -p $out/bin
+    cat > $out/bin/taskserver-user-certs <<"EOF"
+    #!/usr/bin/env bash
+
+    user=$1
+
+    silent_certtool() {
+      if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
+        echo "GNUTLS certtool invocation failed with output:" >&2
+        echo "$output" >&2
+      fi
+    }
+
+    silent_certtool -p \
+      --bits 4096 \
+      --outfile "${server_vardir}/userkeys/$user.key.pem"
+    ${pkgs.gnused}/bin/sed -i -n -e '/^-----BEGIN RSA PRIVATE KEY-----$/,$p' "${server_vardir}/userkeys/$user.key.pem"
+
+    silent_certtool -c \
+      --template "${pkgs.writeText "taskserver-ca.template" ''
+        tls_www_client
+        encryption_key
+        signing_key
+        expiration_days = 3650
+      ''}" \
+      --load-ca-certificate "${server_vardir}/keys/ca.cert" \
+      --load-ca-privkey "${server_vardir}/keys/ca.key" \
+      --load-privkey "${server_vardir}/userkeys/$user.key.pem" \
+      --outfile "${server_vardir}/userkeys/$user.cert.pem"
+    EOF
+    chmod a+x $out/bin/taskserver-user-certs
+    patchShebangs $out/bin/taskserver-user-certs
+    '';
+  taskwarrior-web = pkgs.webapps.taskwarrior-web;
+  socketsDir = "/run/taskwarrior-web";
+  varDir = "/var/lib/taskwarrior-web";
+  taskwebPages = let
+    uidPages = lib.attrsets.zipAttrs (
+      lib.lists.flatten
+        (lib.attrsets.mapAttrsToList (k: c: map (v: { "${v}" = k; }) c.uid) env.taskwarrior-web)
+      );
+    pages = lib.attrsets.mapAttrs (uid: items:
+      if lib.lists.length items == 1 then
+      ''
+        <html>
+        <head>
+          <meta http-equiv="refresh" content="0; url=/taskweb/${lib.lists.head items}/" />
+        </head>
+        <body></body>
+        </html>
+        ''
+      else
+      ''
+        <html>
+        <head>
+        <title>To-do list disponibles</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        </head>
+        <body>
+          <ul>
+            ${builtins.concatStringsSep "\n" (map (item: "<li><a href='/taskweb/${item}'>${item}</a></li>") items)}
+          </ul>
+        </body>
+        </html>
+        ''
+    ) uidPages;
+  in
+    pkgs.runCommand "taskwerver-pages" {} ''
+      mkdir -p $out/
+      ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: "cp ${pkgs.writeText k v} $out/${k}.html") pages)}
+      echo "Please login" > $out/index.html
+      '';
+in {
+  options.myServices.tasks = {
+    enable = lib.mkEnableOption "my tasks service";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = [{
+      dest = "webapps/tools-taskwarrior-web";
+      user = "wwwrun";
+      group = "wwwrun";
+      permissions = "0400";
+      text = ''
+          SetEnv TASKD_HOST          "${fqdn}:${toString config.services.taskserver.listenPort}"
+          SetEnv TASKD_VARDIR        "${server_vardir}"
+          SetEnv TASKD_LDAP_HOST     "ldaps://${env.ldap.host}"
+          SetEnv TASKD_LDAP_DN       "${env.ldap.dn}"
+          SetEnv TASKD_LDAP_PASSWORD "${env.ldap.password}"
+          SetEnv TASKD_LDAP_BASE     "${env.ldap.base}"
+          SetEnv TASKD_LDAP_FILTER   "${env.ldap.search}"
+        '';
+    }];
+    services.websites.tools.modules = [ "proxy_fcgi" "sed" ];
+    services.websites.tools.vhostConfs.task = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "task.immae.eu" ];
+      root        = "/run/current-system/webapps/_task";
+      extraConfig = [ ''
+        <Directory /run/current-system/webapps/_task>
+          DirectoryIndex index.php
+          Use LDAPConnect
+          Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
+          <FilesMatch "\.php$">
+            SetHandler "proxy:unix:/var/run/phpfpm/task.sock|fcgi://localhost"
+          </FilesMatch>
+          Include /var/secrets/webapps/tools-taskwarrior-web
+        </Directory>
+        ''
+        ''
+        <Macro Taskwarrior %{folderName}>
+          ProxyPass        "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
+          ProxyPassReverse "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
+          ProxyPassReverse http://${fqdn}/
+
+          SetOutputFilter Sed
+          OutputSed   "s|/ajax|/taskweb/%{folderName}/ajax|g"
+          OutputSed   "s|\([^x]\)/tasks|\1/taskweb/%{folderName}/tasks|g"
+          OutputSed   "s|\([^x]\)/projects|\1/taskweb/%{folderName}/projects|g"
+          OutputSed   "s|http://${fqdn}/|/taskweb/%{folderName}/|g"
+          OutputSed   "s|/img/relax.jpg|/taskweb/%{folderName}/img/relax.jpg|g"
+        </Macro>
+        ''
+        ''
+        Alias /taskweb ${taskwebPages}
+        <Directory "${taskwebPages}">
+          DirectoryIndex index.html
+          Require all granted
+        </Directory>
+
+        RewriteEngine on
+        RewriteRule ^/taskweb$ /taskweb/ [R=301,L]
+        RedirectMatch permanent ^/taskweb/([^/]+)$ /taskweb/$1/
+
+        RewriteCond %{LA-U:REMOTE_USER} !=""
+        RewriteCond ${taskwebPages}/%{LA-U:REMOTE_USER}.html -f
+        RewriteRule ^/taskweb/?$ ${taskwebPages}/%{LA-U:REMOTE_USER}.html [L]
+
+        <Location /taskweb/>
+          Use LDAPConnect
+          Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
+        </Location>
+        ''
+      ] ++ (lib.attrsets.mapAttrsToList (k: v: ''
+        <Location /taskweb/${k}/>
+          ${builtins.concatStringsSep "\n" (map (uid: "Require ldap-attribute   uid=${uid}") v.uid)}
+
+          Use Taskwarrior ${k}
+        </Location>
+        '') env.taskwarrior-web);
+    };
+    services.phpfpm.poolConfigs = {
+      tasks = ''
+        listen = /var/run/phpfpm/task.sock
+        user = ${user}
+        group = ${group}
+        listen.owner = wwwrun
+        listen.group = wwwrun
+        pm = dynamic
+        pm.max_children = 60
+        pm.start_servers = 2
+        pm.min_spare_servers = 1
+        pm.max_spare_servers = 10
+
+        ; Needed to avoid clashes in browser cookies (same domain)
+        env[PATH] = "/etc/profiles/per-user/${user}/bin"
+        php_value[session.name] = TaskPHPSESSID
+        php_admin_value[open_basedir] = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/"
+      '';
+    };
+
+    myServices.websites.webappDirs._task = ./www;
+
+    security.acme.certs."task" = config.services.myCertificates.certConfig // {
+      inherit user group;
+      plugins = [ "fullchain.pem" "key.pem" "cert.pem" "account_key.json" ];
+      domain = fqdn;
+      postRun = ''
+        systemctl restart taskserver.service
+      '';
+    };
+
+    users.users.${user}.packages = [ taskserver-user-certs ];
+
+    system.activationScripts.taskserver = {
+      deps = [ "users" ];
+      text = ''
+        install -m 0750 -o ${user} -g ${group} -d ${server_vardir}
+        install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/userkeys
+        install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/keys
+
+        if [ ! -e "${server_vardir}/keys/ca.key" ]; then
+          silent_certtool() {
+            if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
+              echo "GNUTLS certtool invocation failed with output:" >&2
+              echo "$output" >&2
+            fi
+          }
+
+          silent_certtool -p \
+            --bits 4096 \
+            --outfile "${server_vardir}/keys/ca.key"
+
+          silent_certtool -s \
+            --template "${pkgs.writeText "taskserver-ca.template" ''
+              cn = ${fqdn}
+              expiration_days = -1
+              cert_signing_key
+              ca
+            ''}" \
+            --load-privkey "${server_vardir}/keys/ca.key" \
+            --outfile "${server_vardir}/keys/ca.cert"
+
+          chown :${group} "${server_vardir}/keys/ca.key"
+          chmod g+r "${server_vardir}/keys/ca.key"
+        fi
+      '';
+    };
+
+    services.taskserver = {
+      enable = true;
+      allowedClientIDs = [ "^task [2-9]" "^Mirakel [1-9]" ];
+      inherit fqdn;
+      listenHost = "::";
+      pki.manual.ca.cert = "${server_vardir}/keys/ca.cert";
+      pki.manual.server.cert = "${config.security.acme.directory}/task/fullchain.pem";
+      pki.manual.server.crl = "${config.security.acme.directory}/task/invalid.crl";
+      pki.manual.server.key = "${config.security.acme.directory}/task/key.pem";
+      requestLimit = 104857600;
+    };
+
+    system.activationScripts.taskwarrior-web = {
+      deps = [ "users" ];
+      text = ''
+        if [ ! -f ${server_vardir}/userkeys/taskwarrior-web.cert.pem ]; then
+          ${taskserver-user-certs}/bin/taskserver-user-certs taskwarrior-web
+          chown taskd:taskd ${server_vardir}/userkeys/taskwarrior-web.cert.pem ${server_vardir}/userkeys/taskwarrior-web.key.pem
+        fi
+      '';
+    };
+
+    systemd.services = (lib.attrsets.mapAttrs' (name: userConfig:
+      let
+        credentials = "${userConfig.org}/${name}/${userConfig.key}";
+        dateFormat = userConfig.date;
+        taskrc = pkgs.writeText "taskrc" ''
+          data.location=${varDir}/${name}
+          taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem
+          taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem
+          # IdenTrust DST Root CA X3
+          # obtained here: https://letsencrypt.org/fr/certificates/
+          taskd.ca=${pkgs.writeText "ca.cert" ''
+            -----BEGIN CERTIFICATE-----
+            MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+            MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+            DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+            PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+            Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+            AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+            rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+            OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+            xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+            7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+            aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+            HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+            SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+            ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+            AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+            R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+            JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+            Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+            -----END CERTIFICATE-----''}
+          taskd.server=${fqdn}:${toString config.services.taskserver.listenPort}
+          taskd.credentials=${credentials}
+          dateformat=${dateFormat}
+          '';
+      in lib.attrsets.nameValuePair "taskwarrior-web-${name}" {
+        description = "Taskwarrior webapp for ${name}";
+        wantedBy = [ "multi-user.target" ];
+        after = [ "network.target" ];
+        path = [ pkgs.taskwarrior ];
+
+        environment.TASKRC = taskrc;
+        environment.BUNDLE_PATH = "${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}";
+        environment.BUNDLE_GEMFILE = "${taskwarrior-web.gems.confFiles}/Gemfile";
+        environment.LC_ALL = "fr_FR.UTF-8";
+
+        script = ''
+          exec ${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}/bin/bundle exec thin start -R config.ru -S ${socketsDir}/${name}.sock
+        '';
+
+        serviceConfig = {
+          User = user;
+          PrivateTmp = true;
+          Restart = "always";
+          TimeoutSec = 60;
+          Type = "simple";
+          WorkingDirectory = taskwarrior-web;
+          StateDirectoryMode = 0750;
+          StateDirectory = assert lib.strings.hasPrefix "/var/lib/" varDir;
+            (lib.strings.removePrefix "/var/lib/" varDir + "/${name}");
+          RuntimeDirectoryPreserve = "yes";
+          RuntimeDirectory = assert lib.strings.hasPrefix "/run/" socketsDir;
+            lib.strings.removePrefix "/run/" socketsDir;
+        };
+
+        unitConfig.RequiresMountsFor = varDir;
+      }) env.taskwarrior-web) // {
+        taskserver-ca.postStart = ''
+          chown :${group} "${server_vardir}/keys/ca.key"
+          chmod g+r "${server_vardir}/keys/ca.key"
+        '';
+      };
+
+  };
+}
diff --git a/modules/private/tasks/www/index.php b/modules/private/tasks/www/index.php
new file mode 100644 (file)
index 0000000..deaf8af
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+if (!isset($_SERVER["REMOTE_USER"])) {
+  die("please login");
+}
+$ldap_user = $_SERVER["REMOTE_USER"];
+$ldap_host = getenv("TASKD_LDAP_HOST");
+$ldap_dn = getenv('TASKD_LDAP_DN');
+$ldap_password = getenv('TASKD_LDAP_PASSWORD');
+$ldap_base = getenv('TASKD_LDAP_BASE');
+$ldap_filter = getenv('TASKD_LDAP_FILTER');
+$host   = getenv('TASKD_HOST');
+$vardir = getenv('TASKD_VARDIR');
+
+$connect = ldap_connect($ldap_host);
+ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
+if (!$connect || !ldap_bind($connect, $ldap_dn, $ldap_password)) {
+  die("impossible to connect to LDAP");
+}
+
+$search_query = str_replace('%login%', ldap_escape($ldap_user), $ldap_filter);
+
+$search = ldap_search($connect, $ldap_base, $search_query);
+$info = ldap_get_entries($connect, $search);
+
+if (ldap_count_entries($connect, $search) != 1) {
+  die("Impossible to find user in LDAP");
+}
+
+$entries = [];
+foreach($info[0]["immaetaskid"] as $key => $value) {
+  if ($key !== "count") {
+    $entries[] = explode(":", $value);
+  }
+}
+
+if (isset($_GET["file"])) {
+  $basecert = $vardir . "/userkeys/" . $ldap_user;
+  if (!file_exists($basecert . ".cert.pem")) {
+    exec("taskserver-user-certs $ldap_user");
+  }
+  $certificate = file_get_contents($basecert . ".cert.pem");
+  $cert_key    = file_get_contents($basecert . ".key.pem");
+
+  // IdenTrust DST Root CA X3
+  // obtained here: https://letsencrypt.org/fr/certificates/
+  $server_cert = "-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----";
+
+  $file = $_GET["file"];
+  switch($file) {
+  case "ca.cert.pem":
+    $content = $server_cert;
+    $name    = "ca.cert.pem";
+    $type    = "application/x-x509-ca-cert";
+    break;
+  case "cert.pem":
+    $content = $certificate;
+    $name    = $ldap_user . ".cert.pem";
+    $type    = "application/x-x509-ca-cert";
+    break;
+  case "key.pem":
+    $content = $cert_key;
+    $name    = $ldap_user . ".key.pem";
+    $type    = "application/x-x509-ca-cert";
+    break;
+  case "mirakel";
+    foreach ($entries as $entry) {
+      list($org, $user, $key) = $entry;
+      if ($key == $_GET["key"]) { break; }
+    }
+    $name    = $user . ".mirakel";
+    $type    = "text/plain";
+    $content = "username: $user
+org: $org
+user key: $key
+server: $host
+client.cert:
+$certificate
+Client.key:
+$cert_key
+ca.cert:
+$server_cert
+";
+    break;
+  default:
+    die("invalid file name");
+    break;
+  }
+
+  header("Content-Type: $type");
+  header('Content-Disposition: attachment; filename="' . $name . '"');
+  header('Content-Transfer-Encoding: binary');
+  header('Accept-Ranges: bytes');
+  header('Cache-Control: private');
+  header('Pragma: private');
+  echo $content;
+  exit;
+}
+?>
+<html>
+<header>
+  <title>Taskwarrior configuration</title>
+</header>
+<body>
+<ul>
+  <li><a href="?file=ca.cert.pem">ca.cert.pem</a></li>
+  <li><a href="?file=cert.pem"><?php echo $ldap_user; ?>.cert.pem</a></li>
+  <li><a href="?file=key.pem"><?php echo $ldap_user; ?>.key.pem</a></li>
+</ul>
+For command line interface, download the files, put them near your Taskwarrior
+configuration files, and add that to your Taskwarrior configuration:
+<pre>
+taskd.certificate=/path/to/<?php echo $ldap_user; ?>.cert.pem
+taskd.key=/path/to/<?php echo $ldap_user; ?>.key.pem
+taskd.server=<?php echo $host ."\n"; ?>
+<?php if (count($entries) > 1) {
+  echo "# Chose one of them\n";
+  foreach($entries as $entry) {
+    list($org, $user, $key) = $entry;
+    echo "# taskd.credentials=$org/$user/$key\n";
+  }
+} else { ?>
+taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
+<?php } ?>
+taskd.ca=/path/to/ca.cert.pem
+</pre>
+For Mirakel, download and import the file:
+<ul>
+<?php
+foreach ($entries as $entry) {
+  list($org, $user, $key) = $entry;
+  echo '<li><a href="?file=mirakel&key='.$key.'">' . $user . '.mirakel</a></li>';
+}
+?>
+</ul>
+For Android Taskwarrior app, see instructions <a href="https://bitbucket.org/kvorobyev/taskwarriorandroid/wiki/Configuration">here</a>.
+</body>
+</html>
+
diff --git a/modules/private/websites/aten/builder.nix b/modules/private/websites/aten/builder.nix
new file mode 100644 (file)
index 0000000..9a2e1a7
--- /dev/null
@@ -0,0 +1,102 @@
+{ apacheUser, apacheGroup, aten, lib, config }: rec {
+  app = aten.override { inherit (config) environment; };
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${app.varDir}/currentWebappDir" -o \
+          ! -f "${app.varDir}/currentKey" -o \
+          "${app}" != "$(cat ${app.varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${app.varDir}/currentKey; then
+        pushd ${app} > /dev/null
+        /run/wrappers/bin/sudo -u ${apacheUser} APP_ENV=${app.environment} ./bin/console --env=${app.environment} cache:clear --no-warmup
+        popd > /dev/null
+        echo -n "${app}" > ${app.varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/${app.environment}-aten > ${app.varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "postgresql.service" ];
+    socket = "/var/run/phpfpm/aten-${app.environment}.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      env[SYMFONY_DEBUG_MODE] = "yes"
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  keys = [{
+    dest = "webapps/${app.environment}-aten";
+    user = apacheUser;
+    group = apacheGroup;
+    permissions = "0400";
+    text = ''
+      SetEnv APP_ENV      "${app.environment}"
+      SetEnv APP_SECRET   "${config.secret}"
+      SetEnv DATABASE_URL "${config.psql_url}"
+      '';
+  }];
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "aten_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    <FilesMatch "\.php$">
+      SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+    </FilesMatch>
+
+    Include /var/secrets/webapps/${app.environment}-aten
+
+    ${if app.environment == "dev" then ''
+    <Location />
+      Use LDAPConnect
+      Require ldap-group   cn=dev.aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
+    </Location>
+
+    <Location /backend>
+      Use LDAPConnect
+      Require ldap-group   cn=dev.aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
+    </Location>
+    '' else ''
+    Use Stats aten.pro
+
+    <Location /backend>
+      Use LDAPConnect
+      Require ldap-group   cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
+    </Location>
+    ''}
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride All
+      Require all granted
+      DirectoryIndex index.php
+      FallbackResource /index.php
+    </Directory>
+    '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}
+    install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+}
diff --git a/modules/private/websites/aten/integration.nix b/modules/private/websites/aten/integration.nix
new file mode 100644 (file)
index 0000000..748e388
--- /dev/null
@@ -0,0 +1,32 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  aten = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) aten;
+    config = myconfig.env.websites.aten.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.aten.integration;
+in {
+  options.myServices.websites.aten.integration.enable = lib.mkEnableOption "enable Aten's website in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = aten.keys;
+    systemd.services.phpfpm-aten_dev.preStart = lib.mkAfter aten.phpFpm.preStart;
+    systemd.services.phpfpm-aten_dev.after = lib.mkAfter aten.phpFpm.serviceDeps;
+    systemd.services.phpfpm-aten_dev.wants = aten.phpFpm.serviceDeps;
+    services.phpfpm.poolConfigs.aten_dev = aten.phpFpm.pool;
+    system.activationScripts.aten_dev = aten.activationScript;
+    myServices.websites.webappDirs."${aten.apache.webappName}" = aten.app.webRoot;
+    services.websites.integration.modules = aten.apache.modules;
+    services.websites.integration.vhostConfs.aten = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "dev.aten.pro" ];
+      root        = aten.apache.root;
+      extraConfig = [ aten.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/aten/production.nix b/modules/private/websites/aten/production.nix
new file mode 100644 (file)
index 0000000..7a4adb5
--- /dev/null
@@ -0,0 +1,34 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  aten = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) aten;
+    config = myconfig.env.websites.aten.production;
+    apacheUser = config.services.httpd.Prod.user;
+    apacheGroup = config.services.httpd.Prod.group;
+  };
+
+  cfg = config.myServices.websites.aten.production;
+in {
+  options.myServices.websites.aten.production.enable = lib.mkEnableOption "enable Aten's website in production";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = aten.keys;
+    services.webstats.sites = [ { name = "aten.pro"; } ];
+
+    systemd.services.phpfpm-aten_prod.preStart = lib.mkAfter aten.phpFpm.preStart;
+    systemd.services.phpfpm-aten_prod.after = lib.mkAfter aten.phpFpm.serviceDeps;
+    systemd.services.phpfpm-aten_prod.wants = aten.phpFpm.serviceDeps;
+    services.phpfpm.poolConfigs.aten_prod = aten.phpFpm.pool;
+    system.activationScripts.aten_prod = aten.activationScript;
+    myServices.websites.webappDirs."${aten.apache.webappName}" = aten.app.webRoot;
+    services.websites.production.modules = aten.apache.modules;
+    services.websites.production.vhostConfs.aten = {
+      certName     = "aten";
+      certMainHost = "aten.pro";
+      hosts        = [ "aten.pro" "www.aten.pro" ];
+      root         = aten.apache.root;
+      extraConfig  = [ aten.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/capitaines/mastodon_static/index.html b/modules/private/websites/capitaines/mastodon_static/index.html
new file mode 100644 (file)
index 0000000..fae4152
--- /dev/null
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang='en'>
+  <head>
+    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
+    <title>This instance is now closed - Mastodon</title>
+    <style>
+      body {
+        text-align: center;
+        background: #282c37;
+        font-family: sans-serif;
+      }
+      img {
+        max-width: 470px;
+        width: 100%;
+      }
+      h1 {
+        font-size: 20px;
+        font-weight: 400;
+        color: #9baec8;
+      }
+    </style>
+  </head>
+  <body>
+    <div>
+      <img alt='Mastodon' src='/oops.png'>
+      <h1>Sorry, this instance is closed now.</h1>
+    </div>
+  </body>
+</html>
diff --git a/modules/private/websites/capitaines/mastodon_static/oops.png b/modules/private/websites/capitaines/mastodon_static/oops.png
new file mode 100644 (file)
index 0000000..0abddad
Binary files /dev/null and b/modules/private/websites/capitaines/mastodon_static/oops.png differ
diff --git a/modules/private/websites/capitaines/production.nix b/modules/private/websites/capitaines/production.nix
new file mode 100644 (file)
index 0000000..57d8787
--- /dev/null
@@ -0,0 +1,44 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+    cfg = config.myServices.websites.capitaines.production;
+    env = myconfig.env.websites.capitaines;
+    webappName = "capitaines_mastodon";
+    root = "/run/current-system/webapps/${webappName}";
+    siteDir = ./mastodon_static;
+in {
+  options.myServices.websites.capitaines.production.enable = lib.mkEnableOption "enable Capitaines's website";
+
+  config = lib.mkIf cfg.enable {
+    myServices.websites.webappDirs."${webappName}" = siteDir;
+
+    services.websites.production.vhostConfs.capitaines_mastodon = {
+      certName     = "capitaines";
+      certMainHost = "mastodon.capitaines.fr";
+      hosts        = [ "mastodon.capitaines.fr" ];
+      root         = root;
+      extraConfig  = [
+        ''
+        ErrorDocument 404 /index.html
+        <Directory ${root}>
+          DirectoryIndex index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+
+    services.websites.production.vhostConfs.capitaines = {
+      certName   = "capitaines";
+      addToCerts = true;
+      hosts      = [ "capitaines.fr" ];
+      root       = "/run/current-system/webapps/_www";
+      extraConfig = [ ''
+        <Directory /run/current-system/webapps/_www>
+          DirectoryIndex index.htm
+          Require all granted
+        </Directory>
+        '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/chloe/builder.nix b/modules/private/websites/chloe/builder.nix
new file mode 100644 (file)
index 0000000..f65e9a9
--- /dev/null
@@ -0,0 +1,102 @@
+{ apacheUser, apacheGroup, chloe, config }:
+rec {
+  app = chloe.override { inherit (config) environment; };
+  phpFpm = rec {
+    serviceDeps = [ "mysql.service" ];
+    socket = "/var/run/phpfpm/chloe-${app.environment}.sock";
+    pool = ''
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "${app.spipConfig}:${configDir}:${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  keys = [{
+    dest = "webapps/${app.environment}-chloe";
+    user = apacheUser;
+    group = apacheGroup;
+    permissions = "0400";
+    text = ''
+      SetEnv SPIP_CONFIG_DIR     "${configDir}"
+      SetEnv SPIP_VAR_DIR        "${app.varDir}"
+      SetEnv SPIP_SITE           "chloe-${app.environment}"
+      SetEnv SPIP_LDAP_BASE      "dc=immae,dc=eu"
+      SetEnv SPIP_LDAP_HOST      "ldaps://ldap.immae.eu"
+      SetEnv SPIP_LDAP_SEARCH_DN "${config.ldap.dn}"
+      SetEnv SPIP_LDAP_SEARCH_PW "${config.ldap.password}"
+      SetEnv SPIP_LDAP_SEARCH    "${config.ldap.search}"
+      SetEnv SPIP_MYSQL_HOST     "${config.mysql.host}"
+      SetEnv SPIP_MYSQL_PORT     "${config.mysql.port}"
+      SetEnv SPIP_MYSQL_DB       "${config.mysql.name}"
+      SetEnv SPIP_MYSQL_USER     "${config.mysql.user}"
+      SetEnv SPIP_MYSQL_PASSWORD "${config.mysql.password}"
+    '';
+  }];
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "chloe_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Include /var/secrets/webapps/${app.environment}-chloe
+
+      RewriteEngine On
+      ${if app.environment == "prod" then ''
+      RewriteRule ^/news.rss  /spip.php?page=backend&id_rubrique=1
+      '' else ""}
+
+      <FilesMatch "\.php$">
+        SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+      </FilesMatch>
+
+      <Directory ${root}>
+        DirectoryIndex index.php index.htm index.html
+        Options -Indexes +FollowSymLinks +MultiViews +Includes
+        Include ${root}/htaccess.txt
+
+        AllowOverride AuthConfig FileInfo Limit
+        Require all granted
+      </Directory>
+
+      <DirectoryMatch "${root}/squelettes">
+        Require all denied
+      </DirectoryMatch>
+
+      <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
+        Require all denied
+      </FilesMatch>
+
+      ${if app.environment == "dev" then ''
+      <Location />
+        Use LDAPConnect
+        Require ldap-group cn=chloe.immae.eu,cn=httpd,ou=services,dc=immae,dc=eu
+        ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://osteopathe-cc.fr\"></html>"
+      </Location>
+      '' else ''
+      Use Stats osteopathe-cc.fr
+      ''}
+      '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local
+      install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+  configDir = ./config;
+}
diff --git a/modules/private/websites/chloe/config/chmod.php b/modules/private/websites/chloe/config/chmod.php
new file mode 100644 (file)
index 0000000..aae16cd
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+if (!defined("_ECRIRE_INC_VERSION")) return;
+if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
+?>
\ No newline at end of file
diff --git a/modules/private/websites/chloe/config/connect.php b/modules/private/websites/chloe/config/connect.php
new file mode 100644 (file)
index 0000000..18b0933
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+if (!defined("_ECRIRE_INC_VERSION")) return;
+define('_MYSQL_SET_SQL_MODE',true);
+$GLOBALS['spip_connect_version'] = 0.7;
+spip_connect_db(
+  getenv("SPIP_MYSQL_HOST"),
+  getenv("SPIP_MYSQL_PORT"),
+  getenv("SPIP_MYSQL_USER"),
+  getenv("SPIP_MYSQL_PASSWORD"),
+  getenv("SPIP_MYSQL_DB"),
+  'mysql',
+  'spip',
+  'ldap.php'
+);
+?>
diff --git a/modules/private/websites/chloe/config/ldap.php b/modules/private/websites/chloe/config/ldap.php
new file mode 100644 (file)
index 0000000..825b7ed
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+if (!defined("_ECRIRE_INC_VERSION")) return;
+$GLOBALS['ldap_base'] = getenv("SPIP_LDAP_BASE");
+$GLOBALS['ldap_link'] = @ldap_connect(getenv("SPIP_LDAP_HOST"));
+@ldap_set_option($GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'3');
+@ldap_bind($GLOBALS['ldap_link'],getenv("SPIP_LDAP_SEARCH_DN"), getenv("SPIP_LDAP_SEARCH_PW"));
+$GLOBALS['ldap_champs'] = array('login' => array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',);
+$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH");
+?>
diff --git a/modules/private/websites/chloe/integration.nix b/modules/private/websites/chloe/integration.nix
new file mode 100644 (file)
index 0000000..c42a428
--- /dev/null
@@ -0,0 +1,36 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  chloe  = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) chloe;
+    config = myconfig.env.websites.chloe.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.chloe.integration;
+in {
+  options.myServices.websites.chloe.integration.enable = lib.mkEnableOption "enable Chloe's website in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = chloe.keys;
+    systemd.services.phpfpm-chloe_dev.after = lib.mkAfter chloe.phpFpm.serviceDeps;
+    systemd.services.phpfpm-chloe_dev.wants = chloe.phpFpm.serviceDeps;
+    services.phpfpm.pools.chloe_dev = {
+      listen = chloe.phpFpm.socket;
+      extraConfig = chloe.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + ''
+        extension=${pkgs.php}/lib/php/extensions/mysqli.so
+      '';
+    };
+    system.activationScripts.chloe_dev = chloe.activationScript;
+    myServices.websites.webappDirs."${chloe.apache.webappName}" = chloe.app.webRoot;
+    services.websites.integration.modules = chloe.apache.modules;
+    services.websites.integration.vhostConfs.chloe = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["chloe.immae.eu" ];
+      root        = chloe.apache.root;
+      extraConfig = [ chloe.apache.vhostConf ];
+    };
+  };
+}
diff --git a/modules/private/websites/chloe/production.nix b/modules/private/websites/chloe/production.nix
new file mode 100644 (file)
index 0000000..0bf2d8f
--- /dev/null
@@ -0,0 +1,38 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  chloe = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) chloe;
+    config = myconfig.env.websites.chloe.production;
+    apacheUser = config.services.httpd.Prod.user;
+    apacheGroup = config.services.httpd.Prod.group;
+  };
+
+  cfg = config.myServices.websites.chloe.production;
+in {
+  options.myServices.websites.chloe.production.enable = lib.mkEnableOption "enable Chloe's website in production";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = chloe.keys;
+    services.webstats.sites = [ { name = "osteopathe-cc.fr"; } ];
+
+    systemd.services.phpfpm-chloe_prod.after = lib.mkAfter chloe.phpFpm.serviceDeps;
+    systemd.services.phpfpm-chloe_prod.wants = chloe.phpFpm.serviceDeps;
+    services.phpfpm.pools.chloe_prod = {
+      listen = chloe.phpFpm.socket;
+      extraConfig = chloe.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + ''
+        extension=${pkgs.php}/lib/php/extensions/mysqli.so
+      '';
+    };
+    system.activationScripts.chloe_prod = chloe.activationScript;
+    myServices.websites.webappDirs."${chloe.apache.webappName}" = chloe.app.webRoot;
+    services.websites.production.modules = chloe.apache.modules;
+    services.websites.production.vhostConfs.chloe = {
+      certName     = "chloe";
+      certMainHost = "osteopathe-cc.fr";
+      hosts        = ["osteopathe-cc.fr" "www.osteopathe-cc.fr" ];
+      root         = chloe.apache.root;
+      extraConfig  = [ chloe.apache.vhostConf ];
+    };
+  };
+}
diff --git a/modules/private/websites/commons/adminer.nix b/modules/private/websites/commons/adminer.nix
new file mode 100644 (file)
index 0000000..98ab461
--- /dev/null
@@ -0,0 +1,21 @@
+{}:
+rec {
+  phpFpm = {
+    socket = "/var/run/phpfpm/adminer.sock";
+  };
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "_adminer";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /adminer ${root}
+      <Directory ${root}>
+        DirectoryIndex index.php
+        Require all granted
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+      </Directory>
+      '';
+  };
+}
diff --git a/modules/private/websites/connexionswing/builder.nix b/modules/private/websites/connexionswing/builder.nix
new file mode 100644 (file)
index 0000000..b4b04cb
--- /dev/null
@@ -0,0 +1,163 @@
+{ apacheUser, apacheGroup, connexionswing, pkgs, phpPackages, config }:
+rec {
+  app = connexionswing.override { inherit (config) environment; };
+  keys = [{
+    dest = "webapps/${app.environment}-connexionswing";
+    user = apacheUser;
+    group = apacheGroup;
+    permissions = "0400";
+    text = ''
+      # This file is auto-generated during the composer install
+      parameters:
+          database_host: ${config.mysql.host}
+          database_port: ${config.mysql.port}
+          database_name: ${config.mysql.name}
+          database_user: ${config.mysql.user}
+          database_password: ${config.mysql.password}
+          database_server_version: ${pkgs.mariadb.mysqlVersion}
+          mailer_transport: sendmail
+          mailer_host: null
+          mailer_user: null
+          mailer_password: null
+          subscription_email: ${config.email}
+          allow_robots: true
+          secret: ${config.secret}
+      ${if app.environment == "prod" then ''
+      services:
+        swiftmailer.mailer.default.transport:
+            class:     Swift_SendmailTransport
+            arguments: ['/run/wrappers/bin/sendmail -bs']
+      '' else ""}
+    '';
+  }];
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${app.varDir}/currentWebappDir" -o \
+          ! -f "${app.varDir}/currentKey" -o \
+          "${app}" != "$(cat ${app.varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${app.varDir}/currentKey; then
+        pushd ${app} > /dev/null
+        /run/wrappers/bin/sudo -u ${apacheUser} ./bin/console --env=${app.environment} cache:clear --no-warmup
+        popd > /dev/null
+        echo -n "${app}" > ${app.varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/${app.environment}-connexionswing > ${app.varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "mysql.service" ];
+    socket = "/var/run/phpfpm/connexionswing-${app.environment}.sock";
+    phpConfig = ''
+      extension=${phpPackages.imagick}/lib/php/extensions/imagick.so
+      '';
+    pool = ''
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "/run/wrappers/bin/sendmail:/var/secrets/webapps/${app.environment}-connexionswing:${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      env[SYMFONY_DEBUG_MODE] = "yes"
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "connexionswing_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    <FilesMatch "\.php$">
+      SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+    </FilesMatch>
+
+    <Directory ${app.varDir}/medias>
+      Options FollowSymLinks
+      AllowOverride None
+      Require all granted
+    </Directory>
+
+    <Directory ${app.varDir}/uploads>
+      Options FollowSymLinks
+      AllowOverride None
+      Require all granted
+    </Directory>
+
+    ${if app.environment == "dev" then ''
+    <Location />
+      Use LDAPConnect
+      Require ldap-group   cn=connexionswing.immae.eu,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://connexionswing.com\"></html>"
+    </Location>
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride None
+      Require all granted
+
+      DirectoryIndex app_dev.php
+
+      <IfModule mod_negotiation.c>
+      Options -MultiViews
+      </IfModule>
+
+      <IfModule mod_rewrite.c>
+        RewriteEngine On
+
+        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+        RewriteRule ^(.*) - [E=BASE:%1]
+
+        # Maintenance script
+        RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
+        RewriteCond %{SCRIPT_FILENAME} !maintenance.php
+        RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
+        ErrorDocument 503 /maintenance.php
+
+        # Sets the HTTP_AUTHORIZATION header removed by Apache
+        RewriteCond %{HTTP:Authorization} .
+        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+        RewriteCond %{ENV:REDIRECT_STATUS} ^$
+        RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+        # If the requested filename exists, simply serve it.
+        # We only want to let Apache serve files and not directories.
+        RewriteCond %{REQUEST_FILENAME} -f
+        RewriteRule ^ - [L]
+
+        # Rewrite all other queries to the front controller.
+        RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
+      </IfModule>
+
+    </Directory>
+    '' else ''
+    Use Stats connexionswing.com
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride All
+      Require all granted
+    </Directory>
+    ''}
+    '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} \
+      ${app.varDir}/medias \
+      ${app.varDir}/uploads \
+      ${app.varDir}/var
+    install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+}
diff --git a/modules/private/websites/connexionswing/integration.nix b/modules/private/websites/connexionswing/integration.nix
new file mode 100644 (file)
index 0000000..1d8488a
--- /dev/null
@@ -0,0 +1,36 @@
+{ lib, pkgs, config,  myconfig, ... }:
+let
+  connexionswing  = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) connexionswing;
+    config = myconfig.env.websites.connexionswing.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.connexionswing.integration;
+in {
+  options.myServices.websites.connexionswing.integration.enable = lib.mkEnableOption "enable Connexionswing's website in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = connexionswing.keys;
+    systemd.services.phpfpm-connexionswing_dev.after = lib.mkAfter connexionswing.phpFpm.serviceDeps;
+    systemd.services.phpfpm-connexionswing_dev.wants = connexionswing.phpFpm.serviceDeps;
+    systemd.services.phpfpm-connexionswing_dev.preStart = lib.mkAfter connexionswing.phpFpm.preStart;
+    services.phpfpm.pools.connexionswing_dev = {
+      listen = connexionswing.phpFpm.socket;
+      extraConfig = connexionswing.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + connexionswing.phpFpm.phpConfig;
+    };
+    system.activationScripts.connexionswing_dev = connexionswing.activationScript;
+    myServices.websites.webappDirs."${connexionswing.apache.webappName}" = connexionswing.app.webRoot;
+    services.websites.integration.modules = connexionswing.apache.modules;
+    services.websites.integration.vhostConfs.connexionswing = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["connexionswing.immae.eu" "sandetludo.immae.eu" ];
+      root        = connexionswing.apache.root;
+      extraConfig = [ connexionswing.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/connexionswing/production.nix b/modules/private/websites/connexionswing/production.nix
new file mode 100644 (file)
index 0000000..555f129
--- /dev/null
@@ -0,0 +1,38 @@
+{ lib, pkgs, config,  myconfig, ... }:
+let
+  connexionswing = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) connexionswing;
+    config = myconfig.env.websites.connexionswing.production;
+    apacheUser = config.services.httpd.Prod.user;
+    apacheGroup = config.services.httpd.Prod.group;
+  };
+
+  cfg = config.myServices.websites.connexionswing.production;
+in {
+  options.myServices.websites.connexionswing.production.enable = lib.mkEnableOption "enable Connexionswing's website in production";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = connexionswing.keys;
+    services.webstats.sites = [ { name = "connexionswing.com"; } ];
+
+    systemd.services.phpfpm-connexionswing_prod.after = lib.mkAfter connexionswing.phpFpm.serviceDeps;
+    systemd.services.phpfpm-connexionswing_prod.wants = connexionswing.phpFpm.serviceDeps;
+    systemd.services.phpfpm-connexionswing_prod.preStart = lib.mkAfter connexionswing.phpFpm.preStart;
+    services.phpfpm.pools.connexionswing_prod = {
+      listen = connexionswing.phpFpm.socket;
+      extraConfig = connexionswing.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + connexionswing.phpFpm.phpConfig;
+    };
+    system.activationScripts.connexionswing_prod = connexionswing.activationScript;
+    myServices.websites.webappDirs."${connexionswing.apache.webappName}" = connexionswing.app.webRoot;
+    services.websites.production.modules = connexionswing.apache.modules;
+    services.websites.production.vhostConfs.connexionswing = {
+      certName     = "connexionswing";
+      certMainHost = "connexionswing.com";
+      hosts        = ["connexionswing.com" "sandetludo.com" "www.connexionswing.com" "www.sandetludo.com" ];
+      root         = connexionswing.apache.root;
+      extraConfig  = [ connexionswing.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/default.nix b/modules/private/websites/default.nix
new file mode 100644 (file)
index 0000000..8b02977
--- /dev/null
@@ -0,0 +1,265 @@
+{ lib, pkgs, config, myconfig, ... }:
+let
+  www_root = "/run/current-system/webapps/_www";
+  theme_root = "/run/current-system/webapps/_theme";
+  apacheConfig = {
+    gzip = {
+      modules = [ "deflate" "filter" ];
+      extraConfig = ''
+        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
+      '';
+    };
+    macros = {
+      modules = [ "macro" ];
+    };
+    stats = {
+      extraConfig = ''
+        <Macro Stats %{domain}>
+          Alias /webstats ${config.services.webstats.dataDir}/%{domain}
+          <Directory ${config.services.webstats.dataDir}/%{domain}>
+            DirectoryIndex index.html
+            AllowOverride None
+            Require all granted
+          </Directory>
+          <Location /webstats>
+            Use LDAPConnect
+            Require ldap-group cn=%{domain},ou=stats,cn=httpd,ou=services,dc=immae,dc=eu
+          </Location>
+        </Macro>
+      '';
+    };
+    ldap = {
+      modules = [ "ldap" "authnz_ldap" ];
+      extraConfig = ''
+        <IfModule ldap_module>
+          LDAPSharedCacheSize 500000
+          LDAPCacheEntries 1024
+          LDAPCacheTTL 600
+          LDAPOpCacheEntries 1024
+          LDAPOpCacheTTL 600
+        </IfModule>
+
+        Include /var/secrets/apache-ldap
+      '';
+    };
+    global = {
+      extraConfig = (pkgs.webapps.apache-default.override { inherit www_root;}).apacheConfig;
+    };
+    apaxy = {
+      extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig;
+    };
+    http2 = {
+      modules = [ "http2" ];
+      extraConfig = ''
+        Protocols h2 http/1.1
+      '';
+    };
+    customLog = {
+      extraConfig = ''
+        LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
+      '';
+    };
+  };
+  makeModules = lib.lists.flatten (lib.attrsets.mapAttrsToList (n: v: v.modules or []) apacheConfig);
+  makeExtraConfig = (builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList (n: v: v.extraConfig or null) apacheConfig));
+in
+{
+  options.myServices.websites.webappDirs = lib.mkOption {
+    type = lib.types.attrsOf lib.types.path;
+    description = ''
+      Webapp paths to create in /run/current-system/webapps
+      '';
+    default = {};
+  };
+
+  config = {
+    users.users.wwwrun.extraGroups = [ "keys" ];
+    networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+    nixpkgs.overlays = [ (self: super: rec {
+      #openssl = self.openssl_1_1;
+      php = php72;
+      php72 = (super.php72.override {
+        mysql.connector-c = self.mariadb;
+        config.php.mysqlnd = false;
+        config.php.mysqli = false;
+      }).overrideAttrs(old: rec {
+        # Didn't manage to build with mysqli + mysql_config connector
+        configureFlags = old.configureFlags ++ [
+          "--with-mysqli=shared,mysqlnd"
+          ];
+        # preConfigure = (old.preConfigure or "") + ''
+        #   export CPPFLAGS="$CPPFLAGS -I${pkgs.mariadb}/include/mysql/server";
+        #   sed -i -e 's/#include "mysqli_priv.h"/#include "mysqli_priv.h"\n#include <mysql_version.h>/' \
+        #     ext/mysqli/mysqli.c ext/mysqli/mysqli_prop.c
+        #   '';
+      });
+      phpPackages = super.php72Packages.override { inherit php; };
+    }) ];
+
+    secrets.keys = [{
+      dest = "apache-ldap";
+      user = "wwwrun";
+      group = "wwwrun";
+      permissions = "0400";
+      text = ''
+        <Macro LDAPConnect>
+          <IfModule authnz_ldap_module>
+            AuthLDAPURL          ldap://ldap.immae.eu:389/dc=immae,dc=eu STARTTLS
+            AuthLDAPBindDN       cn=httpd,ou=services,dc=immae,dc=eu
+            AuthLDAPBindPassword "${myconfig.env.httpd.ldap.password}"
+            AuthType             Basic
+            AuthName             "Authentification requise (Acces LDAP)"
+            AuthBasicProvider    ldap
+          </IfModule>
+        </Macro>
+        '';
+    }];
+
+    system.activationScripts = {
+      httpd = ''
+        install -d -m 0755 ${config.security.acme.directory}/acme-challenge
+        install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
+        '';
+    };
+
+    services.phpfpm = {
+      phpPackage = pkgs.php;
+      phpOptions = ''
+        session.save_path = "/var/lib/php/sessions"
+        post_max_size = 20M
+        ; 15 days (seconds)
+        session.gc_maxlifetime = 1296000
+        ; 30 days (minutes)
+        session.cache_expire = 43200
+        '';
+      extraConfig = ''
+        log_level = notice
+        '';
+    };
+
+    services.websites.production = {
+      enable = true;
+      adminAddr = "httpd@immae.eu";
+      httpdName = "Prod";
+      ips =
+        let ips = myconfig.env.servers.eldiron.ips.production;
+        in [ips.ip4] ++ (ips.ip6 or []);
+      modules = makeModules;
+      extraConfig = makeExtraConfig;
+      fallbackVhost = {
+        certName    = "eldiron";
+        hosts       = ["eldiron.immae.eu" ];
+        root        = www_root;
+        extraConfig = [ "DirectoryIndex index.htm" ];
+      };
+    };
+
+    services.websites.integration = {
+      enable = true;
+      adminAddr = "httpd@immae.eu";
+      httpdName = "Inte";
+      ips =
+        let ips = myconfig.env.servers.eldiron.ips.integration;
+        in [ips.ip4] ++ (ips.ip6 or []);
+      modules = makeModules;
+      extraConfig = makeExtraConfig;
+      fallbackVhost = {
+        certName    = "eldiron";
+        hosts       = ["eldiron.immae.eu" ];
+        root        = www_root;
+        extraConfig = [ "DirectoryIndex index.htm" ];
+      };
+    };
+
+    services.websites.tools = {
+      enable = true;
+      adminAddr = "httpd@immae.eu";
+      httpdName = "Tools";
+      ips =
+        let ips = myconfig.env.servers.eldiron.ips.main;
+        in [ips.ip4] ++ (ips.ip6 or []);
+      modules = makeModules;
+      extraConfig = makeExtraConfig ++
+        [ ''
+            RedirectMatch ^/licen[cs]es?_et_tip(ping)?$ https://www.immae.eu/licences_et_tip.html
+            RedirectMatch ^/licen[cs]es?_and_tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
+            RedirectMatch ^/licen[cs]es?$ https://www.immae.eu/licenses_and_tipping.html
+            RedirectMatch ^/tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
+            RedirectMatch ^/(mentions|mentions_legales|legal)$ https://www.immae.eu/mentions.html
+            RedirectMatch ^/CGU$ https://www.immae.eu/CGU
+          ''
+          ];
+      nosslVhost = {
+        enable = true;
+        host = "nossl.immae.eu";
+      };
+      fallbackVhost = {
+        certName    = "eldiron";
+        hosts       = ["eldiron.immae.eu" ];
+        root        = www_root;
+        extraConfig = [ "DirectoryIndex index.htm" ];
+      };
+    };
+
+    system.extraSystemBuilderCmds = lib.mkIf (builtins.length (builtins.attrValues config.myServices.websites.webappDirs) > 0) ''
+    mkdir -p $out/webapps
+    ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (name: path: "ln -s ${path} $out/webapps/${name}") config.myServices.websites.webappDirs)}
+    '';
+
+    myServices.websites = {
+      webappDirs = {
+        _www = pkgs.webapps.apache-default.www;
+        _theme = pkgs.webapps.apache-theme.theme;
+      };
+
+      aten.integration.enable = true;
+      aten.production.enable = true;
+
+      capitaines.production.enable = true;
+
+      chloe.integration.enable = true;
+      chloe.production.enable = true;
+
+      connexionswing.integration.enable = true;
+      connexionswing.production.enable = true;
+
+      denisejerome.production.enable = true;
+
+      emilia.production.enable = true;
+
+      florian.app.enable = true;
+      florian.integration.enable = true;
+      florian.production.enable = true;
+
+      immae.production.enable = true;
+      immae.release.enable = true;
+      immae.temp.enable = true;
+
+      leila.production.enable = true;
+
+      ludivinecassal.integration.enable = true;
+      ludivinecassal.production.enable = true;
+
+      nassime.production.enable = true;
+
+      naturaloutil.production.enable = true;
+
+      papa.surveillance.enable = true;
+
+      piedsjaloux.integration.enable = true;
+      piedsjaloux.production.enable = true;
+
+      tools.cloud.enable = true;
+      tools.dav.enable = true;
+      tools.db.enable = true;
+      tools.diaspora.enable = true;
+      tools.etherpad-lite.enable = true;
+      tools.git.enable = true;
+      tools.mastodon.enable = true;
+      tools.mediagoblin.enable = true;
+      tools.peertube.enable = true;
+      tools.tools.enable = true;
+    };
+  };
+}
diff --git a/modules/private/websites/denisejerome/production.nix b/modules/private/websites/denisejerome/production.nix
new file mode 100644 (file)
index 0000000..b5aff94
--- /dev/null
@@ -0,0 +1,31 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.denisejerome.production;
+  varDir = "/var/lib/ftp/denisejerome";
+  env = myconfig.env.websites.denisejerome;
+in {
+  options.myServices.websites.denisejerome.production.enable = lib.mkEnableOption "enable Denise Jerome's website";
+
+  config = lib.mkIf cfg.enable {
+    services.webstats.sites = [ { name = "denisejerome.piedsjaloux.fr"; } ];
+
+    services.websites.production.vhostConfs.denisejerome = {
+      certName     = "denisejerome";
+      certMainHost = "denisejerome.piedsjaloux.fr";
+      hosts        = ["denisejerome.piedsjaloux.fr" ];
+      root         = varDir;
+      extraConfig  = [
+        ''
+        Use Stats denisejerome.piedsjaloux.fr
+
+        <Directory ${varDir}>
+          DirectoryIndex index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride AuthConfig
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/emilia/moodle/pause.html b/modules/private/websites/emilia/moodle/pause.html
new file mode 100644 (file)
index 0000000..8b99c59
--- /dev/null
@@ -0,0 +1,48 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Pause</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <style>
+      body {
+        padding-left: 5px;
+        padding-right: 5px;
+        text-align: center;
+        margin: auto;
+        font: 20px Helvetica, sans-serif;
+        color: #333;
+      }
+      h1 {
+        margin: 0px;
+        font-size: 40px;
+      }
+      article {
+        display: block;
+        max-width: 650px;
+        margin: 0 auto;
+        padding-top: 30px;
+      }
+      article + article {
+        border-top: 1px solid lightgrey;
+      }
+      article div {
+        text-align: justify;
+      }
+      a {
+        color: #dc8100;
+        text-decoration: none;
+      }
+      a:hover {
+        color: #333;
+      }
+    </style>
+  </head>
+  <body>
+    <article>
+      <h1>Site web en pause&nbsp;!</h1>
+      <div>
+        <p>Le site et les cours de photographie sont actuellement en pause.</p>
+      </div>
+    </article>
+  </body>
+</html>
diff --git a/modules/private/websites/emilia/production.nix b/modules/private/websites/emilia/production.nix
new file mode 100644 (file)
index 0000000..13f008f
--- /dev/null
@@ -0,0 +1,66 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+    cfg = config.myServices.websites.emilia.production;
+    env = myconfig.env.websites.emilia;
+    varDir = "/var/lib/moodle";
+    siteDir = ./moodle;
+    webappName = "emilia_moodle";
+    root = "/run/current-system/webapps/${webappName}";
+    # php_admin_value[upload_max_filesize] = 50000000
+    # php_admin_value[post_max_size] = 50000000
+    configFile = ''
+      <?php  // Moodle configuration file
+
+      unset($CFG);
+      global $CFG;
+      $CFG = new stdClass();
+
+      $CFG->dbtype    = 'pgsql';
+      $CFG->dblibrary = 'native';
+      $CFG->dbhost    = '${env.postgresql.host}';
+      $CFG->dbname    = '${env.postgresql.database}';
+      $CFG->dbuser    = '${env.postgresql.user}';
+      $CFG->dbpass    = '${env.postgresql.password}';
+      $CFG->prefix    = 'mdl_';
+      $CFG->dboptions = array (
+        'dbpersist' => 0,
+        'dbport' => '${env.postgreesql.port}',
+        'dbsocket' => '${env.postgresql.password}',
+      );
+
+      $CFG->wwwroot   = 'https://www.saison-photo.org';
+      $CFG->dataroot  = '${varDir}';
+      $CFG->admin     = 'admin';
+
+      $CFG->directorypermissions = 02777;
+
+      require_once(__DIR__ . '/lib/setup.php');
+
+      // There is no php closing tag in this file,
+      // it is intentional because it prevents trailing whitespace problems!
+      '';
+in {
+  options.myServices.websites.emilia.production.enable = lib.mkEnableOption "enable Emilia's website";
+
+  config = lib.mkIf cfg.enable {
+    system.activationScripts.emilia = ''
+      install -m 0755 -o wwwrun -g wwwrun -d ${varDir}
+      '';
+    myServices.websites.webappDirs."${webappName}" = siteDir;
+    services.websites.production.vhostConfs.emilia = {
+      certName     = "emilia";
+      certMainHost = "saison-photo.org";
+      hosts        = [ "saison-photo.org" "www.saison-photo.org" ];
+      root         = root;
+      extraConfig  = [
+        ''
+        <Directory ${root}>
+          DirectoryIndex pause.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/florian/app.nix b/modules/private/websites/florian/app.nix
new file mode 100644 (file)
index 0000000..3a6d152
--- /dev/null
@@ -0,0 +1,36 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  adminer = pkgs.callPackage ../commons/adminer.nix {};
+
+  tellesflorian  = pkgs.callPackage ./builder_app.nix {
+    inherit (pkgs.webapps) tellesflorian;
+    config = myconfig.env.websites.tellesflorian.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.florian.app;
+in {
+  options.myServices.websites.florian.app.enable = lib.mkEnableOption "enable Florian's app in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = tellesflorian.keys;
+    systemd.services.phpfpm-tellesflorian_dev.after = lib.mkAfter tellesflorian.phpFpm.serviceDeps;
+    systemd.services.phpfpm-tellesflorian_dev.wants = tellesflorian.phpFpm.serviceDeps;
+    systemd.services.phpfpm-tellesflorian_dev.preStart = lib.mkAfter tellesflorian.phpFpm.preStart;
+    services.phpfpm.poolConfigs.tellesflorian_dev = tellesflorian.phpFpm.pool;
+    system.activationScripts.tellesflorian_dev = tellesflorian.activationScript;
+    myServices.websites.webappDirs."${tellesflorian.apache.webappName}" = tellesflorian.app.webRoot;
+    services.websites.integration.modules = adminer.apache.modules ++ tellesflorian.apache.modules;
+    services.websites.integration.vhostConfs.tellesflorian = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["app.tellesflorian.com" ];
+      root        = tellesflorian.apache.root;
+      extraConfig = [
+        tellesflorian.apache.vhostConf
+        adminer.apache.vhostConf
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/florian/builder_app.nix b/modules/private/websites/florian/builder_app.nix
new file mode 100644 (file)
index 0000000..e521f6e
--- /dev/null
@@ -0,0 +1,152 @@
+{ apacheUser, apacheGroup, tellesflorian, config }:
+rec {
+  app = tellesflorian.override { inherit (config) environment; };
+  keys = [
+    {
+      dest = "webapps/${app.environment}-tellesflorian-passwords";
+      user = apacheUser;
+      group = apacheGroup;
+      permissions = "0400";
+      text = ''
+        invite:${config.invite_passwords}
+      '';
+    }
+    {
+      dest = "webapps/${app.environment}-tellesflorian";
+      user = apacheUser;
+      group = apacheGroup;
+      permissions = "0400";
+      text = ''
+        # This file is auto-generated during the composer install
+        parameters:
+          database_host: ${config.mysql.host}
+          database_port: ${config.mysql.port}
+          database_name: ${config.mysql.name}
+          database_user: ${config.mysql.user}
+          database_password: ${config.mysql.password}
+          mailer_transport: smtp
+          mailer_host: 127.0.0.1
+          mailer_user: null
+          mailer_password: null
+          secret: ${config.secret}
+      '';
+    }
+  ];
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${app.varDir}/currentWebappDir" -o \
+          ! -f "${app.varDir}/currentKey" -o \
+          "${app}" != "$(cat ${app.varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${app.varDir}/currentKey; then
+        pushd ${app} > /dev/null
+        /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=${app.environment} cache:clear --no-warmup
+        popd > /dev/null
+        echo -n "${app}" > ${app.varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/${app.environment}-tellesflorian > ${app.varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "mysql.service" ];
+    socket = "/var/run/phpfpm/floriantelles-${app.environment}.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "/var/secrets/webapps/${app.environment}-tellesflorian:${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      env[SYMFONY_DEBUG_MODE] = "yes"
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "florian_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    <FilesMatch "\.php$">
+      SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+    </FilesMatch>
+
+    ${if app.environment == "dev" then ''
+    <Location />
+      AuthBasicProvider file ldap
+      Use LDAPConnect
+      Require ldap-group   cn=app.tellesflorian.com,cn=httpd,ou=services,dc=immae,dc=eu
+
+      AuthUserFile "/var/secrets/webapps/${app.environment}-tellesflorian-passwords"
+      Require user "invite"
+
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://tellesflorian.com\"></html>"
+    </Location>
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride None
+      Require all granted
+
+      DirectoryIndex app_dev.php
+
+      <IfModule mod_negotiation.c>
+      Options -MultiViews
+      </IfModule>
+
+      <IfModule mod_rewrite.c>
+        RewriteEngine On
+
+        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+        RewriteRule ^(.*) - [E=BASE:%1]
+
+        # Maintenance script
+        RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
+        RewriteCond %{SCRIPT_FILENAME} !maintenance.php
+        RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
+        ErrorDocument 503 /maintenance.php
+
+        # Sets the HTTP_AUTHORIZATION header removed by Apache
+        RewriteCond %{HTTP:Authorization} .
+        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+        RewriteCond %{ENV:REDIRECT_STATUS} ^$
+        RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+        # If the requested filename exists, simply serve it.
+        # We only want to let Apache serve files and not directories.
+        RewriteCond %{REQUEST_FILENAME} -f
+        RewriteRule ^ - [L]
+
+        # Rewrite all other queries to the front controller.
+        RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
+      </IfModule>
+
+    </Directory>
+    '' else ''
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride All
+      Require all granted
+    </Directory>
+    ''}
+    '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} \
+      ${app.varDir}/var
+    install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+}
diff --git a/modules/private/websites/florian/integration.nix b/modules/private/websites/florian/integration.nix
new file mode 100644 (file)
index 0000000..424ebd4
--- /dev/null
@@ -0,0 +1,34 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+    adminer = pkgs.callPackage ../commons/adminer.nix {};
+    cfg = config.myServices.websites.florian.integration;
+    varDir = "/var/lib/ftp/florian";
+    env = myconfig.env.websites.florian;
+in {
+  options.myServices.websites.florian.integration.enable = lib.mkEnableOption "enable Florian's website integration";
+
+  config = lib.mkIf cfg.enable {
+    security.acme.certs."ftp".extraDomains."florian.immae.eu" = null;
+
+    services.websites.integration.modules = adminer.apache.modules;
+    services.websites.integration.vhostConfs.florian = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "florian.immae.eu" ];
+      root        = "${varDir}/florian.immae.eu";
+      extraConfig = [
+        adminer.apache.vhostConf
+        ''
+        ServerAdmin ${env.server_admin}
+
+        <Directory ${varDir}/florian.immae.eu>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/florian/production.nix b/modules/private/websites/florian/production.nix
new file mode 100644 (file)
index 0000000..9b310b8
--- /dev/null
@@ -0,0 +1,34 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+    adminer = pkgs.callPackage ../commons/adminer.nix {};
+    cfg = config.myServices.websites.florian.production;
+    varDir = "/var/lib/ftp/florian";
+    env = myconfig.env.websites.florian;
+in {
+  options.myServices.websites.florian.production.enable = lib.mkEnableOption "enable Florian's website production";
+
+  config = lib.mkIf cfg.enable {
+    security.acme.certs."ftp".extraDomains."tellesflorian.com" = null;
+
+    services.websites.production.modules = adminer.apache.modules;
+    services.websites.production.vhostConfs.florian = {
+      certName     = "florian";
+      certMainHost = "tellesflorian.com";
+      hosts        = [ "tellesflorian.com" "www.tellesflorian.com" ];
+      root         = "${varDir}/tellesflorian.com";
+      extraConfig  = [
+        adminer.apache.vhostConf
+        ''
+        ServerAdmin ${env.server_admin}
+
+        <Directory ${varDir}/tellesflorian.com>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/immae/production.nix b/modules/private/websites/immae/production.nix
new file mode 100644 (file)
index 0000000..c3cabb6
--- /dev/null
@@ -0,0 +1,64 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.immae.production;
+  varDir = "/var/lib/ftp/immae";
+  env = myconfig.env.websites.immae;
+in {
+  options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website";
+
+  config = lib.mkIf cfg.enable {
+    services.webstats.sites = [ { name = "www.immae.eu"; } ];
+
+    services.phpfpm.poolConfigs.immae = ''
+      listen = /run/phpfpm/immae.sock
+      user = wwwrun
+      group = wwwrun
+      listen.owner = wwwrun
+      listen.group = wwwrun
+
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+
+      php_admin_value[open_basedir] = "${varDir}:/tmp"
+      '';
+    services.websites.production.modules = [ "proxy_fcgi" ];
+    services.websites.production.vhostConfs.immae = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "www.immae.eu" ];
+      root        = varDir;
+      extraConfig = [
+        ''
+        Use Stats www.immae.eu
+
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:/run/phpfpm/immae.sock|fcgi://localhost"
+        </FilesMatch>
+
+        <Directory ${varDir}>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride All
+          Require all granted
+        </Directory>
+
+        <Location /blog_old/>
+          Use LDAPConnect
+          Require ldap-group cn=blog,cn=immae.eu,ou=services,dc=immae,dc=eu
+        </Location>
+        ''
+      ];
+    };
+
+    services.websites.production.vhostConfs.bouya = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "bouya.org" "www.bouya.org" ];
+      root        = null;
+      extraConfig = [ ''
+        RedirectMatch 301 ^/((?!\.well-known.*$).*)$ https://www.normalesup.org/~bouya/
+        '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/immae/release.nix b/modules/private/websites/immae/release.nix
new file mode 100644 (file)
index 0000000..68381a6
--- /dev/null
@@ -0,0 +1,39 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.immae.release;
+  varDir = "/var/lib/ftp/release.immae.eu";
+  env = myconfig.env.websites.release;
+in {
+  options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website";
+
+  config = lib.mkIf cfg.enable {
+    services.webstats.sites = [ { name = "release.immae.eu"; } ];
+
+    services.websites.production.vhostConfs.release = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "release.immae.eu" ];
+      root        = varDir;
+      extraConfig = [
+        ''
+        Use Stats release.immae.eu
+
+        Use Apaxy "${varDir}" "title .duplicity-ignore"
+        <Directory "${varDir}">
+          Use LDAPConnect
+          Options Indexes
+          AllowOverride All
+          Require all granted
+        </Directory>
+
+        <Directory "${varDir}/packages">
+          Use LDAPConnect
+          Options Indexes FollowSymlinks
+          AllowOverride None
+          Require all granted
+        </Directory>
+        ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/immae/temp.nix b/modules/private/websites/immae/temp.nix
new file mode 100644 (file)
index 0000000..0b2a3a3
--- /dev/null
@@ -0,0 +1,36 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.immae.temp;
+  varDir = "/var/lib/ftp/temp.immae.eu";
+  env = myconfig.env.websites.temp;
+in {
+  options.myServices.websites.immae.temp.enable = lib.mkEnableOption "enable Temp' website";
+
+  config = lib.mkIf cfg.enable {
+    services.websites.production.modules = [ "headers" ];
+    services.websites.production.vhostConfs.temp = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "temp.immae.eu" ];
+      root        = varDir;
+      extraConfig = [
+        ''
+        Use Apaxy "${varDir}" "title .duplicity-ignore"
+        <FilesMatch ".+">
+          Header set Content-Disposition attachment
+        </FilesMatch>
+        <Directory "${varDir}">
+          Options -Indexes
+          AllowOverride None
+          Require all granted
+        </Directory>
+
+        <DirectoryMatch "${varDir}/(.+)">
+          Options Indexes
+        </DirectoryMatch>
+        ''
+      ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/leila/production.nix b/modules/private/websites/leila/production.nix
new file mode 100644 (file)
index 0000000..69c8c49
--- /dev/null
@@ -0,0 +1,82 @@
+{ lib, pkgs, config, ... }:
+let
+  cfg = config.myServices.websites.leila.production;
+  varDir = "/var/lib/ftp/leila";
+in {
+  options.myServices.websites.leila.production.enable = lib.mkEnableOption "enable Leila's website in production";
+
+  config = lib.mkIf cfg.enable {
+    services.phpfpm.poolConfigs.leila = ''
+      listen = /run/phpfpm/leila.sock
+      user = wwwrun
+      group = wwwrun
+      listen.owner = wwwrun
+      listen.group = wwwrun
+
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+
+      php_admin_value[open_basedir] = "${varDir}:/tmp"
+      '';
+
+    services.webstats.sites = [
+      { name = "leila.bouya.org"; }
+      { name = "chorale.leila.bouya.org"; }
+    ];
+
+    services.websites.production.modules = [ "proxy_fcgi" ];
+    services.websites.production.vhostConfs.leila_chorale = {
+      certName    = "leila";
+      addToCerts  = true;
+      hosts       = [ "chorale.leila.bouya.org" "chorale-vocanta.fr.nf" "www.chorale-vocanta.fr.nf" ];
+      root        = "${varDir}/Chorale";
+      extraConfig = [
+        ''
+        Use Stats chorale.leila.bouya.org
+        <Directory ${varDir}/Chorale>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+
+          Use LDAPConnect
+          Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
+
+          <FilesMatch "\.php$">
+            SetHandler "proxy:unix:/run/phpfpm/leila.sock|fcgi://localhost"
+          </FilesMatch>
+        </Directory>
+          ''
+      ];
+    };
+    services.websites.production.vhostConfs.leila = {
+      certName     = "leila";
+      certMainHost = "leila.bouya.org";
+      hosts        = [ "leila.bouya.org" ];
+      root         = varDir;
+      extraConfig  = [
+        ''
+        Use Stats leila.bouya.org
+        <Directory ${varDir}/Chorale>
+          DirectoryIndex index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+
+          Use LDAPConnect
+          Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
+
+          <FilesMatch "\.php$">
+            SetHandler "proxy:unix:/run/phpfpm/leila.sock|fcgi://localhost"
+          </FilesMatch>
+        </Directory>
+        <Directory ${varDir}>
+          DirectoryIndex index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/ludivinecassal/builder.nix b/modules/private/websites/ludivinecassal/builder.nix
new file mode 100644 (file)
index 0000000..3167bce
--- /dev/null
@@ -0,0 +1,155 @@
+{ apacheUser, apacheGroup, config, ludivinecassal, pkgs, ruby, sass, imagemagick }:
+rec {
+  app = ludivinecassal.override { inherit (config) environment; };
+  varDir = "/var/lib/ludivinecassal_${app.environment}";
+  keys = [{
+    dest = "webapps/${app.environment}-ludivinecassal";
+    user = apacheUser;
+    group = apacheGroup;
+    permissions = "0400";
+    text = ''
+      # This file is auto-generated during the composer install
+      parameters:
+          database_host: ${config.mysql.host}
+          database_port: ${config.mysql.port}
+          database_name: ${config.mysql.name}
+          database_user: ${config.mysql.user}
+          database_password: ${config.mysql.password}
+          database_server_version: ${pkgs.mariadb.mysqlVersion}
+          mailer_transport: smtp
+          mailer_host: 127.0.0.1
+          mailer_user: null
+          mailer_password: null
+          secret: ${config.secret}
+          ldap_host: ldap.immae.eu
+          ldap_port: 636
+          ldap_version: 3
+          ldap_ssl: true
+          ldap_tls: false
+          ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu'
+          ldap_base_dn: 'dc=immae,dc=eu'
+          ldap_search_dn: '${config.ldap.dn}'
+          ldap_search_password: '${config.ldap.password}'
+          ldap_search_filter: '${config.ldap.search}'
+      leapt_im:
+          binary_path: ${imagemagick}/bin
+      assetic:
+          sass: ${sass}/bin/sass
+          ruby: ${ruby}/bin/ruby
+    '';
+  }];
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${app.varDir}/currentWebappDir" -o \
+          ! -f "${app.varDir}/currentKey" -o \
+          "${app}" != "$(cat ${app.varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${app.varDir}/currentKey; then
+        pushd ${app} > /dev/null
+        /run/wrappers/bin/sudo -u ${apacheUser} ./bin/console --env=${app.environment} cache:clear --no-warmup
+        popd > /dev/null
+        echo -n "${app}" > ${app.varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/${app.environment}-ludivinecassal > ${app.varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "mysql.service" ];
+    socket = "/var/run/phpfpm/ludivinecassal-${app.environment}.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "/var/secrets/webapps/${app.environment}-ludivinecassal:${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      env[SYMFONY_DEBUG_MODE] = "yes"
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "ludivine_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    <FilesMatch "\.php$">
+      SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+    </FilesMatch>
+
+    ${if app.environment == "dev" then ''
+    <Location />
+      Use LDAPConnect
+      Require ldap-group   cn=ludivine.immae.eu,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://ludivinecassal.com\"></html>"
+    </Location>
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride None
+      Require all granted
+
+      DirectoryIndex app_dev.php
+
+      <IfModule mod_negotiation.c>
+      Options -MultiViews
+      </IfModule>
+
+      <IfModule mod_rewrite.c>
+        RewriteEngine On
+
+        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+        RewriteRule ^(.*) - [E=BASE:%1]
+
+        # Maintenance script
+        RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
+        RewriteCond %{SCRIPT_FILENAME} !maintenance.php
+        RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
+        ErrorDocument 503 /maintenance.php
+
+        # Sets the HTTP_AUTHORIZATION header removed by Apache
+        RewriteCond %{HTTP:Authorization} .
+        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+        RewriteCond %{ENV:REDIRECT_STATUS} ^$
+        RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+        # If the requested filename exists, simply serve it.
+        # We only want to let Apache serve files and not directories.
+        RewriteCond %{REQUEST_FILENAME} -f
+        RewriteRule ^ - [L]
+
+        # Rewrite all other queries to the front controller.
+        RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
+      </IfModule>
+
+    </Directory>
+    '' else ''
+    Use Stats ludivinecassal.com
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride All
+      Require all granted
+    </Directory>
+    ''}
+    '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/tmp
+    install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+}
diff --git a/modules/private/websites/ludivinecassal/integration.nix b/modules/private/websites/ludivinecassal/integration.nix
new file mode 100644 (file)
index 0000000..ed0dc9f
--- /dev/null
@@ -0,0 +1,32 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  ludivinecassal  = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) ludivinecassal;
+    config = myconfig.env.websites.ludivinecassal.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.ludivinecassal.integration;
+in {
+  options.myServices.websites.ludivinecassal.integration.enable = lib.mkEnableOption "enable Ludivine's website in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = ludivinecassal.keys;
+
+    systemd.services.phpfpm-ludivinecassal_dev.after = lib.mkAfter ludivinecassal.phpFpm.serviceDeps;
+    systemd.services.phpfpm-ludivinecassal_dev.wants = ludivinecassal.phpFpm.serviceDeps;
+    systemd.services.phpfpm-ludivinecassal_dev.preStart = lib.mkAfter ludivinecassal.phpFpm.preStart;
+    services.phpfpm.poolConfigs.ludivinecassal_dev = ludivinecassal.phpFpm.pool;
+    system.activationScripts.ludivinecassal_dev = ludivinecassal.activationScript;
+    myServices.websites.webappDirs."${ludivinecassal.apache.webappName}" = ludivinecassal.app.webRoot;
+    services.websites.integration.modules = ludivinecassal.apache.modules;
+    services.websites.integration.vhostConfs.ludivine = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "ludivine.immae.eu" ];
+      root        = ludivinecassal.apache.root;
+      extraConfig = [ ludivinecassal.apache.vhostConf ];
+    };
+  };
+}
diff --git a/modules/private/websites/ludivinecassal/production.nix b/modules/private/websites/ludivinecassal/production.nix
new file mode 100644 (file)
index 0000000..3df5613
--- /dev/null
@@ -0,0 +1,33 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  ludivinecassal = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) ludivinecassal;
+    config = myconfig.env.websites.ludivinecassal.production;
+    apacheUser = config.services.httpd.Prod.user;
+    apacheGroup = config.services.httpd.Prod.group;
+  };
+
+  cfg = config.myServices.websites.ludivinecassal.production;
+in {
+  options.myServices.websites.ludivinecassal.production.enable = lib.mkEnableOption "enable Ludivine's website in production";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = ludivinecassal.keys;
+    services.webstats.sites = [ { name = "ludivinecassal.com"; } ];
+
+    systemd.services.phpfpm-ludivinecassal_prod.after = lib.mkAfter ludivinecassal.phpFpm.serviceDeps;
+    systemd.services.phpfpm-ludivinecassal_prod.wants = ludivinecassal.phpFpm.serviceDeps;
+    systemd.services.phpfpm-ludivinecassal_prod.preStart = lib.mkAfter ludivinecassal.phpFpm.preStart;
+    services.phpfpm.poolConfigs.ludivinecassal_prod = ludivinecassal.phpFpm.pool;
+    system.activationScripts.ludivinecassal_prod = ludivinecassal.activationScript;
+    myServices.websites.webappDirs."${ludivinecassal.apache.webappName}" = ludivinecassal.app.webRoot;
+    services.websites.production.modules = ludivinecassal.apache.modules;
+    services.websites.production.vhostConfs.ludivine = {
+      certName     = "ludivinecassal";
+      certMainHost = "ludivinecassal.com";
+      hosts        = ["ludivinecassal.com" "www.ludivinecassal.com" ];
+      root         = ludivinecassal.apache.root;
+      extraConfig  = [ ludivinecassal.apache.vhostConf ];
+    };
+  };
+}
diff --git a/modules/private/websites/nassime/production.nix b/modules/private/websites/nassime/production.nix
new file mode 100644 (file)
index 0000000..a109778
--- /dev/null
@@ -0,0 +1,34 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.nassime.production;
+  varDir = "/var/lib/ftp/nassime";
+  env = myconfig.env.websites.nassime;
+in {
+  options.myServices.websites.nassime.production.enable = lib.mkEnableOption "enable Nassime's website";
+
+  config = lib.mkIf cfg.enable {
+    services.webstats.sites = [ { name = "nassime.bouya.org"; } ];
+
+    security.acme.certs."ftp".extraDomains."nassime.bouya.org" = null;
+
+    services.websites.production.vhostConfs.nassime = {
+      certName     = "nassime";
+      certMainHost = "nassime.bouya.org";
+      hosts        = ["nassime.bouya.org" ];
+      root         = varDir;
+      extraConfig  = [
+        ''
+        Use Stats nassime.bouya.org
+        ServerAdmin ${env.server_admin}
+
+        <Directory ${varDir}>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/naturaloutil/production.nix b/modules/private/websites/naturaloutil/production.nix
new file mode 100644 (file)
index 0000000..f59957d
--- /dev/null
@@ -0,0 +1,96 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  adminer = pkgs.callPackage ../commons/adminer.nix {};
+  cfg = config.myServices.websites.naturaloutil.production;
+  varDir = "/var/lib/ftp/jerome";
+  env = myconfig.env.websites.jerome;
+in {
+  options.myServices.websites.naturaloutil.production.enable = lib.mkEnableOption "enable Naturaloutil's website";
+
+  config = lib.mkIf cfg.enable {
+    services.webstats.sites = [ { name = "naturaloutil.immae.eu"; } ];
+
+    security.acme.certs."ftp".extraDomains."naturaloutil.immae.eu" = null;
+
+    secrets.keys = [{
+      dest = "webapps/prod-naturaloutil";
+      user = "wwwrun";
+      group = "wwwrun";
+      permissions = "0400";
+      text = ''
+        <?php
+        $mysql_user = '${env.mysql.user}' ;
+        $mysql_server = '${env.mysql.host}' ;
+        $mysql_base = '${env.mysql.name}' ;
+        $mysql_password = '${env.mysql.password}' ;
+        //connect to db
+        $db = mysqli_init();
+        ${if env.mysql.host != "localhost" then ''
+        mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
+        $db->ssl_set(NULL, NULL, "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt", NULL, NULL);
+        '' else ""}
+        $database = connect_db($db, $mysql_server, $mysql_base, $mysql_user, $mysql_password);
+        ?>
+      '';
+    }];
+    system.activationScripts.naturaloutil = {
+      deps = [ "httpd" ];
+      text = ''
+        install -m 0755 -o wwwrun -g wwwrun -d /var/lib/php/sessions/naturaloutil
+        '';
+    };
+    systemd.services.phpfpm-jerome.after = lib.mkAfter [ "mysql.service" ];
+    systemd.services.phpfpm-jerome.wants = [ "mysql.service" ];
+    services.phpfpm.pools.jerome = {
+      listen = "/run/phpfpm/naturaloutil.sock";
+      extraConfig = ''
+        user = wwwrun
+        group = wwwrun
+        listen.owner = wwwrun
+        listen.group = wwwrun
+
+        pm = ondemand
+        pm.max_children = 5
+        pm.process_idle_timeout = 60
+
+        env[BDD_CONNECT] = "/var/secrets/webapps/prod-naturaloutil"
+        php_admin_value[open_basedir] = "/var/lib/php/sessions/naturaloutil:/var/secrets/webapps/prod-naturaloutil:${varDir}:/tmp"
+        php_admin_value[session.save_path] = "/var/lib/php/sessions/naturaloutil"
+        '';
+      phpOptions = config.services.phpfpm.phpOptions + ''
+        extension=${pkgs.php}/lib/php/extensions/mysqli.so
+        '';
+    };
+    services.websites.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ];
+    services.websites.production.vhostConfs.naturaloutil = {
+      certName     = "naturaloutil";
+      certMainHost = "naturaloutil.immae.eu";
+      hosts        = ["naturaloutil.immae.eu" ];
+      root         = varDir;
+      extraConfig  = [
+        adminer.apache.vhostConf
+        ''
+        Use Stats naturaloutil.immae.eu
+        ServerAdmin ${env.server_admin}
+        ErrorLog "${varDir}/logs/error_log"
+        CustomLog "${varDir}/logs/access_log" combined
+
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:/run/phpfpm/naturaloutil.sock|fcgi://localhost"
+        </FilesMatch>
+
+        <Directory ${varDir}/logs>
+          AllowOverride None
+          Require all denied
+        </Directory>
+        <Directory ${varDir}>
+          DirectoryIndex index.php index.htm index.html
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride None
+          Require all granted
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/papa/surveillance.nix b/modules/private/websites/papa/surveillance.nix
new file mode 100644 (file)
index 0000000..8e7cd9d
--- /dev/null
@@ -0,0 +1,49 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  cfg = config.myServices.websites.papa.surveillance;
+  varDir = "/var/lib/ftp/papa";
+in {
+  options.myServices.websites.papa.surveillance.enable = lib.mkEnableOption "enable Papa surveillance's website";
+
+  config = lib.mkIf cfg.enable {
+    security.acme.certs."ftp".extraDomains."surveillance.maison.bbc.bouya.org" = null;
+
+    services.cron = {
+      systemCronJobs = let
+        script = pkgs.writeScript "cleanup-papa" ''
+          #!${pkgs.stdenv.shell}
+          d=$(date -d "7 days ago" +%Y%m%d)
+          for i in /var/lib/ftp/papa/*/20[0-9][0-9][0-9][0-9][0-9][0-9]; do
+            if [ "$d" -gt $(basename $i) ]; then
+              rm -rf "$i"
+            fi
+          done
+          '';
+      in
+        [
+        ''
+          0 6 * * * wwwrun ${script}
+        ''
+      ];
+    };
+
+    services.websites.production.vhostConfs.papa = {
+      certName     = "papa";
+      certMainHost = "surveillance.maison.bbc.bouya.org";
+      hosts        = [ "surveillance.maison.bbc.bouya.org" ];
+      root         = varDir;
+      extraConfig  = [
+        ''
+        Use Apaxy "${varDir}" "title .duplicity-ignore"
+        <Directory ${varDir}>
+          Use LDAPConnect
+          Options Indexes
+          AllowOverride None
+          Require ldap-group   cn=surveillance.maison.bbc.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
+        </Directory>
+          ''
+      ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/piedsjaloux/builder.nix b/modules/private/websites/piedsjaloux/builder.nix
new file mode 100644 (file)
index 0000000..9fcc8fb
--- /dev/null
@@ -0,0 +1,144 @@
+{ apacheUser, apacheGroup, piedsjaloux, config, pkgs, lib, texlive, imagemagick }:
+rec {
+  app = piedsjaloux.override { inherit (config) environment; };
+  varDir = "/var/lib/piedsjaloux_${app.environment}";
+  keys = [{
+    dest = "webapps/${app.environment}-piedsjaloux";
+    user = apacheUser;
+    group = apacheGroup;
+    permissions = "0400";
+    text = ''
+      # This file is auto-generated during the composer install
+      parameters:
+          database_host: ${config.mysql.host}
+          database_port: ${config.mysql.port}
+          database_name: ${config.mysql.name}
+          database_user: ${config.mysql.user}
+          database_password: ${config.mysql.password}
+          database_server_version: ${pkgs.mariadb.mysqlVersion}
+          mailer_transport: smtp
+          mailer_host: 127.0.0.1
+          mailer_user: null
+          mailer_password: null
+          secret: ${config.secret}
+          pdflatex: "${texlive.combine { inherit (texlive) attachfile preprint scheme-small; }}/bin/pdflatex"
+      leapt_im:
+          binary_path: ${imagemagick}/bin
+    '';
+  }];
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${app.varDir}/currentWebappDir" -o \
+          ! -f "${app.varDir}/currentKey" -o \
+          "${app}" != "$(cat ${app.varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${app.varDir}/currentKey; then
+        pushd ${app} > /dev/null
+        /run/wrappers/bin/sudo -u ${apacheUser} ./bin/console --env=${app.environment} cache:clear --no-warmup
+        popd > /dev/null
+        echo -n "${app}" > ${app.varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/${app.environment}-piedsjaloux > ${app.varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "mysql.service" ];
+    socket = "/var/run/phpfpm/piedsjaloux-${app.environment}.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apacheUser}
+      group = ${apacheGroup}
+      listen.owner = ${apacheUser}
+      listen.group = ${apacheGroup}
+      php_admin_value[upload_max_filesize] = 20M
+      php_admin_value[post_max_size] = 20M
+      ;php_admin_flag[log_errors] = on
+      php_admin_value[open_basedir] = "/var/secrets/webapps/${app.environment}-piedsjaloux:${app}:${app.varDir}:/tmp"
+      php_admin_value[session.save_path] = "${app.varDir}/phpSessions"
+      env[PATH] = ${lib.makeBinPath [ pkgs.apg pkgs.unzip ]}
+      ${if app.environment == "dev" then ''
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      env[SYMFONY_DEBUG_MODE] = "yes"
+      '' else ''
+      pm = dynamic
+      pm.max_children = 20
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 3
+      ''}'';
+  };
+  apache = rec {
+    modules = [ "proxy_fcgi" ];
+    webappName = "piedsjaloux_${app.environment}";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    <FilesMatch "\.php$">
+      SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+    </FilesMatch>
+
+    ${if app.environment == "dev" then ''
+    <Location />
+      Use LDAPConnect
+      Require ldap-group   cn=piedsjaloux.immae.eu,cn=httpd,ou=services,dc=immae,dc=eu
+      ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://piedsjaloux.fr\"></html>"
+    </Location>
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride None
+      Require all granted
+
+      DirectoryIndex app_dev.php
+
+      <IfModule mod_negotiation.c>
+      Options -MultiViews
+      </IfModule>
+
+      <IfModule mod_rewrite.c>
+        RewriteEngine On
+
+        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+        RewriteRule ^(.*) - [E=BASE:%1]
+
+        # Maintenance script
+        RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
+        RewriteCond %{SCRIPT_FILENAME} !maintenance.php
+        RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
+        ErrorDocument 503 /maintenance.php
+
+        # Sets the HTTP_AUTHORIZATION header removed by Apache
+        RewriteCond %{HTTP:Authorization} .
+        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+        RewriteCond %{ENV:REDIRECT_STATUS} ^$
+        RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+        # If the requested filename exists, simply serve it.
+        # We only want to let Apache serve files and not directories.
+        RewriteCond %{REQUEST_FILENAME} -f
+        RewriteRule ^ - [L]
+
+        # Rewrite all other queries to the front controller.
+        RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
+      </IfModule>
+
+    </Directory>
+    '' else ''
+    Use Stats piedsjaloux.fr
+
+    <Directory ${root}>
+      Options Indexes FollowSymLinks MultiViews Includes
+      AllowOverride All
+      Require all granted
+    </Directory>
+    ''}
+    '';
+  };
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+    install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} \
+      ${app.varDir}/tmp
+    install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
+    '';
+  };
+}
diff --git a/modules/private/websites/piedsjaloux/integration.nix b/modules/private/websites/piedsjaloux/integration.nix
new file mode 100644 (file)
index 0000000..5f574e1
--- /dev/null
@@ -0,0 +1,32 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  piedsjaloux  = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) piedsjaloux;
+    config = myconfig.env.websites.piedsjaloux.integration;
+    apacheUser = config.services.httpd.Inte.user;
+    apacheGroup = config.services.httpd.Inte.group;
+  };
+
+  cfg = config.myServices.websites.piedsjaloux.integration;
+in {
+  options.myServices.websites.piedsjaloux.integration.enable = lib.mkEnableOption "enable PiedsJaloux's website in integration";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = piedsjaloux.keys;
+    systemd.services.phpfpm-piedsjaloux_dev.after = lib.mkAfter piedsjaloux.phpFpm.serviceDeps;
+    systemd.services.phpfpm-piedsjaloux_dev.wants = piedsjaloux.phpFpm.serviceDeps;
+    systemd.services.phpfpm-piedsjaloux_dev.preStart = lib.mkAfter piedsjaloux.phpFpm.preStart;
+    services.phpfpm.poolConfigs.piedsjaloux_dev = piedsjaloux.phpFpm.pool;
+    system.activationScripts.piedsjaloux_dev = piedsjaloux.activationScript;
+    myServices.websites.webappDirs."${piedsjaloux.apache.webappName}" = piedsjaloux.app.webRoot;
+    services.websites.integration.modules = piedsjaloux.apache.modules;
+    services.websites.integration.vhostConfs.piedsjaloux = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "piedsjaloux.immae.eu" ];
+      root        = piedsjaloux.apache.root;
+      extraConfig = [ piedsjaloux.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/piedsjaloux/production.nix b/modules/private/websites/piedsjaloux/production.nix
new file mode 100644 (file)
index 0000000..e3bd2dd
--- /dev/null
@@ -0,0 +1,34 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  piedsjaloux = pkgs.callPackage ./builder.nix {
+    inherit (pkgs.webapps) piedsjaloux;
+    config = myconfig.env.websites.piedsjaloux.production;
+    apacheUser = config.services.httpd.Prod.user;
+    apacheGroup = config.services.httpd.Prod.group;
+  };
+
+  cfg = config.myServices.websites.piedsjaloux.production;
+in {
+  options.myServices.websites.piedsjaloux.production.enable = lib.mkEnableOption "enable PiedsJaloux's website in production";
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = piedsjaloux.keys;
+    services.webstats.sites = [ { name = "piedsjaloux.fr"; } ];
+
+    systemd.services.phpfpm-piedsjaloux_prod.after = lib.mkAfter piedsjaloux.phpFpm.serviceDeps;
+    systemd.services.phpfpm-piedsjaloux_prod.wants = piedsjaloux.phpFpm.serviceDeps;
+    systemd.services.phpfpm-piedsjaloux_prod.preStart = lib.mkAfter piedsjaloux.phpFpm.preStart;
+    services.phpfpm.poolConfigs.piedsjaloux_prod = piedsjaloux.phpFpm.pool;
+    system.activationScripts.piedsjaloux_prod = piedsjaloux.activationScript;
+    myServices.websites.webappDirs."${piedsjaloux.apache.webappName}" = piedsjaloux.app.webRoot;
+    services.websites.production.modules = piedsjaloux.apache.modules;
+    services.websites.production.vhostConfs.piedsjaloux = {
+      certName     = "piedsjaloux";
+      certMainHost = "piedsjaloux.fr";
+      hosts        = [ "piedsjaloux.fr" "www.piedsjaloux.fr" ];
+      root         = piedsjaloux.apache.root;
+      extraConfig  = [ piedsjaloux.apache.vhostConf ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/tools/cloud/default.nix b/modules/private/websites/tools/cloud/default.nix
new file mode 100644 (file)
index 0000000..ceb8f77
--- /dev/null
@@ -0,0 +1,188 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  nextcloud = pkgs.webapps.nextcloud.withApps (builtins.attrValues pkgs.webapps.nextcloud-apps);
+  env = myconfig.env.tools.nextcloud;
+  varDir = "/var/lib/nextcloud";
+  webappName = "tools_nextcloud";
+  apacheRoot = "/run/current-system/webapps/${webappName}";
+  cfg = config.myServices.websites.tools.cloud;
+  phpFpm = rec {
+    basedir = builtins.concatStringsSep ":" (
+      [ nextcloud varDir ]
+      ++ builtins.attrValues pkgs.webapps.nextcloud-apps);
+    socket = "/var/run/phpfpm/nextcloud.sock";
+    phpConfig = ''
+      extension=${pkgs.phpPackages.redis}/lib/php/extensions/redis.so
+      extension=${pkgs.phpPackages.apcu}/lib/php/extensions/apcu.so
+      zend_extension=${pkgs.php}/lib/php/extensions/opcache.so
+      '';
+    pool = ''
+      user = wwwrun
+      group = wwwrun
+      listen.owner = wwwrun
+      listen.group = wwwrun
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      php_admin_value[output_buffering] = 0
+      php_admin_value[max_execution_time] = 1800
+      php_admin_value[zend_extension] = "opcache"
+      ;already enabled by default?
+      ;php_value[opcache.enable] = 1
+      php_value[opcache.enable_cli] = 1
+      php_value[opcache.interned_strings_buffer] = 8
+      php_value[opcache.max_accelerated_files] = 10000
+      php_value[opcache.memory_consumption] = 128
+      php_value[opcache.save_comments] = 1
+      php_value[opcache.revalidate_freq] = 1
+      php_admin_value[memory_limit] = 512M
+
+      php_admin_value[open_basedir] = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+in {
+  options.myServices.websites.tools.cloud = {
+    enable = lib.mkEnableOption "enable cloud website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.websites.tools.modules = [ "proxy_fcgi" ];
+
+    services.websites.tools.vhostConfs.cloud = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["cloud.immae.eu" ];
+      root        = apacheRoot;
+      extraConfig = [
+        ''
+          SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
+          <Directory ${apacheRoot}>
+            AcceptPathInfo On
+            DirectoryIndex index.php
+            Options FollowSymlinks
+            Require all granted
+            AllowOverride all
+
+            <IfModule mod_headers.c>
+              Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
+            </IfModule>
+            <FilesMatch "\.php$">
+              CGIPassAuth on
+              SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+            </FilesMatch>
+
+          </Directory>
+        ''
+      ];
+    };
+
+    secrets.keys = [{
+      dest = "webapps/tools-nextcloud";
+      user = "wwwrun";
+      group = "wwwrun";
+      permissions = "0600";
+      text = ''
+        <?php
+        $CONFIG = array (
+          // FIXME: change this value when nextcloud starts getting slow
+          'instanceid' => '${env.instance_id}1',
+          'datadirectory' => '/var/lib/nextcloud/',
+          'passwordsalt' => '${env.password_salt}',
+          'debug' => false,
+          'dbtype' => 'pgsql',
+          'version' => '16.0.0.9',
+          'dbname' => '${env.postgresql.database}',
+          'dbhost' => '${env.postgresql.socket}',
+          'dbtableprefix' => 'oc_',
+          'dbuser' => '${env.postgresql.user}',
+          'dbpassword' => '${env.postgresql.password}',
+          'installed' => true,
+          'maxZipInputSize' => 0,
+          'allowZipDownload' => true,
+          'forcessl' => true,
+          'theme' => ${"''"},
+          'maintenance' => false,
+          'trusted_domains' => 
+          array (
+            0 => 'cloud.immae.eu',
+          ),
+          'secret' => '${env.secret}',
+          'appstoreenabled' => false,
+          'appstore.experimental.enabled' => true,
+          'loglevel' => 2,
+          'trashbin_retention_obligation' => 'auto',
+          'htaccess.RewriteBase' => '/',
+          'mail_smtpmode' => 'sendmail',
+          'mail_smtphost' => '127.0.0.1',
+          'mail_smtpname' => ''',
+          'mail_smtppassword' => ''',
+          'mail_from_address' => 'nextcloud',
+          'mail_smtpauth' => false,
+          'mail_domain' => 'tools.immae.eu',
+          'memcache.local' => '\\OC\\Memcache\\APCu',
+          'memcache.locking' => '\\OC\\Memcache\\Redis',
+          'filelocking.enabled' => true,
+          'redis' => 
+          array (
+            'host' => '${env.redis.socket}',
+            'port' => 0,
+            'dbindex' => ${env.redis.db_index},
+          ),
+          'overwrite.cli.url' => 'https://cloud.immae.eu',
+          'ldapIgnoreNamingRules' => false,
+          'ldapProviderFactory' => '\\OCA\\User_LDAP\\LDAPProviderFactory',
+          'has_rebuilt_cache' => true,
+        );
+      '';
+    }];
+    users.users.root.packages = let
+      occ = pkgs.writeScriptBin "nextcloud-occ" ''
+        #! ${pkgs.stdenv.shell}
+        cd ${nextcloud}
+        NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \
+          exec \
+          sudo -u wwwrun ${pkgs.php}/bin/php \
+          -c ${pkgs.php}/etc/php.ini \
+          occ $*
+        '';
+    in [ occ ];
+
+    system.activationScripts.nextcloud = {
+      deps = [ "secrets" ];
+      text = let
+        confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig;
+      in
+        ''
+        install -m 0755 -o wwwrun -g wwwrun -d ${varDir}
+        install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions
+        ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v:
+          "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json"
+          ) confs)}
+        install -D -m 0600 -o wwwrun -g wwwrun -T /var/secrets/webapps/tools-nextcloud ${varDir}/config/config.php
+      '';
+    };
+    # FIXME: add a warning when config.php changes
+    system.extraSystemBuilderCmds = ''
+      mkdir -p $out/webapps
+      ln -s ${nextcloud} $out/webapps/${webappName}
+      '';
+
+    services.phpfpm.pools.nextcloud = {
+      listen = phpFpm.socket;
+      extraConfig = phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + phpFpm.phpConfig;
+    };
+
+    services.cron = {
+      enable = true;
+      systemCronJobs = [
+        ''
+          LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
+          */15 * * * * wwwrun ${pkgs.php}/bin/php -f ${nextcloud}/cron.php
+        ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/dav/davical.nix b/modules/private/websites/tools/dav/davical.nix
new file mode 100644 (file)
index 0000000..98cebee
--- /dev/null
@@ -0,0 +1,139 @@
+{ stdenv, fetchurl, gettext, writeText, env, awl, davical }:
+rec {
+  activationScript = {
+    deps = [ "httpd" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/davical
+      '';
+  };
+  keys = [{
+    dest = "webapps/dav-davical";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+      $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
+
+      $c->readonly_webdav_collections = false;
+
+      $c->admin_email ='davical@tools.immae.eu';
+
+      $c->restrict_setup_to_admin = true;
+
+      $c->collections_always_exist = false;
+
+      $c->external_refresh = 60;
+
+      $c->enable_scheduling = true;
+
+      $c->iMIP = (object) array("send_email" => true);
+
+      $c->authenticate_hook['optional'] = false;
+      $c->authenticate_hook['call'] = 'LDAP_check';
+      $c->authenticate_hook['config'] = array(
+          'host' => 'ldap.immae.eu',
+          'port' => '389',
+          'startTLS' => 'yes',
+          'bindDN'=> 'cn=davical,ou=services,dc=immae,dc=eu',
+          'passDN'=> '${env.ldap.password}',
+          'protocolVersion' => '3',
+          'baseDNUsers'=> array('ou=users,dc=immae,dc=eu', 'ou=group_users,dc=immae,dc=eu'),
+          'filterUsers' => 'memberOf=cn=users,cn=davical,ou=services,dc=immae,dc=eu',
+          'baseDNGroups' => 'ou=groups,dc=immae,dc=eu',
+          'filterGroups' => 'memberOf=cn=groups,cn=davical,ou=services,dc=immae,dc=eu',
+          'mapping_field' => array(
+            "username" => "uid",
+            "fullname" => "cn",
+            "email"    => "mail",
+            "modified" => "modifyTimestamp",
+          ),
+          'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)),
+            /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/
+      //    'default_value' => array("date_format_type" => "E","locale" => "fr_FR"),
+          'group_mapping_field' => array(
+            "username"    => "cn",
+            "updated"     => "modifyTimestamp",
+            "fullname"    => "givenName",
+            "displayname" => "givenName",
+            "members"     => "memberUid",
+            "email"       => "mail",
+          ),
+        );
+
+      $c->do_not_sync_from_ldap = array('admin' => true);
+      include('drivers_ldap.php');
+    '';
+  }];
+  webapp = davical.override { davical_config = "/var/secrets/webapps/dav-davical"; };
+  webRoot = "${webapp}/htdocs";
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_davical";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /davical "${root}"
+      Alias /caldav.php  "${root}/caldav.php"
+      <Directory "${root}">
+        DirectoryIndex index.php index.html
+        AcceptPathInfo On
+        AllowOverride None
+        Require all granted
+
+        <FilesMatch "\.php$">
+          CGIPassAuth on
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        RewriteEngine On
+        <IfModule mod_headers.c>
+                Header unset Access-Control-Allow-Origin
+                Header unset Access-Control-Allow-Methods
+                Header unset Access-Control-Allow-Headers
+                Header unset Access-Control-Allow-Credentials
+                Header unset Access-Control-Expose-Headers
+
+                Header always set Access-Control-Allow-Origin "*"
+                Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
+                Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
+                Header always set Access-Control-Allow-Credentials false
+                Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
+
+                RewriteCond %{HTTP:Access-Control-Request-Method} !^$
+                RewriteCond %{REQUEST_METHOD} OPTIONS
+                RewriteRule ^(.*)$ $1 [R=200,L]
+        </IfModule>
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" [ webapp "/var/secrets/webapps/dav-davical" awl ];
+    socket = "/var/run/phpfpm/davical.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = dynamic
+      pm.max_children = 60
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 10
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = DavicalPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/davical"
+      php_admin_value[include_path] = "${awl}/inc:${webapp}/inc"
+      php_admin_value[session.save_path] = "/var/lib/php/sessions/davical"
+      php_flag[magic_quotes_gpc] = Off
+      php_flag[register_globals] = Off
+      php_admin_value[error_reporting] = "E_ALL & ~E_NOTICE"
+      php_admin_value[default_charset] = "utf-8"
+      php_flag[magic_quotes_runtime] = Off
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/dav/default.nix b/modules/private/websites/tools/dav/default.nix
new file mode 100644 (file)
index 0000000..fb0baae
--- /dev/null
@@ -0,0 +1,53 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+    infcloud = rec {
+      webappName = "tools_infcloud";
+      root = "/run/current-system/webapps/${webappName}";
+      vhostConf = ''
+          Alias /carddavmate ${root}
+          Alias /caldavzap ${root}
+          Alias /infcloud ${root}
+          <Directory ${root}>
+            AllowOverride All
+            Options FollowSymlinks
+            Require all granted
+            DirectoryIndex index.html
+          </Directory>
+      '';
+    };
+    davical = pkgs.callPackage ./davical.nix {
+      env = myconfig.env.tools.davical;
+      inherit (pkgs.webapps) davical awl;
+    };
+
+    cfg = config.myServices.websites.tools.dav;
+in {
+  options.myServices.websites.tools.dav = {
+    enable = lib.mkEnableOption "enable dav website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    system.activationScripts.davical = davical.activationScript;
+    secrets.keys = davical.keys;
+    services.websites.tools.modules = davical.apache.modules;
+
+    services.websites.tools.vhostConfs.dav = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["dav.immae.eu" ];
+      root        = null;
+      extraConfig = [
+        infcloud.vhostConf
+        davical.apache.vhostConf
+      ];
+    };
+
+    services.phpfpm.poolConfigs = {
+      davical = davical.phpFpm.pool;
+    };
+
+    myServices.websites.webappDirs."${davical.apache.webappName}" = davical.webRoot;
+    myServices.websites.webappDirs."${infcloud.webappName}" = pkgs.webapps.infcloud;
+  };
+}
+
diff --git a/modules/private/websites/tools/db/default.nix b/modules/private/websites/tools/db/default.nix
new file mode 100644 (file)
index 0000000..361e204
--- /dev/null
@@ -0,0 +1,21 @@
+{ lib, pkgs, config,  ... }:
+let
+    adminer = pkgs.callPackage ../../commons/adminer.nix {};
+
+    cfg = config.myServices.websites.tools.db;
+in {
+  options.myServices.websites.tools.db = {
+    enable = lib.mkEnableOption "enable database's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.websites.tools.modules = adminer.apache.modules;
+    services.websites.tools.vhostConfs.db-1 = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["db-1.immae.eu" ];
+      root        = null;
+      extraConfig = [ adminer.apache.vhostConf ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/diaspora/default.nix b/modules/private/websites/tools/diaspora/default.nix
new file mode 100644 (file)
index 0000000..efa1fab
--- /dev/null
@@ -0,0 +1,181 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  env = myconfig.env.tools.diaspora;
+  root = "/run/current-system/webapps/tools_diaspora";
+  cfg = config.myServices.websites.tools.diaspora;
+  dcfg = config.services.diaspora;
+in {
+  options.myServices.websites.tools.diaspora = {
+    enable = lib.mkEnableOption "enable diaspora's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users.diaspora.extraGroups = [ "keys" ];
+
+    secrets.keys = [
+      {
+        dest = "webapps/diaspora/diaspora.yml";
+        user = "diaspora";
+        group = "diaspora";
+        permissions = "0400";
+        text = ''
+        configuration:
+          environment:
+            url: "https://diaspora.immae.eu/"
+            certificate_authorities: '${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt'
+            redis: '${env.redis_url}'
+            sidekiq:
+            s3:
+            assets:
+            logging:
+              logrotate:
+              debug:
+          server:
+            listen: '${dcfg.sockets.rails}'
+            rails_environment: 'production'
+          chat:
+            server:
+              bosh:
+              log:
+          map:
+            mapbox:
+          privacy:
+            piwik:
+            statistics:
+            camo:
+          settings:
+            enable_registrations: false
+            welcome_message:
+            invitations:
+              open: false
+            paypal_donations:
+            community_spotlight:
+            captcha:
+              enable: false
+            terms:
+            maintenance:
+              remove_old_users:
+            default_metas:
+            csp:
+          services:
+            twitter:
+            tumblr:
+            wordpress:
+          mail:
+            enable: true
+            sender_address: 'diaspora@tools.immae.eu'
+            method: 'sendmail'
+            smtp:
+            sendmail:
+              location: '/run/wrappers/bin/sendmail'
+          admins:
+            account: "ismael"
+            podmin_email: 'diaspora@tools.immae.eu'
+          relay:
+            outbound:
+            inbound:
+          ldap:
+              enable: true
+              host: ldap.immae.eu
+              port: 636
+              only_ldap: true
+              mail_attribute: mail
+              skip_email_confirmation: true
+              use_bind_dn: true
+              bind_dn: "cn=diaspora,ou=services,dc=immae,dc=eu"
+              bind_pw: "${env.ldap.password}"
+              search_base: "dc=immae,dc=eu"
+              search_filter: "(&(memberOf=cn=users,cn=diaspora,ou=services,dc=immae,dc=eu)(uid=%{username}))"
+        production:
+          environment:
+        development:
+          environment:
+        '';
+      }
+      {
+        dest = "webapps/diaspora/database.yml";
+        user = "diaspora";
+        group = "diaspora";
+        permissions = "0400";
+        text = ''
+        postgresql: &postgresql
+          adapter: postgresql
+          host: "${env.postgresql.socket}"
+          port: "${env.postgresql.port}"
+          username: "${env.postgresql.user}"
+          password: "${env.postgresql.password}"
+          encoding: unicode
+        common: &common
+          <<: *postgresql
+        combined: &combined
+          <<: *common
+        development:
+          <<: *combined
+          database: diaspora_development
+        production:
+          <<: *combined
+          database: ${env.postgresql.database}
+        test:
+          <<: *combined
+          database: "diaspora_test"
+        integration1:
+          <<: *combined
+          database: diaspora_integration1
+        integration2:
+          <<: *combined
+          database: diaspora_integration2
+        '';
+      }
+      {
+        dest = "webapps/diaspora/secret_token.rb";
+        user = "diaspora";
+        group = "diaspora";
+        permissions = "0400";
+        text = ''
+          Diaspora::Application.config.secret_key_base = '${env.secret_token}'
+        '';
+      }
+    ];
+
+    services.diaspora = {
+      enable = true;
+      package = pkgs.webapps.diaspora.override { ldap = true; };
+      dataDir = "/var/lib/diaspora_immae";
+      adminEmail = "diaspora@tools.immae.eu";
+      configDir = "/var/secrets/webapps/diaspora";
+    };
+
+    services.websites.tools.modules = [
+      "headers" "proxy" "proxy_http"
+    ];
+    system.extraSystemBuilderCmds = ''
+      mkdir -p $out/webapps
+      ln -s ${dcfg.workdir}/public/ $out/webapps/tools_diaspora
+      '';
+    services.websites.tools.vhostConfs.diaspora = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "diaspora.immae.eu" ];
+      root        = root;
+      extraConfig = [ ''
+        RewriteEngine On
+        RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
+        RewriteRule ^/(.*)$ unix://${dcfg.sockets.rails}|http://diaspora.immae.eu/%{REQUEST_URI} [P,NE,QSA,L]
+
+        ProxyRequests Off
+        ProxyVia On
+        ProxyPreserveHost On
+        RequestHeader set X_FORWARDED_PROTO https
+
+        <Proxy *>
+            Require all granted
+        </Proxy>
+
+        <Directory ${root}>
+            Require all granted
+            Options -MultiViews
+        </Directory>
+      '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/ether/default.nix b/modules/private/websites/tools/ether/default.nix
new file mode 100644 (file)
index 0000000..ebcbf61
--- /dev/null
@@ -0,0 +1,175 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  env = myconfig.env.tools.etherpad-lite;
+  cfg = config.myServices.websites.tools.etherpad-lite;
+  # Make sure we’re not rebuilding whole libreoffice just because of a
+  # dependency
+  libreoffice = (import <nixpkgs> { overlays = []; }).libreoffice-fresh;
+  ecfg = config.services.etherpad-lite;
+in {
+  options.myServices.websites.tools.etherpad-lite = {
+    enable = lib.mkEnableOption "enable etherpad's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = [
+      {
+        dest = "webapps/tools-etherpad-apikey";
+        permissions = "0400";
+        text = env.api_key;
+      }
+      {
+        dest = "webapps/tools-etherpad-sessionkey";
+        permissions = "0400";
+        text = env.session_key;
+      }
+      {
+        dest = "webapps/tools-etherpad";
+        permissions = "0400";
+        text = ''
+          {
+            "title": "Etherpad",
+            "favicon": "favicon.ico",
+
+            "ip": "",
+            "port" : "${ecfg.sockets.node}",
+            "showSettingsInAdminPage" : false,
+            "dbType" : "postgres",
+            "dbSettings" : {
+              "user"    : "${env.postgresql.user}",
+              "host"    : "${env.postgresql.socket}",
+              "password": "${env.postgresql.password}",
+              "database": "${env.postgresql.database}",
+              "charset" : "utf8mb4"
+            },
+
+            "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n",
+            "padOptions": {
+              "noColors": false,
+              "showControls": true,
+              "showChat": true,
+              "showLineNumbers": true,
+              "useMonospaceFont": false,
+              "userName": false,
+              "userColor": false,
+              "rtl": false,
+              "alwaysShowChat": false,
+              "chatAndUsers": false,
+              "lang": "en-gb"
+            },
+
+            "suppressErrorsInPadText" : false,
+            "requireSession" : false,
+            "editOnly" : false,
+            "sessionNoPassword" : false,
+            "minify" : true,
+            "maxAge" : 21600,
+            "abiword" : null,
+            "soffice" : "${libreoffice}/bin/soffice",
+            "tidyHtml" : "${pkgs.html-tidy}/bin/tidy",
+            "allowUnknownFileEnds" : true,
+            "requireAuthentication" : false,
+            "requireAuthorization" : false,
+            "trustProxy" : false,
+            "disableIPlogging" : false,
+            "automaticReconnectionTimeout" : 0,
+            "scrollWhenFocusLineIsOutOfViewport": {
+              "percentage": {
+                "editionAboveViewport": 0,
+                "editionBelowViewport": 0
+              },
+              "duration": 0,
+              "scrollWhenCaretIsInTheLastLineOfViewport": false,
+              "percentageToScrollWhenUserPressesArrowUp": 0
+            },
+            "users": {
+              "ldapauth": {
+                "url": "ldaps://${env.ldap.host}",
+                "accountBase": "${env.ldap.base}",
+                "accountPattern": "(&(memberOf=cn=users,cn=etherpad,ou=services,dc=immae,dc=eu)(uid={{username}}))",
+                "displayNameAttribute": "cn",
+                "searchDN": "cn=etherpad,ou=services,dc=immae,dc=eu",
+                "searchPWD": "${env.ldap.password}",
+                "groupSearchBase": "${env.ldap.base}",
+                "groupAttribute": "member",
+                "groupAttributeIsDN": true,
+                "searchScope": "sub",
+                "groupSearch": "(memberOf=cn=groups,cn=etherpad,ou=services,dc=immae,dc=eu)",
+                "anonymousReadonly": false
+              }
+            },
+            "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
+            "loadTest": false,
+            "indentationOnNewLine": false,
+            "toolbar": {
+              "left": [
+                ["bold", "italic", "underline", "strikethrough"],
+                ["orderedlist", "unorderedlist", "indent", "outdent"],
+                ["undo", "redo"],
+                ["clearauthorship"]
+              ],
+              "right": [
+                ["importexport", "timeslider", "savedrevision"],
+                ["settings", "embed"],
+                ["showusers"]
+              ],
+              "timeslider": [
+                ["timeslider_export", "timeslider_returnToPad"]
+              ]
+            },
+            "loglevel": "INFO",
+            "logconfig" : { "appenders": [ { "type": "console" } ] }
+          }
+        '';
+      }
+    ];
+    services.etherpad-lite = {
+      enable = true;
+      modules = builtins.attrValues pkgs.webapps.etherpad-lite-modules;
+      sessionKeyFile = "/var/secrets/webapps/tools-etherpad-sessionkey";
+      apiKeyFile = "/var/secrets/webapps/tools-etherpad-apikey";
+      configFile = "/var/secrets/webapps/tools-etherpad";
+    };
+
+    systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys";
+
+    services.websites.tools.modules = [
+      "headers" "proxy" "proxy_http" "proxy_wstunnel"
+    ];
+    services.websites.tools.vhostConfs.etherpad-lite = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "ether.immae.eu" ];
+      root        = null;
+      extraConfig = [ ''
+        Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
+        RequestHeader set X-Forwarded-Proto "https"
+
+        RewriteEngine On
+
+        RewriteMap  redirects "txt:${pkgs.writeText "redirects.txt" myconfig.env.tools.etherpad-lite.redirects}"
+        RewriteCond %{QUERY_STRING}         "!noredirect"
+        RewriteCond %{REQUEST_URI}          "^(.*)$"
+        RewriteCond ''${redirects:$1|Unknown} "!Unknown"
+        RewriteRule "^(.*)$"                ''${redirects:$1}  [L,NE,R=301,QSD]
+
+        RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
+        RewriteCond %{QUERY_STRING} transport=websocket    [NC]
+        RewriteRule /(.*)           unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L]
+
+        <IfModule mod_proxy.c>
+          ProxyVia On
+          ProxyRequests Off
+          ProxyPreserveHost On
+          ProxyPass         / unix://${ecfg.sockets.node}|http://ether.immae.eu/
+          ProxyPassReverse  / unix://${ecfg.sockets.node}|http://ether.immae.eu/
+          <Proxy *>
+            Options FollowSymLinks MultiViews
+            AllowOverride None
+            Require all granted
+          </Proxy>
+        </IfModule>
+      '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/git/default.nix b/modules/private/websites/tools/git/default.nix
new file mode 100644 (file)
index 0000000..75d0240
--- /dev/null
@@ -0,0 +1,45 @@
+{ lib, pkgs, config, myconfig, ... }:
+let
+    mantisbt = pkgs.callPackage ./mantisbt.nix {
+      inherit (pkgs.webapps) mantisbt_2 mantisbt_2-plugins;
+      env = myconfig.env.tools.mantisbt;
+    };
+    gitweb = pkgs.callPackage ./gitweb.nix {
+      gitoliteDir = config.myServices.gitolite.gitoliteDir;
+    };
+
+    cfg = config.myServices.websites.tools.git;
+in {
+  options.myServices.websites.tools.git = {
+    enable = lib.mkEnableOption "enable git's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = mantisbt.keys;
+    services.websites.tools.modules =
+      gitweb.apache.modules ++
+      mantisbt.apache.modules;
+    myServices.websites.webappDirs."${gitweb.apache.webappName}" = gitweb.webRoot;
+    myServices.websites.webappDirs."${mantisbt.apache.webappName}" = mantisbt.webRoot;
+
+    system.activationScripts.mantisbt = mantisbt.activationScript;
+    services.websites.tools.vhostConfs.git = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["git.immae.eu" ];
+      root        = gitweb.apache.root;
+      extraConfig = [
+        gitweb.apache.vhostConf
+        mantisbt.apache.vhostConf
+        ''
+          RewriteEngine on
+          RewriteCond %{REQUEST_URI}       ^/releases
+          RewriteRule /releases(.*)        https://release.immae.eu$1 [P,L]
+          ''
+      ];
+    };
+    services.phpfpm.poolConfigs = {
+      mantisbt = mantisbt.phpFpm.pool;
+    };
+  };
+}
diff --git a/modules/private/websites/tools/git/gitweb.nix b/modules/private/websites/tools/git/gitweb.nix
new file mode 100644 (file)
index 0000000..2ee7a63
--- /dev/null
@@ -0,0 +1,64 @@
+{ gitweb, writeText, gitolite, git, gitoliteDir, highlight }:
+rec {
+  varDir = gitoliteDir;
+  webRoot = gitweb;
+  config = writeText "gitweb.conf" ''
+    $git_temp = "/tmp";
+
+    # The directories where your projects are. Must not end with a
+    # slash.
+    $projectroot = "${varDir}/repositories";
+
+    $projects_list = "${varDir}/projects.list";
+    $strict_export = "true";
+
+    # Base URLs for links displayed in the web interface.
+    our @git_base_url_list = qw(ssh://gitolite@git.immae.eu https://git.immae.eu);
+
+    $feature{'blame'}{'default'} = [1];
+    $feature{'avatar'}{'default'} = ['gravatar'];
+    $feature{'highlight'}{'default'} = [1];
+
+    @stylesheets = ("gitweb-theme/gitweb.css");
+    $logo = "gitweb-theme/git-logo.png";
+    $favicon = "gitweb-theme/git-favicon.png";
+    $javascript = "gitweb-theme/gitweb.js";
+    $logo_url = "https://git.immae.eu/";
+    $projects_list_group_categories = "true";
+    $projects_list_description_width = 60;
+    $project_list_default_category = "__Others__";
+    $highlight_bin = "${highlight}/bin/highlight";
+    '';
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "cgid" ];
+    webappName = "tools_gitweb";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      SetEnv GIT_PROJECT_ROOT ${varDir}/repositories/
+      ScriptAliasMatch \
+                  "(?x)^/(.*/(HEAD | \
+                                  info/refs | \
+                                  objects/(info/[^/]+ | \
+                                          [0-9a-f]{2}/[0-9a-f]{38} | \
+                                          pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
+                                  git-(upload|receive)-pack))$" \
+                  ${git}/libexec/git-core/git-http-backend/$1
+
+      <Directory "${git}/libexec/git-core">
+        Require all granted
+      </Directory>
+      <Directory "${root}">
+        DirectoryIndex gitweb.cgi
+        Require all granted
+        AllowOverride None
+        Options ExecCGI FollowSymLinks
+        <Files gitweb.cgi>
+          SetHandler cgi-script
+          SetEnv  GITWEB_CONFIG  "${config}"
+        </Files>
+      </Directory>
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/git/mantisbt.nix b/modules/private/websites/tools/git/mantisbt.nix
new file mode 100644 (file)
index 0000000..a1b830e
--- /dev/null
@@ -0,0 +1,96 @@
+{ env, mantisbt_2, mantisbt_2-plugins }:
+rec {
+  activationScript = {
+    deps = [ "httpd" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/mantisbt
+    '';
+  };
+  keys = [{
+    dest = "webapps/tools-mantisbt";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+      $g_hostname              = '${env.postgresql.socket}';
+      $g_db_username           = '${env.postgresql.user}';
+      $g_db_password           = '${env.postgresql.password}';
+      $g_database_name         = '${env.postgresql.database}';
+      $g_db_type               = 'pgsql';
+      $g_crypto_master_salt    = '${env.master_salt}';
+      $g_allow_signup          = OFF;
+      $g_allow_anonymous_login = ON;
+      $g_anonymous_account     = 'anonymous';
+
+      $g_phpMailer_method      = PHPMAILER_METHOD_SENDMAIL;
+      $g_smtp_host             = 'localhost';
+      $g_smtp_username         = ''';
+      $g_smtp_password         = ''';
+      $g_webmaster_email       = 'mantisbt@tools.immae.eu';
+      $g_from_email            = 'mantisbt@tools.immae.eu';
+      $g_return_path_email     = 'mantisbt@tools.immae.eu';
+      $g_from_name             = 'Mantis Bug Tracker at git.immae.eu';
+      $g_email_receive_own     = OFF;
+      # --- LDAP ---
+      $g_login_method = LDAP;
+      $g_ldap_protocol_version = 3;
+      $g_ldap_server = 'ldaps://ldap.immae.eu:636';
+      $g_ldap_root_dn = 'ou=users,dc=immae,dc=eu';
+      $g_ldap_bind_dn = 'cn=mantisbt,ou=services,dc=immae,dc=eu';
+      $g_ldap_bind_passwd = '${env.ldap.password}';
+      $g_use_ldap_email = ON;
+      $g_use_ldap_realname = ON;
+      $g_ldap_uid_field = 'uid';
+      $g_ldap_realname_field = 'cn';
+      $g_ldap_organization = '(memberOf=cn=users,cn=mantisbt,ou=services,dc=immae,dc=eu)';
+    '';
+  }];
+  webRoot = (mantisbt_2.override { mantis_config = "/var/secrets/webapps/tools-mantisbt"; }).withPlugins (builtins.attrValues mantisbt_2-plugins);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_mantisbt";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /mantisbt "${root}"
+      <Directory "${root}">
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride All
+        Options FollowSymlinks
+        Require all granted
+      </Directory>
+      <Directory "${root}/admin">
+        #Reenable during upgrade
+        Require all denied
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot "/var/secrets/webapps/tools-mantisbt" ]
+      ++ webRoot.plugins);
+    socket = "/var/run/phpfpm/mantisbt.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      php_admin_value[upload_max_filesize] = 5000000
+
+      php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/mantisbt"
+      php_admin_value[session.save_path] = "/var/lib/php/sessions/mantisbt"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/mastodon/default.nix b/modules/private/websites/tools/mastodon/default.nix
new file mode 100644 (file)
index 0000000..d742a33
--- /dev/null
@@ -0,0 +1,128 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  env = myconfig.env.tools.mastodon;
+  root = "/run/current-system/webapps/tools_mastodon";
+  cfg = config.myServices.websites.tools.mastodon;
+  mcfg = config.services.mastodon;
+in {
+  options.myServices.websites.tools.mastodon = {
+    enable = lib.mkEnableOption "enable mastodon's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = [{
+      dest = "webapps/tools-mastodon";
+      user = "mastodon";
+      group = "mastodon";
+      permissions = "0400";
+      text = ''
+        REDIS_HOST=${env.redis.host}
+        REDIS_PORT=${env.redis.port}
+        REDIS_DB=${env.redis.db}
+        DB_HOST=${env.postgresql.socket}
+        DB_USER=${env.postgresql.user}
+        DB_NAME=${env.postgresql.database}
+        DB_PASS=${env.postgresql.password}
+        DB_PORT=${env.postgresql.port}
+
+        LOCAL_DOMAIN=mastodon.immae.eu
+        LOCAL_HTTPS=true
+        ALTERNATE_DOMAINS=immae.eu
+
+        PAPERCLIP_SECRET=${env.paperclip_secret}
+        SECRET_KEY_BASE=${env.secret_key_base}
+        OTP_SECRET=${env.otp_secret}
+
+        VAPID_PRIVATE_KEY=${env.vapid.private}
+        VAPID_PUBLIC_KEY=${env.vapid.public}
+
+        SMTP_DELIVERY_METHOD=sendmail
+        SMTP_FROM_ADDRESS=mastodon@tools.immae.eu
+        SENDMAIL_LOCATION="/run/wrappers/bin/sendmail"
+        PAPERCLIP_ROOT_PATH=${mcfg.dataDir}
+
+        STREAMING_CLUSTER_NUM=1
+
+        RAILS_LOG_LEVEL=warn
+
+        # LDAP authentication (optional)
+        LDAP_ENABLED=true
+        LDAP_HOST=ldap.immae.eu
+        LDAP_PORT=636
+        LDAP_METHOD=simple_tls
+        LDAP_BASE="dc=immae,dc=eu"
+        LDAP_BIND_DN="cn=mastodon,ou=services,dc=immae,dc=eu"
+        LDAP_PASSWORD="${env.ldap.password}"
+        LDAP_UID="uid"
+        LDAP_SEARCH_FILTER="(&(%{uid}=%{email})(memberOf=cn=users,cn=mastodon,ou=services,dc=immae,dc=eu))"
+      '';
+    }];
+    services.mastodon = {
+      enable = true;
+      configFile = "/var/secrets/webapps/tools-mastodon";
+      socketsPrefix = "live_immae";
+      dataDir = "/var/lib/mastodon_immae";
+    };
+
+    services.websites.tools.modules = [
+      "headers" "proxy" "proxy_wstunnel" "proxy_http"
+    ];
+    system.extraSystemBuilderCmds = ''
+      mkdir -p $out/webapps
+      ln -s ${mcfg.workdir}/public/ $out/webapps/tools_mastodon
+      '';
+    services.websites.tools.vhostConfs.mastodon = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["mastodon.immae.eu" ];
+      root        = root;
+      extraConfig = [ ''
+        Header always set Referrer-Policy "strict-origin-when-cross-origin"
+        Header always set Strict-Transport-Security "max-age=31536000"
+
+        <LocationMatch "^/(assets|avatars|emoji|headers|packs|sounds|system)>
+          Header always set Cache-Control "public, max-age=31536000, immutable"
+          Require all granted
+        </LocationMatch>
+
+        ProxyPreserveHost On
+        RequestHeader set X-Forwarded-Proto "https"
+
+        RewriteEngine On
+
+        ProxyPass /500.html !
+        ProxyPass /sw.js !
+        ProxyPass /embed.js !
+        ProxyPass /robots.txt !
+        ProxyPass /manifest.json !
+        ProxyPass /browserconfig.xml !
+        ProxyPass /mask-icon.svg !
+        ProxyPassMatch ^(/.*\.(png|ico|gif)$) !
+        ProxyPassMatch ^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) !
+
+        RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L]
+        RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L]
+        ProxyPass / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
+        ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
+
+        Alias /system ${mcfg.dataDir}
+
+        <Directory ${mcfg.dataDir}>
+          Require all granted
+          Options -MultiViews
+        </Directory>
+
+        <Directory ${root}>
+          Require all granted
+          Options -MultiViews +FollowSymlinks
+        </Directory>
+
+        ErrorDocument 500 /500.html
+        ErrorDocument 501 /500.html
+        ErrorDocument 502 /500.html
+        ErrorDocument 503 /500.html
+        ErrorDocument 504 /500.html
+      '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/mgoblin/default.nix b/modules/private/websites/tools/mgoblin/default.nix
new file mode 100644 (file)
index 0000000..5da81f6
--- /dev/null
@@ -0,0 +1,122 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  env = myconfig.env.tools.mediagoblin;
+  cfg = config.myServices.websites.tools.mediagoblin;
+  mcfg = config.services.mediagoblin;
+in {
+  options.myServices.websites.tools.mediagoblin = {
+    enable = lib.mkEnableOption "enable mediagoblin's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys = [{
+      dest = "webapps/tools-mediagoblin";
+      user = "mediagoblin";
+      group = "mediagoblin";
+      permissions = "0400";
+      text = ''
+        [DEFAULT]
+        data_basedir = "${mcfg.dataDir}"
+
+        [mediagoblin]
+        direct_remote_path = /mgoblin_static/
+        email_sender_address = "mediagoblin@tools.immae.eu"
+
+        #sql_engine = sqlite:///%(data_basedir)s/mediagoblin.db
+        sql_engine = ${env.psql_url}
+
+        email_debug_mode = false
+        allow_registration = false
+        allow_reporting = true
+
+        theme = airymodified
+
+        user_privilege_scheme = "uploader,commenter,reporter"
+
+        # We need to redefine them here since we override data_basedir
+        # cf /usr/share/webapps/mediagoblin/mediagoblin/config_spec.ini
+        workbench_path = %(data_basedir)s/media/workbench
+        crypto_path = %(data_basedir)s/crypto
+        theme_install_dir = %(data_basedir)s/themes/
+        theme_linked_assets_dir = %(data_basedir)s/theme_static/
+        plugin_linked_assets_dir = %(data_basedir)s/plugin_static/
+
+        [storage:queuestore]
+        base_dir = %(data_basedir)s/media/queue
+
+        [storage:publicstore]
+        base_dir = %(data_basedir)s/media/public
+        base_url = /mgoblin_media/
+
+        [celery]
+        CELERY_RESULT_DBURI = ${env.redis_url}
+        BROKER_URL = ${env.redis_url}
+        CELERYD_CONCURRENCY = 1
+
+        [plugins]
+          [[mediagoblin.plugins.geolocation]]
+          [[mediagoblin.plugins.ldap]]
+            [[[immae.eu]]]
+              LDAP_SERVER_URI = 'ldaps://ldap.immae.eu:636'
+              LDAP_SEARCH_BASE = 'dc=immae,dc=eu'
+              LDAP_BIND_DN = 'cn=mediagoblin,ou=services,dc=immae,dc=eu'
+              LDAP_BIND_PW = '${env.ldap.password}'
+              LDAP_SEARCH_FILTER = '(&(memberOf=cn=users,cn=mediagoblin,ou=services,dc=immae,dc=eu)(uid={username}))'
+              EMAIL_SEARCH_FIELD = 'mail'
+          [[mediagoblin.plugins.basicsearch]]
+          [[mediagoblin.plugins.piwigo]]
+          [[mediagoblin.plugins.processing_info]]
+          [[mediagoblin.media_types.image]]
+          [[mediagoblin.media_types.video]]
+        '';
+    }];
+
+    users.users.mediagoblin.extraGroups = [ "keys" ];
+
+    services.mediagoblin = {
+      enable     = true;
+      plugins    = builtins.attrValues pkgs.webapps.mediagoblin-plugins;
+      configFile = "/var/secrets/webapps/tools-mediagoblin";
+    };
+
+    services.websites.tools.modules = [
+      "proxy" "proxy_http"
+    ];
+    users.users.wwwrun.extraGroups = [ "mediagoblin" ];
+    services.websites.tools.vhostConfs.mgoblin = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["mgoblin.immae.eu" ];
+      root        = null;
+      extraConfig = [ ''
+        Alias /mgoblin_media ${mcfg.dataDir}/media/public
+        <Directory ${mcfg.dataDir}/media/public>
+          Options -Indexes +FollowSymLinks +MultiViews +Includes
+          Require all granted
+        </Directory>
+
+        Alias /theme_static ${mcfg.dataDir}/theme_static
+        <Directory ${mcfg.dataDir}/theme_static>
+          Options -Indexes +FollowSymLinks +MultiViews +Includes
+          Require all granted
+        </Directory>
+
+        Alias /plugin_static ${mcfg.dataDir}/plugin_static
+        <Directory ${mcfg.dataDir}/plugin_static>
+          Options -Indexes +FollowSymLinks +MultiViews +Includes
+          Require all granted
+        </Directory>
+
+        ProxyPreserveHost on
+        ProxyVia On
+        ProxyRequests Off
+        ProxyPass /mgoblin_media !
+        ProxyPass /theme_static !
+        ProxyPass /plugin_static !
+        ProxyPassMatch ^/.well-known/acme-challenge !
+        ProxyPass / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
+        ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
+      '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/peertube/default.nix b/modules/private/websites/tools/peertube/default.nix
new file mode 100644 (file)
index 0000000..dee1b81
--- /dev/null
@@ -0,0 +1,179 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  env = myconfig.env.tools.peertube;
+  cfg = config.myServices.websites.tools.peertube;
+  pcfg = config.services.peertube;
+in {
+  options.myServices.websites.tools.peertube = {
+    enable = lib.mkEnableOption "enable Peertube's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.peertube = {
+      enable = true;
+      configFile = "/var/secrets/webapps/tools-peertube";
+      package = pkgs.webapps.peertube.override { ldap = true; };
+    };
+    users.users.peertube.extraGroups = [ "keys" ];
+
+    secrets.keys = [{
+      dest = "webapps/tools-peertube";
+      user = "peertube";
+      group = "peertube";
+      permissions = "0640";
+      text = ''
+        listen:
+          hostname: 'localhost'
+          port: ${env.listenPort}
+        webserver:
+          https: true
+          hostname: 'peertube.immae.eu'
+          port: 443
+        trust_proxy:
+          - 'loopback'
+        database:
+          hostname: '${env.postgresql.socket}'
+          port: 5432
+          suffix: '_prod'
+          username: '${env.postgresql.user}'
+          password: '${env.postgresql.password}'
+          pool:
+            max: 5
+        redis:
+          socket: '${env.redis.socket}'
+          auth: null
+          db: ${env.redis.db_index}
+        ldap:
+          enable: true
+          ldap_only: false
+          url: ldaps://${env.ldap.host}/${env.ldap.base}
+          bind_dn: ${env.ldap.dn}
+          bind_password: ${env.ldap.password}
+          base: ${env.ldap.base}
+          mail_entry: "mail"
+          user_filter: "${env.ldap.filter}"
+        smtp:
+          transport: sendmail
+          sendmail: '/run/wrappers/bin/sendmail'
+          hostname: null
+          port: 465 # If you use StartTLS: 587
+          username: null
+          password: null
+          tls: true # If you use StartTLS: false
+          disable_starttls: false
+          ca_file: null # Used for self signed certificates
+          from_address: 'peertube@tools.immae.eu'
+        storage:
+          tmp: '${pcfg.dataDir}/storage/tmp/'
+          avatars: '${pcfg.dataDir}/storage/avatars/'
+          videos: '${pcfg.dataDir}/storage/videos/'
+          redundancy: '${pcfg.dataDir}/storage/videos/'
+          logs: '${pcfg.dataDir}/storage/logs/'
+          previews: '${pcfg.dataDir}/storage/previews/'
+          thumbnails: '${pcfg.dataDir}/storage/thumbnails/'
+          torrents: '${pcfg.dataDir}/storage/torrents/'
+          captions: '${pcfg.dataDir}/storage/captions/'
+          cache: '${pcfg.dataDir}/storage/cache/'
+        log:
+          level: 'info'
+        search:
+          remote_uri:
+            users: true
+            anonymous: false
+        trending:
+          videos:
+            interval_days: 7
+        redundancy:
+          videos:
+            check_interval: '1 hour' # How often you want to check new videos to cache
+            strategies: # Just uncomment strategies you want
+        # Following are saved in local-production.json
+        cache:
+          previews:
+            size: 500 # Max number of previews you want to cache
+          captions:
+            size: 500 # Max number of video captions/subtitles you want to cache
+        admin:
+          email: 'peertube@tools.immae.eu'
+        contact_form:
+          enabled: true
+        signup:
+          enabled: false
+          limit: 10
+          requires_email_verification: false
+          filters:
+            cidr:
+              whitelist: []
+              blacklist: []
+        user:
+          video_quota: -1
+          video_quota_daily: -1
+        transcoding:
+          enabled: false
+          allow_additional_extensions: true
+          threads: 1
+          resolutions:
+            240p: false
+            360p: false
+            480p: true
+            720p: true
+            1080p: true
+          hls:
+            enabled: false
+        import:
+          videos:
+            http:
+              enabled: true
+            torrent:
+              enabled: false
+        instance:
+          name: 'Immae&#x2019;s PeerTube'
+          short_description: 'PeerTube, a federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.'
+          description: '''
+          terms: '''
+          default_client_route: '/videos/trending'
+          default_nsfw_policy: 'blur'
+          customizations:
+            javascript: '''
+            css: '''
+          robots: |
+            User-agent: *
+            Disallow:
+          securitytxt:
+            "# If you would like to report a security issue\n# you may report it to:\nContact: https://github.com/Chocobozzz/PeerTube/blob/develop/SECURITY.md\nContact: mailto:"
+        services:
+          # You can provide a reporting endpoint for Content Security Policy violations
+          csp-logger:
+          twitter:
+            username: '@_immae'
+            whitelisted: false
+        '';
+    }];
+
+    services.websites.tools.modules = [
+      "headers" "proxy" "proxy_http" "proxy_wstunnel"
+    ];
+    services.websites.tools.vhostConfs.peertube = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = [ "peertube.immae.eu" ];
+      root        = null;
+      extraConfig = [ ''
+          RewriteEngine On
+
+          RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
+          RewriteCond %{QUERY_STRING} transport=websocket    [NC]
+          RewriteRule /(.*)           ws://localhost:${env.listenPort}/$1 [P,NE,QSA,L]
+
+          RewriteCond %{REQUEST_URI}  ^/tracker/socket       [NC]
+          RewriteRule /(.*)           ws://localhost:${env.listenPort}/$1 [P,NE,QSA,L]
+
+          ProxyPass /        http://localhost:${env.listenPort}/
+          ProxyPassReverse / http://localhost:${env.listenPort}/
+
+          ProxyPreserveHost On
+          RequestHeader set X-Real-IP %{REMOTE_ADDR}s
+      '' ];
+    };
+  };
+}
diff --git a/modules/private/websites/tools/tools/adminer.nix b/modules/private/websites/tools/tools/adminer.nix
new file mode 100644 (file)
index 0000000..cd51e7f
--- /dev/null
@@ -0,0 +1,47 @@
+{ adminer }:
+rec {
+  activationScript = {
+    deps = [ "httpd" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/adminer
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/tmp/adminer
+      '';
+  };
+  webRoot = adminer;
+  phpFpm = rec {
+    socket = "/var/run/phpfpm/adminer.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 5
+      pm.process_idle_timeout = 60
+      ;php_admin_flag[log_errors] = on
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = AdminerPHPSESSID
+      php_admin_value[open_basedir] = "${webRoot}:/tmp:/var/lib/php/sessions/adminer:/var/lib/php/tmp/adminer"
+      php_admin_value[session.save_path] = "/var/lib/php/sessions/adminer"
+      php_admin_value[upload_tmp_dir] = "/var/lib/php/tmp/adminer"
+      '';
+  };
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "_adminer";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /adminer ${root}
+      <Directory ${root}>
+        DirectoryIndex index.php
+        Require all granted
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+      </Directory>
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/default.nix b/modules/private/websites/tools/tools/default.nix
new file mode 100644 (file)
index 0000000..94a2be1
--- /dev/null
@@ -0,0 +1,302 @@
+{ lib, pkgs, config, myconfig,  ... }:
+let
+  adminer = pkgs.callPackage ./adminer.nix {
+    inherit (pkgs.webapps) adminer;
+  };
+  ympd = pkgs.callPackage ./ympd.nix {
+    env = myconfig.env.tools.ympd;
+  };
+  ttrss = pkgs.callPackage ./ttrss.nix {
+    inherit (pkgs.webapps) ttrss ttrss-plugins;
+    env = myconfig.env.tools.ttrss;
+  };
+  roundcubemail = pkgs.callPackage ./roundcubemail.nix {
+    inherit (pkgs.webapps) roundcubemail roundcubemail-plugins roundcubemail-skins;
+    env = myconfig.env.tools.roundcubemail;
+  };
+  rainloop = pkgs.callPackage ./rainloop.nix  {};
+  kanboard = pkgs.callPackage ./kanboard.nix  {
+    env = myconfig.env.tools.kanboard;
+  };
+  wallabag = pkgs.callPackage ./wallabag.nix {
+    inherit (pkgs.webapps) wallabag;
+    env = myconfig.env.tools.wallabag;
+  };
+  yourls = pkgs.callPackage ./yourls.nix {
+    inherit (pkgs.webapps) yourls yourls-plugins;
+    env = myconfig.env.tools.yourls;
+  };
+  rompr = pkgs.callPackage ./rompr.nix {
+    inherit (pkgs.webapps) rompr;
+    env = myconfig.env.tools.rompr;
+  };
+  shaarli = pkgs.callPackage ./shaarli.nix {
+    env = myconfig.env.tools.shaarli;
+  };
+  dokuwiki = pkgs.callPackage ./dokuwiki.nix {
+    inherit (pkgs.webapps) dokuwiki dokuwiki-plugins;
+  };
+  ldap = pkgs.callPackage ./ldap.nix {
+    inherit (pkgs.webapps) phpldapadmin;
+    env = myconfig.env.tools.phpldapadmin;
+  };
+
+  cfg = config.myServices.websites.tools.tools;
+in {
+  options.myServices.websites.tools.tools = {
+    enable = lib.mkEnableOption "enable tools website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    secrets.keys =
+      kanboard.keys
+      ++ ldap.keys
+      ++ roundcubemail.keys
+      ++ shaarli.keys
+      ++ ttrss.keys
+      ++ wallabag.keys
+      ++ yourls.keys;
+
+    services.websites.integration.modules =
+      rainloop.apache.modules;
+
+    services.websites.tools.modules =
+      [ "proxy_fcgi" ]
+      ++ adminer.apache.modules
+      ++ ympd.apache.modules
+      ++ ttrss.apache.modules
+      ++ roundcubemail.apache.modules
+      ++ wallabag.apache.modules
+      ++ yourls.apache.modules
+      ++ rompr.apache.modules
+      ++ shaarli.apache.modules
+      ++ dokuwiki.apache.modules
+      ++ ldap.apache.modules
+      ++ kanboard.apache.modules;
+
+    services.websites.integration.vhostConfs.devtools = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["devtools.immae.eu" ];
+      root        = "/var/lib/ftp/devtools.immae.eu";
+      extraConfig = [
+        ''
+          <Directory "/var/lib/ftp/devtools.immae.eu">
+            DirectoryIndex index.php index.htm index.html
+            AllowOverride all
+            Require all granted
+            <FilesMatch "\.php$">
+              SetHandler "proxy:unix:/var/run/phpfpm/devtools.sock|fcgi://localhost"
+            </FilesMatch>
+          </Directory>
+          ''
+        rainloop.apache.vhostConf
+      ];
+    };
+
+    services.websites.tools.vhostConfs.tools = {
+      certName    = "eldiron";
+      addToCerts  = true;
+      hosts       = ["tools.immae.eu" ];
+      root        = "/var/lib/ftp/tools.immae.eu";
+      extraConfig = [
+        ''
+          <Directory "/var/lib/ftp/tools.immae.eu">
+            DirectoryIndex index.php index.htm index.html
+            AllowOverride all
+            Require all granted
+            <FilesMatch "\.php$">
+              SetHandler "proxy:unix:/var/run/phpfpm/tools.sock|fcgi://localhost"
+            </FilesMatch>
+          </Directory>
+          ''
+        adminer.apache.vhostConf
+        ympd.apache.vhostConf
+        ttrss.apache.vhostConf
+        roundcubemail.apache.vhostConf
+        wallabag.apache.vhostConf
+        yourls.apache.vhostConf
+        rompr.apache.vhostConf
+        shaarli.apache.vhostConf
+        dokuwiki.apache.vhostConf
+        ldap.apache.vhostConf
+        kanboard.apache.vhostConf
+      ];
+    };
+
+    services.websites.tools.vhostConfs.outils = {
+      certName   = "eldiron";
+      addToCerts = true;
+      hosts      = [ "outils.immae.eu" ];
+      root       = null;
+      extraConfig = [
+        ''
+        RedirectMatch 301 ^/mediagoblin(.*)$ https://mgoblin.immae.eu$1
+
+        RedirectMatch 301 ^/ether(.*)$       https://ether.immae.eu$1
+
+        RedirectMatch 301 ^/nextcloud(.*)$   https://cloud.immae.eu$1
+        RedirectMatch 301 ^/owncloud(.*)$    https://cloud.immae.eu$1
+
+        RedirectMatch 301 ^/carddavmate(.*)$ https://dav.immae.eu/infcloud$1
+        RedirectMatch 301 ^/caldavzap(.*)$   https://dav.immae.eu/infcloud$1
+        RedirectMatch 301 ^/caldav.php(.*)$  https://dav.immae.eu/caldav.php$1
+        RedirectMatch 301 ^/davical(.*)$     https://dav.immae.eu/davical$1
+
+        RedirectMatch 301 ^/taskweb(.*)$     https://task.immae.eu/taskweb$1
+
+        RedirectMatch 301 ^/(.*)$            https://tools.immae.eu/$1
+        ''
+      ];
+    };
+
+    systemd.services = {
+      phpfpm-dokuwiki = {
+        after = lib.mkAfter dokuwiki.phpFpm.serviceDeps;
+        wants = dokuwiki.phpFpm.serviceDeps;
+      };
+      phpfpm-kanboard = {
+        after = lib.mkAfter kanboard.phpFpm.serviceDeps;
+        wants = kanboard.phpFpm.serviceDeps;
+      };
+      phpfpm-ldap = {
+        after = lib.mkAfter ldap.phpFpm.serviceDeps;
+        wants = ldap.phpFpm.serviceDeps;
+      };
+      phpfpm-rainloop = {
+        after = lib.mkAfter rainloop.phpFpm.serviceDeps;
+        wants = rainloop.phpFpm.serviceDeps;
+      };
+      phpfpm-roundcubemail = {
+        after = lib.mkAfter roundcubemail.phpFpm.serviceDeps;
+        wants = roundcubemail.phpFpm.serviceDeps;
+      };
+      phpfpm-shaarli = {
+        after = lib.mkAfter shaarli.phpFpm.serviceDeps;
+        wants = shaarli.phpFpm.serviceDeps;
+      };
+      phpfpm-ttrss = {
+        after = lib.mkAfter ttrss.phpFpm.serviceDeps;
+        wants = ttrss.phpFpm.serviceDeps;
+      };
+      phpfpm-wallabag = {
+        after = lib.mkAfter wallabag.phpFpm.serviceDeps;
+        wants = wallabag.phpFpm.serviceDeps;
+        preStart = lib.mkAfter wallabag.phpFpm.preStart;
+      };
+      phpfpm-yourls = {
+        after = lib.mkAfter yourls.phpFpm.serviceDeps;
+        wants = yourls.phpFpm.serviceDeps;
+      };
+      ympd = {
+        description = "Standalone MPD Web GUI written in C";
+        wantedBy = [ "multi-user.target" ];
+        script = ''
+          export MPD_PASSWORD=$(cat /var/secrets/mpd)
+          ${pkgs.ympd}/bin/ympd --host ${ympd.config.host} --port ${toString ympd.config.port} --webport ${ympd.config.webPort} --user nobody
+          '';
+      };
+      tt-rss = {
+        description = "Tiny Tiny RSS feeds update daemon";
+        serviceConfig = {
+          User = "wwwrun";
+          ExecStart = "${pkgs.php}/bin/php ${ttrss.webRoot}/update.php --daemon";
+          StandardOutput = "syslog";
+          StandardError = "syslog";
+          PermissionsStartOnly = true;
+        };
+
+        wantedBy = [ "multi-user.target" ];
+        requires = ["postgresql.service"];
+        after = ["network.target" "postgresql.service"];
+      };
+    };
+
+    services.phpfpm.pools.roundcubemail = {
+      listen = roundcubemail.phpFpm.socket;
+      extraConfig = roundcubemail.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + roundcubemail.phpFpm.phpConfig;
+    };
+
+    services.phpfpm.pools.devtools = {
+      listen = "/var/run/phpfpm/devtools.sock";
+      extraConfig = ''
+        user = wwwrun
+        group = wwwrun
+        listen.owner = wwwrun
+        listen.group = wwwrun
+        pm = dynamic
+        pm.max_children = 60
+        pm.start_servers = 2
+        pm.min_spare_servers = 1
+        pm.max_spare_servers = 10
+
+        php_admin_value[open_basedir] = "/run/wrappers/bin/sendmail:/var/lib/ftp/devtools.immae.eu:/tmp"
+        '';
+      phpOptions = config.services.phpfpm.phpOptions + ''
+        extension=${pkgs.phpPackages.redis}/lib/php/extensions/redis.so
+        extension=${pkgs.phpPackages.apcu}/lib/php/extensions/apcu.so
+        zend_extension=${pkgs.php}/lib/php/extensions/opcache.so
+        '';
+    };
+
+    services.phpfpm.poolConfigs = {
+      adminer = adminer.phpFpm.pool;
+      ttrss = ttrss.phpFpm.pool;
+      wallabag = wallabag.phpFpm.pool;
+      yourls = yourls.phpFpm.pool;
+      rompr = rompr.phpFpm.pool;
+      shaarli = shaarli.phpFpm.pool;
+      dokuwiki = dokuwiki.phpFpm.pool;
+      ldap = ldap.phpFpm.pool;
+      rainloop = rainloop.phpFpm.pool;
+      kanboard = kanboard.phpFpm.pool;
+      tools = ''
+        listen = /var/run/phpfpm/tools.sock
+        user = wwwrun
+        group = wwwrun
+        listen.owner = wwwrun
+        listen.group = wwwrun
+        pm = dynamic
+        pm.max_children = 60
+        pm.start_servers = 2
+        pm.min_spare_servers = 1
+        pm.max_spare_servers = 10
+
+        ; Needed to avoid clashes in browser cookies (same domain)
+        php_value[session.name] = ToolsPHPSESSID
+        php_admin_value[open_basedir] = "/run/wrappers/bin/sendmail:/var/lib/ftp/tools.immae.eu:/tmp"
+        '';
+    };
+
+    system.activationScripts = {
+      adminer = adminer.activationScript;
+      ttrss = ttrss.activationScript;
+      roundcubemail = roundcubemail.activationScript;
+      wallabag = wallabag.activationScript;
+      yourls = yourls.activationScript;
+      rompr = rompr.activationScript;
+      shaarli = shaarli.activationScript;
+      dokuwiki = dokuwiki.activationScript;
+      rainloop = rainloop.activationScript;
+      kanboard = kanboard.activationScript;
+      ldap = ldap.activationScript;
+    };
+
+    myServices.websites.webappDirs = {
+      _adminer = adminer.webRoot;
+      "${dokuwiki.apache.webappName}" = dokuwiki.webRoot;
+      "${ldap.apache.webappName}" = "${ldap.webRoot}/htdocs";
+      "${rompr.apache.webappName}" = rompr.webRoot;
+      "${roundcubemail.apache.webappName}" = roundcubemail.webRoot;
+      "${shaarli.apache.webappName}" = shaarli.webRoot;
+      "${ttrss.apache.webappName}" = ttrss.webRoot;
+      "${wallabag.apache.webappName}" = wallabag.webRoot;
+      "${yourls.apache.webappName}" = yourls.webRoot;
+      "${rainloop.apache.webappName}" = rainloop.webRoot;
+      "${kanboard.apache.webappName}" = kanboard.webRoot;
+    };
+
+  };
+}
+
diff --git a/modules/private/websites/tools/tools/dokuwiki.nix b/modules/private/websites/tools/tools/dokuwiki.nix
new file mode 100644 (file)
index 0000000..c61d15f
--- /dev/null
@@ -0,0 +1,61 @@
+{ lib, stdenv, dokuwiki, dokuwiki-plugins }:
+rec {
+  varDir = "/var/lib/dokuwiki";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      if [ ! -d ${varDir} ]; then
+        install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+          ${varDir}/animals
+        cp -a ${webRoot}/conf.dist ${varDir}/conf
+        cp -a ${webRoot}/data.dist ${varDir}/data
+        cp -a ${webRoot}/
+        chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
+        chmod -R 755 ${varDir}/config ${varDir}/data
+      fi
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
+    '';
+  };
+  webRoot = dokuwiki.withPlugins (builtins.attrValues dokuwiki-plugins);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_dokuwiki";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /dokuwiki "${root}"
+      <Directory "${root}">
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride All
+        Options +FollowSymlinks
+        Require all granted
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot varDir ] ++ webRoot.plugins);
+    socket = "/var/run/phpfpm/dokuwiki.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = DokuwikiPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/kanboard.nix b/modules/private/websites/tools/tools/kanboard.nix
new file mode 100644 (file)
index 0000000..68f92b8
--- /dev/null
@@ -0,0 +1,86 @@
+{ env, kanboard }:
+rec {
+  varDir = "/var/lib/kanboard";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
+      install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess
+      install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config
+    '';
+  };
+  keys = [{
+    dest = "webapps/tools-kanboard";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+      define('MAIL_FROM', 'kanboard@tools.immae.eu');
+
+      define('DB_DRIVER', 'postgres');
+      define('DB_USERNAME', '${env.postgresql.user}');
+      define('DB_PASSWORD', '${env.postgresql.password}');
+      define('DB_HOSTNAME', '${env.postgresql.socket}');
+      define('DB_NAME', '${env.postgresql.database}');
+
+      define('DATA_DIR', '${varDir}');
+      define('LDAP_AUTH', true);
+      define('LDAP_SERVER', '${env.ldap.host}');
+      define('LDAP_START_TLS', true);
+
+      define('LDAP_BIND_TYPE', 'proxy');
+      define('LDAP_USERNAME', '${env.ldap.dn}');
+      define('LDAP_PASSWORD', '${env.ldap.password}');
+      define('LDAP_USER_BASE_DN', '${env.ldap.base}');
+      define('LDAP_USER_FILTER', '(&(memberOf=cn=users,cn=kanboard,ou=services,dc=immae,dc=eu)(uid=%s))');
+      define('LDAP_GROUP_ADMIN_DN', 'cn=admins,cn=kanboard,ou=services,dc=immae,dc=eu');
+      ?>
+      '';
+  }];
+  webRoot = kanboard { kanboard_config = "/var/secrets/webapps/tools-kanboard"; };
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_kanboard";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    Alias /kanboard "${root}"
+    <Directory "${root}">
+      DirectoryIndex index.php
+      AllowOverride All
+      Options FollowSymlinks
+      Require all granted
+
+      <FilesMatch "\.php$">
+        SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+      </FilesMatch>
+    </Directory>
+    <DirectoryMatch "${root}/data">
+      Require all denied
+    </DirectoryMatch>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" [ webRoot varDir "/var/secrets/webapps/tools-kanboard" ];
+    socket = "/var/run/phpfpm/kanboard.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = KanboardPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/ldap.nix b/modules/private/websites/tools/tools/ldap.nix
new file mode 100644 (file)
index 0000000..4585ee3
--- /dev/null
@@ -0,0 +1,74 @@
+{ lib, php, env, writeText, phpldapadmin }:
+rec {
+  activationScript = {
+    deps = [ "httpd" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/phpldapadmin
+      '';
+  };
+  keys = [{
+    dest = "webapps/tools-ldap";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+      $config->custom->appearance['show_clear_password'] = true;
+      $config->custom->appearance['hide_template_warning'] = true;
+      $config->custom->appearance['theme'] = "tango";
+      $config->custom->appearance['minimalMode'] = true;
+
+      $servers = new Datastore();
+
+      $servers->newServer('ldap_pla');
+      $servers->setValue('server','name','Immae&#x2019;s LDAP');
+      $servers->setValue('server','host','ldaps://${env.ldap.host}');
+      $servers->setValue('login','auth_type','cookie');
+      $servers->setValue('login','bind_id','${env.ldap.dn}');
+      $servers->setValue('login','bind_pass','${env.ldap.password}');
+      $servers->setValue('appearance','password_hash','ssha');
+      $servers->setValue('login','attr','uid');
+      $servers->setValue('login','fallback_dn',true);
+      '';
+  }];
+  webRoot = phpldapadmin.override { config = "/var/secrets/webapps/tools-ldap"; };
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_ldap";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /ldap "${root}"
+      <Directory "${root}">
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride None
+        Require all granted
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" [ webRoot "/var/secrets/webapps/tools-ldap" ];
+    socket = "/var/run/phpfpm/ldap.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = LdapPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin"
+      php_admin_value[session.save_path] = "/var/lib/php/sessions/phpldapadmin"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/rainloop.nix b/modules/private/websites/tools/tools/rainloop.nix
new file mode 100644 (file)
index 0000000..dbf0f24
--- /dev/null
@@ -0,0 +1,59 @@
+{ lib, pkgs, writeText, stdenv, fetchurl }:
+rec {
+  varDir = "/var/lib/rainloop";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
+    '';
+  };
+  webRoot = pkgs.rainloop-community.override { dataPath = "${varDir}/data"; };
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_rainloop";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    Alias /rainloop "${root}"
+    <Directory "${root}">
+      DirectoryIndex index.php
+      AllowOverride All
+      Options -FollowSymlinks
+      Require all granted
+
+      <FilesMatch "\.php$">
+        SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+      </FilesMatch>
+    </Directory>
+
+    <DirectoryMatch "${root}/data">
+      Require all denied
+    </DirectoryMatch>
+    '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" ];
+    basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
+    socket = "/var/run/phpfpm/rainloop.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = RainloopPHPSESSID
+      php_admin_value[upload_max_filesize] = 200M
+      php_admin_value[post_max_size] = 200M
+      php_admin_value[open_basedir] = "${basedir}:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/rompr.nix b/modules/private/websites/tools/tools/rompr.nix
new file mode 100644 (file)
index 0000000..fea59fc
--- /dev/null
@@ -0,0 +1,77 @@
+{ lib, env, rompr }:
+rec {
+  varDir = "/var/lib/rompr";
+  activationScript = ''
+    install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+      ${varDir}/prefs ${varDir}/albumart ${varDir}/phpSessions
+  '';
+  webRoot = rompr;
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "headers" "mime" "proxy_fcgi" ];
+    webappName = "tools_rompr";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /rompr ${root}
+
+      <Directory ${root}>
+        Options Indexes FollowSymLinks
+        DirectoryIndex index.php
+        AllowOverride all
+        Require all granted
+        Order allow,deny
+        Allow from all
+        ErrorDocument 404 /rompr/404.php
+        AddType image/x-icon .ico
+
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+      </Directory>
+
+      <Directory ${root}/albumart/small>
+          Header Set Cache-Control "max-age=0, no-store"
+          Header Set Cache-Control "no-cache, must-revalidate"
+      </Directory>
+
+      <Directory ${root}/albumart/asdownloaded>
+          Header Set Cache-Control "max-age=0, no-store"
+          Header Set Cache-Control "no-cache, must-revalidate"
+      </Directory>
+
+      <LocationMatch "^/rompr">
+        Use LDAPConnect
+        Require ldap-group   cn=users,cn=mpd,ou=services,dc=immae,dc=eu
+      </LocationMatch>
+      '';
+  };
+  phpFpm = rec {
+    basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
+    socket = "/var/run/phpfpm/rompr.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = RomprPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      php_flag[magic_quotes_gpc] = Off
+      php_flag[track_vars] = On
+      php_flag[register_globals] = Off
+      php_admin_flag[allow_url_fopen] = On
+      php_value[include_path] = ${webRoot}
+      php_admin_value[upload_tmp_dir] = "${varDir}/prefs"
+      php_admin_value[post_max_size] = 32M
+      php_admin_value[upload_max_filesize] = 32M
+      php_admin_value[memory_limit] = 256M
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/roundcubemail.nix b/modules/private/websites/tools/tools/roundcubemail.nix
new file mode 100644 (file)
index 0000000..8974d1b
--- /dev/null
@@ -0,0 +1,121 @@
+{ env, roundcubemail, roundcubemail-plugins, roundcubemail-skins, phpPackages, apacheHttpd }:
+rec {
+  varDir = "/var/lib/roundcubemail";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+        ${varDir}/cache ${varDir}/logs
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
+    '';
+  };
+  keys = [{
+    dest = "webapps/tools-roundcube";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+        $config['db_dsnw'] = '${env.psql_url}';
+        $config['default_host'] = 'ssl://mail.immae.eu';
+        $config['imap_conn_options'] = array("ssl" => array("verify_peer" => false));
+        $config['smtp_server'] = 'tls://mail.immae.eu';
+        $config['smtp_port'] = '25';
+        $config['managesieve_host'] = 'mail.immae.eu';
+        $config['managesieve_port'] = '4190';
+        $config['managesieve_usetls'] = true;
+        $config['managesieve_conn_options'] = array("ssl" => array("verify_peer" => false));
+
+        $config['imap_cache'] = 'db';
+        $config['messages_cache'] = 'db';
+
+        $config['support_url'] = ''';
+
+        $config['des_key'] = '${env.secret}';
+
+        $config['skin'] = 'elastic';
+        $config['plugins'] = array(
+          'attachment_reminder',
+          'emoticons',
+          'filesystem_attachments',
+          'hide_blockquote',
+          'identicon',
+          'identity_select',
+          'jqueryui',
+          'managesieve',
+          'newmail_notifier',
+          'vcard_attachments',
+          'zipdownload',
+
+          'automatic_addressbook',
+          'message_highlight',
+          'carddav',
+          // Ne marche pas ?: 'ident_switch',
+          // Ne marche pas ?: 'thunderbird_labels',
+        );
+
+        $config['language'] = 'fr_FR';
+
+        $config['drafts_mbox'] = 'Mail/Drafts';
+        $config['junk_mbox'] = 'Mail/Spam';
+        $config['sent_mbox'] = 'Mail/sent';
+        $config['trash_mbox'] = ''';
+        $config['default_folders'] = array('INBOX', 'Mail/Drafts', 'Mail/sent', 'Mail/Spam', ''');
+        $config['draft_autosave'] = 60;
+        $config['enable_installer'] = false;
+        $config['log_driver'] = 'file';
+        $config['temp_dir'] = '${varDir}/cache';
+        $config['mime_types'] = '${apacheHttpd}/conf/mime.types';
+    '';
+  }];
+  webRoot = (roundcubemail.override { roundcube_config = "/var/secrets/webapps/tools-roundcube"; }).withPlugins
+    (builtins.attrValues roundcubemail-plugins) (builtins.attrValues roundcubemail-skins);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_roundcubemail";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+    Alias /roundcube "${root}"
+    <Directory "${root}">
+        DirectoryIndex index.php
+        AllowOverride All
+        Options FollowSymlinks
+        Require all granted
+
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot "/var/secrets/webapps/tools-roundcube" varDir ]
+      ++ webRoot.plugins
+      ++ webRoot.skins);
+    phpConfig = ''
+      date.timezone = 'CET'
+      extension=${phpPackages.imagick}/lib/php/extensions/imagick.so
+      '';
+    socket = "/var/run/phpfpm/roundcubemail.sock";
+    pool = ''
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = RoundcubemailPHPSESSID
+      php_admin_value[upload_max_filesize] = 200M
+      php_admin_value[post_max_size] = 200M
+      php_admin_value[open_basedir] = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/shaarli.nix b/modules/private/websites/tools/tools/shaarli.nix
new file mode 100644 (file)
index 0000000..2e89a47
--- /dev/null
@@ -0,0 +1,65 @@
+{ lib, env, stdenv, fetchurl, shaarli }:
+let
+  varDir = "/var/lib/shaarli";
+in rec {
+  activationScript = ''
+    install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+      ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data \
+      ${varDir}/phpSessions
+    '';
+  webRoot = shaarli varDir;
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules =  [ "proxy_fcgi" "rewrite" "env" ];
+    webappName = "tools_shaarli";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /Shaarli "${root}"
+
+      Include /var/secrets/webapps/tools-shaarli
+      <Directory "${root}">
+        DirectoryIndex index.php index.htm index.html
+        Options Indexes FollowSymLinks MultiViews Includes
+        AllowOverride All
+        Require all granted
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+      </Directory>
+      '';
+  };
+  keys = [{
+    dest = "webapps/tools-shaarli";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      SetEnv SHAARLI_LDAP_PASSWORD "${env.ldap.password}"
+      SetEnv SHAARLI_LDAP_DN       "${env.ldap.dn}"
+      SetEnv SHAARLI_LDAP_HOST     "ldaps://${env.ldap.host}"
+      SetEnv SHAARLI_LDAP_BASE     "${env.ldap.base}"
+      SetEnv SHAARLI_LDAP_FILTER   "${env.ldap.search}"
+      '';
+  }];
+  phpFpm = rec {
+    serviceDeps = [ "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
+    socket = "/var/run/phpfpm/shaarli.sock";
+    pool = ''
+        listen = ${socket}
+        user = ${apache.user}
+        group = ${apache.group}
+        listen.owner = ${apache.user}
+        listen.group = ${apache.group}
+        pm = ondemand
+        pm.max_children = 60
+        pm.process_idle_timeout = 60
+
+        ; Needed to avoid clashes in browser cookies (same domain)
+        php_value[session.name] = ShaarliPHPSESSID
+        php_admin_value[open_basedir] = "${basedir}:/tmp"
+        php_admin_value[session.save_path] = "${varDir}/phpSessions"
+    '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/ttrss.nix b/modules/private/websites/tools/tools/ttrss.nix
new file mode 100644 (file)
index 0000000..05c8cab
--- /dev/null
@@ -0,0 +1,131 @@
+{ php, env, ttrss, ttrss-plugins }:
+rec {
+  varDir = "/var/lib/ttrss";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+        ${varDir}/lock ${varDir}/cache ${varDir}/feed-icons
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/cache/export/ \
+        ${varDir}/cache/feeds/ \
+        ${varDir}/cache/images/ \
+        ${varDir}/cache/js/ \
+        ${varDir}/cache/simplepie/ \
+        ${varDir}/cache/upload/
+      touch ${varDir}/feed-icons/index.html
+      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
+    '';
+  };
+  keys = [{
+    dest = "webapps/tools-ttrss";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+
+        define('PHP_EXECUTABLE', '${php}/bin/php');
+
+        define('LOCK_DIRECTORY', 'lock');
+        define('CACHE_DIR', 'cache');
+        define('ICONS_DIR', 'feed-icons');
+        define('ICONS_URL', 'feed-icons');
+        define('SELF_URL_PATH', 'https://tools.immae.eu/ttrss/');
+
+        define('MYSQL_CHARSET', 'UTF8');
+
+        define('DB_TYPE', 'pgsql');
+        define('DB_HOST', '${env.postgresql.socket}');
+        define('DB_USER', '${env.postgresql.user}');
+        define('DB_NAME', '${env.postgresql.database}');
+        define('DB_PASS', '${env.postgresql.password}');
+        define('DB_PORT', '${env.postgresql.port}');
+
+        define('AUTH_AUTO_CREATE', true);
+        define('AUTH_AUTO_LOGIN', true);
+
+        define('SINGLE_USER_MODE', false);
+
+        define('SIMPLE_UPDATE_MODE', false);
+        define('CHECK_FOR_UPDATES', true);
+
+        define('FORCE_ARTICLE_PURGE', 0);
+        define('SESSION_COOKIE_LIFETIME', 60*60*24*120);
+        define('ENABLE_GZIP_OUTPUT', false);
+
+        define('PLUGINS', 'auth_ldap, note, instances');
+
+        define('LOG_DESTINATION', ''');
+        define('CONFIG_VERSION', 26);
+
+
+        define('SPHINX_SERVER', 'localhost:9312');
+        define('SPHINX_INDEX', 'ttrss, delta');
+
+        define('ENABLE_REGISTRATION', false);
+        define('REG_NOTIFY_ADDRESS', 'ttrss@tools.immae.eu');
+        define('REG_MAX_USERS', 10);
+
+        define('SMTP_FROM_NAME', 'Tiny Tiny RSS');
+        define('SMTP_FROM_ADDRESS', 'ttrss@tools.immae.eu');
+        define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');
+
+        define('LDAP_AUTH_SERVER_URI', 'ldap://ldap.immae.eu:389/');
+        define('LDAP_AUTH_USETLS', TRUE);
+        define('LDAP_AUTH_ALLOW_UNTRUSTED_CERT', TRUE);
+        define('LDAP_AUTH_BASEDN', 'dc=immae,dc=eu');
+        define('LDAP_AUTH_ANONYMOUSBEFOREBIND', FALSE);
+        define('LDAP_AUTH_SEARCHFILTER', '(&(memberOf=cn=users,cn=ttrss,ou=services,dc=immae,dc=eu)(|(cn=???)(uid=???)(&(uid:dn:=???)(ou=ttrss))))');
+
+        define('LDAP_AUTH_BINDDN', 'cn=ttrss,ou=services,dc=immae,dc=eu');
+        define('LDAP_AUTH_BINDPW', '${env.ldap.password}');
+        define('LDAP_AUTH_LOGIN_ATTRIB', 'immaeTtrssLogin');
+
+        define('LDAP_AUTH_LOG_ATTEMPTS', FALSE);
+        define('LDAP_AUTH_DEBUG', FALSE);
+      '';
+  }];
+  webRoot = (ttrss.override { ttrss_config = "/var/secrets/webapps/tools-ttrss"; }).withPlugins (builtins.attrValues ttrss-plugins);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_ttrss";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /ttrss "${root}"
+      <Directory "${root}">
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride All
+        Options FollowSymlinks
+        Require all granted
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "postgresql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot "/var/secrets/webapps/tools-ttrss" varDir ]
+      ++ webRoot.plugins);
+    socket = "/var/run/phpfpm/ttrss.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = TtrssPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp"
+      php_admin_value[session.save_path] = "${varDir}/phpSessions"
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/wallabag.nix b/modules/private/websites/tools/tools/wallabag.nix
new file mode 100644 (file)
index 0000000..d6e5882
--- /dev/null
@@ -0,0 +1,148 @@
+{ env, wallabag }:
+rec {
+  varDir = "/var/lib/wallabag";
+  keys = [{
+    dest = "webapps/tools-wallabag";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      # This file is auto-generated during the composer install
+      parameters:
+          database_driver: pdo_pgsql
+          database_driver_class: Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver
+          database_host: ${env.postgresql.socket}
+          database_port: ${env.postgresql.port}
+          database_name: ${env.postgresql.database}
+          database_user: ${env.postgresql.user}
+          database_password: ${env.postgresql.password}
+          database_path: null
+          database_table_prefix: wallabag_
+          database_socket: null
+          database_charset: utf8
+          domain_name: https://tools.immae.eu/wallabag
+          mailer_transport: sendmail
+          mailer_host: 127.0.0.1
+          mailer_user: null
+          mailer_password: null
+          locale: fr
+          secret: ${env.secret}
+          twofactor_auth: true
+          twofactor_sender: wallabag@tools.immae.eu
+          fosuser_registration: false
+          fosuser_confirmation: true
+          from_email: wallabag@tools.immae.eu
+          rss_limit: 50
+          rabbitmq_host: localhost
+          rabbitmq_port: 5672
+          rabbitmq_user: guest
+          rabbitmq_password: guest
+          rabbitmq_prefetch_count: 10
+          redis_scheme: unix
+          redis_host: null
+          redis_port: null
+          redis_path: ${env.redis.socket}
+          redis_password: null
+          sites_credentials: {  }
+          ldap_enabled: true
+          ldap_host: ldap.immae.eu
+          ldap_port: 636
+          ldap_tls: false
+          ldap_ssl: true
+          ldap_bind_requires_dn: true
+          ldap_base: 'dc=immae,dc=eu'
+          ldap_manager_dn: 'cn=wallabag,ou=services,dc=immae,dc=eu'
+          ldap_manager_pw: ${env.ldap.password}
+          ldap_filter: '(&(memberOf=cn=users,cn=wallabag,ou=services,dc=immae,dc=eu))'
+          ldap_admin_filter: '(&(memberOf=cn=admins,cn=wallabag,ou=services,dc=immae,dc=eu)(uid=%s))'
+          ldap_username_attribute: uid
+          ldap_email_attribute: mail
+          ldap_name_attribute: cn
+          ldap_enabled_attribute: null
+      services:
+          swiftmailer.mailer.default.transport:
+              class:     Swift_SendmailTransport
+              arguments: ['/run/wrappers/bin/sendmail -bs']
+      '';
+  }];
+  webappDir = wallabag.override { ldap = true; wallabag_config = "/var/secrets/webapps/tools-wallabag"; };
+  activationScript = ''
+    install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+      ${varDir}/var ${varDir}/data/db ${varDir}/assets/images
+    '';
+  webRoot = "${webappDir}/web";
+  # Domain migration: Table wallabag_entry contains whole
+  # https://tools.immae.eu/wallabag domain name in preview_picture
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_wallabag";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /wallabag "${root}"
+      <Directory "${root}">
+        AllowOverride None
+        Require all granted
+        # For OAuth (apps)
+        CGIPassAuth On
+
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        <IfModule mod_rewrite.c>
+          Options -MultiViews
+          RewriteEngine On
+          RewriteCond %{REQUEST_FILENAME} !-f
+          RewriteRule ^(.*)$ app.php [QSA,L]
+        </IfModule>
+      </Directory>
+      <Directory "${root}/bundles">
+        <IfModule mod_rewrite.c>
+          RewriteEngine Off
+        </IfModule>
+      </Directory>
+      <Directory "${varDir}/assets">
+        AllowOverride None
+        Require all granted
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    preStart = ''
+      if [ ! -f "${varDir}/currentWebappDir" -o \
+          ! -f "${varDir}/currentKey" -o \
+          "${webappDir}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ] \
+          || ! sha512sum -c --status ${varDir}/currentKey; then
+        pushd ${webappDir} > /dev/null
+        /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
+        rm -rf /var/lib/wallabag/var/cache/pro_
+        /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate --no-interaction
+        popd > /dev/null
+        echo -n "${webappDir}" > ${varDir}/currentWebappDir
+        sha512sum /var/secrets/webapps/tools-wallabag > ${varDir}/currentKey
+      fi
+      '';
+    serviceDeps = [ "postgresql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" [ webappDir "/var/secrets/webapps/tools-wallabag" varDir ];
+    socket = "/var/run/phpfpm/wallabag.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = dynamic
+      pm.max_children = 60
+      pm.start_servers = 2
+      pm.min_spare_servers = 1
+      pm.max_spare_servers = 10
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = WallabagPHPSESSID
+      php_admin_value[open_basedir] = "/run/wrappers/bin/sendmail:${basedir}:/tmp"
+      php_value[max_execution_time] = 300
+      '';
+  };
+}
diff --git a/modules/private/websites/tools/tools/ympd.nix b/modules/private/websites/tools/tools/ympd.nix
new file mode 100644 (file)
index 0000000..b54c486
--- /dev/null
@@ -0,0 +1,40 @@
+{ env }:
+let
+  ympd = rec {
+    config = {
+      webPort = "localhost:${env.listenPort}";
+      host = env.mpd.host;
+      port = env.mpd.port;
+    };
+    apache = {
+      modules = [
+        "proxy_wstunnel"
+        ];
+      vhostConf = ''
+        <LocationMatch "^/mpd(?!/music.(mp3|ogg))">
+          Use LDAPConnect
+          Require ldap-group   cn=users,cn=mpd,ou=services,dc=immae,dc=eu
+        </LocationMatch>
+
+        RedirectMatch permanent "^/mpd$" "/mpd/"
+        <Location "/mpd/">
+          ProxyPass http://${config.webPort}/
+          ProxyPassReverse http://${config.webPort}/
+          ProxyPreserveHost on
+        </Location>
+        <Location "/mpd/ws">
+          ProxyPass ws://${config.webPort}/ws
+        </Location>
+        <Location "/mpd/music.mp3">
+          ProxyPass unix:///run/mpd/mp3.sock|http://tools.immae.eu/
+          ProxyPassReverse unix:///run/mpd/mp3.sock|http://tools.immae.eu/
+        </Location>
+        <Location "/mpd/music.ogg">
+          ProxyPass unix:///run/mpd/ogg.sock|http://tools.immae.eu/
+          ProxyPassReverse unix:///run/mpd/ogg.sock|http://tools.immae.eu/
+        </Location>
+      '';
+    };
+  };
+in
+  ympd
diff --git a/modules/private/websites/tools/tools/yourls.nix b/modules/private/websites/tools/tools/yourls.nix
new file mode 100644 (file)
index 0000000..0a8e837
--- /dev/null
@@ -0,0 +1,93 @@
+{ env, yourls, yourls-plugins }:
+rec {
+  activationScript = {
+    deps = [ "httpd" ];
+    text = ''
+      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/yourls
+    '';
+  };
+  keys = [{
+    dest = "webapps/tools-yourls";
+    user = apache.user;
+    group = apache.group;
+    permissions = "0400";
+    text = ''
+      <?php
+      define( 'YOURLS_DB_USER', '${env.mysql.user}' );
+      define( 'YOURLS_DB_PASS', '${env.mysql.password}' );
+      define( 'YOURLS_DB_NAME', '${env.mysql.database}' );
+      define( 'YOURLS_DB_HOST', '${env.mysql.host}' );
+      define( 'YOURLS_DB_PREFIX', 'yourls_' );
+      define( 'YOURLS_SITE', 'https://tools.immae.eu/url' );
+      define( 'YOURLS_HOURS_OFFSET', 0 ); 
+      define( 'YOURLS_LANG', ''' ); 
+      define( 'YOURLS_UNIQUE_URLS', true );
+      define( 'YOURLS_PRIVATE', true );
+      define( 'YOURLS_COOKIEKEY', '${env.cookieKey}' );
+      $yourls_user_passwords = array();
+      define( 'YOURLS_DEBUG', false );
+      define( 'YOURLS_URL_CONVERT', 36 );
+      $yourls_reserved_URL = array();
+      define( 'LDAPAUTH_HOST', 'ldaps://ldap.immae.eu' );
+      define( 'LDAPAUTH_PORT', '636' );
+      define( 'LDAPAUTH_BASE', 'dc=immae,dc=eu' );
+      define( 'LDAPAUTH_SEARCH_USER', 'cn=yourls,ou=services,dc=immae,dc=eu' );
+      define( 'LDAPAUTH_SEARCH_PASS', '${env.ldap.password}' );
+
+      define( 'LDAPAUTH_GROUP_ATTR', 'memberof' );
+      define( 'LDAPAUTH_GROUP_REQ', 'cn=admin,cn=yourls,ou=services,dc=immae,dc=eu');
+
+      define( 'LDAPAUTH_USERCACHE_TYPE', 0);
+    '';
+  }];
+  webRoot = (yourls.override { yourls_config = "/var/secrets/webapps/tools-yourls"; }).withPlugins
+    (builtins.attrValues yourls-plugins);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    webappName = "tools_yourls";
+    root = "/run/current-system/webapps/${webappName}";
+    vhostConf = ''
+      Alias /url "${root}"
+      <Directory "${root}">
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride None
+        Require all granted
+        <IfModule mod_rewrite.c>
+          RewriteEngine On
+          RewriteBase /url/
+          RewriteCond %{REQUEST_FILENAME} !-f
+          RewriteCond %{REQUEST_FILENAME} !-d
+          RewriteRule ^.*$ /url/yourls-loader.php [L]
+        </IfModule>
+        DirectoryIndex index.php
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "mysql.service" "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot "/var/secrets/webapps/tools-yourls" ]
+      ++ webRoot.plugins);
+    socket = "/var/run/phpfpm/yourls.sock";
+    pool = ''
+      listen = ${socket}
+      user = ${apache.user}
+      group = ${apache.group}
+      listen.owner = ${apache.user}
+      listen.group = ${apache.group}
+      pm = ondemand
+      pm.max_children = 60
+      pm.process_idle_timeout = 60
+
+      ; Needed to avoid clashes in browser cookies (same domain)
+      php_value[session.name] = YourlsPHPSESSID
+      php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/yourls"
+      php_admin_value[session.save_path] = "/var/lib/php/sessions/yourls"
+      '';
+  };
+}
diff --git a/modules/secrets.nix b/modules/secrets.nix
new file mode 100644 (file)
index 0000000..b282e56
--- /dev/null
@@ -0,0 +1,61 @@
+{ lib, pkgs, config, ... }:
+{
+  options.secrets = {
+    keys = lib.mkOption {
+      type = lib.types.listOf lib.types.unspecified;
+      default = [];
+      description = "Keys to upload to server";
+    };
+    location = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/secrets";
+      description = "Location where to put the keys";
+    };
+  };
+  config = let
+    location = config.secrets.location;
+    keys = config.secrets.keys;
+    empty = pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out && touch $out/done";
+    dumpKey = v: ''
+        mkdir -p secrets/$(dirname ${v.dest})
+        echo -n ${lib.strings.escapeShellArg v.text} > secrets/${v.dest}
+        cat >> mods <<EOF
+        ${v.user or "root"} ${v.group or "root"} ${v.permissions or "0600"} secrets/${v.dest}
+        EOF
+        '';
+    secrets = pkgs.runCommand "secrets.tar" {} ''
+      touch mods
+      tar --format=ustar --mtime='1970-01-01' -P --transform="s@${empty}@secrets@" -cf $out ${empty}/done
+      ${builtins.concatStringsSep "\n" (map dumpKey keys)}
+      cat mods | while read u g p k; do
+      tar --format=ustar --mtime='1970-01-01' --owner="$u" --group="$g" --mode="$p" --append -f $out "$k"
+      done
+      '';
+  in lib.mkIf (builtins.length keys > 0) {
+    system.activationScripts.secrets = {
+      deps = [ "users" "wrappers" ];
+      text = ''
+        install -m0750 -o root -g keys -d ${location}
+        if [ -f /run/keys/secrets.tar ]; then
+          if [ ! -f ${location}/currentSecrets ] || ! sha512sum -c --status "${location}/currentSecrets"; then
+            echo "rebuilding secrets"
+            rm -rf ${location}
+            install -m0750 -o root -g keys -d ${location}
+            ${pkgs.gnutar}/bin/tar --strip-components 1 -C ${location} -xf /run/keys/secrets.tar
+            sha512sum /run/keys/secrets.tar > ${location}/currentSecrets
+            find ${location} -type d -exec chown root:keys {} \; -exec chmod o-rx {} \;
+          fi
+        fi
+        '';
+    };
+    deployment.keys."secrets.tar" = {
+      permissions = "0400";
+      # keyFile below is not evaluated at build time by nixops, so the
+      # `secrets` path doesn’t necessarily exist when uploading the
+      # keys, and nixops is unhappy.
+      user = "root${builtins.substring 10000 1 secrets}";
+      group = "root";
+      keyFile = "${secrets}";
+    };
+  };
+}
diff --git a/modules/webapps/diaspora.nix b/modules/webapps/diaspora.nix
new file mode 100644 (file)
index 0000000..65599b7
--- /dev/null
@@ -0,0 +1,171 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "diaspora";
+  cfg = config.services.diaspora;
+
+  uid = config.ids.uids.diaspora;
+  gid = config.ids.gids.diaspora;
+in
+{
+  options.services.diaspora = {
+    enable = lib.mkEnableOption "Enable Diaspora’s service";
+    user = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "User account under which Diaspora runs";
+    };
+    group = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "Group under which Diaspora runs";
+    };
+    adminEmail = lib.mkOption {
+      type = lib.types.str;
+      example = "admin@example.com";
+      description = "Admin e-mail for Diaspora";
+    };
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Diaspora stores its data.
+      '';
+    };
+    socketsDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/run/${name}";
+      description = ''
+        The directory where Diaspora puts runtime files and sockets.
+        '';
+    };
+    configDir = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The configuration path for Diaspora.
+        '';
+    };
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.webapps.diaspora;
+      description = ''
+        Diaspora package to use.
+        '';
+    };
+    # Output variables
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Diaspora data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Diaspora sockets directory for systemd
+      '';
+      readOnly = true;
+    };
+    workdir = lib.mkOption {
+      type = lib.types.package;
+      default = cfg.package.override {
+        varDir = cfg.dataDir;
+        podmin_email = cfg.adminEmail;
+        config_dir = cfg.configDir;
+      };
+      description = ''
+        Adjusted diaspora package with overriden values
+        '';
+      readOnly = true;
+    };
+    sockets = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        rails = "${cfg.socketsDir}/diaspora.sock";
+        eye   = "${cfg.socketsDir}/eye.sock";
+      };
+      readOnly = true;
+      description = ''
+        Diaspora sockets
+        '';
+    };
+    pids = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        eye   = "${cfg.socketsDir}/eye.pid";
+      };
+      readOnly = true;
+      description = ''
+        Diaspora pids
+        '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users = lib.optionalAttrs (cfg.user == name) (lib.singleton {
+      inherit name;
+      inherit uid;
+      group = cfg.group;
+      description = "Diaspora user";
+      home = cfg.dataDir;
+      packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
+      useDefaultShell = true;
+    });
+    users.groups = lib.optionalAttrs (cfg.group == name) (lib.singleton {
+      inherit name;
+      inherit gid;
+    });
+
+    systemd.services.diaspora = {
+      description = "Diaspora";
+      wantedBy = [ "multi-user.target" ];
+      after = [
+        "network.target" "redis.service" "postgresql.service"
+      ];
+      wants = [
+        "redis.service" "postgresql.service"
+      ];
+
+      environment.RAILS_ENV = "production";
+      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+      environment.EYE_SOCK = cfg.sockets.eye;
+      environment.EYE_PID = cfg.pids.eye;
+
+      path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
+
+      preStart = ''
+        install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
+        install -m 0700 -d ${cfg.dataDir}/tmp/pids
+        if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
+          echo "{}" > ${cfg.dataDir}/schedule.yml
+        fi
+        ./bin/bundle exec rails db:migrate
+      '';
+
+      script = ''
+        exec ${cfg.workdir}/script/server
+      '';
+
+      serviceConfig = {
+        User = cfg.user;
+        PrivateTmp = true;
+        Restart = "always";
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StandardInput = "null";
+        KillMode = "control-group";
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+  };
+}
diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix
new file mode 100644 (file)
index 0000000..7f0e2ed
--- /dev/null
@@ -0,0 +1,158 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "etherpad-lite";
+  cfg = config.services.etherpad-lite;
+
+  uid = config.ids.uids.etherpad-lite;
+  gid = config.ids.gids.etherpad-lite;
+in
+{
+  options.services.etherpad-lite = {
+    enable = lib.mkEnableOption "Enable Etherpad lite’s service";
+    user = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "User account under which Etherpad lite runs";
+    };
+    group = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "Group under which Etherpad lite runs";
+    };
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Etherpad lite stores its data.
+      '';
+    };
+    socketsDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/run/${name}";
+      description = ''
+        The directory where Etherpad lite stores its sockets.
+      '';
+    };
+    configFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The config file path for Etherpad lite.
+        '';
+    };
+    sessionKeyFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The Session key file path for Etherpad lite.
+        '';
+    };
+    apiKeyFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The API key file path for Etherpad lite.
+        '';
+    };
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.webapps.etherpad-lite;
+      description = ''
+        Etherpad lite package to use.
+        '';
+    };
+    modules = lib.mkOption {
+      type = lib.types.listOf lib.types.package;
+      default = [];
+      description = ''
+        Etherpad lite modules to use.
+        '';
+    };
+    # Output variables
+    workdir = lib.mkOption {
+      type = lib.types.package;
+      default = cfg.package.withModules cfg.modules;
+      description = ''
+      Adjusted Etherpad lite package with plugins
+      '';
+      readOnly = true;
+    };
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Etherpad lite data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Etherpad lite sockets directory for systemd
+      '';
+      readOnly = true;
+    };
+    sockets = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        node  = "${cfg.socketsDir}/etherpad-lite.sock";
+      };
+      readOnly = true;
+      description = ''
+        Etherpad lite sockets
+        '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    systemd.services.etherpad-lite = {
+      description = "Etherpad-lite";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" "postgresql.service" ];
+      wants = [ "postgresql.service" ];
+
+      environment.NODE_ENV = "production";
+      environment.HOME = cfg.workdir;
+
+      path = [ pkgs.nodejs ];
+
+      script = ''
+        exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
+          --sessionkey ${cfg.sessionKeyFile} \
+          --apikey ${cfg.apiKeyFile} \
+          --settings ${cfg.configFile}
+      '';
+
+      postStart = ''
+        while [ ! -S ${cfg.sockets.node} ]; do
+          sleep 0.5
+        done
+        chmod a+w ${cfg.sockets.node}
+        '';
+      serviceConfig = {
+        DynamicUser = true;
+        User = cfg.user;
+        Group = cfg.group;
+        WorkingDirectory = cfg.workdir;
+        PrivateTmp = true;
+        NoNewPrivileges = true;
+        PrivateDevices = true;
+        ProtectHome = true;
+        ProtectControlGroups = true;
+        ProtectKernelModules = true;
+        Restart = "always";
+        Type = "simple";
+        TimeoutSec = 60;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StateDirectory= cfg.systemdStateDirectory;
+        ExecStartPre = [
+          "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized"
+          "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
+        ];
+      };
+    };
+
+  };
+}
diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix
new file mode 100644 (file)
index 0000000..6255de9
--- /dev/null
@@ -0,0 +1,223 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "mastodon";
+  cfg = config.services.mastodon;
+
+  uid = config.ids.uids.mastodon;
+  gid = config.ids.gids.mastodon;
+in
+{
+  options.services.mastodon = {
+    enable = lib.mkEnableOption "Enable Mastodon’s service";
+    user = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "User account under which Mastodon runs";
+    };
+    group = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "Group under which Mastodon runs";
+    };
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Mastodon stores its data.
+      '';
+    };
+    socketsPrefix = lib.mkOption {
+      type = lib.types.string;
+      default = "live";
+      description = ''
+        The prefix to use for Mastodon sockets.
+        '';
+    };
+    socketsDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/run/${name}";
+      description = ''
+        The directory where Mastodon puts runtime files and sockets.
+        '';
+    };
+    configFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The configuration file path for Mastodon.
+        '';
+    };
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.webapps.mastodon;
+      description = ''
+        Mastodon package to use.
+        '';
+    };
+    # Output variables
+    workdir = lib.mkOption {
+      type = lib.types.package;
+      default = cfg.package.override { varDir = cfg.dataDir; };
+      description = ''
+      Adjusted mastodon package with overriden varDir
+      '';
+      readOnly = true;
+    };
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Mastodon data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Mastodon sockets directory for systemd
+      '';
+      readOnly = true;
+    };
+    sockets = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        node  = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
+        rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
+      };
+      readOnly = true;
+      description = ''
+        Mastodon sockets
+        '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users = lib.optionalAttrs (cfg.user == name) (lib.singleton {
+      inherit name;
+      inherit uid;
+      group = cfg.group;
+      description = "Mastodon user";
+      home = cfg.dataDir;
+      useDefaultShell = true;
+    });
+    users.groups = lib.optionalAttrs (cfg.group == name) (lib.singleton {
+      inherit name;
+      inherit gid;
+    });
+
+    systemd.services.mastodon-streaming = {
+      description = "Mastodon Streaming";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" "mastodon-web.service" ];
+
+      environment.NODE_ENV = "production";
+      environment.SOCKET = cfg.sockets.node;
+
+      path = [ pkgs.nodejs pkgs.bashInteractive ];
+
+      script = ''
+        exec npm run start
+      '';
+
+      postStart = ''
+        while [ ! -S $SOCKET ]; do
+          sleep 0.5
+        done
+        chmod a+w $SOCKET
+      '';
+
+      postStop = ''
+        rm $SOCKET
+      '';
+
+      serviceConfig = {
+        User = cfg.user;
+        EnvironmentFile = cfg.configFile;
+        PrivateTmp = true;
+        Restart = "always";
+        TimeoutSec = 15;
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+
+    systemd.services.mastodon-web = {
+      description = "Mastodon Web app";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" ];
+
+      environment.RAILS_ENV = "production";
+      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+      environment.SOCKET = cfg.sockets.rails;
+
+      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
+
+      preStart = ''
+        install -m 0755 -d ${cfg.dataDir}/tmp/cache
+        ./bin/bundle exec rails db:migrate
+      '';
+
+      script = ''
+        exec ./bin/bundle exec puma -C config/puma.rb
+      '';
+
+      serviceConfig = {
+        User = cfg.user;
+        EnvironmentFile = cfg.configFile;
+        PrivateTmp = true;
+        Restart = "always";
+        TimeoutSec = 60;
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+
+    systemd.services.mastodon-sidekiq = {
+      description = "Mastodon Sidekiq";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" "mastodon-web.service" ];
+
+      environment.RAILS_ENV="production";
+      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+      environment.DB_POOL="5";
+
+      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
+
+      script = ''
+        exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
+      '';
+
+      serviceConfig = {
+        User = cfg.user;
+        EnvironmentFile = cfg.configFile;
+        PrivateTmp = true;
+        Restart = "always";
+        TimeoutSec = 15;
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        StateDirectory = cfg.systemdStateDirectory;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        RuntimeDirectoryPreserve = "yes";
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+
+  };
+}
diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix
new file mode 100644 (file)
index 0000000..78bbef6
--- /dev/null
@@ -0,0 +1,237 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "mediagoblin";
+  cfg = config.services.mediagoblin;
+
+  uid = config.ids.uids.mediagoblin;
+  gid = config.ids.gids.mediagoblin;
+
+  paste_local = pkgs.writeText "paste_local.ini" ''
+    [DEFAULT]
+    debug = false
+
+    [pipeline:main]
+    pipeline = mediagoblin
+
+    [app:mediagoblin]
+    use = egg:mediagoblin#app
+    config = ${cfg.configFile} ${cfg.workdir}/mediagoblin.ini
+    /mgoblin_static = ${cfg.workdir}/mediagoblin/static
+
+    [loggers]
+    keys = root
+
+    [handlers]
+    keys = console
+
+    [formatters]
+    keys = generic
+
+    [logger_root]
+    level = INFO
+    handlers = console
+
+    [handler_console]
+    class = StreamHandler
+    args = (sys.stderr,)
+    level = NOTSET
+    formatter = generic
+
+    [formatter_generic]
+    format = %(levelname)-7.7s [%(name)s] %(message)s
+
+    [filter:errors]
+    use = egg:mediagoblin#errors
+    debug = false
+
+    [server:main]
+    use = egg:waitress#main
+    unix_socket = ${cfg.sockets.paster}
+    unix_socket_perms = 777
+    url_scheme = https
+    '';
+in
+{
+  options.services.mediagoblin = {
+    enable = lib.mkEnableOption "Enable Mediagoblin’s service";
+    user = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "User account under which Mediagoblin runs";
+    };
+    group = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "Group under which Mediagoblin runs";
+    };
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Mediagoblin stores its data.
+      '';
+    };
+    socketsDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/run/${name}";
+      description = ''
+        The directory where Mediagoblin puts runtime files and sockets.
+        '';
+    };
+    configFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The configuration file path for Mediagoblin.
+        '';
+    };
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.webapps.mediagoblin;
+      description = ''
+        Mediagoblin package to use.
+        '';
+    };
+    plugins = lib.mkOption {
+      type = lib.types.listOf lib.types.package;
+      default = [];
+      description = ''
+        Mediagoblin plugins to use.
+        '';
+    };
+    # Output variables
+    workdir = lib.mkOption {
+      type = lib.types.package;
+      default = cfg.package.withPlugins cfg.plugins;
+      description = ''
+      Adjusted Mediagoblin package with plugins
+      '';
+      readOnly = true;
+    };
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Mediagoblin data directory for systemd
+      '';
+      readOnly = true;
+    };
+    systemdRuntimeDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if socketsDir is outside of /run
+      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+        lib.strings.removePrefix "/run/" cfg.socketsDir;
+      description = ''
+      Adjusted Mediagoblin sockets directory for systemd
+      '';
+      readOnly = true;
+    };
+    sockets = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        paster = "${cfg.socketsDir}/mediagoblin.sock";
+      };
+      readOnly = true;
+      description = ''
+        Mediagoblin sockets
+        '';
+    };
+    pids = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      default = {
+        paster = "${cfg.socketsDir}/mediagoblin.pid";
+        celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
+      };
+      readOnly = true;
+      description = ''
+        Mediagoblin pid files
+        '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users = lib.optionalAttrs (cfg.user == name) (lib.singleton {
+      inherit name;
+      inherit uid;
+      group = cfg.group;
+      description = "Mediagoblin user";
+      home = cfg.dataDir;
+      useDefaultShell = true;
+    });
+    users.groups = lib.optionalAttrs (cfg.group == name) (lib.singleton {
+      inherit name;
+      inherit gid;
+    });
+
+    systemd.services.mediagoblin-web = {
+      description = "Mediagoblin service";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" ];
+      wants = [ "postgresql.service" "redis.service" ];
+
+      environment.SCRIPT_NAME = "/mediagoblin/";
+
+      script = ''
+        exec ./bin/paster serve \
+          ${paste_local} \
+          --pid-file=${cfg.pids.paster}
+        '';
+      preStop = ''
+        exec ./bin/paster serve \
+          --pid-file=${cfg.pids.paster} \
+          ${paste_local} stop
+        '';
+      preStart = ''
+        if [ -d ${cfg.dataDir}/plugin_static/ ]; then
+          rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+          ln -sf ${cfg.workdir}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+        fi
+        ./bin/gmg -cf ${cfg.configFile} dbupdate
+        '';
+
+      serviceConfig = {
+        User = cfg.user;
+        PrivateTmp = true;
+        Restart = "always";
+        TimeoutSec = 15;
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StateDirectory= cfg.systemdStateDirectory;
+        PIDFile = cfg.pids.paster;
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+
+    systemd.services.mediagoblin-celeryd = {
+      description = "Mediagoblin service";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" "mediagoblin-web.service" ];
+
+      environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
+      environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
+
+      script = ''
+        exec ./bin/celery worker \
+          --logfile=${cfg.dataDir}/celery.log \
+          --loglevel=INFO
+        '';
+
+      serviceConfig = {
+        User = cfg.user;
+        PrivateTmp = true;
+        Restart = "always";
+        TimeoutSec = 60;
+        Type = "simple";
+        WorkingDirectory = cfg.workdir;
+        RuntimeDirectory = cfg.systemdRuntimeDirectory;
+        StateDirectory= cfg.systemdStateDirectory;
+        PIDFile = cfg.pids.celery;
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+  };
+}
diff --git a/modules/webapps/peertube.nix b/modules/webapps/peertube.nix
new file mode 100644 (file)
index 0000000..89dcc67
--- /dev/null
@@ -0,0 +1,105 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "peertube";
+  cfg = config.services.peertube;
+
+  uid = config.ids.uids.peertube;
+  gid = config.ids.gids.peertube;
+in
+{
+  options.services.peertube = {
+    enable = lib.mkEnableOption "Enable Peertube’s service";
+    user = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "User account under which Peertube runs";
+    };
+    group = lib.mkOption {
+      type = lib.types.str;
+      default = name;
+      description = "Group under which Peertube runs";
+    };
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Peertube stores its data.
+      '';
+    };
+    configFile = lib.mkOption {
+      type = lib.types.path;
+      description = ''
+        The configuration file path for Peertube.
+        '';
+    };
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.webapps.peertube;
+      description = ''
+        Peertube package to use.
+        '';
+    };
+    # Output variables
+    systemdStateDirectory = lib.mkOption {
+      type = lib.types.str;
+      # Use ReadWritePaths= instead if varDir is outside of /var/lib
+      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+      description = ''
+      Adjusted Peertube data directory for systemd
+      '';
+      readOnly = true;
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.users = lib.optionalAttrs (cfg.user == name) (lib.singleton {
+      inherit name;
+      inherit uid;
+      group = cfg.group;
+      description = "Peertube user";
+      home = cfg.dataDir;
+      useDefaultShell = true;
+    });
+    users.groups = lib.optionalAttrs (cfg.group == name) (lib.singleton {
+      inherit name;
+      inherit gid;
+    });
+
+    systemd.services.peertube = {
+      description = "Peertube";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" "postgresql.service" ];
+      wants = [ "postgresql.service" ];
+
+      environment.NODE_CONFIG_DIR = "${cfg.dataDir}/config";
+      environment.NODE_ENV = "production";
+      environment.HOME = cfg.package;
+
+      path = [ pkgs.nodejs pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ];
+
+      script = ''
+        install -m 0750 -d ${cfg.dataDir}/config
+        ln -sf ${cfg.configFile} ${cfg.dataDir}/config/production.yaml
+        exec npm run start
+      '';
+
+      serviceConfig = {
+        User = cfg.user;
+        Group = cfg.group;
+        WorkingDirectory = cfg.package;
+        StateDirectory = cfg.systemdStateDirectory;
+        StateDirectoryMode = 0750;
+        PrivateTmp = true;
+        ProtectHome = true;
+        ProtectControlGroups = true;
+        Restart = "always";
+        Type = "simple";
+        TimeoutSec = 60;
+      };
+
+      unitConfig.RequiresMountsFor = cfg.dataDir;
+    };
+  };
+}
+
diff --git a/modules/webapps/webstats/default.nix b/modules/webapps/webstats/default.nix
new file mode 100644 (file)
index 0000000..924d72d
--- /dev/null
@@ -0,0 +1,81 @@
+{ lib, pkgs, config, ... }:
+let
+  name = "goaccess";
+  cfg = config.services.webstats;
+in {
+  options.services.webstats = {
+    dataDir = lib.mkOption {
+      type = lib.types.path;
+      default = "/var/lib/${name}";
+      description = ''
+        The directory where Goaccess stores its data.
+      '';
+    };
+    sites = lib.mkOption {
+      type = lib.types.listOf (lib.types.submodule {
+        options = {
+          conf = lib.mkOption {
+            type = lib.types.nullOr lib.types.path;
+            default = null;
+            description = ''
+              use custom goaccess configuration file instead of the
+              default one.
+              '';
+          };
+          name = lib.mkOption {
+            type = lib.types.string;
+            description  = ''
+              Domain name. Corresponds to the Apache file name and the
+              folder name in which the state will be saved.
+              '';
+          };
+        };
+      });
+      default = [];
+      description = "Sites to generate stats";
+    };
+  };
+
+  config = lib.mkIf (builtins.length cfg.sites > 0) {
+    users.users.root.packages = [
+      pkgs.goaccess
+    ];
+
+    services.cron = {
+      enable = true;
+      systemCronJobs = let
+        stats = domain: conf: let
+          config = if builtins.isNull conf
+            then pkgs.runCommand "goaccess.conf" {
+                dbPath = "${cfg.dataDir}/${domain}";
+              } "substituteAll ${./goaccess.conf} $out"
+            else conf;
+          d = pkgs.writeScriptBin "stats-${domain}" ''
+            #!${pkgs.stdenv.shell}
+            set -e
+            shopt -s nullglob
+            date_regex=$(LC_ALL=C date -d yesterday +'%d\/%b\/%Y')
+            TMPFILE=$(mktemp)
+            trap "rm -f $TMPFILE" EXIT
+
+            mkdir -p ${cfg.dataDir}/${domain}
+            cat /var/log/httpd/access-${domain}.log | sed -n "/\\[$date_regex/ p" > $TMPFILE
+            for i in /var/log/httpd/access-${domain}*.gz; do
+              zcat "$i" | sed -n "/\\[$date_regex/ p" >> $TMPFILE
+            done
+            ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
+            '';
+          in "${d}/bin/stats-${domain}";
+        allStats = sites: pkgs.writeScript "stats" ''
+          #!${pkgs.stdenv.shell}
+
+          mkdir -p ${cfg.dataDir}
+          ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
+          '';
+      in
+        [
+          "5 0 * * * root ${allStats cfg.sites}"
+        ];
+    };
+  };
+}
diff --git a/modules/webapps/webstats/goaccess.conf b/modules/webapps/webstats/goaccess.conf
new file mode 100644 (file)
index 0000000..4918988
--- /dev/null
@@ -0,0 +1,99 @@
+time-format %H:%M:%S
+date-format %d/%b/%Y
+
+#sur immae.eu
+#log-format %v %h %^[%d:%t %^] "%r" %s %b "%R" "%u" $^
+
+log-format VCOMBINED
+#= %v:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
+
+html-prefs {"theme":"bright","layout":"vertical"}
+
+exclude-ip 188.165.209.148
+exclude-ip 178.33.252.96
+exclude-ip 2001:41d0:2:9c94::1
+exclude-ip 2001:41d0:2:9c94::
+exclude-ip 176.9.151.89
+exclude-ip 2a01:4f8:160:3445::
+exclude-ip 82.255.56.72
+
+no-query-string true
+
+keep-db-files true
+load-from-disk true
+db-path @dbPath@
+
+ignore-panel REFERRERS
+ignore-panel KEYPHRASES
+
+static-file .css
+static-file .js
+static-file .jpg
+static-file .png
+static-file .gif
+static-file .ico
+static-file .jpeg
+static-file .pdf
+static-file .csv
+static-file .mpeg
+static-file .mpg
+static-file .swf
+static-file .woff
+static-file .woff2
+static-file .xls
+static-file .xlsx
+static-file .doc
+static-file .docx
+static-file .ppt
+static-file .pptx
+static-file .txt
+static-file .zip
+static-file .ogg
+static-file .mp3
+static-file .mp4
+static-file .exe
+static-file .iso
+static-file .gz
+static-file .rar
+static-file .svg
+static-file .bmp
+static-file .tar
+static-file .tgz
+static-file .tiff
+static-file .tif
+static-file .ttf
+static-file .flv
+#static-file .less
+#static-file .ac3
+#static-file .avi
+#static-file .bz2
+#static-file .class
+#static-file .cue
+#static-file .dae
+#static-file .dat
+#static-file .dts
+#static-file .ejs
+#static-file .eot
+#static-file .eps
+#static-file .img
+#static-file .jar
+#static-file .map
+#static-file .mid
+#static-file .midi
+#static-file .ogv
+#static-file .webm
+#static-file .mkv
+#static-file .odp
+#static-file .ods
+#static-file .odt
+#static-file .otf
+#static-file .pict
+#static-file .pls
+#static-file .ps
+#static-file .qt
+#static-file .rm
+#static-file .svgz
+#static-file .wav
+#static-file .webp
+
+
diff --git a/modules/websites/default.nix b/modules/websites/default.nix
new file mode 100644 (file)
index 0000000..e57f505
--- /dev/null
@@ -0,0 +1,199 @@
+{ lib, config, ... }: with lib;
+let
+  cfg = config.services.websites;
+in
+{
+  options.services.websitesCerts = mkOption {
+    description = "Default websites configuration for certificates as accepted by acme";
+  };
+  options.services.websites = with types; mkOption {
+    default = {};
+    description = "Each type of website to enable will target a distinct httpd server";
+    type = attrsOf (submodule {
+      options = {
+        enable = mkEnableOption "Enable websites of this type";
+        adminAddr = mkOption {
+          type = str;
+          description = "Admin e-mail address of the instance";
+        };
+        httpdName = mkOption {
+          type = str;
+          description = "Name of the httpd instance to assign this type to";
+        };
+        ips = mkOption {
+          type = listOf string;
+          default = [];
+          description = "ips to listen to";
+        };
+        modules = mkOption {
+          type = listOf str;
+          default = [];
+          description = "Additional modules to load in Apache";
+        };
+        extraConfig = mkOption {
+          type = listOf lines;
+          default = [];
+          description = "Additional configuration to append to Apache";
+        };
+        nosslVhost = mkOption {
+          description = "A default nossl vhost for captive portals";
+          default = {};
+          type = submodule {
+            options = {
+              enable = mkEnableOption "Add default no-ssl vhost for this instance";
+              host = mkOption {
+                type = string;
+                description = "The hostname to use for this vhost";
+              };
+              root = mkOption {
+                type = path;
+                default = ./nosslVhost;
+                description = "The root folder to serve";
+              };
+              indexFile = mkOption {
+                type = string;
+                default = "index.html";
+                description = "The index file to show.";
+              };
+            };
+          };
+        };
+        fallbackVhost = mkOption {
+          description = "The fallback vhost that will be defined as first vhost in Apache";
+          type = submodule {
+            options = {
+              certName = mkOption { type = string; };
+              hosts    = mkOption { type = listOf string; };
+              root     = mkOption { type = nullOr path; };
+              extraConfig = mkOption { type = listOf lines; default = []; };
+            };
+          };
+        };
+        vhostConfs = mkOption {
+          default = {};
+          description = "List of vhosts to define for Apache";
+          type = attrsOf (submodule {
+            options = {
+              certName = mkOption { type = string; };
+              addToCerts = mkOption {
+                type = bool;
+                default = false;
+                description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null";
+              };
+              certMainHost = mkOption {
+                type = nullOr string;
+                description = "Use that host as 'main host' for acme certs";
+                default = null;
+              };
+              hosts    = mkOption { type = listOf string; };
+              root     = mkOption { type = nullOr path; };
+              extraConfig = mkOption { type = listOf lines; default = []; };
+            };
+          });
+        };
+      };
+    });
+  };
+
+  config.services.httpd = let
+    redirectVhost = ips: { # Should go last, catchall http -> https redirect
+      listen = map (ip: { inherit ip; port = 80; }) ips;
+      hostName = "redirectSSL";
+      serverAliases = [ "*" ];
+      enableSSL = false;
+      logFormat = "combinedVhost";
+      documentRoot = "${config.security.acme.directory}/acme-challenge";
+      extraConfig = ''
+        RewriteEngine on
+        RewriteCond "%{REQUEST_URI}"   "!^/\.well-known"
+        RewriteRule ^(.+)              https://%{HTTP_HOST}$1  [R=301]
+        # To redirect in specific "VirtualHost *:80", do
+        #   RedirectMatch 301 ^/((?!\.well-known.*$).*)$ https://host/$1
+        # rather than rewrite
+      '';
+    };
+    nosslVhost = ips: cfg: {
+      listen = map (ip: { inherit ip; port = 80; }) ips;
+      hostName = cfg.host;
+      enableSSL = false;
+      logFormat = "combinedVhost";
+      documentRoot = cfg.root;
+      extraConfig = ''
+        <Directory ${cfg.root}>
+          DirectoryIndex ${cfg.indexFile}
+          AllowOverride None
+          Require all granted
+
+          RewriteEngine on
+          RewriteRule ^/(.+)   /   [L]
+        </Directory>
+        '';
+    };
+    toVhost = ips: vhostConf: {
+      enableSSL = true;
+      sslServerCert = "${config.security.acme.directory}/${vhostConf.certName}/cert.pem";
+      sslServerKey = "${config.security.acme.directory}/${vhostConf.certName}/key.pem";
+      sslServerChain = "${config.security.acme.directory}/${vhostConf.certName}/chain.pem";
+      logFormat = "combinedVhost";
+      listen = map (ip: { inherit ip; port = 443; }) ips;
+      hostName = builtins.head vhostConf.hosts;
+      serverAliases = builtins.tail vhostConf.hosts or [];
+      documentRoot = vhostConf.root;
+      extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig;
+    };
+  in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
+    icfg.httpdName (mkIf icfg.enable {
+      enable = true;
+      listen = map (ip: { inherit ip; port = 443; }) icfg.ips;
+      stateDir = "/run/httpd_${name}";
+      logPerVirtualHost = true;
+      multiProcessingModule = "worker";
+      inherit (icfg) adminAddr;
+      logFormat = "combinedVhost";
+      extraModules = lists.unique icfg.modules;
+      extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig;
+      virtualHosts = [ (toVhost icfg.ips icfg.fallbackVhost) ]
+        ++ optionals (icfg.nosslVhost.enable) [ (nosslVhost icfg.ips icfg.nosslVhost) ]
+        ++ (attrsets.mapAttrsToList (n: v: toVhost icfg.ips v) icfg.vhostConfs)
+        ++ [ (redirectVhost icfg.ips) ];
+    })
+  ) cfg;
+
+  config.security.acme.certs = let
+    typesToManage = attrsets.filterAttrs (k: v: v.enable) cfg;
+    flatVhosts = lists.flatten (attrsets.mapAttrsToList (k: v:
+      attrValues v.vhostConfs
+    ) typesToManage);
+    groupedCerts = attrsets.filterAttrs
+      (_: group: builtins.any (v: v.addToCerts || !isNull v.certMainHost) group)
+      (lists.groupBy (v: v.certName) flatVhosts);
+    groupToDomain = group:
+      let
+        nonNull = builtins.filter (v: !isNull v.certMainHost) group;
+        domains = lists.unique (map (v: v.certMainHost) nonNull);
+      in
+        if builtins.length domains == 0
+          then null
+          else assert (builtins.length domains == 1); (elemAt domains 0);
+    extraDomains = group:
+      let
+        mainDomain = groupToDomain group;
+      in
+        lists.remove mainDomain (
+          lists.unique (
+            lists.flatten (map (c: optionals (c.addToCerts || !isNull c.certMainHost) c.hosts) group)
+          )
+        );
+  in attrsets.mapAttrs (k: g:
+    if (!isNull (groupToDomain g))
+    then config.services.websitesCerts // {
+      domain = groupToDomain g;
+      extraDomains = builtins.listToAttrs (
+        map (d: attrsets.nameValuePair d null) (extraDomains g));
+    }
+    else {
+      extraDomains = builtins.listToAttrs (
+        map (d: attrsets.nameValuePair d null) (extraDomains g));
+    }
+  ) groupedCerts;
+}
diff --git a/modules/websites/httpd-service-builder.nix b/modules/websites/httpd-service-builder.nix
new file mode 100644 (file)
index 0000000..d049202
--- /dev/null
@@ -0,0 +1,746 @@
+# to help backporting this builder should stay as close as possible to
+# nixos/modules/services/web-servers/apache-httpd/default.nix
+{ httpdName, withUsers ? true }:
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+  mainCfg = config.services.httpd."${httpdName}";
+
+  httpd = mainCfg.package.out;
+
+  version24 = !versionOlder httpd.version "2.4";
+
+  httpdConf = mainCfg.configFile;
+
+  php = mainCfg.phpPackage.override { apacheHttpd = httpd.dev; /* otherwise it only gets .out */ };
+
+  phpMajorVersion = head (splitString "." php.version);
+
+  mod_perl = pkgs.apacheHttpdPackages.mod_perl.override { apacheHttpd = httpd; };
+
+  defaultListen = cfg: if cfg.enableSSL
+    then [{ip = "*"; port = 443;}]
+    else [{ip = "*"; port = 80;}];
+
+  getListen = cfg:
+    let list = (lib.optional (cfg.port != 0) {ip = "*"; port = cfg.port;}) ++ cfg.listen;
+    in if list == []
+        then defaultListen cfg
+        else list;
+
+  listenToString = l: "${l.ip}:${toString l.port}";
+
+  extraModules = attrByPath ["extraModules"] [] mainCfg;
+  extraForeignModules = filter isAttrs extraModules;
+  extraApacheModules = filter isString extraModules;
+
+
+  makeServerInfo = cfg: {
+    # Canonical name must not include a trailing slash.
+    canonicalNames =
+      let defaultPort = (head (defaultListen cfg)).port; in
+      map (port:
+        (if cfg.enableSSL then "https" else "http") + "://" +
+        cfg.hostName +
+        (if port != defaultPort then ":${toString port}" else "")
+        ) (map (x: x.port) (getListen cfg));
+
+    # Admin address: inherit from the main server if not specified for
+    # a virtual host.
+    adminAddr = if cfg.adminAddr != null then cfg.adminAddr else mainCfg.adminAddr;
+
+    vhostConfig = cfg;
+    serverConfig = mainCfg;
+    fullConfig = config; # machine config
+  };
+
+
+  allHosts = [mainCfg] ++ mainCfg.virtualHosts;
+
+
+  callSubservices = serverInfo: defs:
+    let f = svc:
+      let
+        svcFunction =
+          if svc ? function then svc.function
+          # instead of using serviceType="mediawiki"; you can copy mediawiki.nix to any location outside nixpkgs, modify it at will, and use serviceExpression=./mediawiki.nix;
+          else if svc ? serviceExpression then import (toString svc.serviceExpression)
+          else import (toString "${toString ./.}/${if svc ? serviceType then svc.serviceType else svc.serviceName}.nix");
+        config = (evalModules
+          { modules = [ { options = res.options; config = svc.config or svc; } ];
+            check = false;
+          }).config;
+        defaults = {
+          extraConfig = "";
+          extraModules = [];
+          extraModulesPre = [];
+          extraPath = [];
+          extraServerPath = [];
+          globalEnvVars = [];
+          robotsEntries = "";
+          startupScript = "";
+          enablePHP = false;
+          enablePerl = false;
+          phpOptions = "";
+          options = {};
+          documentRoot = null;
+        };
+        res = defaults // svcFunction { inherit config lib pkgs serverInfo php; };
+      in res;
+    in map f defs;
+
+
+  # !!! callSubservices is expensive
+  subservicesFor = cfg: callSubservices (makeServerInfo cfg) cfg.extraSubservices;
+
+  mainSubservices = subservicesFor mainCfg;
+
+  allSubservices = mainSubservices ++ concatMap subservicesFor mainCfg.virtualHosts;
+
+
+  enableSSL = any (vhost: vhost.enableSSL) allHosts;
+
+
+  # Names of modules from ${httpd}/modules that we want to load.
+  apacheModules =
+    [ # HTTP authentication mechanisms: basic and digest.
+      "auth_basic" "auth_digest"
+
+      # Authentication: is the user who he claims to be?
+      "authn_file" "authn_dbm" "authn_anon"
+      (if version24 then "authn_core" else "authn_alias")
+
+      # Authorization: is the user allowed access?
+      "authz_user" "authz_groupfile" "authz_host"
+
+      # Other modules.
+      "ext_filter" "include" "log_config" "env" "mime_magic"
+      "cern_meta" "expires" "headers" "usertrack" /* "unique_id" */ "setenvif"
+      "mime" "dav" "status" "autoindex" "asis" "info" "dav_fs"
+      "vhost_alias" "negotiation" "dir" "imagemap" "actions" "speling"
+      "userdir" "alias" "rewrite" "proxy" "proxy_http"
+    ]
+    ++ optionals version24 [
+      "mpm_${mainCfg.multiProcessingModule}"
+      "authz_core"
+      "unixd"
+      "cache" "cache_disk"
+      "slotmem_shm"
+      "socache_shmcb"
+      # For compatibility with old configurations, the new module mod_access_compat is provided.
+      "access_compat"
+    ]
+    ++ (if mainCfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
+    ++ optional enableSSL "ssl"
+    ++ extraApacheModules;
+
+
+  allDenied = if version24 then ''
+    Require all denied
+  '' else ''
+    Order deny,allow
+    Deny from all
+  '';
+
+  allGranted = if version24 then ''
+    Require all granted
+  '' else ''
+    Order allow,deny
+    Allow from all
+  '';
+
+
+  loggingConf = (if mainCfg.logFormat != "none" then ''
+    ErrorLog ${mainCfg.logDir}/error.log
+
+    LogLevel notice
+
+    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+    LogFormat "%h %l %u %t \"%r\" %>s %b" common
+    LogFormat "%{Referer}i -> %U" referer
+    LogFormat "%{User-agent}i" agent
+
+    CustomLog ${mainCfg.logDir}/access.log ${mainCfg.logFormat}
+  '' else ''
+    ErrorLog /dev/null
+  '');
+
+
+  browserHacks = ''
+    BrowserMatch "Mozilla/2" nokeepalive
+    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
+    BrowserMatch "RealPlayer 4\.0" force-response-1.0
+    BrowserMatch "Java/1\.0" force-response-1.0
+    BrowserMatch "JDK/1\.0" force-response-1.0
+    BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
+    BrowserMatch "^WebDrive" redirect-carefully
+    BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
+    BrowserMatch "^gnome-vfs" redirect-carefully
+  '';
+
+
+  sslConf = ''
+    SSLSessionCache ${if version24 then "shmcb" else "shm"}:${mainCfg.stateDir}/ssl_scache(512000)
+
+    ${if version24 then "Mutex" else "SSLMutex"} posixsem
+
+    SSLRandomSeed startup builtin
+    SSLRandomSeed connect builtin
+
+    SSLProtocol ${mainCfg.sslProtocols}
+    SSLCipherSuite ${mainCfg.sslCiphers}
+    SSLHonorCipherOrder on
+  '';
+
+
+  mimeConf = ''
+    TypesConfig ${httpd}/conf/mime.types
+
+    AddType application/x-x509-ca-cert .crt
+    AddType application/x-pkcs7-crl    .crl
+    AddType application/x-httpd-php    .php .phtml
+
+    <IfModule mod_mime_magic.c>
+        MIMEMagicFile ${httpd}/conf/magic
+    </IfModule>
+  '';
+
+
+  perServerConf = isMainServer: cfg: let
+
+    serverInfo = makeServerInfo cfg;
+
+    subservices = callSubservices serverInfo cfg.extraSubservices;
+
+    maybeDocumentRoot = fold (svc: acc:
+      if acc == null then svc.documentRoot else assert svc.documentRoot == null; acc
+    ) null ([ cfg ] ++ subservices);
+
+    documentRoot = if maybeDocumentRoot != null then maybeDocumentRoot else
+      pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out";
+
+    documentRootConf = ''
+      DocumentRoot "${documentRoot}"
+
+      <Directory "${documentRoot}">
+          Options Indexes FollowSymLinks
+          AllowOverride None
+          ${allGranted}
+      </Directory>
+    '';
+
+    robotsTxt =
+      concatStringsSep "\n" (filter (x: x != "") (
+        # If this is a vhost, the include the entries for the main server as well.
+        (if isMainServer then [] else [mainCfg.robotsEntries] ++ map (svc: svc.robotsEntries) mainSubservices)
+        ++ [cfg.robotsEntries]
+        ++ (map (svc: svc.robotsEntries) subservices)));
+
+  in ''
+    ${concatStringsSep "\n" (map (n: "ServerName ${n}") serverInfo.canonicalNames)}
+
+    ${concatMapStrings (alias: "ServerAlias ${alias}\n") cfg.serverAliases}
+
+    ${if cfg.sslServerCert != null then ''
+      SSLCertificateFile ${cfg.sslServerCert}
+      SSLCertificateKeyFile ${cfg.sslServerKey}
+      ${if cfg.sslServerChain != null then ''
+        SSLCertificateChainFile ${cfg.sslServerChain}
+      '' else ""}
+    '' else ""}
+
+    ${if cfg.enableSSL then ''
+      SSLEngine on
+    '' else if enableSSL then /* i.e., SSL is enabled for some host, but not this one */
+    ''
+      SSLEngine off
+    '' else ""}
+
+    ${if isMainServer || cfg.adminAddr != null then ''
+      ServerAdmin ${cfg.adminAddr}
+    '' else ""}
+
+    ${if !isMainServer && mainCfg.logPerVirtualHost then ''
+      ErrorLog ${mainCfg.logDir}/error-${cfg.hostName}.log
+      CustomLog ${mainCfg.logDir}/access-${cfg.hostName}.log ${cfg.logFormat}
+    '' else ""}
+
+    ${optionalString (robotsTxt != "") ''
+      Alias /robots.txt ${pkgs.writeText "robots.txt" robotsTxt}
+    ''}
+
+    ${if isMainServer || maybeDocumentRoot != null then documentRootConf else ""}
+
+    ${if cfg.enableUserDir then ''
+
+      UserDir public_html
+      UserDir disabled root
+
+      <Directory "/home/*/public_html">
+          AllowOverride FileInfo AuthConfig Limit Indexes
+          Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
+          <Limit GET POST OPTIONS>
+              ${allGranted}
+          </Limit>
+          <LimitExcept GET POST OPTIONS>
+              ${allDenied}
+          </LimitExcept>
+      </Directory>
+
+    '' else ""}
+
+    ${if cfg.globalRedirect != null && cfg.globalRedirect != "" then ''
+      RedirectPermanent / ${cfg.globalRedirect}
+    '' else ""}
+
+    ${
+      let makeFileConf = elem: ''
+            Alias ${elem.urlPath} ${elem.file}
+          '';
+      in concatMapStrings makeFileConf cfg.servedFiles
+    }
+
+    ${
+      let makeDirConf = elem: ''
+            Alias ${elem.urlPath} ${elem.dir}/
+            <Directory ${elem.dir}>
+                Options +Indexes
+                ${allGranted}
+                AllowOverride All
+            </Directory>
+          '';
+      in concatMapStrings makeDirConf cfg.servedDirs
+    }
+
+    ${concatMapStrings (svc: svc.extraConfig) subservices}
+
+    ${cfg.extraConfig}
+  '';
+
+
+  confFile = pkgs.writeText "httpd.conf" ''
+
+    ServerRoot ${httpd}
+
+    ${optionalString version24 ''
+      DefaultRuntimeDir ${mainCfg.stateDir}/runtime
+    ''}
+
+    PidFile ${mainCfg.stateDir}/httpd.pid
+
+    ${optionalString (mainCfg.multiProcessingModule != "prefork") ''
+      # mod_cgid requires this.
+      ScriptSock ${mainCfg.stateDir}/cgisock
+    ''}
+
+    <IfModule prefork.c>
+        MaxClients           ${toString mainCfg.maxClients}
+        MaxRequestsPerChild  ${toString mainCfg.maxRequestsPerChild}
+    </IfModule>
+
+    ${let
+        listen = concatMap getListen allHosts;
+        toStr = listen: "Listen ${listenToString listen}\n";
+        uniqueListen = uniqList {inputList = map toStr listen;};
+      in concatStrings uniqueListen
+    }
+
+    User ${mainCfg.user}
+    Group ${mainCfg.group}
+
+    ${let
+        load = {name, path}: "LoadModule ${name}_module ${path}\n";
+        allModules =
+          concatMap (svc: svc.extraModulesPre) allSubservices
+          ++ map (name: {inherit name; path = "${httpd}/modules/mod_${name}.so";}) apacheModules
+          ++ optional mainCfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
+          ++ optional enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
+          ++ optional enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
+          ++ concatMap (svc: svc.extraModules) allSubservices
+          ++ extraForeignModules;
+      in concatMapStrings load allModules
+    }
+
+    AddHandler type-map var
+
+    <Files ~ "^\.ht">
+        ${allDenied}
+    </Files>
+
+    ${mimeConf}
+    ${loggingConf}
+    ${browserHacks}
+
+    Include ${httpd}/conf/extra/httpd-default.conf
+    Include ${httpd}/conf/extra/httpd-autoindex.conf
+    Include ${httpd}/conf/extra/httpd-multilang-errordoc.conf
+    Include ${httpd}/conf/extra/httpd-languages.conf
+
+    TraceEnable off
+
+    ${if enableSSL then sslConf else ""}
+
+    # Fascist default - deny access to everything.
+    <Directory />
+        Options FollowSymLinks
+        AllowOverride None
+        ${allDenied}
+    </Directory>
+
+    # Generate directives for the main server.
+    ${perServerConf true mainCfg}
+
+    # Always enable virtual hosts; it doesn't seem to hurt.
+    ${let
+        listen = concatMap getListen allHosts;
+        uniqueListen = uniqList {inputList = listen;};
+        directives = concatMapStrings (listen: "NameVirtualHost ${listenToString listen}\n") uniqueListen;
+      in optionalString (!version24) directives
+    }
+
+    ${let
+        makeVirtualHost = vhost: ''
+          <VirtualHost ${concatStringsSep " " (map listenToString (getListen vhost))}>
+              ${perServerConf false vhost}
+          </VirtualHost>
+        '';
+      in concatMapStrings makeVirtualHost mainCfg.virtualHosts
+    }
+  '';
+
+
+  enablePHP = mainCfg.enablePHP || any (svc: svc.enablePHP) allSubservices;
+
+  enablePerl = mainCfg.enablePerl || any (svc: svc.enablePerl) allSubservices;
+
+
+  # Generate the PHP configuration file.  Should probably be factored
+  # out into a separate module.
+  phpIni = pkgs.runCommand "php.ini"
+    { options = concatStringsSep "\n"
+        ([ mainCfg.phpOptions ] ++ (map (svc: svc.phpOptions) allSubservices));
+      preferLocalBuild = true;
+    }
+    ''
+      cat ${php}/etc/php.ini > $out
+      echo "$options" >> $out
+    '';
+
+in
+
+
+{
+
+  ###### interface
+
+  options = {
+
+    services.httpd."${httpdName}" = {
+
+      enable = mkOption {
+        type = types.bool;
+        default = false;
+        description = "Whether to enable the Apache HTTP Server.";
+      };
+
+      package = mkOption {
+        type = types.package;
+        default = pkgs.apacheHttpd;
+        defaultText = "pkgs.apacheHttpd";
+        description = ''
+          Overridable attribute of the Apache HTTP Server package to use.
+        '';
+      };
+
+      configFile = mkOption {
+        type = types.path;
+        default = confFile;
+        defaultText = "confFile";
+        example = literalExample ''pkgs.writeText "httpd.conf" "# my custom config file ..."'';
+        description = ''
+          Override the configuration file used by Apache. By default,
+          NixOS generates one automatically.
+        '';
+      };
+
+      extraConfig = mkOption {
+        type = types.lines;
+        default = "";
+        description = ''
+          Cnfiguration lines appended to the generated Apache
+          configuration file. Note that this mechanism may not work
+          when <option>configFile</option> is overridden.
+        '';
+      };
+
+      extraModules = mkOption {
+        type = types.listOf types.unspecified;
+        default = [];
+        example = literalExample ''[ "proxy_connect" { name = "php5"; path = "''${pkgs.php}/modules/libphp5.so"; } ]'';
+        description = ''
+          Additional Apache modules to be used.  These can be
+          specified as a string in the case of modules distributed
+          with Apache, or as an attribute set specifying the
+          <varname>name</varname> and <varname>path</varname> of the
+          module.
+        '';
+      };
+
+      logPerVirtualHost = mkOption {
+        type = types.bool;
+        default = false;
+        description = ''
+          If enabled, each virtual host gets its own
+          <filename>access.log</filename> and
+          <filename>error.log</filename>, namely suffixed by the
+          <option>hostName</option> of the virtual host.
+        '';
+      };
+
+      user = mkOption {
+        type = types.str;
+        default = "wwwrun";
+        description = ''
+          User account under which httpd runs.  The account is created
+          automatically if it doesn't exist.
+        '';
+      };
+
+      group = mkOption {
+        type = types.str;
+        default = "wwwrun";
+        description = ''
+          Group under which httpd runs.  The account is created
+          automatically if it doesn't exist.
+        '';
+      };
+
+      logDir = mkOption {
+        type = types.path;
+        default = "/var/log/httpd";
+        description = ''
+          Directory for Apache's log files.  It is created automatically.
+        '';
+      };
+
+      stateDir = mkOption {
+        type = types.path;
+        default = "/run/httpd";
+        description = ''
+          Directory for Apache's transient runtime state (such as PID
+          files).  It is created automatically.  Note that the default,
+          <filename>/run/httpd</filename>, is deleted at boot time.
+        '';
+      };
+
+      virtualHosts = mkOption {
+        type = types.listOf (types.submodule (
+          { options = import <nixpkgs/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix> {
+              inherit lib;
+              forMainServer = false;
+            };
+          }));
+        default = [];
+        example = [
+          { hostName = "foo";
+            documentRoot = "/data/webroot-foo";
+          }
+          { hostName = "bar";
+            documentRoot = "/data/webroot-bar";
+          }
+        ];
+        description = ''
+          Specification of the virtual hosts served by Apache.  Each
+          element should be an attribute set specifying the
+          configuration of the virtual host.  The available options
+          are the non-global options permissible for the main host.
+        '';
+      };
+
+      enableMellon = mkOption {
+        type = types.bool;
+        default = false;
+        description = "Whether to enable the mod_auth_mellon module.";
+      };
+
+      enablePHP = mkOption {
+        type = types.bool;
+        default = false;
+        description = "Whether to enable the PHP module.";
+      };
+
+      phpPackage = mkOption {
+        type = types.package;
+        default = pkgs.php;
+        defaultText = "pkgs.php";
+        description = ''
+          Overridable attribute of the PHP package to use.
+        '';
+      };
+
+      enablePerl = mkOption {
+        type = types.bool;
+        default = false;
+        description = "Whether to enable the Perl module (mod_perl).";
+      };
+
+      phpOptions = mkOption {
+        type = types.lines;
+        default = "";
+        example =
+          ''
+            date.timezone = "CET"
+          '';
+        description =
+          "Options appended to the PHP configuration file <filename>php.ini</filename>.";
+      };
+
+      multiProcessingModule = mkOption {
+        type = types.str;
+        default = "prefork";
+        example = "worker";
+        description =
+          ''
+            Multi-processing module to be used by Apache.  Available
+            modules are <literal>prefork</literal> (the default;
+            handles each request in a separate child process),
+            <literal>worker</literal> (hybrid approach that starts a
+            number of child processes each running a number of
+            threads) and <literal>event</literal> (a recent variant of
+            <literal>worker</literal> that handles persistent
+            connections more efficiently).
+          '';
+      };
+
+      maxClients = mkOption {
+        type = types.int;
+        default = 150;
+        example = 8;
+        description = "Maximum number of httpd processes (prefork)";
+      };
+
+      maxRequestsPerChild = mkOption {
+        type = types.int;
+        default = 0;
+        example = 500;
+        description =
+          "Maximum number of httpd requests answered per httpd child (prefork), 0 means unlimited";
+      };
+
+      sslCiphers = mkOption {
+        type = types.str;
+        default = "HIGH:!aNULL:!MD5:!EXP";
+        description = "Cipher Suite available for negotiation in SSL proxy handshake.";
+      };
+
+      sslProtocols = mkOption {
+        type = types.str;
+        default = "All -SSLv2 -SSLv3 -TLSv1";
+        example = "All -SSLv2 -SSLv3";
+        description = "Allowed SSL/TLS protocol versions.";
+      };
+    }
+
+    # Include the options shared between the main server and virtual hosts.
+    // (import <nixpkgs/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix> {
+      inherit lib;
+      forMainServer = true;
+    });
+
+  };
+
+
+  ###### implementation
+
+  config = mkIf config.services.httpd."${httpdName}".enable {
+
+    assertions = [ { assertion = mainCfg.enableSSL == true
+                               -> mainCfg.sslServerCert != null
+                                    && mainCfg.sslServerKey != null;
+                     message = "SSL is enabled for httpd, but sslServerCert and/or sslServerKey haven't been specified."; }
+                 ];
+
+    warnings = map (cfg: ''apache-httpd's port option is deprecated. Use listen = [{/*ip = "*"; */ port = ${toString cfg.port};}]; instead'' ) (lib.filter (cfg: cfg.port != 0) allHosts);
+
+    users.users = optionalAttrs (withUsers && mainCfg.user == "wwwrun") (singleton
+      { name = "wwwrun";
+        group = mainCfg.group;
+        description = "Apache httpd user";
+        uid = config.ids.uids.wwwrun;
+      });
+
+    users.groups = optionalAttrs (withUsers && mainCfg.group == "wwwrun") (singleton
+      { name = "wwwrun";
+        gid = config.ids.gids.wwwrun;
+      });
+
+    environment.systemPackages = [httpd] ++ concatMap (svc: svc.extraPath) allSubservices;
+
+    services.httpd."${httpdName}".phpOptions =
+      ''
+        ; Needed for PHP's mail() function.
+        sendmail_path = sendmail -t -i
+
+        ; Don't advertise PHP
+        expose_php = off
+      '' + optionalString (!isNull config.time.timeZone) ''
+
+        ; Apparently PHP doesn't use $TZ.
+        date.timezone = "${config.time.timeZone}"
+      '';
+
+    systemd.services."httpd${httpdName}" =
+      { description = "Apache HTTPD";
+
+        wantedBy = [ "multi-user.target" ];
+        wants = [ "keys.target" ];
+        after = [ "network.target" "fs.target" "postgresql.service" "keys.target" ];
+
+        path =
+          [ httpd pkgs.coreutils pkgs.gnugrep ]
+          ++ optional enablePHP pkgs.system-sendmail # Needed for PHP's mail() function.
+          ++ concatMap (svc: svc.extraServerPath) allSubservices;
+
+        environment =
+          optionalAttrs enablePHP { PHPRC = phpIni; }
+          // optionalAttrs mainCfg.enableMellon { LD_LIBRARY_PATH  = "${pkgs.xmlsec}/lib"; }
+          // (listToAttrs (concatMap (svc: svc.globalEnvVars) allSubservices));
+
+        preStart =
+          ''
+            mkdir -m 0750 -p ${mainCfg.stateDir}
+            [ $(id -u) != 0 ] || chown root.${mainCfg.group} ${mainCfg.stateDir}
+            ${optionalString version24 ''
+              mkdir -m 0750 -p "${mainCfg.stateDir}/runtime"
+              [ $(id -u) != 0 ] || chown root.${mainCfg.group} "${mainCfg.stateDir}/runtime"
+            ''}
+            mkdir -m 0700 -p ${mainCfg.logDir}
+
+            # Get rid of old semaphores.  These tend to accumulate across
+            # server restarts, eventually preventing it from restarting
+            # successfully.
+            for i in $(${pkgs.utillinux}/bin/ipcs -s | grep ' ${mainCfg.user} ' | cut -f2 -d ' '); do
+                ${pkgs.utillinux}/bin/ipcrm -s $i
+            done
+
+            # Run the startup hooks for the subservices.
+            for i in ${toString (map (svn: svn.startupScript) allSubservices)}; do
+                echo Running Apache startup hook $i...
+                $i
+            done
+          '';
+
+        serviceConfig.ExecStart = "@${httpd}/bin/httpd httpd -f ${httpdConf}";
+        serviceConfig.ExecStop = "${httpd}/bin/httpd -f ${httpdConf} -k graceful-stop";
+        serviceConfig.ExecReload = "${httpd}/bin/httpd -f ${httpdConf} -k graceful";
+        serviceConfig.Type = "forking";
+        serviceConfig.PIDFile = "${mainCfg.stateDir}/httpd.pid";
+        serviceConfig.Restart = "always";
+        serviceConfig.RestartSec = "5s";
+      };
+
+  };
+}
diff --git a/modules/websites/nosslVhost/index.html b/modules/websites/nosslVhost/index.html
new file mode 100644 (file)
index 0000000..4401a80
--- /dev/null
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>No SSL site</title>
+  </head>
+  <body>
+    <h1>No SSL on this site</h1>
+    <p>Use for wifi networks with login page that doesn't work well with
+    https.</p>
+  </body>
+</html>
diff --git a/nix_path_env b/nix_path_env
new file mode 100644 (file)
index 0000000..901cd69
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ -z "$NIXOPS_DEPLOYMENT" ]; then
+  # This will automatically upgrade to latest version at each build
+  nixpkgs="https://nixos.org/channels/nixos-19.03/nixexprs.tar.xz"
+else
+  nixpkgs="https://releases.nixos.org/nixos/19.03/nixos-19.03.172530.096e2f137b6/nixexprs.tar.xz"
+fi
+nixpkgsPrevious="$nixpkgs"
+nixpkgsNext="$nixpkgs"
+export NIX_PATH="nixpkgs=$nixpkgs:nixpkgsNext=$nixpkgsNext:nixpkgsPrevious=$nixpkgsPrevious"
diff --git a/nixops/.gitignore b/nixops/.gitignore
new file mode 100644 (file)
index 0000000..2ea467b
--- /dev/null
@@ -0,0 +1 @@
+/state
diff --git a/nixops/Makefile b/nixops/Makefile
new file mode 100644 (file)
index 0000000..cce57ff
--- /dev/null
@@ -0,0 +1,54 @@
+setup:
+       ./scripts/setup
+
+ssh-eldiron:
+       ./scripts/nixops_wrap ssh eldiron
+
+info:
+       ./scripts/nixops_wrap list
+       ./scripts/nixops_wrap info
+
+debug:
+       ./scripts/nixops_wrap deploy --build-only --show-trace
+
+dry-run:
+       ./scripts/nixops_wrap deploy --dry-run
+
+build:
+       ./scripts/nixops_wrap deploy --build-only
+
+upload:
+       ./scripts/nixops_wrap deploy --copy-only
+
+deploy:
+       ./scripts/nixops_wrap deploy
+
+reboot:
+       ./scripts/nixops_wrap reboot --include=eldiron
+
+push:
+       ./scripts/push_deployment
+       ./scripts/push_environment
+
+pull:
+       ./scripts/pull_environment
+
+pull-deployment:
+       ./scripts/pull_deployment
+
+profile = $(shell ./scripts/nixops_wrap info | grep "^Nix profile: " | sed -e "s/^Nix profile: //")
+GEN ?= "+3"
+
+list-generations:
+       nix-env -p $(profile) --list-generations
+       ./scripts/nixops_wrap ssh eldiron -- nix-env -p /nix/var/nix/profiles/system --list-generations
+
+delete-generations:
+       nix-env -p $(profile) --delete-generations $(GEN)
+       ./scripts/nixops_wrap ssh eldiron -- nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)
+
+cleanup: delete-generations
+       nix-store --gc
+       ./scripts/nixops_wrap ssh eldiron -- nix-store --gc
+
+.PHONY: setup ssh-eldiron info debug dry-run build upload deploy push pull pull-deployment list-generations delete-generations cleanup
diff --git a/nixops/custom_nixops.nix b/nixops/custom_nixops.nix
new file mode 100644 (file)
index 0000000..f024a4d
--- /dev/null
@@ -0,0 +1,2 @@
+with import <nixpkgs> { overlays = builtins.attrValues (import ../overlays); };
+nixops
diff --git a/nixops/eldiron.nix b/nixops/eldiron.nix
new file mode 100644 (file)
index 0000000..649e431
--- /dev/null
@@ -0,0 +1,9 @@
+{ privateFiles ? ./. }:
+{
+  network = {
+    description = "Immae's network";
+    enableRollback = true;
+  };
+
+  eldiron = import ../modules/private/system/eldiron.nix { inherit privateFiles; };
+}
diff --git a/nixops/migrate_hetzner.md b/nixops/migrate_hetzner.md
new file mode 100644 (file)
index 0000000..c7fbe20
--- /dev/null
@@ -0,0 +1,20 @@
+nixops show a deprecation message at each deployment because hetzner
+info is outdated. To fix it:
+
+    cp -a ~/.nixops ~/.nixops.bak
+
+    nixops export --all > all.json
+
+    network=$(cat all.json| jq -r '."cef694f3-081d-11e9-b31f-0242ec186adf".resources.eldiron."hetzner.networkInfo"' | jq -r -c '.networking.interfaces.eth0 = { "ipv4": { "addresses": [ { "address": .networking.interfaces.eth0.ipAddress, "prefixLength": .networking.interfaces.eth0.prefixLength } ] } }')
+
+    cat all.json | jq --arg network "$network" '."cef694f3-081d-11e9-b31f-0242ec186adf".resources.eldiron."hetzner.networkInfo" = $network' > all_new.json
+
+    nixops delete --force -d eldiron
+
+    nixops import < all_new.json
+
+    rm all.json all_new.json
+
+*check that everything works*, then:
+
+    rm -rf ~/.nixops.bak
diff --git a/nixops/scripts/nixops_wrap b/nixops/scripts/nixops_wrap
new file mode 100755 (executable)
index 0000000..d03784e
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+DeploymentUuid="cef694f3-081d-11e9-b31f-0242ec186adf"
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_PATH to the password-store subtree path"
+  exit 1;
+fi
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+export NIXOPS_STATE="$(dirname $DIR)/state/eldiron.nixops"
+export NIXOPS_DEPLOYMENT="$DeploymentUuid"
+source $(dirname $(dirname $DIR))/nix_path_env
+nixops="$(nix-build --no-out-link "$(dirname $DIR)/custom_nixops.nix")/bin/nixops"
+
+TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files)
+chmod go-rwx $TEMP
+
+# __noChroot: ssh-config-file requires relaxed
+export NIX_PATH="ssh-config-file=$(dirname $DIR)/ssh/config:$NIX_PATH"
+
+
+finish() {
+  rm -rf "$TEMP"
+  $nixops set-args --unset privateFiles
+}
+
+trap finish EXIT
+
+# pass cannot "just" list files in a directory without showing a tree :(
+files=$(pass ls $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/files | sed -e '1d' -e 's/^.* //')
+
+for file in $files; do
+  pass show "$NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/files/$file" > $TEMP/$file
+done
+$nixops set-args --argstr privateFiles "$TEMP"
+
+$nixops "$@"
diff --git a/nixops/scripts/pull_deployment b/nixops/scripts/pull_deployment
new file mode 100755 (executable)
index 0000000..10f71fe
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+DeploymentUuid="cef694f3-081d-11e9-b31f-0242ec186adf"
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_PATH to the password-store subtree path"
+  exit 1;
+fi
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+export NIXOPS_STATE="$(dirname $DIR)/state/eldiron.nixops"
+export NIXOPS_DEPLOYMENT="$DeploymentUuid"
+source $(dirname $(dirname $DIR))/nix_path_env
+nixops="$(nix-build --no-out-link "$(dirname $DIR)/custom_nixops.nix")/bin/nixops"
+
+export NIXOPS_STATE="$(dirname $DIR)/state/eldiron.nixops"
+
+if $nixops info -d $DeploymentUuid 2>/dev/null >/dev/null; then
+  cat <<EOF
+This will remove your current deployment file and recreate it!
+Continue? [y/N]
+EOF
+  read y
+  if [ "$y" = "y" -o "$y" = "Y" ]; then
+    $nixops delete --force -d $DeploymentUuid
+  else
+    echo "Aborting"
+    exit 1
+  fi
+fi
+
+deployment=$(pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/Deployment)
+
+echo "$deployment" | $nixops import
+
+$nixops modify -d "$DeploymentUuid" "$(dirname $DIR)/eldiron.nix"
diff --git a/nixops/scripts/pull_environment b/nixops/scripts/pull_environment
new file mode 100755 (executable)
index 0000000..e508a2e
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_PATH to the password-store subtree path"
+  exit 1;
+fi
+
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_REMOTE" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_REMOTE to the password-store subtree remote name"
+  exit 1;
+fi
+
+pass git subtree pull --prefix=$NIXOPS_CONFIG_PASS_SUBTREE_PATH $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE master
diff --git a/nixops/scripts/push_deployment b/nixops/scripts/push_deployment
new file mode 100755 (executable)
index 0000000..6c67fab
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+DeploymentUuid="cef694f3-081d-11e9-b31f-0242ec186adf"
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_PATH to the password-store subtree path"
+  exit 1;
+fi
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+export NIXOPS_STATE="$(dirname $DIR)/state/eldiron.nixops"
+export NIXOPS_DEPLOYMENT="$DeploymentUuid"
+source $(dirname $(dirname $DIR))/nix_path_env
+nixops="$(nix-build --no-out-link "$(dirname $DIR)/custom_nixops.nix")/bin/nixops"
+
+$nixops export | pass insert -m $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/Deployment
diff --git a/nixops/scripts/push_environment b/nixops/scripts/push_environment
new file mode 100755 (executable)
index 0000000..8b59240
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_PATH to the password-store subtree path"
+  exit 1;
+fi
+
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_REMOTE" ]; then
+  echo "Please set NIXOPS_CONFIG_PASS_SUBTREE_REMOTE to the password-store subtree remote name"
+  exit 1;
+fi
+
+pass git subtree push --prefix=$NIXOPS_CONFIG_PASS_SUBTREE_PATH $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE master
diff --git a/nixops/scripts/setup b/nixops/scripts/setup
new file mode 100755 (executable)
index 0000000..1586265
--- /dev/null
@@ -0,0 +1,163 @@
+#!/bin/bash
+
+set -euo pipefail
+
+RemoteRepo="gitolite@git.immae.eu:perso/Immae/Prive/Password_store/Sites"
+DeploymentUuid="cef694f3-081d-11e9-b31f-0242ec186adf"
+
+if ! which nix 2>/dev/null >/dev/null; then
+  cat <<-EOF
+       nix is needed, please install it:
+       > curl https://nixos.org/nix/install | sh
+       (or any other way handled by your distribution)
+       EOF
+  exit 1
+fi
+
+if [ "${NIX_STORE:-/nix/store}" != "/nix/store" ]; then
+  cat <<-EOF
+       Nix store outside of /nix/store is not supported
+       EOF
+  exit 1
+fi
+
+if [ -z "$NIXOPS_CONFIG_PASS_SUBTREE_REMOTE" \
+    -o -z "$NIXOPS_CONFIG_PASS_SUBTREE_PATH" ]; then
+  cat <<-EOF
+       Two environment variables are needed to setup the password store:
+       NIXOPS_CONFIG_PASS_SUBTREE_PATH : path where the subtree will be imported
+       NIXOPS_CONFIG_PASS_SUBTREE_REMOTE : remote name to give to the repository
+       EOF
+  exit 1
+fi
+
+if ! pass $NIXOPS_CONFIG_PASS_SUBTREE_PATH > /dev/null 2>/dev/null; then
+  cat <<-EOF
+       /!\ This will modify your password store to add and import a subtree
+       with the specific passwords files. Choose a path that doesn’t exist
+       yet in your password store.
+       > pass git remote add $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE $RemoteRepo
+       > pass git subtree add --prefix=$NIXOPS_CONFIG_PASS_SUBTREE_PATH $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE master
+       Later, you can use pull_environment and push_environment scripts to
+       update the passwords when needed
+       Continue? [y/N]
+       EOF
+  read y
+  if [ "$y" = "y" -o "$y" = "Y" ]; then
+    pass git remote add $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE $RemoteRepo
+    pass git subtree add --prefix=$NIXOPS_CONFIG_PASS_SUBTREE_PATH $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE master
+  else
+    echo "Aborting"
+    exit 1
+  fi
+fi
+
+# Repull it before using it, just in case
+pass git subtree pull --prefix=$NIXOPS_CONFIG_PASS_SUBTREE_PATH $NIXOPS_CONFIG_PASS_SUBTREE_REMOTE master
+
+gpg_keys=$(pass ls $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/GPGKeys | sed -e "1d" | cut -d" " -f2)
+for key in $gpg_keys; do
+  content=$(pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/GPGKeys/$key)
+  fpr=$(echo "$content" | gpg --import-options show-only --import --with-colons | grep -e "^pub" | cut -d':' -f5)
+  gpg --list-key "$fpr" >/dev/null 2>/dev/null && imported=yes || imported=no
+  # /usr/share/doc/gnupg/DETAILS field 2
+  (echo "$content" | gpg --import-options show-only --import --with-colons |
+      grep -E '^pub:' |
+      cut -d':' -f2 |
+      grep -q '[fu]') && signed=yes || signed=no
+  if [ "$signed" = no -o "$imported" = no ] ; then
+    echo "The key for $key needs to be imported and signed (a local signature is enough)"
+    echo "$content" | gpg --import-options show-only --import
+    echo "Continue? [y/N]"
+    read y
+    if [ "$y" = "y" -o "$y" = "Y" ]; then
+      echo "$content" | gpg --import
+      gpg --expert --edit-key "$fpr" lsign quit
+    else
+      echo "Aborting"
+      exit 1
+    fi
+  fi
+done
+
+nix_group=$(stat -c %G /nix/store)
+if [ "$nix_group" = "nixbld" ]; then
+  nix_user="nixbld1"
+else
+  nix_user="$(stat -c %U /nix/store)"
+fi
+
+if [ ! -f /etc/ssh/ssh_rsa_key_nixops ]; then
+  cat <<-EOF
+       The key to access private git repositories (websites hosted by the
+       server) needs to be accessible to nix builders. It will be put in
+       /etc/ssh/ssh_rsa_key_nixops (sudo right is needed for that)
+       > pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/SshKey | sudo tee /etc/ssh/ssh_rsa_key_nixops > /dev/null
+       > pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/SshKey.pub | sudo tee /etc/ssh/ssh_rsa_key_nixops.pub > /dev/null
+       > sudo chmod u=r,go-rwx /etc/ssh/ssh_rsa_key_nixops
+       > sudo chown $nix_user:$nix_group /etc/ssh/ssh_rsa_key_nixops /etc/ssh/ssh_rsa_key_nixops.pub
+       Continue? [y/N]
+       EOF
+  read y
+  if [ "$y" = "y" -o "$y" = "Y" ]; then
+    if ! id -u $nix_user 2>/dev/null >/dev/null; then
+      echo "User $nix_user seems inexistant, did you install nix?"
+      exit 1
+    fi
+    mask=$(umask)
+    umask 0777
+    # Don’t forward it directly to tee, it would break ncurse pinentry
+    key=$(pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/SshKey)
+    echo "$key" | sudo tee /etc/ssh/ssh_rsa_key_nixops > /dev/null
+    sudo chmod u=r,go=- /etc/ssh/ssh_rsa_key_nixops
+    pubkey=$(pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/SshKey.pub)
+    echo "$pubkey" | sudo tee /etc/ssh/ssh_rsa_key_nixops.pub > /dev/null
+    sudo chmod a=r /etc/ssh/ssh_rsa_key_nixops.pub
+    sudo chown $nix_user:$nix_group /etc/ssh/ssh_rsa_key_nixops /etc/ssh/ssh_rsa_key_nixops.pub
+    umask $mask
+  else
+    echo "Aborting"
+    exit 1
+  fi
+fi
+
+if nix show-config --json | jq -e '.sandbox.value == "true"' >/dev/null; then
+  cat <<-EOF
+       There are some impure derivations in the repo currently (grep __noChroot), please put
+         sandbox = "relaxed"
+       in /etc/nix/nix.conf
+       you may also want to add
+         keep-outputs = true
+         keep-derivations = true
+       to prevent garbage collector from deleting build dependencies (they take a lot of time to build)
+       EOF
+  exit 1
+fi
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+source $(dirname $(dirname $DIR))/nix_path_env
+nixops="$(nix-build --no-out-link "$(dirname $DIR)/custom_nixops.nix")/bin/nixops"
+export NIXOPS_STATE="$(dirname $DIR)/state/eldiron.nixops"
+export NIXOPS_DEPLOYMENT="$DeploymentUuid"
+
+if ! $nixops info 2>/dev/null >/dev/null; then
+  cat <<-EOF
+       Importing deployment file into nixops:
+       Continue? [y/N]
+       EOF
+  read y
+  if [ "$y" = "y" -o "$y" = "Y" ]; then
+    deployment=$(pass show $NIXOPS_CONFIG_PASS_SUBTREE_PATH/Nixops/Deployment)
+    echo "$deployment" | $nixops import
+
+    $nixops modify "$(dirname $DIR)/eldiron.nix"
+  else
+    echo "Aborting"
+    exit 1
+  fi
+fi
+
+cat <<-EOF
+       All set up.
+       Please make sure you’re using scripts/nixops_wrap when deploying
+       EOF
diff --git a/nixops/ssh/config b/nixops/ssh/config
new file mode 100644 (file)
index 0000000..3d4dc3e
--- /dev/null
@@ -0,0 +1,5 @@
+Host git.immae.eu
+IdentityFile /etc/ssh/ssh_rsa_key_nixops
+StrictHostKeyChecking no
+UserKnownHostsFile /dev/null
+CheckHostIP no
diff --git a/nixops/state/.gitkeep b/nixops/state/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/overlays/bitlbee/bitlbee_long_nicks.patch b/overlays/bitlbee/bitlbee_long_nicks.patch
new file mode 100644 (file)
index 0000000..70be092
--- /dev/null
@@ -0,0 +1,56 @@
+diff --git a/bitlbee.h b/bitlbee.h
+index 17ab2979..5858277e 100644
+--- a/bitlbee.h
++++ b/bitlbee.h
+@@ -121,7 +121,7 @@ extern "C" {
+ #define CONTROL_TOPIC "Welcome to the control channel. Type \2help\2 for help information."
+ #define IRCD_INFO PACKAGE " <http://www.bitlbee.org/>"
+-#define MAX_NICK_LENGTH 24
++#define MAX_NICK_LENGTH 99
+ #define HELP_FILE VARDIR "help.txt"
+ #define CONF_FILE_DEF ETCDIR "bitlbee.conf"
+diff --git a/tests/check_nick.c b/tests/check_nick.c
+index ca5e5111..909fdcc9 100644
+--- a/tests/check_nick.c
++++ b/tests/check_nick.c
+@@ -11,16 +11,16 @@
+ START_TEST(test_nick_strip){
+       int i;
+       const char *get[] = { "test:", "test", "test\n",
+-                            "thisisaveryveryveryverylongnick",
+-                            "thisisave:ryveryveryverylongnick",
++                            "thisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnick",
++                            "thisis:averyveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnick",
+                             "t::::est",
+                             "test123",
+                             "123test",
+                             "123",
+                             NULL };
+       const char *expected[] = { "test", "test", "test",
+-                                 "thisisaveryveryveryveryl",
+-                                 "thisisaveryveryveryveryl",
++                                 "thisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnickthisisaveryve",
++                                 "thisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnickthisisaveryve",
+                                  "test",
+                                  "test123",
+                                  "_123test",
+@@ -28,7 +28,7 @@ START_TEST(test_nick_strip){
+                                  NULL };
+       for (i = 0; get[i]; i++) {
+-              char copy[60];
++              char copy[260];
+               strcpy(copy, get[i]);
+               nick_strip(NULL, copy);
+               fail_unless(strcmp(copy, expected[i]) == 0,
+@@ -53,7 +53,7 @@ END_TEST
+ START_TEST(test_nick_ok_notok)
+ {
+-      const char *nicks[] = { "thisisaveryveryveryveryveryveryverylongnick",
++      const char *nicks[] = { "thisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnickthisisaveryveryveryveryveryveryverylongnick",
+                               "\nillegalchar", "", "nick%", "123test", NULL };
+       int i;
diff --git a/overlays/bitlbee/default.nix b/overlays/bitlbee/default.nix
new file mode 100644 (file)
index 0000000..5183d01
--- /dev/null
@@ -0,0 +1,5 @@
+self: super: {
+  bitlbee = super.bitlbee.overrideAttrs(old: {
+    patches = (old.patches or []) ++ [ ./bitlbee_long_nicks.patch ];
+  });
+}
diff --git a/overlays/bundix/default.nix b/overlays/bundix/default.nix
new file mode 100644 (file)
index 0000000..6c4046c
--- /dev/null
@@ -0,0 +1,7 @@
+self: super: {
+  bundix = super.bundix.overrideAttrs (old: {
+    preBuild = (old.preBuild or "") + ''
+      sed -i -e "/case obj/a\      when nil\n        nil" lib/bundix/nixer.rb
+      '';
+  });
+}
diff --git a/overlays/databases/mysql/default.nix b/overlays/databases/mysql/default.nix
new file mode 100644 (file)
index 0000000..5e40284
--- /dev/null
@@ -0,0 +1,12 @@
+self: super: rec {
+  mariadb = mariadbPAM;
+  mariadbPAM = super.mariadb.overrideAttrs(old: {
+    cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
+    buildInputs = old.buildInputs ++ [ self.pam ];
+  }) // (with super.mariadb; {
+    inherit client;
+    servier = super.mariadb;
+    inherit connector-c;
+    inherit galera;
+  });
+}
diff --git a/overlays/databases/postgresql/default.nix b/overlays/databases/postgresql/default.nix
new file mode 100644 (file)
index 0000000..8d1405e
--- /dev/null
@@ -0,0 +1,11 @@
+self: super: rec {
+  postgresql_11_custom = super.postgresql_11.overrideAttrs(old: {
+    # datadir in /var/lib/postgresql is named after psqlSchema
+    passthru = old.passthru // { psqlSchema = "11.0"; };
+    configureFlags = old.configureFlags ++ [ "--with-pam" ];
+    buildInputs = (old.buildInputs or []) ++ [ self.pam ];
+    patches = old.patches ++ [
+      ./postgresql_run_socket_path.patch
+    ];
+  });
+}
diff --git a/overlays/databases/postgresql/postgresql_run_socket_path.patch b/overlays/databases/postgresql/postgresql_run_socket_path.patch
new file mode 100644 (file)
index 0000000..b558c7b
--- /dev/null
@@ -0,0 +1,12 @@
+diff -Naur postgresql-9.2.0.sockets/src/include/pg_config_manual.h postgresql-9.2.0/src/include/pg_config_manual.h
+--- postgresql-9.2.0.sockets/src/include/pg_config_manual.h    2012-09-06 17:26:17.000000000 -0400
++++ postgresql-9.2.0/src/include/pg_config_manual.h    2012-09-06 18:13:18.183092471 -0400
+@@ -144,7 +144,7 @@
+  * here's where to twiddle it.  You can also override this at runtime
+  * with the postmaster's -k switch.
+  */
+-#define DEFAULT_PGSOCKET_DIR  "/tmp"
++#define DEFAULT_PGSOCKET_DIR  "/run/postgresql"
+ /*
+  * The random() function is expected to yield values between 0 and
diff --git a/overlays/default.nix b/overlays/default.nix
new file mode 100644 (file)
index 0000000..408515e
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  mylibs = self: super: { mylibs = import ../libs.nix { pkgs = self; }; };
+  mypkgs = self: super: import ../pkgs { pkgs = self; };
+
+  bitlbee = import ./bitlbee;
+  bundix = import ./bundix;
+  dwm = import ./dwm;
+  elinks = import ./elinks;
+  gitweb = import ./gitweb;
+  goaccess = import ./goaccess;
+  kanboard = import ./kanboard;
+  ldapvi = import ./ldapvi;
+  lesspipe = import ./lesspipe;
+  mysql = import ./databases/mysql;
+  neomutt = import ./neomutt;
+  nixops = import ./nixops;
+  pass = import ./pass;
+  pelican = import ./pelican;
+  postgresql = import ./databases/postgresql;
+  profanity = import ./profanity;
+  sc-im = import ./sc-im;
+  shaarli = import ./shaarli;
+  slrn = import ./slrn;
+  taskwarrior = import ./taskwarrior;
+  vit = import ./vit;
+  weboob = import ./weboob;
+  weechat = import ./weechat;
+  ympd = import ./ympd;
+}
+// import ./python-packages
+// import ./environments
diff --git a/overlays/dwm/default.nix b/overlays/dwm/default.nix
new file mode 100644 (file)
index 0000000..96ed3ff
--- /dev/null
@@ -0,0 +1,7 @@
+self: super: {
+  dwm = super.dwm.overrideAttrs(old: rec {
+    postPatch = ''
+      cp ${./dwm_config.h} ./config.h
+      '';
+  });
+}
diff --git a/overlays/dwm/dwm_config.h b/overlays/dwm/dwm_config.h
new file mode 100644 (file)
index 0000000..b1587e8
--- /dev/null
@@ -0,0 +1,98 @@
+/* See LICENSE file for copyright and license details. */
+
+/* appearance */
+static const unsigned int borderpx  = 1;        /* border pixel of windows */
+static const unsigned int snap      = 32;       /* snap pixel */
+static const int showbar            = 1;        /* 0 means no bar */
+static const int topbar             = 1;        /* 0 means bottom bar */
+static const char *fonts[]          = { "monospace:size=10" };
+static const char dmenufont[]       = "monospace:size=10";
+static const char col_gray1[]       = "#222222";
+static const char col_gray2[]       = "#444444";
+static const char col_gray3[]       = "#bbbbbb";
+static const char col_gray4[]       = "#eeeeee";
+static const char col_cyan[]        = "#005577";
+static const char *colors[][3]      = {
+       /*               fg         bg         border   */
+       [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+       [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
+};
+
+/* tagging */
+static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+
+static const Rule rules[] = {
+       /* xprop(1):
+        *      WM_CLASS(STRING) = instance, class
+        *      WM_NAME(STRING) = title
+        */
+       /* class       instance    title      tags mask     isfloating   monitor */
+       { "Nextcloud", NULL,       NULL,      9 << 8,       0,           -1 },
+};
+
+/* layout(s) */
+static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster     = 1;    /* number of clients in master area */
+static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
+
+static const Layout layouts[] = {
+       /* symbol     arrange function */
+       { "[M]",      monocle }, /* first entry is default */
+       { "[]=",      tile },
+       { "><>",      NULL },    /* no layout function means floating behavior */
+};
+
+/* key definitions */
+#define MODKEY Mod1Mask
+#define TAGKEYS(KEY,TAG) \
+       { MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
+       { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
+       { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
+       { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
+
+/* helper for spawning shell commands in the pre dwm-5.0 fashion */
+#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+/* commands */
+static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
+static const char *termcmd[]  = { "st", NULL };
+
+static Key keys[] = {
+       /* modifier                     key        function        argument */
+       { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
+       { MODKEY,                       XK_t,      spawn,          {.v = termcmd } },
+       { MODKEY,                       XK_Tab,    view,           {0} },
+       { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
+       { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
+       { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
+       { MODKEY,                       XK_Return, zoom,           {0} },
+       TAGKEYS(                        XK_1,                      0)
+       TAGKEYS(                        XK_2,                      1)
+       TAGKEYS(                        XK_3,                      2)
+       TAGKEYS(                        XK_4,                      3)
+       TAGKEYS(                        XK_5,                      4)
+       TAGKEYS(                        XK_6,                      5)
+       TAGKEYS(                        XK_7,                      6)
+       TAGKEYS(                        XK_8,                      7)
+       TAGKEYS(                        XK_9,                      8)
+       { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
+};
+
+/* button definitions */
+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
+static Button buttons[] = {
+       /* click                event mask      button          function        argument */
+       { ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
+       { ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
+       { ClkWinTitle,          0,              Button2,        zoom,           {0} },
+       { ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
+       { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
+       { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
+       { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
+       { ClkTagBar,            0,              Button1,        view,           {0} },
+       { ClkTagBar,            0,              Button3,        toggleview,     {0} },
+       { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
+       { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
+};
+
diff --git a/overlays/elinks/default.nix b/overlays/elinks/default.nix
new file mode 100644 (file)
index 0000000..1744dc0
--- /dev/null
@@ -0,0 +1,14 @@
+self: super: {
+  elinks = super.elinks.overrideAttrs (old:
+    self.mylibs.fetchedGithub ./elinks.json // rec {
+      preConfigure = ''sh autogen.sh'';
+      buildInputs = old.buildInputs ++ (with self; [ gettext automake autoconf ]);
+      configureFlags = [
+        "--disable-smb" "--without-x" "--enable-cgi"
+        "--enable-leds" "--enable-256-colors"
+        "--enable-html-highlight" "--with-zlib"
+        ];
+      patches = [];
+    }
+  );
+}
diff --git a/overlays/elinks/elinks.json b/overlays/elinks/elinks.json
new file mode 100644 (file)
index 0000000..ea13b1f
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "f86be65-master",
+  "meta": {
+    "name": "elinks",
+    "url": "https://github.com/nabetaro/elinks",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "nabetaro",
+    "repo": "elinks",
+    "rev": "f86be659718c0cd0a67f88b42f07044c23d0d028",
+    "sha256": "1jxb7xgawcjkb3gw4gqyw26g02709wwdbhyczfckh3l4njxhy14m",
+    "fetchSubmodules": true
+  }
+}
diff --git a/overlays/environments/default.nix b/overlays/environments/default.nix
new file mode 100644 (file)
index 0000000..630b0bd
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  immae-eu = import ./immae-eu.nix;
+}
diff --git a/overlays/environments/immae-eu.nix b/overlays/environments/immae-eu.nix
new file mode 100644 (file)
index 0000000..1f27e7c
--- /dev/null
@@ -0,0 +1,116 @@
+self: super: with self;
+let
+  # https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
+  # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks
+  paths = [
+    # archives
+    lzo unzip bzip2 p7zip xz
+    # unrar is unfree
+
+    # backups
+    duply
+
+    # calendar/contacts
+    abook khard khal cadaver vdirsyncer pal
+
+    # computing
+    boinctui
+
+    # cryptocurrencies
+    cardano sia monero
+    xmr-stak
+    solc
+    iota-cli-app
+
+    # debugging
+    rr valgrind netcat-gnu strace
+
+    # documentations
+    unicodeDoc
+
+    # e-mails
+    muttprint mutt-ics
+    notmuch-python2 notmuch-python3 notmuch-vim
+    neomutt mairix notmuch
+    bogofilter fetchmail
+
+    # git
+    vcsh gitRepo gitAndTools.stgit tig
+
+    # graphical tools
+    nextcloud-client firefox
+    dwm dmenu st
+
+    # images
+    feh imagemagick tiv graphicsmagick
+
+    # internet browsing
+    w3m lynx links elinks browsh weboob urlview googler urlwatch
+
+    # less
+    python3Packages.pygments lesspipe highlight sourceHighlight
+
+    # monitoring
+    cnagios mtop pg_activity nagios-cli mtr
+    iftop htop iotop iperf
+    goaccess
+    # nagnu
+
+    # messaging/forums/news
+    flrn slrn
+    telegram-cli telegram-history-dump telegramircd
+    weechat profanity
+    newsboat irssi
+
+    # nix
+    mylibs.yarn2nixPackage.yarn2nix
+    nixops nix-prefetch-scripts nix-generate-from-cpan
+    nix-zsh-completions bundix nodePackages.bower2nix
+    nodePackages.node2nix
+    # (nixos {}).nixos-generate-config
+    # (nixos {}).nixos-install
+    # (nixos {}).nixos-enter
+    # (nixos {}).manual.manpages
+
+    # note taking
+    note terminal-velocity jrnl
+
+    # office
+    sc-im ranger
+    genius bc
+    ledger
+    tmux
+    rtorrent
+    ldapvi
+
+    # password management
+    pass apg pwgen
+
+    # pdf
+    pdftk poppler_utils
+
+    # programming
+    pelican emacs26-nox ctags
+    wdiff
+
+    # security
+    keybase
+
+    # todolist/time management
+    taskwarrior vit timewarrior
+
+    # video/music
+    youtube-dl ncmpc ncmpcpp ffmpeg
+
+    # other tools
+    pgloader s3cmd lftp jq cpulimit libxslt
+  ];
+in
+{
+  myEnvironments.immae-eu = buildEnv {
+    name = "immae-eu-packages";
+    inherit paths;
+    pathsToLink = [ "/bin" "/etc" "/include" "/lib" "/libexec" "/share"];
+    extraOutputsToInstall = [ "bin" "man" "doc" "info" ];
+  };
+}
diff --git a/overlays/gitweb/default.nix b/overlays/gitweb/default.nix
new file mode 100644 (file)
index 0000000..aa17d22
--- /dev/null
@@ -0,0 +1,7 @@
+self: super: {
+  gitweb = super.gitweb.overrideAttrs(old: {
+    installPhase = old.installPhase + ''
+      cp -r ${./theme} $out/gitweb-theme;
+      '';
+  });
+}
diff --git a/overlays/gitweb/theme/git-favicon.png b/overlays/gitweb/theme/git-favicon.png
new file mode 100644 (file)
index 0000000..4fa44bb
Binary files /dev/null and b/overlays/gitweb/theme/git-favicon.png differ
diff --git a/overlays/gitweb/theme/git-logo.png b/overlays/gitweb/theme/git-logo.png
new file mode 100644 (file)
index 0000000..fdaf7b7
Binary files /dev/null and b/overlays/gitweb/theme/git-logo.png differ
diff --git a/overlays/gitweb/theme/gitweb.css b/overlays/gitweb/theme/gitweb.css
new file mode 100644 (file)
index 0000000..83e0742
--- /dev/null
@@ -0,0 +1,783 @@
+/* Reset
+------------------------------------------------------------------------- */
+
+/* Based on http://meyerweb.com/eric/tools/css/reset/ */
+/* v1.0 | 20080212 */
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
+blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,
+font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b,
+u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table,
+caption, tbody, tfoot, thead, tr, th, td {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  outline: 0;
+  font-size: 100%;
+  vertical-align: baseline;
+  background: transparent;
+}
+
+ol, ul { list-style: none; }
+
+blockquote, q { quotes: none; }
+
+blockquote:before, blockquote:after,
+q:before, q:after {
+  content: '';
+  content: none;
+}
+
+:focus { outline: 0; }
+
+ins { text-decoration: none; }
+
+del { text-decoration: line-through; }
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+a { outline: none; }
+
+/* General
+---------------------------------------------------------------------------- */
+
+html {
+  position: relative;
+  min-height: 100%;
+}
+
+body {
+  font: 13px Helvetica,arial,freesans,clean,sans-serif;
+  line-height: 1.4;
+  margin: 0 0 105px;
+  background-color: #fff;
+  color: #000000;
+}
+
+/* Monospaced Fonts */
+.sha1, .mode, .diff_tree .list, .pre, .diff, .patchset {
+  font-family: 'Consolas','Bitstream Vera Sans Mono',monospace;
+}
+
+a:link, a:visited {
+  color: #4183C4;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+td.list a[href*='tree'], td.list a[href*='blob'] {
+  padding-left: 20px;
+  display: block;
+  float: left;
+  height: 16px;
+  line-height: 16px;
+}
+
+td.list a[href*='tree'] {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABq0lEQVQ4y8WTu4oUQRSGv+rtGVuxhwVFdFEEE2c3d0HYTEMTn8DEVxADQTDUF9DMwMxQMBMx8AEWzRQ3cBHd9TI91+2urjq/QbczY2IygSep4nD+79yqnCRWsYQVbWVACvDh5ZXdrLe15dwyT1TjT/sxFFeB6i+VA2B6+cb7kAI4Jf0LO087zjlQI8Y5Qvnj0sHug321XoC1bk+K9eHk6+s7wPMUgKAS88eqb4+Jfg2SHs7lZBvX2Nh+2EUCDGSAcMnJsx9f7NxfAGqXyDzRd5EJO/pMPT1gcviGTnYOVIN5pAAE8v7dLrKL8xnglFk4ws9Afko9HpH3b5Gd2mwb/lOBmgrSdYhJugDUCenxM6xv3p4HCsP8F0LxCsUhCkMURihOyM7fg0osASTFEpu9a4LjGIUCqwcoDiEUrX+E4hRUQb20RiokC1j9vckUhygU7X3QZh7NAVKYL7YBeMkRUfjVCotF2XGIwnghtrJpMywB5G0QZj9P1JNujuWJ1AHLQadRrACPkuZ0SSSWpeStWgDK6tHek5vbiOs48n++XQHurcf0rFng//6NvwG+iB9/4duaTgAAAABJRU5ErkJgggo=) center left no-repeat;
+}
+
+td.list a[href*='blob'] {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQoFQXBMW5TQRgGwNnHnoE0QbiCjoIooUmTU3AuS1BwIoTSUdJBigg3GCWOg9/++zHTop078wIAsPMrE4SL5/1aIyMjIyMjz/m0tbFECFdrPeaQQw75mz/5nZH7fN7aWILmauSYfznmmIfss8vIUx7zZWsTTXM5vpWvTk5Wq9VHQP/gtgOLa0Qpw940vAQdaG6thpOhlOkG0AEuAVGmEkAH+G4YSikxXQM6wDsAMRFAB/ihDNNUmN4DOsAbBAEAdICfpmmaAt4COoj2GgCASbIkZh1NAACznhQt2itnFgAAlF3u/gMDtJXPzQxoswAAAABJRU5ErkJgggo=) center left no-repeat;
+}
+
+i {
+  font-style: normal;
+}
+
+td, th {
+  padding: 5px;
+}
+
+.page_nav br {
+  display: none;
+}
+
+/* Page Header
+---------------------------------------------------------------------------- */
+
+.page_header {
+  height: 50px;
+  line-height: 50px;
+  position: relative;
+  padding: 0 27px;
+  margin-bottom: 20px;
+  font-size: 20px;
+  font-family: Helvetica, Arial, Freesans, Clean, sans-serif;
+  background: #FFFFFF; /* old browsers */
+  background: -moz-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%); /* firefox */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FFFFFF), color-stop(100%,#F5F5F5)); /* webkit */
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#F5F5F5',GradientType=0 ); /* ie */
+  background: -o-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%);
+  border-bottom: 1px solid #dfdfdf;
+}
+
+.page_header a:link, .page_header a:visited {
+  color: #4183C4;
+  text-decoration: none;
+  padding: 3px;
+  font-weight: bold;
+}
+
+.page_header a:hover {
+  font-weight: bold;
+  padding: 3px;
+  text-decoration: underline;
+}
+
+.page_header a:first-child {
+  background: transparent;
+}
+
+.page_header img.logo {
+  position: relative;
+  top: 7px;
+  margin-right: 5px;
+}
+
+/* Page Footer
+---------------------------------------------------------------------------- */
+
+.page_footer {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  height: 80px;
+  line-height: 80px;
+  margin-top: 15px;
+  background: #f1f1f1;
+  border-top: 2px solid #ddd;
+  border-bottom: 1px solid #ddd;
+}
+
+.page_footer_text {
+  color: #666;
+  display: inline;
+  float: left;
+  margin-left: 25px;
+  width: 80%;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+a.rss_logo {
+  float: right;
+  padding: 3px 1px;
+  width: 35px;
+  line-height: 10px;
+  border: 1px solid;
+  border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
+  color: #ffffff;
+  background-color: #ff6600;
+  font-weight: bold;
+  font-family: sans-serif;
+  font-size: 80%;
+  text-align: center;
+  text-decoration: none;
+  margin-top: 30px;
+  margin-left: 5px;
+}
+
+a.rss_logo:hover {
+  background-color: #ee5500;
+}
+
+.rss_logo {
+  margin-right: 25px;
+  background: yellow;
+}
+
+.rss_logo:last-child {
+  margin-right: 5px;
+}
+
+/* Index include
+---------------------------------------------------------------------------- */
+
+.index_include {
+  width: 95%;
+  margin: 0 auto 15px;
+  background: -moz-linear-gradient(center top , #FFFFFF 0%, #F5F5F5 100%) repeat scroll 0 0 transparent;
+  border: 1px solid #DFDFDF;
+  padding: 8px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+/* Elements
+---------------------------------------------------------------------------- */
+
+.project_list,
+.shortlog,
+.tree,
+.commit_search,
+.history {
+  width: 95%;
+  margin: 0 auto 15px auto;
+  border: 1px solid #d8d8d8;
+  -moz-box-shadow: 0 0 3px rgba(0,0,0,0.2);
+  -webkit-box-shadow: 0 0 3px rgba(0,0,0,0.2);
+  box-shadow: 0 0 3px rgba(0,0,0,0.2);
+}
+
+.project_list th,
+.shortlog th,
+.tree th,
+.commit_search th {
+  color: #afafaf;
+  font-weight: normal;
+}
+
+.project_list th {
+  font-weight: bold;
+}
+
+.project_list tr,
+.shortlog tr,
+.tree tr,
+.commit_search tr {
+  background: #eaeaea;
+  height: 2.5em;
+  text-align: left;
+  color: #545454;
+}
+
+.project_list tr.dark, .project_list tr.light,
+.shortlog tr.dark, .shortlog tr.light,
+.tree tr.dark, .tree tr.light,
+.commit_search tr.dark, .commit_search tr.light,
+.history tr.dark, .history tr.light,
+.heads tr.dark, .heads tr.light {
+  background: #F9F9F9; /* old browsers */
+  background: -moz-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%); /* firefox */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F9F9F9), color-stop(100%,#EFEFEF)); /* webkit */
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F9F9F9', endColorstr='#EFEFEF',GradientType=0 ); /* ie */
+  background: -o-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%);
+  height: 2.5em;
+  border-bottom: 1px solid #e1e1e1;
+}
+
+th .header {
+  background: transparent;
+  border: 0;
+  padding: 0;
+  font-weight: bold;
+}
+
+.tree {
+  width: 100%;
+  margin: 0;
+}
+
+.projsearch {
+  position: absolute;
+  right: 4%;
+  top: 15px;
+}
+
+.projsearch a {
+  display: none;
+}
+
+.commit_search {
+  background: #eaeaea;
+}
+
+.page_nav,
+.list_head,
+.page_path,
+.search {
+  width: 94%;
+  background: #eaeaea;
+  color: #545454;
+  border: 1px solid #d8d8d8;
+  padding: 5px;
+  margin: 0 auto 15px auto;
+}
+
+.history {
+  background: #eaeaea;
+}
+
+.title {
+  margin: 0 auto 15px auto;
+  padding: 5px;
+  width: 95%;
+}
+
+.readme {
+  background: #eaf2f5;
+  border: 1px solid #bedce7;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0 auto 15px auto;
+  padding: 15px;
+  width: 95%;
+}
+
+.readme h1 {
+  display: block;
+  font-size: 2em;
+  font-weight: bold;
+  margin-bottom: 0.67em;
+  margin-top: 0;
+}
+
+.readme h2 {
+  font-size: 1.5em;
+  font-weight: bold;
+  margin-bottom: 0.83em;
+}
+
+
+.readme h3 {
+  font-size: 1.17em;
+  font-weight: bold;
+  margin-bottom: 1em;
+}
+
+.readme p {
+  margin-bottom: 1em;
+}
+
+.readme ul {
+  list-style: disc;
+  margin-bottom: 1em;
+  margin-left: 1.5em;
+}
+
+.readme ul ul {
+  margin-bottom: 0;
+}
+
+.readme ol {
+  list-style: decimal;
+  margin-bottom: 1em;
+  margin-left: 1.5em;
+}
+
+.readme ol ol {
+  margin-bottom: 0;
+}
+
+.readme pre {
+  font-family: monospace;
+  margin: 1em 0;
+  white-space: pre;
+}
+
+.readme tt, .readme code, .readme kbd, .readme samp {
+  font-family: monospace;
+}
+
+.readme blockquote {
+  margin: 1em;
+}
+
+.projects_list,
+.tags {
+  width: 95%;
+  background: #f0f0f0;
+  color: #545454;
+  border: 1px solid #d8d8d8;
+  padding: 5px;
+  margin: 0 auto 15px auto;
+}
+
+.heads {
+  width: 95%;
+  color: #545454;
+  border: 1px solid #d8d8d8;
+  padding: 5px;
+  margin: 0 auto 15px auto;
+}
+
+.header {
+  width: 94%;
+  margin: 0 auto 15px auto;
+  background: #eaf2f5;
+  border: 1px solid #bedce7;
+  padding: 5px;
+}
+
+.header .age {
+  float: left;
+  color: #000;
+  font-weight: bold;
+  width: 10em;
+}
+
+.title_text {
+  width: 94%;
+  background: #eaf2f5;
+  border: 1px solid #bedce7;
+  padding: 5px;
+  margin: 0 auto 0 auto;
+}
+
+.log_body {
+  width: 94%;
+  background: #eaf2f5;
+  border: 1px solid #bedce7;
+  border-top: 0;
+  padding: 5px;
+  margin: 0 auto 15px auto;
+}
+
+.page_body {
+  line-height: 1.4em;
+  width: 94%;
+  background: #f8f8f8;
+  border: 1px solid #d8d8d8;
+  padding: 5px;
+  margin: 15px auto 15px auto;
+}
+
+.diff_tree {
+  width: 95%;
+  background: #f0f0f0;
+  border: 1px solid #d8d8d8;
+  padding: 5px;
+  margin: 0 auto 15px auto;
+}
+
+.page_body > .list_head {
+  width: 98.5%;
+}
+
+.page_body > .diff_tree {
+  width: 99.5%;
+}
+
+.patch > .header {
+  width: 99%;
+}
+
+.author .avatar,
+.author_date .avatar {
+  position: relative;
+  top: 3px;
+}
+
+.object_header .avatar {
+  border: 1px solid #D8D8D8;
+  float: right;
+}
+
+.object_header td,
+.object_header th {
+  vertical-align: top;
+}
+
+/* Refs
+---------------------------------------------------------------------------- */
+
+span.refs span {
+  color: #707070;
+  display: inline-block;
+  margin: 0;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 3px;
+  height: 18px;
+  padding: 0 6px;
+  text-overflow: ellipsis;
+}
+
+span.refs span.ref {
+  color: #707070;
+  display: inline-block;
+  margin: 0;
+  background-color: #c4c4ff;
+  border: 1px solid #7878ff;
+  border-radius: 3px;
+  height: 18px;
+  padding: 0 6px;
+  text-overflow: ellipsis;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUnpolg7AAAAHJQTFRFAAAAVVWqZmbMVVXVYGDgbW3td3fuc3PzdHT0cHD1d3f6dHT6dnb7dHT7dnb8dnb8dnb9d3f9dnb+eHj+d3f+eHj+d3f+d3f+d3f+eHj+d3f+eHj+d3f+eHj+d3f+d3f+eHj+d3f+d3f+d3f+eHj/////V9oQhQAAACR0Uk5TAAIEBQcNDhMVGCotNTZAT217i5CgobvExtjZ4eLr7vP09ff7uqQ6cgAAAAFiS0dEJcMByQ8AAABUSURBVBjTpc43AoAwDENRh95bgNBM1f3PyOpslD++RSJ61YgH5M2IbIkn4GocSR1MZVBL4t2n4FgkbaxI8Sqph041WknZCWAIrcmEUbpf3lNe0N9u59YFYHnZ78gAAAAASUVORK5CYII=);
+  background-repeat: no-repeat;
+  padding-left: 18px;
+}
+
+span.refs span.tag {
+  color: #707070;
+  display: inline-block;
+  margin: 0;
+  background-color: #ffffab;
+  border: 1px solid #d9d93b;
+  border-radius: 3px;
+  height: 18px;
+  padding: 0 6px;
+  text-overflow: ellipsis;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUZZ+h9RwAAAGZQTFRFAAAAtrYkwMBAwMBAx8c4yso11NQ71NQ51dU52Ng71tY519c719c719c62Ng719c719c62Ng72dk62Ng62Ng72Ng72dk62Ng72Ng62dk62dk72dk62Ng62dk72Ng72Ng72dk7////ou/AnQAAACB0Uk5TAAYHCxESLjRCWWlqa4uNkpissbrO19jc3ufs8vf6/f7atAU2AAAAAWJLR0QhxGwNFgAAAF1JREFUGFeNy0cOgCAABVGw94rY5d//lC7omhhn+ZIh5Gf1xPk0Zi5dAABROIQjSU/fsAXhDkCUljAv8jW2wlQpaixpo4Nj+dtatVpjkSJjLNaizRVpvhBCu/4h391jzw1lU12Z7wAAAABJRU5ErkJggg==);
+  background-repeat: no-repeat;
+  padding-left: 18px;
+}
+
+span.refs span.head {
+  color: #707070;
+  display: inline-block;
+  margin: 0;
+  background-color: #c4ffc4;
+  border: 1px solid #78ff78;
+  border-radius: 3px;
+  height: 18px;
+  padding: 0 6px;
+  text-overflow: ellipsis;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSYDsafX/gAAAUpJREFUOMvVkjFLA0EQhd/s7l06MSCihbV/wC5/QBDEIFYWprRIIQQJFqKFQi4kUbBQsFSwtrUQLQULUTBFLCzVIgimCXe7z0q5yIWcqfRVwzDzMTNvgL8mSUqWw3JOtFQJdsIwLDYyjdYgkEmkazl2oVtQWk36nn8AYBYASmFpxmizGtnoqO7Vb+M9KglEkASdpWU872nvVCiPRpuTnz2JIHGyqX3d0kZfR1G0Ht+g/do+FIhOBbLW3n/FNb/28D0puZ+dyL44ur1UoH5yzt2JyIj6UGdDgwrPhYzSagNEszJaeU/lWlylbmnaeGZZICsAppxzi6nt73HK85oQCMknOuarpno+FIjglVjZDXaCS2yDv3rIHlCb88FY0BlUl3hs7ektkhckb5DFWhoz+n12zr7ZPLpYUqLm0oBMn8NUzLhpAgjpWMS/1CcSJ3ykD7Rk1QAAAABJRU5ErkJggg==);
+  background-repeat: no-repeat;
+  padding-left: 18px;
+}
+
+span.refs a {
+  color: #4e4e4e;
+  font: 11px "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, monospace;
+  line-height: 18px;
+}
+
+/* Diffs
+---------------------------------------------------------------------------- */
+
+div.diff.to_file a.path,
+div.diff.to_file {
+  color: #007000;
+}
+
+div.diff.from_file a.path,
+div.diff.from_file {
+  color: #aa0000;
+}
+
+.patch .header {
+  margin: 0;
+}
+
+.patchset {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+
+.chunk_header {
+  background: #eaf2f5;
+  color: #999;
+}
+
+.rem {
+  background: #ffdddd;
+}
+.rem .marked {
+  background: #ffaaaa;
+}
+.add {
+  background: #ddffdd;
+}
+.add .marked {
+  background: #7dff7d;
+}
+
+.extended_header {
+  width: 99.5%;
+}
+
+div.chunk_block {
+  overflow: hidden;
+}
+
+div.chunk_block div.old {
+  float: left;
+  width: 50%;
+  overflow: hidden;
+  border-right: 5px solid #EAF2F5;
+}
+
+div.chunk_block.rem,
+div.chunk_block.add {
+  background: transparent;
+}
+
+div.chunk_block div.old .add,
+div.chunk_block div.old .rem {
+  padding-right: 3px;
+}
+
+div.chunk_block div.new .add,
+div.chunk_block div.new .rem {
+  padding-left: 3px;
+}
+
+div.chunk_block div.new {
+  margin-left: 50%;
+  width: 50%;
+  border-left: 5px solid #EAF2F5;
+}
+
+/* Category
+---------------------------------------------------------------------------- */
+
+td.category {
+  background: #E6F1F6; /* old browsers */
+  background: -moz-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%); /* firefox */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#C8D8E7), color-stop(100%,#E6F1F3)); /* webkit */
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#C8D8E7', endColorstr='#E6F1F3',GradientType=0 ); /* ie */
+  background: -o-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%);
+  font-weight: bold;
+  border-bottom: 1px solid #D1D1D1;
+  border-top: 1px solid #D1D1D1;
+}
+
+/* Age
+---------------------------------------------------------------------------- */
+
+/* noage: "No commits" */
+.project_list td.noage {
+  color: #cdcdcd;
+}
+
+/* age2: 60*60*24*2 <= age */
+.project_list td.age2, .blame td.age2 {
+  color: #545454;
+}
+
+/* age1: 60*60*2 <= age < 60*60*24*2 */
+.project_list td.age1 {
+  color: #009900;
+}
+
+/* age0: age < 60*60*2 */
+.project_list td.age0 {
+  color: #009900;
+  font-weight: bold;
+}
+
+/* File status
+---------------------------------------------------------------------------- */
+
+.diff_tree span.file_status.new {
+  color: #008000;
+}
+
+table.diff_tree span.file_status.deleted {
+  color: #c00000;
+}
+
+table.diff_tree span.file_status.moved,
+table.diff_tree span.file_status.mode_chnge {
+  color: #545454;
+}
+
+table.diff_tree span.file_status.copied {
+  color: #70a070;
+}
+
+span.cntrl {
+  border: dashed #aaaaaa;
+  border-width: 1px;
+  padding: 0px 2px 0px 2px;
+  margin:  0px 2px 0px 2px;
+}
+
+span.match {
+  background: #aaffaa;
+  color: #000;
+}
+
+td.error {
+  color: red;
+  background: yellow;
+}
+
+/* blob view */
+
+td.pre, div.pre, div.diff {
+  white-space: pre-wrap;
+}
+
+/* JavaScript-based timezone manipulation */
+
+.popup { /* timezone selection UI */
+       position: absolute;
+       /* "top: 0; right: 0;" would be better, if not for bugs in browsers */
+       top: 0; left: 0;
+       border: 1px solid #d8d8d8;
+       padding: 2px;
+       background-color: #f0f0f0;
+       font-style: normal;
+       color: #545454;
+       cursor: auto;
+}
+
+.close-button { /* close timezone selection UI without selecting */
+       /* float doesn't work within absolutely positioned container,
+        * if width of container is not set explicitly */
+       /* float: right; */
+       position: absolute;
+       top: 0px; right: 0px;
+       border:  1px solid #ffaaaa;
+       margin:  1px 1px 1px 1px;
+       padding-bottom: 2px;
+       width:     12px;
+       height:    10px;
+       font-size:  9px;
+       font-weight: bold;
+       text-align: center;
+       background-color: #ffdddd;
+       cursor: pointer;
+}
+
+/* Style definition generated by highlight 2.4.5, http://www.andre-simon.de/ */
+
+/* Highlighting theme definition: */
+
+.num    { color:#6ecf36; }
+.esc    { color:#ff00ff; }
+.str    { color:#ff00d3; background-color: #edc9ec }
+.dstr   { color:#818100; }
+.slc    { color:#838183; font-style:italic; }
+.com    { color:#838183; font-style:italic; }
+.dir    { color:#008200; }
+.sym    { color:#000000; }
+.line   { color:#555555; }
+.kwa    { color:#666666; font-weight:bold; }
+.kwb    { color:#6b3099; }
+.kwc    { color:#d4663d; }
+.kwd    { color:#2928ff; }
+
+/**** Styles supplémentaires *****/
+
+.readme div.toc {
+  float: right;
+  border: 1px solid black;
+  background-color: white;
+}
+.readme div.toc span.toctitle {
+  display: inline-block;
+  width: 100%;
+  text-align: center;
+  font-weight: bold;
+}
+
+.readme table {
+  background-color: white;
+}
+
+.readme table thead tr {
+  background-color: #ccc;
+}
+
+.readme table tbody tr:nth-child(2n) {
+  background-color: #f8f8f8;
+}
+
+.readme table td, .readme table th {
+  border: 1px solid black;
+}
diff --git a/overlays/gitweb/theme/gitweb.js b/overlays/gitweb/theme/gitweb.js
new file mode 100644 (file)
index 0000000..72f3cfa
--- /dev/null
@@ -0,0 +1,27 @@
+function include(filename, onload) {
+  var head   = document.getElementsByTagName('head')[0];
+  var script = document.createElement('script');
+  script.src = filename;
+  script.type = 'text/javascript';
+  script.onload = script.onreadystatechange = function() {
+    if (script.readyState) {
+      if (script.readyState === 'complete' || script.readyState === 'loaded') {
+        script.onreadystatechange = null;
+        onload();
+      }
+    } 
+    else {
+      onload();
+    }
+  }
+  head.appendChild(script);
+}
+
+include('static/gitweb.js', function() {});
+include('//code.jquery.com/jquery-3.1.0.min.js', function() {
+  $("div.title").each(function(index, element) {
+    if ($(element).text() === "readme" || $(element).text() === " ") {
+      $(element).hide();
+    }
+  });
+});
diff --git a/overlays/goaccess/default.nix b/overlays/goaccess/default.nix
new file mode 100644 (file)
index 0000000..12b28f3
--- /dev/null
@@ -0,0 +1,13 @@
+self: super: {
+  goaccess = super.goaccess.overrideAttrs(old: rec {
+    name = "goaccess-${version}";
+    version = "1.3";
+    src = self.fetchurl {
+      url = "https://tar.goaccess.io/${name}.tar.gz";
+      sha256 = "16vv3pj7pbraq173wlxa89jjsd279004j4kgzlrsk1dz4if5qxwc";
+    };
+    configureFlags = old.configureFlags ++ [ "--enable-tcb=btree" ];
+    buildInputs = old.buildInputs ++ [ self.tokyocabinet self.bzip2 ];
+  });
+
+}
diff --git a/overlays/kanboard/default.nix b/overlays/kanboard/default.nix
new file mode 100644 (file)
index 0000000..81b39fe
--- /dev/null
@@ -0,0 +1,18 @@
+self: super: {
+  kanboard = { kanboard_config ? "/etc/kanboard/config.php" }:
+    super.kanboard.overrideAttrs(old: rec {
+      name = "kanboard-${version}";
+      version = "1.2.9";
+      src = self.fetchFromGitHub {
+        owner = "kanboard";
+        repo = "kanboard";
+        rev = "c4152316b14936556edf3bcc4d11f16ba31b8ae7";
+        sha256 = "18bn9zhyfc5x28hwcxss7chdq7c8rshc8jxgai65i5l68iwhvjg7";
+      };
+      installPhase = ''
+        cp -a . $out
+        ln -s ${kanboard_config} $out/config.php
+        mv $out/data $out/dataold
+        '';
+    });
+}
diff --git a/overlays/ldapvi/default.nix b/overlays/ldapvi/default.nix
new file mode 100644 (file)
index 0000000..030e676
--- /dev/null
@@ -0,0 +1,3 @@
+self: super: {
+  ldapvi = super.ldapvi.overrideAttrs (old: self.mylibs.fetchedGit ./ldapvi.json);
+}
diff --git a/overlays/ldapvi/ldapvi.json b/overlays/ldapvi/ldapvi.json
new file mode 100644 (file)
index 0000000..ceaff71
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "f1d42ba-master",
+  "meta": {
+    "name": "ldapvi",
+    "url": "http://www.lichteblau.com/git/ldapvi.git",
+    "branch": "master"
+  },
+  "git": {
+    "url": "http://www.lichteblau.com/git/ldapvi.git",
+    "rev": "f1d42bad66cc4623d1ff21fbd5dddbf5009d3e40",
+    "sha256": "0c2h4b1spp9z6a16gy9azf0wyxq397yy7001x1zlvc7c60q11wry",
+    "fetchSubmodules": true
+  }
+}
diff --git a/overlays/lesspipe/default.nix b/overlays/lesspipe/default.nix
new file mode 100644 (file)
index 0000000..e53feae
--- /dev/null
@@ -0,0 +1,5 @@
+self: super: {
+  lesspipe = super.lesspipe.overrideAttrs(old: {
+    configureFlags = (old.configureFlags or []) ++ [ "--yes" ];
+  });
+}
diff --git a/overlays/neomutt/default.nix b/overlays/neomutt/default.nix
new file mode 100644 (file)
index 0000000..c8578c9
--- /dev/null
@@ -0,0 +1,8 @@
+self: super: {
+  neomutt = super.neomutt.overrideAttrs (old:
+    {
+      buildInputs = old.buildInputs ++ [ self.gdbm ];
+      configureFlags = old.configureFlags ++ [ "--gdbm" ];
+    }
+  );
+}
diff --git a/overlays/nixops/default.nix b/overlays/nixops/default.nix
new file mode 100644 (file)
index 0000000..eb29ecd
--- /dev/null
@@ -0,0 +1,7 @@
+self: super: {
+  nixops = super.nixops.overrideAttrs (old: {
+    preConfigure = (old.preConfigure or "") + ''
+      sed -i -e "/'keyFile'/s/'path'/'string'/" nixops/backends/__init__.py
+      '';
+  });
+}
diff --git a/overlays/pass/default.nix b/overlays/pass/default.nix
new file mode 100644 (file)
index 0000000..df42cf1
--- /dev/null
@@ -0,0 +1,8 @@
+self: super: {
+  pass = (super.pass.withExtensions (exts: [ exts.pass-otp ])).overrideAttrs (old:
+    self.mylibs.fetchedGit ./pass.json // {
+      patches = old.patches ++ [ ./pass-fix-pass-init.patch ];
+    }
+  );
+
+}
diff --git a/overlays/pass/pass-fix-pass-init.patch b/overlays/pass/pass-fix-pass-init.patch
new file mode 100644 (file)
index 0000000..10a76c1
--- /dev/null
@@ -0,0 +1,42 @@
+From 33e8f1cd0065639a948d7b5ba3f93d43bdf7f3be Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= <ismael.bouya@normalesup.org>
+Date: Sun, 11 Nov 2018 19:47:33 +0100
+Subject: [PATCH] Fix pass init for some gpg keys
+
+This fixes the pass init for gpg keys which have their main key as
+encryption key. This may happen for instance with RSA keys and specific
+configuration.
+---
+ src/password-store.sh       | 2 +-
+ tests/t0300-reencryption.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/password-store.sh b/src/password-store.sh
+index d89d455..44d122e 100755
+--- a/src/password-store.sh
++++ b/src/password-store.sh
+@@ -124,7 +124,7 @@ reencrypt_path() {
+                               IFS=";" eval 'GPG_RECIPIENTS+=( $group )' # http://unix.stackexchange.com/a/92190
+                               unset "GPG_RECIPIENTS[$index]"
+                       done
+-                      gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)"
++                      gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)"
+               fi
+               current_keys="$(LC_ALL=C $GPG $PASSWORD_STORE_GPG_OPTS -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$passfile" 2>&1 | sed -n 's/^gpg: public key is \([A-F0-9]\+\)$/\1/p' | LC_ALL=C sort -u)"
+diff --git a/tests/t0300-reencryption.sh b/tests/t0300-reencryption.sh
+index 3c88987..57d873f 100755
+--- a/tests/t0300-reencryption.sh
++++ b/tests/t0300-reencryption.sh
+@@ -7,7 +7,7 @@ cd "$(dirname "$0")"
+ INITIAL_PASSWORD="will this password live? a big question indeed..."
+ canonicalize_gpg_keys() {
+-      $GPG --list-keys --with-colons "$@" | sed -n 's/sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u
++      $GPG --list-keys --with-colons "$@" | sed -n 's/[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u
+ }
+ gpg_keys_from_encrypted_file() {
+       $GPG -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$1" 2>&1 | grep "public key is" | cut -d ' ' -f 5 | LC_ALL=C sort -u
+-- 
+2.19.1
+
diff --git a/overlays/pass/pass.json b/overlays/pass/pass.json
new file mode 100644 (file)
index 0000000..a4638c1
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "d29a389-master",
+  "meta": {
+    "name": "password-store",
+    "url": "https://git.zx2c4.com/password-store/",
+    "branch": "master"
+  },
+  "git": {
+    "url": "https://git.zx2c4.com/password-store/",
+    "rev": "d29a389a40524c684595f51bb937f66958bc14ea",
+    "sha256": "17g43i0if9nggcq6005iyxxy9my8s15ihc2nzwjgqzhy3svh5xvn",
+    "fetchSubmodules": true
+  }
+}
diff --git a/overlays/pelican/default.nix b/overlays/pelican/default.nix
new file mode 100644 (file)
index 0000000..5f60b8f
--- /dev/null
@@ -0,0 +1,6 @@
+self: super: {
+  pelican = with self.python3Packages;
+    pelican.overrideAttrs(old: self.mylibs.fetchedGithub ./pelican.json // {
+      propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml ];
+    });
+}
diff --git a/overlays/pelican/pelican.json b/overlays/pelican/pelican.json
new file mode 100644 (file)
index 0000000..d8f4425
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "4.0.1",
+  "meta": {
+    "name": "pelican",
+    "url": "https://github.com/getpelican/pelican",
+    "branch": "refs/tags/4.0.1"
+  },
+  "github": {
+    "owner": "getpelican",
+    "repo": "pelican",
+    "rev": "24d6efa9fda4ad45649ddf88c1c596193d589bf8",
+    "sha256": "09fcwnnfln0cl5v0qpxzrllj27znrg6dbhaksxrl0192c3mbyjvl",
+    "fetchSubmodules": true
+  }
+}
diff --git a/overlays/profanity/default.nix b/overlays/profanity/default.nix
new file mode 100644 (file)
index 0000000..33861f1
--- /dev/null
@@ -0,0 +1,9 @@
+self: super: {
+  profanity = (super.profanity.override {
+    notifySupport = true;
+    inherit (self) libnotify gpgme gdk_pixbuf;
+    python = self.python3;
+  }).overrideAttrs (old: rec {
+    configureFlags = old.configureFlags ++ [ "--enable-plugins" ];
+  });
+}
diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix
new file mode 100644 (file)
index 0000000..ccf2f6a
--- /dev/null
@@ -0,0 +1,8 @@
+self: super: {
+  pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
+    buildbot-plugins = pysuper.buildbot-plugins // {
+      buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist;
+    };
+    buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ];
+  }) super.pythonOverrides;
+}
diff --git a/overlays/python-packages/default.nix b/overlays/python-packages/default.nix
new file mode 100644 (file)
index 0000000..8a9949e
--- /dev/null
@@ -0,0 +1,28 @@
+let
+  fromMyPythonPackages = name: self: super: {
+    pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
+      "${name}" = self."${pyself.python.pname}PackagesPlus"."${name}";
+    }) super.pythonOverrides;
+  };
+in
+{
+  # https://github.com/NixOS/nixpkgs/issues/44426
+  # needs to come before all other in alphabetical order (or make use of
+  # lib.mkBefore)
+  __pythonOverlayFix = self: super: let
+    pyNames = [ "python3" "python36" "python37" ];
+    overriddenPython = name: [
+      { inherit name; value = super.${name}.override { packageOverrides = self.pythonOverrides; }; }
+      { name = "${name}Packages"; value = self.recurseIntoAttrs self.${name}.pkgs; }
+    ];
+    overriddenPythons = builtins.concatLists (map overriddenPython pyNames);
+  in {
+    pythonOverrides = pyself: pysuper: {};
+    buildPythonOverrides = newOverrides: currentOverrides: super.lib.composeExtensions newOverrides currentOverrides;
+  } // super.lib.attrsets.listToAttrs overriddenPythons;
+
+
+  apprise = fromMyPythonPackages "apprise";
+  buildbot = import ./buildbot.nix;
+  wokkel = fromMyPythonPackages "wokkel";
+}
diff --git a/overlays/sc-im/default.nix b/overlays/sc-im/default.nix
new file mode 100644 (file)
index 0000000..f728655
--- /dev/null
@@ -0,0 +1,9 @@
+self: super: {
+  sc-im = super.sc-im.overrideAttrs (old: {
+    buildPhase = ''
+      cd src
+      sed -i Makefile -e 's@\...name.info@.local/state/$(name)info@'
+      cd ..
+      '' + old.buildPhase;
+  });
+}
diff --git a/overlays/shaarli/default.nix b/overlays/shaarli/default.nix
new file mode 100644 (file)
index 0000000..c2fb9cc
--- /dev/null
@@ -0,0 +1,10 @@
+self: super: {
+  shaarli = varDir: super.shaarli.overrideAttrs (old: {
+    patchPhase = "";
+    patches = (old.patches or []) ++ [ ./shaarli_ldap.patch ];
+    installPhase = (old.installPhase or "") + ''
+      cp .htaccess $out/
+      ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/
+      '';
+  });
+}
diff --git a/overlays/shaarli/shaarli_ldap.patch b/overlays/shaarli/shaarli_ldap.patch
new file mode 100644 (file)
index 0000000..9c7315a
--- /dev/null
@@ -0,0 +1,420 @@
+commit bc82ebfd779b8641dadd6787f51639ea9105c3e8
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Sun Feb 3 20:58:18 2019 +0100
+
+    Add ldap connection
+
+diff --git a/.htaccess b/.htaccess
+index 4c00427..5acd708 100644
+--- a/.htaccess
++++ b/.htaccess
+@@ -6,10 +6,23 @@ RewriteEngine On
+ # Prevent accessing subdirectories not managed by SCM
+ RewriteRule ^(.git|doxygen|vendor) - [F]
++RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
++RewriteRule ^(.*) - [E=BASE:%1]
++
++RewriteCond %{ENV:REDIRECT_BASE} (.+)
++RewriteRule .* - [E=BASE:%1]
++
+ # Forward the "Authorization" HTTP header
+ RewriteCond %{HTTP:Authorization} ^(.*)
+ RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
++RewriteCond %{REQUEST_FILENAME} !-f
++RewriteCond %{REQUEST_FILENAME} !-d
++RewriteRule ^((?!api/)[^/]*)/?(.*)$ $2?%{QUERY_STRING} [E=USERSPACE:$1]
++
++RewriteCond %{ENV:REDIRECT_USERSPACE} (.+)
++RewriteRule .* - [E=USERSPACE:%1]
++
+ # REST API
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+diff --git a/application/ApplicationUtils.php b/application/ApplicationUtils.php
+index 911873a..f21a1ef 100644
+--- a/application/ApplicationUtils.php
++++ b/application/ApplicationUtils.php
+@@ -191,6 +191,9 @@ public static function checkResourcePermissions($conf)
+             $conf->get('resource.page_cache'),
+             $conf->get('resource.raintpl_tmp'),
+         ) as $path) {
++            if (! is_dir($path)) {
++                mkdir($path, 0755, true);
++            }
+             if (! is_readable(realpath($path))) {
+                 $errors[] = '"'.$path.'" '. t('directory is not readable');
+             }
+diff --git a/application/config/ConfigManager.php b/application/config/ConfigManager.php
+index 32aaea4..99efc15 100644
+--- a/application/config/ConfigManager.php
++++ b/application/config/ConfigManager.php
+@@ -21,6 +21,11 @@ class ConfigManager
+     public static $DEFAULT_PLUGINS = array('qrcode');
++    /**
++     * @var string User space.
++     */
++    protected $userSpace;
++
+     /**
+      * @var string Config folder.
+      */
+@@ -41,12 +46,36 @@ class ConfigManager
+      *
+      * @param string $configFile Configuration file path without extension.
+      */
+-    public function __construct($configFile = 'data/config')
++    public function __construct($configFile = null, $userSpace = null)
+     {
+-        $this->configFile = $configFile;
++        $this->userSpace = $this->findLDAPUser($userSpace);
++        if ($configFile !== null) {
++            $this->configFile = $configFile;
++        } else {
++            $this->configFile = ($this->userSpace === null) ? 'data/config' : 'data/' . $this->userSpace . '/config';
++        }
+         $this->initialize();
+     }
++    public function findLDAPUser($login, $password = null) {
++        $connect = ldap_connect(getenv('SHAARLI_LDAP_HOST'));
++        ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
++        if (!$connect || !ldap_bind($connect, getenv('SHAARLI_LDAP_DN'), getenv('SHAARLI_LDAP_PASSWORD'))) {
++            return false;
++        }
++
++        $search_query = str_replace('%login%', ldap_escape($login), getenv('SHAARLI_LDAP_FILTER'));
++
++        $search = ldap_search($connect, getenv('SHAARLI_LDAP_BASE'), $search_query);
++        $info = ldap_get_entries($connect, $search);
++
++        if (ldap_count_entries($connect, $search) == 1 && (is_null($password) || ldap_bind($connect, $info[0]["dn"], $password))) {
++            return $login;
++        } else {
++            return null;
++        }
++    }
++
+     /**
+      * Reset the ConfigManager instance.
+      */
+@@ -269,6 +298,16 @@ public function getConfigFileExt()
+         return $this->configFile . $this->configIO->getExtension();
+     }
++    /**
++     * Get the current userspace.
++     *
++     * @return mixed User space.
++     */
++    public function getUserSpace()
++    {
++      return $this->userSpace;
++    }
++
+     /**
+      * Recursive function which find asked setting in the loaded config.
+      *
+@@ -342,19 +381,31 @@ protected static function removeConfig($settings, &$conf)
+      */
+     protected function setDefaultValues()
+     {
+-        $this->setEmpty('resource.data_dir', 'data');
+-        $this->setEmpty('resource.config', 'data/config.php');
+-        $this->setEmpty('resource.datastore', 'data/datastore.php');
+-        $this->setEmpty('resource.ban_file', 'data/ipbans.php');
+-        $this->setEmpty('resource.updates', 'data/updates.txt');
+-        $this->setEmpty('resource.log', 'data/log.txt');
+-        $this->setEmpty('resource.update_check', 'data/lastupdatecheck.txt');
+-        $this->setEmpty('resource.history', 'data/history.php');
++        if ($this->userSpace === null) {
++          $data = 'data';
++          $tmp  = 'tmp';
++          $cache = 'cache';
++          $pagecache = 'pagecache';
++        } else {
++          $data = 'data/' . ($this->userSpace);
++          $tmp  = 'tmp/' . ($this->userSpace);
++          $cache = 'cache/' . ($this->userSpace);
++          $pagecache = 'pagecache/' . ($this->userSpace);
++        }
++
++        $this->setEmpty('resource.data_dir', $data);
++        $this->setEmpty('resource.config', $data . '/config.php');
++        $this->setEmpty('resource.datastore', $data . '/datastore.php');
++        $this->setEmpty('resource.ban_file', $data . '/ipbans.php');
++        $this->setEmpty('resource.updates', $data . '/updates.txt');
++        $this->setEmpty('resource.log', $data . '/log.txt');
++        $this->setEmpty('resource.update_check', $data . '/lastupdatecheck.txt');
++        $this->setEmpty('resource.history', $data . '/history.php');
+         $this->setEmpty('resource.raintpl_tpl', 'tpl/');
+         $this->setEmpty('resource.theme', 'default');
+-        $this->setEmpty('resource.raintpl_tmp', 'tmp/');
+-        $this->setEmpty('resource.thumbnails_cache', 'cache');
+-        $this->setEmpty('resource.page_cache', 'pagecache');
++        $this->setEmpty('resource.raintpl_tmp', $tmp);
++        $this->setEmpty('resource.thumbnails_cache', $cache);
++        $this->setEmpty('resource.page_cache', $pagecache);
+         $this->setEmpty('security.ban_after', 4);
+         $this->setEmpty('security.ban_duration', 1800);
+diff --git a/application/security/LoginManager.php b/application/security/LoginManager.php
+index d6784d6..bdfaca7 100644
+--- a/application/security/LoginManager.php
++++ b/application/security/LoginManager.php
+@@ -32,6 +32,9 @@ class LoginManager
+     /** @var string User sign-in token depending on remote IP and credentials */
+     protected $staySignedInToken = '';
++    protected $lastErrorReason = '';
++    protected $lastErrorIsBanishable = false;
++
+     /**
+      * Constructor
+      *
+@@ -83,7 +86,7 @@ public function getStaySignedInToken()
+      */
+     public function checkLoginState($cookie, $clientIpId)
+     {
+-        if (! $this->configManager->exists('credentials.login')) {
++        if (! $this->configManager->exists('credentials.login') || (isset($_SESSION['username']) && $_SESSION['username'] && $this->configManager->get('credentials.login') !== $_SESSION['username'])) {
+             // Shaarli is not configured yet
+             $this->isLoggedIn = false;
+             return;
+@@ -133,20 +136,40 @@ public function isLoggedIn()
+      */
+     public function checkCredentials($remoteIp, $clientIpId, $login, $password)
+     {
+-        $hash = sha1($password . $login . $this->configManager->get('credentials.salt'));
++        $this->lastErrorIsBanishable = false;
++
++        if ($this->configManager->getUserSpace() !== null && $this->configManager->getUserSpace() !== $login) {
++          logm($this->configManager->get('resource.log'),
++               $remoteIp,
++               'Trying to login to wrong user space');
++          $this->lastErrorReason = 'You’re trying to access the wrong account.';
++          return false;
++        }
+-        if ($login != $this->configManager->get('credentials.login')
+-            || $hash != $this->configManager->get('credentials.hash')
+-        ) {
++        logm($this->configManager->get('resource.log'),
++             $remoteIp,
++             'Trying LDAP connection');
++        $result = $this->configManager->findLDAPUser($login, $password);
++        if ($result === false) {
+             logm(
+                 $this->configManager->get('resource.log'),
+                 $remoteIp,
+-                'Login failed for user ' . $login
++                'Impossible to connect to LDAP'
+             );
++            $this->lastErrorReason = 'Server error.';
++            return false;
++        } else if (is_null($result)) {
++            logm(
++              $this->configManager->get('resource.log'),
++              $remoteIp,
++              'Login failed for user ' . $login
++            );
++            $this->lastErrorIsBanishable = true;
++            $this->lastErrorReason = 'Wrong login/password.';
+             return false;
+         }
+-        $this->sessionManager->storeLoginInfo($clientIpId);
++        $this->sessionManager->storeLoginInfo($clientIpId, $login);
+         logm(
+             $this->configManager->get('resource.log'),
+             $remoteIp,
+@@ -187,6 +210,10 @@ protected function writeBanFile()
+      */
+     public function handleFailedLogin($server)
+     {
++        if (!$this->lastErrorIsBanishable) {
++          return $this->lastErrorReason ?: 'Error during login.';
++        };
++
+         $ip = $server['REMOTE_ADDR'];
+         $trusted = $this->configManager->get('security.trusted_proxies', []);
+@@ -215,6 +242,7 @@ public function handleFailedLogin($server)
+             );
+         }
+         $this->writeBanFile();
++        return $this->lastErrorReason ?: 'Error during login.';
+     }
+     /**
+diff --git a/application/security/SessionManager.php b/application/security/SessionManager.php
+index b8b8ab8..5eb4aac 100644
+--- a/application/security/SessionManager.php
++++ b/application/security/SessionManager.php
+@@ -111,10 +111,10 @@ public static function checkId($sessionId)
+      *
+      * @param string $clientIpId Client IP address identifier
+      */
+-    public function storeLoginInfo($clientIpId)
++    public function storeLoginInfo($clientIpId, $login = null)
+     {
+         $this->session['ip'] = $clientIpId;
+-        $this->session['username'] = $this->conf->get('credentials.login');
++        $this->session['username'] = $login ?: $this->conf->get('credentials.login');
+         $this->extendTimeValidityBy(self::$SHORT_TIMEOUT);
+     }
+diff --git a/index.php b/index.php
+index 4b86a3e..85376e8 100644
+--- a/index.php
++++ b/index.php
+@@ -121,7 +121,27 @@
+     $_COOKIE['shaarli'] = session_id();
+ }
+-$conf = new ConfigManager();
++$folderBase = getenv("BASE");
++
++if (getenv("USERSPACE")) {
++    if (isset($_GET["do"]) && $_GET["do"] == "login") {
++        header("Location: $folderBase/?do=login");
++        exit;
++    }
++    $userspace = preg_replace("/[^-_A-Za-z0-9]/", '', getenv("USERSPACE"));
++} else if (isset($_SESSION["username"]) && $_SESSION["username"]) {
++    header("Location: " . $folderBase . "/" . $_SESSION["username"] . "?");
++    exit;
++} else if (!isset($_GET["do"]) || $_GET["do"] != "login") {
++    header("Location: $folderBase/?do=login");
++    exit;
++}
++
++if (isset($userspace)) {
++  $conf = new ConfigManager(null, $userspace);
++} else {
++  $conf = new ConfigManager();
++}
+ $sessionManager = new SessionManager($_SESSION, $conf);
+ $loginManager = new LoginManager($GLOBALS, $conf, $sessionManager);
+ $loginManager->generateStaySignedInToken($_SERVER['REMOTE_ADDR']);
+@@ -175,7 +195,7 @@
+     }
+     // Display the installation form if no existing config is found
+-    install($conf, $sessionManager, $loginManager);
++    install($conf, $sessionManager, $loginManager, $userspace);
+ }
+ $loginManager->checkLoginState($_COOKIE, $clientIpId);
+@@ -205,6 +225,7 @@ function isLoggedIn()
+         && $loginManager->checkCredentials($_SERVER['REMOTE_ADDR'], $clientIpId, $_POST['login'], $_POST['password'])
+     ) {
+         $loginManager->handleSuccessfulLogin($_SERVER);
++        $userspace = $_POST['login'];
+         $cookiedir = '';
+         if (dirname($_SERVER['SCRIPT_NAME']) != '/') {
+@@ -241,25 +262,25 @@ function isLoggedIn()
+                     $uri .= '&'.$param.'='.urlencode($_GET[$param]);
+                 }
+             }
+-            header('Location: '. $uri);
++            header('Location: '. $userspace . $uri);
+             exit;
+         }
+         if (isset($_GET['edit_link'])) {
+-            header('Location: ?edit_link='. escape($_GET['edit_link']));
++            header('Location: ' . $userspace . '?edit_link='. escape($_GET['edit_link']));
+             exit;
+         }
+         if (isset($_POST['returnurl'])) {
+             // Prevent loops over login screen.
+             if (strpos($_POST['returnurl'], 'do=login') === false) {
+-                header('Location: '. generateLocation($_POST['returnurl'], $_SERVER['HTTP_HOST']));
++                header('Location: ' . generateLocation($_POST['returnurl'], $_SERVER['HTTP_HOST']));
+                 exit;
+             }
+         }
+-        header('Location: ?'); exit;
++        header('Location: '. $userspace . '?'); exit;
+     } else {
+-        $loginManager->handleFailedLogin($_SERVER);
++        $errorReason = $loginManager->handleFailedLogin($_SERVER);
+         $redir = '&username='. urlencode($_POST['login']);
+         if (isset($_GET['post'])) {
+             $redir .= '&post=' . urlencode($_GET['post']);
+@@ -270,7 +291,7 @@ function isLoggedIn()
+             }
+         }
+         // Redirect to login screen.
+-        echo '<script>alert("'. t("Wrong login/password.") .'");document.location=\'?do=login'.$redir.'\';</script>';
++        echo '<script>alert("'. t($errorReason) .'");document.location=\'?do=login'.$redir.'\';</script>';
+         exit;
+     }
+ }
+@@ -1719,7 +1740,7 @@ function buildLinkList($PAGE, $LINKSDB, $conf, $pluginManager, $loginManager)
+  * @param SessionManager $sessionManager SessionManager instance
+  * @param LoginManager   $loginManager   LoginManager instance
+  */
+-function install($conf, $sessionManager, $loginManager) {
++function install($conf, $sessionManager, $loginManager, $userspace) {
+     // On free.fr host, make sure the /sessions directory exists, otherwise login will not work.
+     if (endsWith($_SERVER['HTTP_HOST'],'.free.fr') && !is_dir($_SERVER['DOCUMENT_ROOT'].'/sessions')) mkdir($_SERVER['DOCUMENT_ROOT'].'/sessions',0705);
+@@ -1755,7 +1776,7 @@ function install($conf, $sessionManager, $loginManager) {
+     }
+-    if (!empty($_POST['setlogin']) && !empty($_POST['setpassword']))
++    if (true)
+     {
+         $tz = 'UTC';
+         if (!empty($_POST['continent']) && !empty($_POST['city'])
+@@ -1764,15 +1785,15 @@ function install($conf, $sessionManager, $loginManager) {
+             $tz = $_POST['continent'].'/'.$_POST['city'];
+         }
+         $conf->set('general.timezone', $tz);
+-        $login = $_POST['setlogin'];
+-        $conf->set('credentials.login', $login);
++        $conf->set('credentials.login', $userspace);
+         $salt = sha1(uniqid('', true) .'_'. mt_rand());
+         $conf->set('credentials.salt', $salt);
+-        $conf->set('credentials.hash', sha1($_POST['setpassword'] . $login . $salt));
++        $hash = sha1(uniqid('', true) .'_'. mt_rand());
++        $conf->set('credentials.hash', $hash);
+         if (!empty($_POST['title'])) {
+             $conf->set('general.title', escape($_POST['title']));
+         } else {
+-            $conf->set('general.title', 'Shared links on '.escape(index_url($_SERVER)));
++            $conf->set('general.title', ucwords(str_replace("_", " ", $userspace)));
+         }
+         $conf->set('translation.language', escape($_POST['language']));
+         $conf->set('updates.check_updates', !empty($_POST['updateCheck']));
+@@ -1841,7 +1862,12 @@ function install($conf, $sessionManager, $loginManager) {
+ $app = new \Slim\App($container);
+ // REST API routes
+-$app->group('/api/v1', function() {
++if (isset($userspace)) {
++  $mountpoint = '/' . $userspace . '/api/v1';
++} else {
++  $mountpoint = '/api/v1';
++}
++$app->group($mountpoint, function() {
+     $this->get('/info', '\Shaarli\Api\Controllers\Info:getInfo')->setName('getInfo');
+     $this->get('/links', '\Shaarli\Api\Controllers\Links:getLinks')->setName('getLinks');
+     $this->get('/links/{id:[\d]+}', '\Shaarli\Api\Controllers\Links:getLink')->setName('getLink');
+@@ -1860,7 +1886,7 @@ function install($conf, $sessionManager, $loginManager) {
+ $response = $app->run(true);
+ // Hack to make Slim and Shaarli router work together:
+ // If a Slim route isn't found and NOT API call, we call renderPage().
+-if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v1') === false) {
++if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], $mountpoint) === false) {
+     // We use UTF-8 for proper international characters handling.
+     header('Content-Type: text/html; charset=utf-8');
+     renderPage($conf, $pluginManager, $linkDb, $history, $sessionManager, $loginManager);
diff --git a/overlays/slrn/default.nix b/overlays/slrn/default.nix
new file mode 100644 (file)
index 0000000..6caef55
--- /dev/null
@@ -0,0 +1,11 @@
+self: super: {
+  slrn = super.slrn.overrideAttrs (old: rec {
+    version = "1.0.3a";
+    name = "slrn-${version}";
+    src = self.fetchurl {
+      url = "http://www.jedsoft.org/releases/slrn/slrn-${version}.tar.bz2";
+      sha256 = "1b1d9iikr60w0vq86y9a0l4gjl0jxhdznlrdp3r405i097as9a1v";
+    };
+    configureFlags = old.configureFlags ++ [ "--with-slrnpull" ];
+  });
+}
diff --git a/overlays/taskwarrior/default.nix b/overlays/taskwarrior/default.nix
new file mode 100644 (file)
index 0000000..64ea690
--- /dev/null
@@ -0,0 +1,13 @@
+self: super:
+{
+  taskwarrior = super.taskwarrior.overrideAttrs (old: {
+    postInstall = ''${old.postInstall}
+      mkdir -p "$out/share/vim/vimfiles/ftdetect"
+      mkdir -p "$out/share/vim/vimfiles/syntax"
+      ln -s "../../../../share/doc/task/scripts/vim/ftdetect/task.vim" "$out/share/vim/vimfiles/ftdetect/"
+      ln -s "../../../../share/doc/task/scripts/vim/syntax/taskrc.vim" "$out/share/vim/vimfiles/syntax/"
+      ln -s "../../../../share/doc/task/scripts/vim/syntax/taskdata.vim" "$out/share/vim/vimfiles/syntax/"
+      ln -s "../../../../share/doc/task/scripts/vim/syntax/taskedit.vim" "$out/share/vim/vimfiles/syntax/"
+    '';
+  });
+}
diff --git a/overlays/vit/default.nix b/overlays/vit/default.nix
new file mode 100644 (file)
index 0000000..4624284
--- /dev/null
@@ -0,0 +1,8 @@
+self: super:
+{
+  vit = (super.vit.override { inherit (self) taskwarrior; }).overrideAttrs (old:
+    self.mylibs.fetchedGithub ./vit.json // {
+      buildInputs = old.buildInputs ++ (with self.perlPackages; [ TryTiny TextCharWidth ]);
+    }
+  );
+}
diff --git a/overlays/vit/vit.json b/overlays/vit/vit.json
new file mode 100644 (file)
index 0000000..d062f68
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "dbacada-1.3",
+  "meta": {
+    "name": "vit",
+    "url": "https://github.com/scottkosty/vit",
+    "branch": "1.3"
+  },
+  "github": {
+    "owner": "scottkosty",
+    "repo": "vit",
+    "rev": "dbacada5867b238fdf35dbf00a3ca0daf7703038",
+    "sha256": "1wlk62cv6dc0dqv8265xcx2l7ydzg40xf6l4qbrf6h5156ncc90l",
+    "fetchSubmodules": true
+  }
+}
diff --git a/overlays/weboob/default.nix b/overlays/weboob/default.nix
new file mode 100644 (file)
index 0000000..d0a15a7
--- /dev/null
@@ -0,0 +1,15 @@
+self: super: {
+  weboob = (self.pythonPackages.weboob.overridePythonAttrs {
+    setupPyBuildFlags = [ "--no-qt" "--xdg" ];
+  }).overrideAttrs (old: rec {
+    version = "1.5";
+    src = self.fetchurl {
+      url = "https://git.weboob.org/weboob/weboob/-/archive/${version}/${old.pname}-${version}.tar.gz";
+      sha256 = "0l6q5nm5g0zn6gmf809059kddrbds27wgygxsfkqja9blks5vq7z";
+    };
+    postInstall = ''${old.postInstall or ""}
+      mkdir -p $out/share/bash-completion/completions/
+      cp tools/weboob_bash_completion $out/share/bash-completion/completions/weboob
+    '';
+  });
+}
diff --git a/overlays/weechat/default.nix b/overlays/weechat/default.nix
new file mode 100644 (file)
index 0000000..17faa0e
--- /dev/null
@@ -0,0 +1,14 @@
+self: super: {
+  weechat = super.weechat.override {
+    configure = { availablePlugins, ... }: {
+      plugins = with self; with availablePlugins; [
+          # Make sure websocket_client is not 0.55.0, it provokes
+          # regular crashes
+         (python.withPackages (ps: with ps; assert websocket_client.version == "0.54.0"; [websocket_client emoji]))
+         perl
+         ruby
+        ];
+    };
+  };
+
+}
diff --git a/overlays/ympd/default.nix b/overlays/ympd/default.nix
new file mode 100644 (file)
index 0000000..dda17aa
--- /dev/null
@@ -0,0 +1,5 @@
+self: super: {
+  ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // {
+    patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
+  });
+}
diff --git a/overlays/ympd/ympd-password-env.patch b/overlays/ympd/ympd-password-env.patch
new file mode 100644 (file)
index 0000000..2bbe188
--- /dev/null
@@ -0,0 +1,23 @@
+diff --git a/src/ympd.c b/src/ympd.c
+index 3aed7e6..b3b6fda 100644
+--- a/src/ympd.c
++++ b/src/ympd.c
+@@ -71,6 +71,7 @@ int main(int argc, char **argv)
+     char *run_as_user = NULL;
+     char const *error_msg = NULL;
+     char *webport = "8080";
++    const char *s;
+     atexit(bye);
+ #ifdef WITH_DYNAMIC_ASSETS
+@@ -92,6 +93,10 @@ int main(int argc, char **argv)
+         {0,              0,                 0,  0 }
+     };
++    if ((s = getenv("MPD_PASSWORD")) != NULL) {
++        mpd.password = strdup(s);
++    }
++
+     while((n = getopt_long(argc, argv, "h:p:w:u:vm:",
+                 long_options, &option_index)) != -1) {
+         switch (n) {
diff --git a/overlays/ympd/ympd.json b/overlays/ympd/ympd.json
new file mode 100644 (file)
index 0000000..51f06d5
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "612f8fc-master",
+  "meta": {
+    "name": "ympd",
+    "url": "https://github.com/notandy/ympd",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "notandy",
+    "repo": "ympd",
+    "rev": "612f8fc0b2c47fc89d403e4a044541c6b2b238c8",
+    "sha256": "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/bitlbee-mastodon/default.nix b/pkgs/bitlbee-mastodon/default.nix
new file mode 100644 (file)
index 0000000..0451068
--- /dev/null
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, bitlbee, glib, lib }:
+stdenv.mkDerivation rec {
+  name = "bitlbee-mastodon-${version}";
+  version = "v1.4.2";
+
+  src = fetchFromGitHub {
+    rev = version;
+    owner = "kensanata";
+    repo = "bitlbee-mastodon";
+    sha256 = "04rakgr1pfsg1vhfwlfbggbzw249j7dmk88xrsnf3n84c5ccdyas";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkgconfig ];
+  buildInputs = [ bitlbee glib ];
+
+  preConfigure = ''
+    export BITLBEE_PLUGINDIR=$out/lib/bitlbee
+    ./autogen.sh
+  '';
+
+  meta = {
+    description = "Bitlbee plugin for Mastodon";
+
+    homepage = https://github.com/kensanata/bitlbee-mastodon;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/pkgs/boinctui/default.nix b/pkgs/boinctui/default.nix
new file mode 100644 (file)
index 0000000..d8b106a
--- /dev/null
@@ -0,0 +1,20 @@
+{ stdenv, fetchurl, expat, openssl, autoconf, ncurses }:
+stdenv.mkDerivation rec {
+  name = "boinctui-${version}";
+  version = "2.5.0";
+  src = fetchurl {
+    url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz";
+    sha256 = "16zxp8r4z6pllacdacg681y56cg2phnn3pm5gwszbsi93cix2g8p";
+  };
+
+  configureFlags = [ "--without-gnutls" ];
+  preConfigure = ''
+    autoconf
+    '';
+
+  preBuild = ''
+    sed -i -e 's/"HOME"/"XDG_CONFIG_HOME"/' src/cfg.cpp
+    sed -i -e 's@\.boinctui\.cfg@boinctui/boinctui.cfg@' src/mainprog.cpp
+    '';
+  buildInputs = [ expat openssl autoconf ncurses ];
+}
diff --git a/pkgs/cnagios/cnagios.json b/pkgs/cnagios/cnagios.json
new file mode 100644 (file)
index 0000000..4c1c385
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "3bd27fb-master",
+  "meta": {
+    "name": "cnagios",
+    "url": "https://github.com/dannywarren/cnagios",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "dannywarren",
+    "repo": "cnagios",
+    "rev": "3bd27fb40e68f61ffd01bea6234b919a667b6fe4",
+    "sha256": "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/cnagios/default.nix b/pkgs/cnagios/default.nix
new file mode 100644 (file)
index 0000000..d5b52f3
--- /dev/null
@@ -0,0 +1,22 @@
+{ stdenv, mylibs, perl, ncurses }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./cnagios.json // {
+  configureFlags = [
+    "--with-etc-dir=/etc/cnagios"
+    "--with-var-dir=/var/lib/naemon"
+    "--with-status-file=/var/lib/naemon/status.dat"
+    "--with-nagios-data=4"
+  ];
+
+  prePatch = ''
+    sed -i -e "s/-lcurses/-lncurses/" Makefile.in
+  '';
+  installPhase = ''
+    install -dm755 $out/share/doc/cnagios
+    install -Dm644 cnagiosrc $out/share/doc/cnagios/
+    install -Dm644 cnagios.help $out/share/doc/cnagios/
+    install -Dm644 cnagios.pl $out/share/doc/cnagios/
+    install -dm755 $out/bin
+    install -Dm755 cnagios $out/bin/
+  '';
+  buildInputs = [ perl ncurses ];
+})
diff --git a/pkgs/composer-env/default.nix b/pkgs/composer-env/default.nix
new file mode 100644 (file)
index 0000000..416a61c
--- /dev/null
@@ -0,0 +1,280 @@
+# This file originates from composer2nix
+
+{ stdenv, writeTextFile, fetchurl, php, unzip }:
+
+let
+  composer = stdenv.mkDerivation {
+    name = "composer-1.8.0";
+    src = fetchurl {
+      url = https://github.com/composer/composer/releases/download/1.8.0/composer.phar;
+      sha256 = "19pg9ip2mpyf5cyq34fld7qwl77mshqw3c4nif7sxmpnar6sh089";
+    };
+    buildInputs = [ php ];
+
+    # We must wrap the composer.phar because of the impure shebang.
+    # We cannot use patchShebangs because the executable verifies its own integrity and will detect that somebody has tampered with it.
+
+    buildCommand = ''
+      # Copy phar file
+      mkdir -p $out/share/php
+      cp $src $out/share/php/composer.phar
+      chmod 755 $out/share/php/composer.phar
+
+      # Create wrapper executable
+      mkdir -p $out/bin
+      cat > $out/bin/composer <<EOF
+      #! ${stdenv.shell} -e
+      exec ${php}/bin/php $out/share/php/composer.phar "\$@"
+      EOF
+      chmod +x $out/bin/composer
+    '';
+    meta = {
+      description = "Dependency Manager for PHP";
+      #license = stdenv.licenses.mit;
+      maintainers = [ stdenv.lib.maintainers.sander ];
+      platforms = stdenv.lib.platforms.unix;
+    };
+  };
+
+  buildZipPackage = { name, src }:
+    stdenv.mkDerivation {
+      inherit name src;
+      buildInputs = [ unzip ];
+      buildCommand = ''
+        unzip $src
+        baseDir=$(find . -type d -mindepth 1 -maxdepth 1)
+        cd $baseDir
+        mkdir -p $out
+        mv * $out
+      '';
+    };
+
+  buildPackage =
+    { name
+    , src
+    , packages ? {}
+    , devPackages ? {}
+    , buildInputs ? []
+    , symlinkDependencies ? false
+    , executable ? false
+    , removeComposerArtifacts ? false
+    , postInstall ? ""
+    , preInstall ? ""
+    , noDev ? false
+    , unpackPhase ? "true"
+    , buildPhase ? "true"
+    , doRemoveVendor ? true
+    , ...}@args:
+
+    let
+      reconstructInstalled = writeTextFile {
+        name = "reconstructinstalled.php";
+        executable = true;
+        text = ''
+          #! ${php}/bin/php
+          <?php
+          if(file_exists($argv[1]))
+          {
+              $composerLockStr = file_get_contents($argv[1]);
+
+              if($composerLockStr === false)
+              {
+                  fwrite(STDERR, "Cannot open composer.lock contents\n");
+                  exit(1);
+              }
+              else
+              {
+                  $config = json_decode($composerLockStr, true);
+
+                  if(array_key_exists("packages", $config))
+                      $allPackages = $config["packages"];
+                  else
+                      $allPackages = array();
+
+                  ${stdenv.lib.optionalString (!noDev) ''
+                    if(array_key_exists("packages-dev", $config))
+                        $allPackages = array_merge($allPackages, $config["packages-dev"]);
+                  ''}
+
+                  $packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+                  print($packagesStr);
+              }
+          }
+          else
+              print("[]");
+          ?>
+        '';
+      };
+
+      constructBin = writeTextFile {
+        name = "constructbin.php";
+        executable = true;
+        text = ''
+          #! ${php}/bin/php
+          <?php
+          $composerJSONStr = file_get_contents($argv[1]);
+
+          if($composerJSONStr === false)
+          {
+              fwrite(STDERR, "Cannot open composer.json contents\n");
+              exit(1);
+          }
+          else
+          {
+              $config = json_decode($composerJSONStr, true);
+
+              if(array_key_exists("bin-dir", $config))
+                  $binDir = $config["bin-dir"];
+              else
+                  $binDir = "bin";
+
+              if(array_key_exists("bin", $config))
+              {
+                  if(!file_exists("vendor/".$binDir))
+                      mkdir("vendor/".$binDir);
+
+                  foreach($config["bin"] as $bin)
+                      symlink("../../".$bin, "vendor/".$binDir."/".basename($bin));
+              }
+          }
+          ?>
+        '';
+      };
+
+      bundleDependencies = dependencies:
+        stdenv.lib.concatMapStrings (dependencyName:
+          let
+            dependency = dependencies.${dependencyName};
+          in
+          ''
+            ${if dependency.targetDir == "" then ''
+              vendorDir="$(dirname ${dependencyName})"
+              mkdir -p "$vendorDir"
+              ${if symlinkDependencies then
+                ''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
+                else
+                ''cp -a "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
+              }${if dependency.needsModifyRights or false then "\n" + ''
+                chmod -R u+rwx "$vendorDir/$(basename "${dependencyName}")"
+            '' else ""}
+            '' else ''
+              namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")"
+              mkdir -p "$namespaceDir"
+              ${if symlinkDependencies then
+                ''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
+              else
+                ''cp -a "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
+              }${if dependency.needsModifyRights or false then "\n" + ''
+                chmod -R u+rwx "$namespaceDir/$(basename "${dependency.targetDir}")"
+            '' else ""}
+            ''}
+          '') (builtins.attrNames dependencies);
+
+      extraArgs = removeAttrs args [ "name" "packages" "devPackages" "buildInputs" ];
+    in
+    stdenv.mkDerivation ({
+      name = "composer-${name}";
+      buildInputs = [ php composer ] ++ buildInputs;
+
+      inherit unpackPhase buildPhase;
+
+      installPhase = ''
+        ${if executable then ''
+          mkdir -p $out/share/php
+          cp -a $src $out/share/php/$name
+          chmod -R u+w $out/share/php/$name
+          cd $out/share/php/$name
+        '' else ''
+          cp -a $src $out
+          chmod -R u+w $out
+          cd $out
+        ''}
+
+        # Execute pre install hook
+        runHook preInstall
+
+        # Remove unwanted files
+        rm -f *.nix
+
+        export HOME=$TMPDIR
+
+        ${if doRemoveVendor then ''
+        # Remove the provided vendor folder if it exists
+        rm -Rf vendor
+        '' else ""}
+        # If there is no composer.lock file, compose a dummy file.
+        # Otherwise, composer attempts to download the package.json file from
+        # the registry which we do not want.
+        if [ ! -f composer.lock ]
+        then
+            cat > composer.lock <<EOF
+        {
+            "packages": []
+        }
+        EOF
+        fi
+
+        # Reconstruct the installed.json file from the lock file
+        mkdir -p vendor/composer
+        ${reconstructInstalled} composer.lock > vendor/composer/installed.json
+
+        # Copy or symlink the provided dependencies
+        cd vendor
+        ${bundleDependencies packages}
+        ${stdenv.lib.optionalString (!noDev) (bundleDependencies devPackages)}
+        cd ..
+
+        # Reconstruct autoload scripts
+        # We use the optimize feature because Nix packages cannot change after they have been built
+        # Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
+        composer dump-autoload --optimize ${stdenv.lib.optionalString noDev "--no-dev"}
+
+        # Run the install step as a validation to confirm that everything works out as expected
+        composer install --optimize-autoloader ${stdenv.lib.optionalString noDev "--no-dev"}
+
+        ${stdenv.lib.optionalString executable ''
+          # Reconstruct the bin/ folder if we deploy an executable project
+          ${constructBin} composer.json
+          ln -s $(pwd)/vendor/bin $out/bin
+        ''}
+
+        ${stdenv.lib.optionalString (!symlinkDependencies) ''
+          # Patch the shebangs if possible
+          if [ -d $(pwd)/vendor/bin ]
+          then
+              # Look for all executables in bin/
+              for i in $(pwd)/vendor/bin/*
+              do
+                  # Look for their location
+                  realFile=$(readlink -f "$i")
+
+                  # Restore write permissions
+                  chmod u+wx "$(dirname "$realFile")"
+                  chmod u+w "$realFile"
+
+                  # Patch shebang
+                  sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \
+                      -e "s|#!/usr/bin/env php|#!${php}/bin/php|" \
+                      "$realFile" > tmp
+                  mv tmp "$realFile"
+                  chmod u+x "$realFile"
+              done
+          fi
+        ''}
+
+        if [ "$removeComposerArtifacts" = "1" ]
+        then
+            # Remove composer stuff
+            rm -f composer.json composer.lock
+        fi
+
+        # Execute post install hook
+        runHook postInstall
+    '';
+  } // extraArgs);
+in
+{
+  composer = stdenv.lib.makeOverridable composer;
+  buildZipPackage = stdenv.lib.makeOverridable buildZipPackage;
+  buildPackage = stdenv.lib.makeOverridable buildPackage;
+}
diff --git a/pkgs/crypto/cardano/daedalus.json b/pkgs/crypto/cardano/daedalus.json
new file mode 100644 (file)
index 0000000..5bb72f4
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "0.12.1",
+  "meta": {
+    "name": "daedalus",
+    "url": "https://github.com/input-output-hk/daedalus",
+    "branch": "refs/tags/0.12.1"
+  },
+  "github": {
+    "owner": "input-output-hk",
+    "repo": "daedalus",
+    "rev": "1276852b9a766d9fd4cda10561254f1a8ddd33ed",
+    "sha256": "0jf6ibwf0r4587g1ixq6zvi40kzwy137jgay5136yfbg15xw14k2",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/crypto/cardano/default.nix b/pkgs/crypto/cardano/default.nix
new file mode 100644 (file)
index 0000000..879fddb
--- /dev/null
@@ -0,0 +1,29 @@
+{ stdenv, mylibs }:
+let
+  daedalusSrc = (mylibs.fetchedGithub ./daedalus.json).src;
+  daedalusOrig = (import daedalusSrc {}).daedalus;
+  cfg = stdenv.mkDerivation rec {
+    name = "launcher-config-custom";
+    buildInputs = [ daedalusSrc daedalusOrig.cfg ];
+    src = daedalusOrig.cfg;
+    installPhase = ''
+      cp -a $src $out
+      chmod -R u+w $out
+      cd $out/etc
+      sed -e "/^walletPath/d" -e "/^walletArgs/d" launcher-config.yaml > launcher-config-server-only.yaml
+      '';
+  };
+in
+stdenv.mkDerivation rec {
+  name = "daedalus-custom";
+  src = daedalusOrig;
+  buildInputs = [ cfg daedalusOrig ];
+  installPhase = ''
+    cp -a $src $out
+    chmod -R u+w $out
+    cd $out/bin
+    sed -i -e "s@${builtins.storeDir}/[0-9a-z]*-daedalus-config@${cfg}/etc@" daedalus
+    sed -e "s@${cfg}/etc/launcher-config.yaml@${cfg}/etc/launcher-config-server-only.yaml@" daedalus > daedalus-server-only
+    chmod a+x daedalus-server-only
+    '';
+}
diff --git a/pkgs/crypto/iota-cli-app/default.nix b/pkgs/crypto/iota-cli-app/default.nix
new file mode 100644 (file)
index 0000000..1a9d3ed
--- /dev/null
@@ -0,0 +1,20 @@
+{ stdenv, mylibs, fetchurl, fetchgit, callPackage, nodePackages, nodejs-8_x }:
+let
+  nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs-8_x; };
+  # built using node2nix -8 -l package-lock.json
+  # and changing "./." to "src"
+  packageEnv = import ./node-packages.nix {
+    src = stdenv.mkDerivation (mylibs.fetchedGithub ./iota-cli-app.json // {
+      phases = "installPhase";
+      installPhase = ''
+        cp -a $src $out
+        chmod u+w -R $out
+        cd $out
+        sed -i -e "s@host: 'http://localhost',@host: 'https://iri.trytes.eu',@" index.js
+        sed -i -e "s@port: 14265@port: 443@" index.js
+        '';
+    });
+    inherit fetchurl fetchgit nodeEnv;
+  };
+in
+packageEnv.package
diff --git a/pkgs/crypto/iota-cli-app/iota-cli-app.json b/pkgs/crypto/iota-cli-app/iota-cli-app.json
new file mode 100644 (file)
index 0000000..6b47dec
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "d7e2e08-master",
+  "meta": {
+    "name": "iota-cli-app",
+    "url": "https://github.com/iotaledger/cli-app",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "iotaledger",
+    "repo": "cli-app",
+    "rev": "d7e2e0856ae6bd34890fefb4245c07cd467a5032",
+    "sha256": "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/crypto/iota-cli-app/node-packages.nix b/pkgs/crypto/iota-cli-app/node-packages.nix
new file mode 100644 (file)
index 0000000..d5c61d6
--- /dev/null
@@ -0,0 +1,1814 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{src, nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "acorn-3.3.0" = {
+      name = "acorn";
+      packageName = "acorn";
+      version = "3.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz";
+        sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
+      };
+    };
+    "acorn-5.2.1" = {
+      name = "acorn";
+      packageName = "acorn";
+      version = "5.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz";
+        sha512 = "jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==";
+      };
+    };
+    "acorn-jsx-3.0.1" = {
+      name = "acorn-jsx";
+      packageName = "acorn-jsx";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz";
+        sha1 = "afdf9488fb1ecefc8348f6fb22f464e32a58b36b";
+      };
+    };
+    "ajv-4.11.8" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "4.11.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz";
+        sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
+      };
+    };
+    "ajv-keywords-1.5.1" = {
+      name = "ajv-keywords";
+      packageName = "ajv-keywords";
+      version = "1.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz";
+        sha1 = "314dd0a4b3368fad3dfcdc54ede6171b886daf3c";
+      };
+    };
+    "ansi-escapes-1.4.0" = {
+      name = "ansi-escapes";
+      packageName = "ansi-escapes";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz";
+        sha1 = "d3a8a83b319aa67793662b13e761c7911422306e";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "ansi-regex-3.0.0" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    };
+    "ansi-styles-2.2.1" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    };
+    "ansi-styles-3.2.0" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "3.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz";
+        sha512 = "NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==";
+      };
+    };
+    "argparse-1.0.9" = {
+      name = "argparse";
+      packageName = "argparse";
+      version = "1.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz";
+        sha1 = "73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86";
+      };
+    };
+    "array-union-1.0.2" = {
+      name = "array-union";
+      packageName = "array-union";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz";
+        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
+      };
+    };
+    "array-uniq-1.0.3" = {
+      name = "array-uniq";
+      packageName = "array-uniq";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    };
+    "arrify-1.0.1" = {
+      name = "arrify";
+      packageName = "arrify";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz";
+        sha1 = "898508da2226f380df904728456849c1501a4b0d";
+      };
+    };
+    "async-2.6.0" = {
+      name = "async";
+      packageName = "async";
+      version = "2.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-2.6.0.tgz";
+        sha512 = "xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==";
+      };
+    };
+    "babel-code-frame-6.26.0" = {
+      name = "babel-code-frame";
+      packageName = "babel-code-frame";
+      version = "6.26.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
+        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
+      };
+    };
+    "babel-polyfill-6.26.0" = {
+      name = "babel-polyfill";
+      packageName = "babel-polyfill";
+      version = "6.26.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
+        sha1 = "379937abc67d7895970adc621f284cd966cf2153";
+      };
+    };
+    "babel-runtime-6.26.0" = {
+      name = "babel-runtime";
+      packageName = "babel-runtime";
+      version = "6.26.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
+        sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "bignumber.js-4.1.0" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "4.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz";
+        sha512 = "eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==";
+      };
+    };
+    "bluebird-3.5.1" = {
+      name = "bluebird";
+      packageName = "bluebird";
+      version = "3.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz";
+        sha512 = "MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==";
+      };
+    };
+    "brace-expansion-1.1.8" = {
+      name = "brace-expansion";
+      packageName = "brace-expansion";
+      version = "1.1.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz";
+        sha1 = "c07b211c7c952ec1f8efd51a77ef0d1d3990a292";
+      };
+    };
+    "caller-path-0.1.0" = {
+      name = "caller-path";
+      packageName = "caller-path";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz";
+        sha1 = "94085ef63581ecd3daa92444a8fe94e82577751f";
+      };
+    };
+    "callsites-0.2.0" = {
+      name = "callsites";
+      packageName = "callsites";
+      version = "0.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz";
+        sha1 = "afab96262910a7f33c19a5775825c69f34e350ca";
+      };
+    };
+    "chalk-1.1.3" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    };
+    "chalk-2.3.0" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz";
+        sha512 = "Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==";
+      };
+    };
+    "circular-json-0.3.3" = {
+      name = "circular-json";
+      packageName = "circular-json";
+      version = "0.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz";
+        sha512 = "UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==";
+      };
+    };
+    "cli-cursor-1.0.2" = {
+      name = "cli-cursor";
+      packageName = "cli-cursor";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz";
+        sha1 = "64da3f7d56a54412e59794bd62dc35295e8f2987";
+      };
+    };
+    "cli-width-1.1.1" = {
+      name = "cli-width";
+      packageName = "cli-width";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz";
+        sha1 = "a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d";
+      };
+    };
+    "cli-width-2.2.0" = {
+      name = "cli-width";
+      packageName = "cli-width";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz";
+        sha1 = "ff19ede8a9a5e579324147b0c11f0fbcbabed639";
+      };
+    };
+    "co-4.6.0" = {
+      name = "co";
+      packageName = "co";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    };
+    "code-point-at-1.1.0" = {
+      name = "code-point-at";
+      packageName = "code-point-at";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    };
+    "color-convert-1.9.1" = {
+      name = "color-convert";
+      packageName = "color-convert";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz";
+        sha512 = "mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==";
+      };
+    };
+    "color-name-1.1.3" = {
+      name = "color-name";
+      packageName = "color-name";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    };
+    "colors-1.1.2" = {
+      name = "colors";
+      packageName = "colors";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz";
+        sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+      };
+    };
+    "concat-map-0.0.1" = {
+      name = "concat-map";
+      packageName = "concat-map";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "concat-stream-1.6.0" = {
+      name = "concat-stream";
+      packageName = "concat-stream";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz";
+        sha1 = "0aac662fd52be78964d5532f694784e70110acf7";
+      };
+    };
+    "core-js-2.5.3" = {
+      name = "core-js";
+      packageName = "core-js";
+      version = "2.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz";
+        sha1 = "8acc38345824f16d8365b7c9b4259168e8ed603e";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "crypto-js-3.1.9-1" = {
+      name = "crypto-js";
+      packageName = "crypto-js";
+      version = "3.1.9-1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz";
+        sha1 = "fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8";
+      };
+    };
+    "d-1.0.0" = {
+      name = "d";
+      packageName = "d";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/d/-/d-1.0.0.tgz";
+        sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
+      };
+    };
+    "debug-2.6.9" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.6.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
+        sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
+      };
+    };
+    "deep-is-0.1.3" = {
+      name = "deep-is";
+      packageName = "deep-is";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    };
+    "del-2.2.2" = {
+      name = "del";
+      packageName = "del";
+      version = "2.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/del/-/del-2.2.2.tgz";
+        sha1 = "c12c981d067846c84bcaf862cff930d907ffd1a8";
+      };
+    };
+    "doctrine-2.0.2" = {
+      name = "doctrine";
+      packageName = "doctrine";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz";
+        sha512 = "y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==";
+      };
+    };
+    "encoding-0.1.12" = {
+      name = "encoding";
+      packageName = "encoding";
+      version = "0.1.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz";
+        sha1 = "538b66f3ee62cd1ab51ec323829d1f9480c74beb";
+      };
+    };
+    "es5-ext-0.10.37" = {
+      name = "es5-ext";
+      packageName = "es5-ext";
+      version = "0.10.37";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz";
+        sha1 = "0ee741d148b80069ba27d020393756af257defc3";
+      };
+    };
+    "es6-iterator-2.0.3" = {
+      name = "es6-iterator";
+      packageName = "es6-iterator";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz";
+        sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
+      };
+    };
+    "es6-map-0.1.5" = {
+      name = "es6-map";
+      packageName = "es6-map";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz";
+        sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0";
+      };
+    };
+    "es6-set-0.1.5" = {
+      name = "es6-set";
+      packageName = "es6-set";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz";
+        sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1";
+      };
+    };
+    "es6-symbol-3.1.1" = {
+      name = "es6-symbol";
+      packageName = "es6-symbol";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz";
+        sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
+      };
+    };
+    "es6-weak-map-2.0.2" = {
+      name = "es6-weak-map";
+      packageName = "es6-weak-map";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz";
+        sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f";
+      };
+    };
+    "escape-string-regexp-1.0.5" = {
+      name = "escape-string-regexp";
+      packageName = "escape-string-regexp";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    };
+    "escope-3.6.0" = {
+      name = "escope";
+      packageName = "escope";
+      version = "3.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz";
+        sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3";
+      };
+    };
+    "eslint-3.19.0" = {
+      name = "eslint";
+      packageName = "eslint";
+      version = "3.19.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz";
+        sha1 = "c8fc6201c7f40dd08941b87c085767386a679acc";
+      };
+    };
+    "espree-3.5.2" = {
+      name = "espree";
+      packageName = "espree";
+      version = "3.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz";
+        sha512 = "sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==";
+      };
+    };
+    "esprima-4.0.0" = {
+      name = "esprima";
+      packageName = "esprima";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz";
+        sha512 = "oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==";
+      };
+    };
+    "esquery-1.0.0" = {
+      name = "esquery";
+      packageName = "esquery";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz";
+        sha1 = "cfba8b57d7fba93f17298a8a006a04cda13d80fa";
+      };
+    };
+    "esrecurse-4.2.0" = {
+      name = "esrecurse";
+      packageName = "esrecurse";
+      version = "4.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz";
+        sha1 = "fa9568d98d3823f9a41d91e902dcab9ea6e5b163";
+      };
+    };
+    "estraverse-4.2.0" = {
+      name = "estraverse";
+      packageName = "estraverse";
+      version = "4.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz";
+        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
+      };
+    };
+    "esutils-2.0.2" = {
+      name = "esutils";
+      packageName = "esutils";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    };
+    "event-emitter-0.3.5" = {
+      name = "event-emitter";
+      packageName = "event-emitter";
+      version = "0.3.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz";
+        sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
+      };
+    };
+    "exit-hook-1.1.1" = {
+      name = "exit-hook";
+      packageName = "exit-hook";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz";
+        sha1 = "f05ca233b48c05d54fff07765df8507e95c02ff8";
+      };
+    };
+    "fast-levenshtein-2.0.6" = {
+      name = "fast-levenshtein";
+      packageName = "fast-levenshtein";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    };
+    "figures-1.7.0" = {
+      name = "figures";
+      packageName = "figures";
+      version = "1.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz";
+        sha1 = "cbe1e3affcf1cd44b80cadfed28dc793a9701d2e";
+      };
+    };
+    "file-entry-cache-2.0.0" = {
+      name = "file-entry-cache";
+      packageName = "file-entry-cache";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz";
+        sha1 = "c392990c3e684783d838b8c84a45d8a048458361";
+      };
+    };
+    "flat-cache-1.3.0" = {
+      name = "flat-cache";
+      packageName = "flat-cache";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz";
+        sha1 = "d3030b32b38154f4e3b7e9c709f490f7ef97c481";
+      };
+    };
+    "fs.realpath-1.0.0" = {
+      name = "fs.realpath";
+      packageName = "fs.realpath";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    };
+    "generate-function-2.0.0" = {
+      name = "generate-function";
+      packageName = "generate-function";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz";
+        sha1 = "6858fe7c0969b7d4e9093337647ac79f60dfbe74";
+      };
+    };
+    "generate-object-property-1.2.0" = {
+      name = "generate-object-property";
+      packageName = "generate-object-property";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz";
+        sha1 = "9c0e1c40308ce804f4783618b937fa88f99d50d0";
+      };
+    };
+    "glob-7.1.2" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz";
+        sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==";
+      };
+    };
+    "globals-9.18.0" = {
+      name = "globals";
+      packageName = "globals";
+      version = "9.18.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz";
+        sha512 = "S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==";
+      };
+    };
+    "globby-5.0.0" = {
+      name = "globby";
+      packageName = "globby";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz";
+        sha1 = "ebd84667ca0dbb330b99bcfc68eac2bc54370e0d";
+      };
+    };
+    "graceful-fs-4.1.11" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.1.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz";
+        sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
+      };
+    };
+    "has-ansi-2.0.0" = {
+      name = "has-ansi";
+      packageName = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    };
+    "has-flag-2.0.0" = {
+      name = "has-flag";
+      packageName = "has-flag";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz";
+        sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51";
+      };
+    };
+    "iconv-lite-0.4.19" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.4.19";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz";
+        sha512 = "oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==";
+      };
+    };
+    "ignore-3.3.7" = {
+      name = "ignore";
+      packageName = "ignore";
+      version = "3.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz";
+        sha512 = "YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==";
+      };
+    };
+    "imurmurhash-0.1.4" = {
+      name = "imurmurhash";
+      packageName = "imurmurhash";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz";
+        sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
+      };
+    };
+    "in-publish-2.0.0" = {
+      name = "in-publish";
+      packageName = "in-publish";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz";
+        sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51";
+      };
+    };
+    "inflight-1.0.6" = {
+      name = "inflight";
+      packageName = "inflight";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "inquirer-0.11.0" = {
+      name = "inquirer";
+      packageName = "inquirer";
+      version = "0.11.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inquirer/-/inquirer-0.11.0.tgz";
+        sha1 = "7448bfa924092af311d47173bbab990cae2bb027";
+      };
+    };
+    "inquirer-0.12.0" = {
+      name = "inquirer";
+      packageName = "inquirer";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz";
+        sha1 = "1ef2bfd63504df0bc75785fff8c2c41df12f077e";
+      };
+    };
+    "install-0.10.4" = {
+      name = "install";
+      packageName = "install";
+      version = "0.10.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/install/-/install-0.10.4.tgz";
+        sha512 = "+IRyOastuPmLVx9zlVXJoKErSqz1Ma5at9A7S8yfsj3W+Kg95faPoh3bPDtMrZ/grz4PRmXzrswmlzfLlYyLOw==";
+      };
+    };
+    "interpret-1.1.0" = {
+      name = "interpret";
+      packageName = "interpret";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz";
+        sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
+      };
+    };
+    "iota.lib.js-0.4.6" = {
+      name = "iota.lib.js";
+      packageName = "iota.lib.js";
+      version = "0.4.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iota.lib.js/-/iota.lib.js-0.4.6.tgz";
+        sha1 = "47afdc03d57c7f55d2f58f068db492df6bc6e9bb";
+      };
+    };
+    "is-fullwidth-code-point-1.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    };
+    "is-fullwidth-code-point-2.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    };
+    "is-my-json-valid-2.16.1" = {
+      name = "is-my-json-valid";
+      packageName = "is-my-json-valid";
+      version = "2.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz";
+        sha512 = "ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==";
+      };
+    };
+    "is-path-cwd-1.0.0" = {
+      name = "is-path-cwd";
+      packageName = "is-path-cwd";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
+        sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
+      };
+    };
+    "is-path-in-cwd-1.0.0" = {
+      name = "is-path-in-cwd";
+      packageName = "is-path-in-cwd";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz";
+        sha1 = "6477582b8214d602346094567003be8a9eac04dc";
+      };
+    };
+    "is-path-inside-1.0.1" = {
+      name = "is-path-inside";
+      packageName = "is-path-inside";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz";
+        sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
+      };
+    };
+    "is-property-1.0.2" = {
+      name = "is-property";
+      packageName = "is-property";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz";
+        sha1 = "57fe1c4e48474edd65b09911f26b1cd4095dda84";
+      };
+    };
+    "is-resolvable-1.0.1" = {
+      name = "is-resolvable";
+      packageName = "is-resolvable";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz";
+        sha512 = "y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==";
+      };
+    };
+    "is-stream-1.1.0" = {
+      name = "is-stream";
+      packageName = "is-stream";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";
+        sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    };
+    "js-tokens-3.0.2" = {
+      name = "js-tokens";
+      packageName = "js-tokens";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz";
+        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
+      };
+    };
+    "js-yaml-3.10.0" = {
+      name = "js-yaml";
+      packageName = "js-yaml";
+      version = "3.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz";
+        sha512 = "O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==";
+      };
+    };
+    "json-stable-stringify-1.0.1" = {
+      name = "json-stable-stringify";
+      packageName = "json-stable-stringify";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
+        sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
+      };
+    };
+    "json5-0.5.1" = {
+      name = "json5";
+      packageName = "json5";
+      version = "0.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz";
+        sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
+      };
+    };
+    "jsonify-0.0.0" = {
+      name = "jsonify";
+      packageName = "jsonify";
+      version = "0.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz";
+        sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
+      };
+    };
+    "jsonpointer-4.0.1" = {
+      name = "jsonpointer";
+      packageName = "jsonpointer";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz";
+        sha1 = "4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9";
+      };
+    };
+    "left-pad-1.2.0" = {
+      name = "left-pad";
+      packageName = "left-pad";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz";
+        sha1 = "d30a73c6b8201d8f7d8e7956ba9616087a68e0ee";
+      };
+    };
+    "levn-0.3.0" = {
+      name = "levn";
+      packageName = "levn";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    };
+    "lodash-3.10.1" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "3.10.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";
+        sha1 = "5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+      };
+    };
+    "lodash-4.17.4" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "4.17.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz";
+        sha1 = "78203a4d1c328ae1d86dca6460e369b57f4055ae";
+      };
+    };
+    "log-update-1.0.2" = {
+      name = "log-update";
+      packageName = "log-update";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz";
+        sha1 = "19929f64c4093d2d2e7075a1dad8af59c296b8d1";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-0.0.8" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "0.0.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    };
+    "minimist-1.2.0" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";
+        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
+      };
+    };
+    "mkdirp-0.5.1" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    };
+    "moment-2.20.1" = {
+      name = "moment";
+      packageName = "moment";
+      version = "2.20.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz";
+        sha512 = "Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==";
+      };
+    };
+    "ms-2.0.0" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "mute-stream-0.0.5" = {
+      name = "mute-stream";
+      packageName = "mute-stream";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz";
+        sha1 = "8fbfabb0a98a253d3184331f9e8deb7372fac6c0";
+      };
+    };
+    "natural-compare-1.4.0" = {
+      name = "natural-compare";
+      packageName = "natural-compare";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz";
+        sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
+      };
+    };
+    "node-fetch-1.7.3" = {
+      name = "node-fetch";
+      packageName = "node-fetch";
+      version = "1.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz";
+        sha512 = "NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==";
+      };
+    };
+    "node-localstorage-0.6.0" = {
+      name = "node-localstorage";
+      packageName = "node-localstorage";
+      version = "0.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-localstorage/-/node-localstorage-0.6.0.tgz";
+        sha1 = "45a0601c6932dfde6644a23361f1be173c75d3af";
+      };
+    };
+    "number-is-nan-1.0.1" = {
+      name = "number-is-nan";
+      packageName = "number-is-nan";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    };
+    "object-assign-4.1.1" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    };
+    "once-1.4.0" = {
+      name = "once";
+      packageName = "once";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "onetime-1.1.0" = {
+      name = "onetime";
+      packageName = "onetime";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz";
+        sha1 = "a1f7838f8314c516f05ecefcbc4ccfe04b4ed789";
+      };
+    };
+    "optionator-0.8.2" = {
+      name = "optionator";
+      packageName = "optionator";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
+        sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
+      };
+    };
+    "os-homedir-1.0.2" = {
+      name = "os-homedir";
+      packageName = "os-homedir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    };
+    "path-is-absolute-1.0.1" = {
+      name = "path-is-absolute";
+      packageName = "path-is-absolute";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "path-is-inside-1.0.2" = {
+      name = "path-is-inside";
+      packageName = "path-is-inside";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz";
+        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
+      };
+    };
+    "path-parse-1.0.5" = {
+      name = "path-parse";
+      packageName = "path-parse";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz";
+        sha1 = "3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1";
+      };
+    };
+    "pify-2.3.0" = {
+      name = "pify";
+      packageName = "pify";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    };
+    "pinkie-2.0.4" = {
+      name = "pinkie";
+      packageName = "pinkie";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    };
+    "pinkie-promise-2.0.1" = {
+      name = "pinkie-promise";
+      packageName = "pinkie-promise";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    };
+    "pluralize-1.2.1" = {
+      name = "pluralize";
+      packageName = "pluralize";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz";
+        sha1 = "d1a21483fd22bb41e58a12fa3421823140897c45";
+      };
+    };
+    "prelude-ls-1.1.2" = {
+      name = "prelude-ls";
+      packageName = "prelude-ls";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
+      };
+    };
+    "prettyjson-1.2.1" = {
+      name = "prettyjson";
+      packageName = "prettyjson";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.1.tgz";
+        sha1 = "fcffab41d19cab4dfae5e575e64246619b12d289";
+      };
+    };
+    "process-nextick-args-1.0.7" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "1.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz";
+        sha1 = "150e20b756590ad3f91093f25a4f2ad8bff30ba3";
+      };
+    };
+    "progress-1.1.8" = {
+      name = "progress";
+      packageName = "progress";
+      version = "1.1.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz";
+        sha1 = "e260c78f6161cdd9b0e56cc3e0a85de17c7a57be";
+      };
+    };
+    "readable-stream-2.3.3" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz";
+        sha512 = "m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==";
+      };
+    };
+    "readline2-1.0.1" = {
+      name = "readline2";
+      packageName = "readline2";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz";
+        sha1 = "41059608ffc154757b715d9989d199ffbf372e35";
+      };
+    };
+    "rechoir-0.6.2" = {
+      name = "rechoir";
+      packageName = "rechoir";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz";
+        sha1 = "85204b54dba82d5742e28c96756ef43af50e3384";
+      };
+    };
+    "regenerator-runtime-0.10.5" = {
+      name = "regenerator-runtime";
+      packageName = "regenerator-runtime";
+      version = "0.10.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
+        sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
+      };
+    };
+    "regenerator-runtime-0.11.1" = {
+      name = "regenerator-runtime";
+      packageName = "regenerator-runtime";
+      version = "0.11.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
+        sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
+      };
+    };
+    "require-uncached-1.0.3" = {
+      name = "require-uncached";
+      packageName = "require-uncached";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz";
+        sha1 = "4e0d56d6c9662fd31e43011c4b95aa49955421d3";
+      };
+    };
+    "resolve-1.5.0" = {
+      name = "resolve";
+      packageName = "resolve";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz";
+        sha512 = "hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==";
+      };
+    };
+    "resolve-from-1.0.1" = {
+      name = "resolve-from";
+      packageName = "resolve-from";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz";
+        sha1 = "26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226";
+      };
+    };
+    "restore-cursor-1.0.1" = {
+      name = "restore-cursor";
+      packageName = "restore-cursor";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz";
+        sha1 = "34661f46886327fed2991479152252df92daa541";
+      };
+    };
+    "rimraf-2.6.2" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz";
+        sha512 = "lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==";
+      };
+    };
+    "run-async-0.1.0" = {
+      name = "run-async";
+      packageName = "run-async";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz";
+        sha1 = "c8ad4a5e110661e402a7d21b530e009f25f8e389";
+      };
+    };
+    "rx-lite-3.1.2" = {
+      name = "rx-lite";
+      packageName = "rx-lite";
+      version = "3.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz";
+        sha1 = "19ce502ca572665f3b647b10939f97fd1615f102";
+      };
+    };
+    "safe-buffer-5.1.1" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz";
+        sha512 = "kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==";
+      };
+    };
+    "shelljs-0.7.8" = {
+      name = "shelljs";
+      packageName = "shelljs";
+      version = "0.7.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz";
+        sha1 = "decbcf874b0d1e5fb72e14b164a9683048e9acb3";
+      };
+    };
+    "slice-ansi-0.0.4" = {
+      name = "slice-ansi";
+      packageName = "slice-ansi";
+      version = "0.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz";
+        sha1 = "edbf8903f66f7ce2f8eafd6ceed65e264c831b35";
+      };
+    };
+    "sprintf-js-1.0.3" = {
+      name = "sprintf-js";
+      packageName = "sprintf-js";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    };
+    "string-width-1.0.2" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    };
+    "string-width-2.1.1" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
+        sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
+      };
+    };
+    "string_decoder-1.0.3" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz";
+        sha512 = "4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "strip-ansi-4.0.0" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    };
+    "strip-bom-3.0.0" = {
+      name = "strip-bom";
+      packageName = "strip-bom";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz";
+        sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
+      };
+    };
+    "strip-json-comments-2.0.1" = {
+      name = "strip-json-comments";
+      packageName = "strip-json-comments";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
+      };
+    };
+    "supports-color-2.0.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    };
+    "supports-color-4.5.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "4.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz";
+        sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b";
+      };
+    };
+    "table-3.8.3" = {
+      name = "table";
+      packageName = "table";
+      version = "3.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/table/-/table-3.8.3.tgz";
+        sha1 = "2bbc542f0fda9861a755d3947fefd8b3f513855f";
+      };
+    };
+    "text-table-0.2.0" = {
+      name = "text-table";
+      packageName = "text-table";
+      version = "0.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";
+        sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+      };
+    };
+    "through-2.3.8" = {
+      name = "through";
+      packageName = "through";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    };
+    "type-check-0.3.2" = {
+      name = "type-check";
+      packageName = "type-check";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    };
+    "typedarray-0.0.6" = {
+      name = "typedarray";
+      packageName = "typedarray";
+      version = "0.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
+        sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
+      };
+    };
+    "user-home-2.0.0" = {
+      name = "user-home";
+      packageName = "user-home";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz";
+        sha1 = "9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f";
+      };
+    };
+    "util-deprecate-1.0.2" = {
+      name = "util-deprecate";
+      packageName = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    };
+    "vorpal-1.12.0" = {
+      name = "vorpal";
+      packageName = "vorpal";
+      version = "1.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vorpal/-/vorpal-1.12.0.tgz";
+        sha1 = "4be7b2a4e48f8fcfc9cf3648c419d311c522159d";
+      };
+    };
+    "wordwrap-1.0.0" = {
+      name = "wordwrap";
+      packageName = "wordwrap";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
+        sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
+      };
+    };
+    "wrap-ansi-2.1.0" = {
+      name = "wrap-ansi";
+      packageName = "wrap-ansi";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
+        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
+      };
+    };
+    "wrappy-1.0.2" = {
+      name = "wrappy";
+      packageName = "wrappy";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+    "write-0.2.1" = {
+      name = "write";
+      packageName = "write";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/write/-/write-0.2.1.tgz";
+        sha1 = "5fc03828e264cea3fe91455476f7a3c566cb0757";
+      };
+    };
+    "xmlhttprequest-1.8.0" = {
+      name = "xmlhttprequest";
+      packageName = "xmlhttprequest";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz";
+        sha1 = "67fe075c5c24fef39f9d65f5f7b7fe75171968fc";
+      };
+    };
+    "xtend-4.0.1" = {
+      name = "xtend";
+      packageName = "xtend";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    };
+  };
+  args = {
+    name = "iota-cli-app";
+    packageName = "iota-cli-app";
+    version = "1.0.8";
+    inherit src;
+    dependencies = [
+      sources."acorn-5.2.1"
+      (sources."acorn-jsx-3.0.1" // {
+        dependencies = [
+          sources."acorn-3.3.0"
+        ];
+      })
+      sources."ajv-4.11.8"
+      sources."ajv-keywords-1.5.1"
+      sources."ansi-escapes-1.4.0"
+      sources."ansi-regex-2.1.1"
+      sources."ansi-styles-3.2.0"
+      sources."argparse-1.0.9"
+      sources."array-union-1.0.2"
+      sources."array-uniq-1.0.3"
+      sources."arrify-1.0.1"
+      sources."async-2.6.0"
+      (sources."babel-code-frame-6.26.0" // {
+        dependencies = [
+          sources."ansi-styles-2.2.1"
+          sources."chalk-1.1.3"
+          sources."supports-color-2.0.0"
+        ];
+      })
+      sources."babel-polyfill-6.26.0"
+      (sources."babel-runtime-6.26.0" // {
+        dependencies = [
+          sources."regenerator-runtime-0.11.1"
+        ];
+      })
+      sources."balanced-match-1.0.0"
+      sources."bignumber.js-4.1.0"
+      sources."bluebird-3.5.1"
+      sources."brace-expansion-1.1.8"
+      sources."caller-path-0.1.0"
+      sources."callsites-0.2.0"
+      sources."chalk-2.3.0"
+      sources."circular-json-0.3.3"
+      sources."cli-cursor-1.0.2"
+      sources."cli-width-2.2.0"
+      sources."co-4.6.0"
+      sources."code-point-at-1.1.0"
+      sources."color-convert-1.9.1"
+      sources."color-name-1.1.3"
+      sources."colors-1.1.2"
+      sources."concat-map-0.0.1"
+      sources."concat-stream-1.6.0"
+      sources."core-js-2.5.3"
+      sources."core-util-is-1.0.2"
+      sources."crypto-js-3.1.9-1"
+      sources."d-1.0.0"
+      sources."debug-2.6.9"
+      sources."deep-is-0.1.3"
+      sources."del-2.2.2"
+      sources."doctrine-2.0.2"
+      sources."encoding-0.1.12"
+      sources."es5-ext-0.10.37"
+      sources."es6-iterator-2.0.3"
+      sources."es6-map-0.1.5"
+      sources."es6-set-0.1.5"
+      sources."es6-symbol-3.1.1"
+      sources."es6-weak-map-2.0.2"
+      sources."escape-string-regexp-1.0.5"
+      sources."escope-3.6.0"
+      (sources."eslint-3.19.0" // {
+        dependencies = [
+          sources."ansi-styles-2.2.1"
+          sources."chalk-1.1.3"
+          sources."supports-color-2.0.0"
+        ];
+      })
+      sources."espree-3.5.2"
+      sources."esprima-4.0.0"
+      sources."esquery-1.0.0"
+      sources."esrecurse-4.2.0"
+      sources."estraverse-4.2.0"
+      sources."esutils-2.0.2"
+      sources."event-emitter-0.3.5"
+      sources."exit-hook-1.1.1"
+      sources."fast-levenshtein-2.0.6"
+      sources."figures-1.7.0"
+      sources."file-entry-cache-2.0.0"
+      sources."flat-cache-1.3.0"
+      sources."fs.realpath-1.0.0"
+      sources."generate-function-2.0.0"
+      sources."generate-object-property-1.2.0"
+      sources."glob-7.1.2"
+      sources."globals-9.18.0"
+      sources."globby-5.0.0"
+      sources."graceful-fs-4.1.11"
+      sources."has-ansi-2.0.0"
+      sources."has-flag-2.0.0"
+      sources."iconv-lite-0.4.19"
+      sources."ignore-3.3.7"
+      sources."imurmurhash-0.1.4"
+      sources."in-publish-2.0.0"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.3"
+      (sources."inquirer-0.12.0" // {
+        dependencies = [
+          sources."ansi-styles-2.2.1"
+          sources."chalk-1.1.3"
+          sources."supports-color-2.0.0"
+        ];
+      })
+      sources."install-0.10.4"
+      sources."interpret-1.1.0"
+      sources."iota.lib.js-0.4.6"
+      sources."is-fullwidth-code-point-1.0.0"
+      sources."is-my-json-valid-2.16.1"
+      sources."is-path-cwd-1.0.0"
+      sources."is-path-in-cwd-1.0.0"
+      sources."is-path-inside-1.0.1"
+      sources."is-property-1.0.2"
+      sources."is-resolvable-1.0.1"
+      sources."is-stream-1.1.0"
+      sources."isarray-1.0.0"
+      sources."js-tokens-3.0.2"
+      sources."js-yaml-3.10.0"
+      sources."json-stable-stringify-1.0.1"
+      sources."json5-0.5.1"
+      sources."jsonify-0.0.0"
+      sources."jsonpointer-4.0.1"
+      sources."left-pad-1.2.0"
+      sources."levn-0.3.0"
+      sources."lodash-4.17.4"
+      sources."log-update-1.0.2"
+      sources."minimatch-3.0.4"
+      sources."minimist-0.0.8"
+      sources."mkdirp-0.5.1"
+      sources."moment-2.20.1"
+      sources."ms-2.0.0"
+      sources."mute-stream-0.0.5"
+      sources."natural-compare-1.4.0"
+      sources."node-fetch-1.7.3"
+      sources."node-localstorage-0.6.0"
+      sources."number-is-nan-1.0.1"
+      sources."object-assign-4.1.1"
+      sources."once-1.4.0"
+      sources."onetime-1.1.0"
+      sources."optionator-0.8.2"
+      sources."os-homedir-1.0.2"
+      sources."path-is-absolute-1.0.1"
+      sources."path-is-inside-1.0.2"
+      sources."path-parse-1.0.5"
+      sources."pify-2.3.0"
+      sources."pinkie-2.0.4"
+      sources."pinkie-promise-2.0.1"
+      sources."pluralize-1.2.1"
+      sources."prelude-ls-1.1.2"
+      (sources."prettyjson-1.2.1" // {
+        dependencies = [
+          sources."minimist-1.2.0"
+        ];
+      })
+      sources."process-nextick-args-1.0.7"
+      sources."progress-1.1.8"
+      sources."readable-stream-2.3.3"
+      sources."readline2-1.0.1"
+      sources."rechoir-0.6.2"
+      sources."regenerator-runtime-0.10.5"
+      sources."require-uncached-1.0.3"
+      sources."resolve-1.5.0"
+      sources."resolve-from-1.0.1"
+      sources."restore-cursor-1.0.1"
+      sources."rimraf-2.6.2"
+      sources."run-async-0.1.0"
+      sources."rx-lite-3.1.2"
+      sources."safe-buffer-5.1.1"
+      sources."shelljs-0.7.8"
+      sources."slice-ansi-0.0.4"
+      sources."sprintf-js-1.0.3"
+      sources."string-width-1.0.2"
+      sources."string_decoder-1.0.3"
+      sources."strip-ansi-3.0.1"
+      sources."strip-bom-3.0.0"
+      sources."strip-json-comments-2.0.1"
+      sources."supports-color-4.5.0"
+      (sources."table-3.8.3" // {
+        dependencies = [
+          sources."ansi-regex-3.0.0"
+          sources."ansi-styles-2.2.1"
+          (sources."chalk-1.1.3" // {
+            dependencies = [
+              sources."ansi-regex-2.1.1"
+              sources."strip-ansi-3.0.1"
+            ];
+          })
+          sources."is-fullwidth-code-point-2.0.0"
+          sources."string-width-2.1.1"
+          sources."strip-ansi-4.0.0"
+          sources."supports-color-2.0.0"
+        ];
+      })
+      sources."text-table-0.2.0"
+      sources."through-2.3.8"
+      sources."type-check-0.3.2"
+      sources."typedarray-0.0.6"
+      sources."user-home-2.0.0"
+      sources."util-deprecate-1.0.2"
+      (sources."vorpal-1.12.0" // {
+        dependencies = [
+          sources."ansi-styles-2.2.1"
+          sources."chalk-1.1.3"
+          sources."cli-width-1.1.1"
+          (sources."inquirer-0.11.0" // {
+            dependencies = [
+              sources."lodash-3.10.1"
+            ];
+          })
+          sources."minimist-1.2.0"
+          sources."supports-color-2.0.0"
+        ];
+      })
+      sources."wordwrap-1.0.0"
+      sources."wrap-ansi-2.1.0"
+      sources."wrappy-1.0.2"
+      sources."write-0.2.1"
+      sources."xmlhttprequest-1.8.0"
+      sources."xtend-4.0.1"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "IOTA CLI";
+      homepage = "https://github.com/iotaledger/cli-app#readme";
+      license = "MIT";
+    };
+    production = true;
+    bypassCache = true;
+  };
+in
+{
+  tarball = nodeEnv.buildNodeSourceDist args;
+  package = nodeEnv.buildNodePackage args;
+  shell = nodeEnv.buildNodeShell args;
+}
diff --git a/pkgs/crypto/sia/default.nix b/pkgs/crypto/sia/default.nix
new file mode 100644 (file)
index 0000000..45908af
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchzip }:
+stdenv.mkDerivation rec {
+  version = "v1.3.7";
+  name = "Sia-${version}";
+  src = fetchzip {
+    url = "https://sia.tech/static/releases/${name}-linux-amd64.zip";
+    sha256 = "1ljzwrlkx4hc16r8siiyakn039afipp95dyr83c8yfq3r3bfasqd";
+  };
+  phases = "installPhase";
+  installPhase = ''
+    mkdir -p $out/share/doc
+    mkdir -p $out/bin
+    mkdir -p $out/share/sia
+    cp -a $src/doc $out/share/doc/sia
+    cp -a $src/LICENSE $src/README.md $out/share/sia
+    cp -a $src/{siac,siad} $out/bin
+    cp -a $src/{siac,siad}.sig $out/share/sia/
+    '';
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
new file mode 100644 (file)
index 0000000..8ea65a5
--- /dev/null
@@ -0,0 +1,51 @@
+{ pkgs }:
+with pkgs;
+let
+  mylibs = import ../libs.nix { inherit pkgs; };
+in
+rec {
+  boinctui = callPackage ../pkgs/boinctui {};
+  cnagios = callPackage ../pkgs/cnagios { inherit mylibs; };
+  duply = callPackage ../pkgs/duply {};
+  flrn = callPackage ../pkgs/flrn { inherit mylibs; slang = callPackage ../pkgs/slang_1 {}; };
+  genius = callPackage ../pkgs/genius {};
+  mtop = callPackage ../pkgs/mtop {};
+  muttprint = callPackage ../pkgs/muttprint {};
+  mutt-ics = callPackage ../pkgs/mutt-ics { inherit mylibs; };
+  nagios-cli = callPackage ../pkgs/nagios-cli { inherit mylibs; };
+  nagnu = callPackage ../pkgs/nagnu { inherit mylibs; };
+  note = callPackage ../pkgs/note {};
+  notmuch-python2 = callPackage ../pkgs/notmuch/notmuch-python { pythonPackages = python2Packages; };
+  notmuch-python3 = callPackage ../pkgs/notmuch/notmuch-python { pythonPackages = python3Packages; };
+  notmuch-vim = callPackage ../pkgs/notmuch/notmuch-vim {};
+  pg_activity = callPackage ../pkgs/pg_activity { inherit mylibs; };
+  pgloader = callPackage ../pkgs/pgloader { inherit mylibs; };
+  telegram-cli = callPackage ../pkgs/telegram-cli { inherit mylibs; };
+  telegram-history-dump = callPackage ../pkgs/telegram-history-dump { inherit mylibs; };
+  telegramircd = callPackage ../pkgs/telegramircd { inherit mylibs; telethon = callPackage ../pkgs/telethon_sync {}; };
+  terminal-velocity = callPackage ../pkgs/terminal-velocity {};
+  tiv = callPackage ../pkgs/tiv {};
+  unicodeDoc = callPackage ../pkgs/unicode {};
+
+  cardano = callPackage ../pkgs/crypto/cardano { inherit mylibs; };
+  iota-cli-app = callPackage ../pkgs/crypto/iota-cli-app { inherit mylibs; };
+  sia = callPackage ../pkgs/crypto/sia {};
+
+  pure-ftpd = callPackage ../pkgs/pure-ftpd {};
+  mpd = (callPackage ../pkgs/mpd_0_21 {}).mpd;
+  mpd-small = (callPackage ../pkgs/mpd_0_21 {}).mpd-small;
+
+  bitlbee-mastodon = callPackage ./bitlbee-mastodon {};
+
+  composerEnv = callPackage ./composer-env {};
+  webapps = callPackage ./webapps { inherit mylibs composerEnv private; };
+
+  private = if builtins.pathExists (./. + "/private")
+    then import ./private { inherit pkgs; }
+    else { webapps = {}; };
+
+  python3PackagesPlus = callPackage ./python-packages {
+    python = python3;
+    inherit mylibs;
+  };
+}
diff --git a/pkgs/duply/default.nix b/pkgs/duply/default.nix
new file mode 100644 (file)
index 0000000..3816996
--- /dev/null
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, makeWrapper, coreutils, python2, duplicity, gawk, gnupg1, bash, gnugrep, txt2man, which }:
+stdenv.mkDerivation rec {
+  name = "duply-${version}";
+  version = "2.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/ftplicity/duply%20%28simple%20duplicity%29/2.1.x/duply_${version}.tgz";
+    sha256 = "0i5j7h7h6ssrwhll0sfhymisshg54kx7j45zcqffzjxa0ylvzlm8";
+  };
+
+  buildInputs = [ txt2man makeWrapper ];
+
+  postPatch = "patchShebangs .";
+
+  installPhase = ''
+    mkdir -p "$out/bin"
+    mkdir -p "$out/share/man/man1"
+    install -vD duply "$out/bin"
+    sed -i $out/bin/duply -e "1a \
+    export PATH='${stdenv.lib.makeBinPath [ coreutils python2 duplicity gawk gnupg1 bash gnugrep txt2man which ]}'
+    " -e "1a \
+    export DUPL_PYTHON_BIN=$(basename ${duplicity}/lib/python*)
+    "
+    "$out/bin/duply" txt2man > "$out/share/man/man1/duply.1"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Shell front end for the duplicity backup tool";
+    longDescription = ''
+      Duply is a shell front end for the duplicity backup tool
+      http://duplicity.nongnu.org/. It greatly simplifies it's usage by
+      implementing backup job profiles, batch commands and more. Who says
+      secure backups on non-trusted spaces are no child's play?
+    '';
+    homepage = http://duply.net/;
+    license = licenses.gpl2;
+    maintainers = [ maintainers.bjornfor ];
+    platforms = stdenv.lib.platforms.unix;
+  };
+}
diff --git a/pkgs/flrn/default.nix b/pkgs/flrn/default.nix
new file mode 100644 (file)
index 0000000..f288615
--- /dev/null
@@ -0,0 +1,13 @@
+{ stdenv, mylibs, libetpan, openssl, autoconf, groff, slang, yacc }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./flrn.json // {
+  buildInputs = [ libetpan openssl autoconf groff slang yacc ];
+  preConfigure = ''
+    sed -i -e "s/test -e configure/false/" configure.in
+    autoconf
+    sed -i -e '/define CHECK_MAIL/d' src/flrn_config.h
+    sed -i -e '/DEFAULT_DIR_FILE/s@".flrn"@".config/flrn"@' src/flrn_config.h
+    sed -i -e '/DEFAULT_CONFIG_FILE/s@".flrnrc"@"flrnrc"@' src/flrn_config.h
+    sed -i -e '/DEFAULT_FLNEWS_FILE/s@".flnewsrc"@"flnewsrc"@' src/flrn_config.h
+    sed -i -e '/flrn_char chaine/s@18@20@' src/flrn_command.c
+    '';
+})
diff --git a/pkgs/flrn/flrn.json b/pkgs/flrn/flrn.json
new file mode 100644 (file)
index 0000000..3d7a944
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "860d642-master",
+  "meta": {
+    "name": "flrn",
+    "url": "https://github.com/Cigaes/flrn",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "Cigaes",
+    "repo": "flrn",
+    "rev": "860d642bd6389a209c8b697bd044f78d23406509",
+    "sha256": "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/genius/default.nix b/pkgs/genius/default.nix
new file mode 100644 (file)
index 0000000..b40d1d0
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python3, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }:
+stdenv.mkDerivation rec {
+  name = "genius-${version}";
+  version = "1.0.24";
+  src = fetchurl {
+    url = "https://download.gnome.org/sources/genius/1.0/${name}.tar.xz";
+    sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6";
+  };
+  buildInputs = [
+    mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python3 gnome2.gtksourceview
+    autoconf automake libtool ncurses readline pkg-config
+  ];
+  preConfigure = ''
+    autoreconf -fi
+    '';
+  preBuild = ''
+    sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
+    '';
+}
diff --git a/pkgs/mpd_0_21/default.nix b/pkgs/mpd_0_21/default.nix
new file mode 100644 (file)
index 0000000..f19a76f
--- /dev/null
@@ -0,0 +1,152 @@
+{ stdenv, fetchFromGitHub, meson, ninja, pkgconfig, glib, systemd, boost, darwin
+# Inputs
+, curl, libmms, libnfs, samba
+# Archive support
+, bzip2, zziplib
+# Codecs
+, audiofile, faad2, ffmpeg, flac, fluidsynth, game-music-emu
+, libmad, libmikmod, mpg123, libopus, libvorbis, lame
+# Filters
+, libsamplerate
+# Outputs
+, alsaLib, libjack2, libpulseaudio, libshout
+# Misc
+, icu, sqlite, avahi, dbus, pcre, libgcrypt, expat
+# Services
+, yajl
+# Client support
+, mpd_clientlib
+# Tag support
+, libid3tag
+}:
+
+let
+  major = "0.21";
+  minor = "7";
+
+  lib = stdenv.lib;
+  mkDisable = f: "-D${f}=disabled";
+  mkEnable = f: "-D${f}=enabled";
+  keys = lib.mapAttrsToList (k: v: k);
+
+  featureDependencies = {
+    # Storage plugins
+    udisks        = [ dbus ];
+    webdav        = [ curl expat ];
+    # Input plugins
+    curl          = [ curl ];
+    mms           = [ libmms ];
+    nfs           = [ libnfs ];
+    smbclient     = [ samba ];
+    # Archive support
+    bzip2         = [ bzip2 ];
+    zzip          = [ zziplib ];
+    # Decoder plugins
+    audiofile     = [ audiofile ];
+    faad          = [ faad2 ];
+    ffmpeg        = [ ffmpeg ];
+    flac          = [ flac ];
+    fluidsynth    = [ fluidsynth ];
+    gme           = [ game-music-emu ];
+    mad           = [ libmad ];
+    mikmod        = [ libmikmod ];
+    mpg123        = [ mpg123 ];
+    opus          = [ libopus ];
+    vorbis        = [ libvorbis ];
+    # Encoder plugins
+    vorbisenc     = [ libvorbis ];
+    lame          = [ lame ];
+    # Filter plugins
+    libsamplerate = [ libsamplerate ];
+    # Output plugins
+    alsa          = [ alsaLib ];
+    jack          = [ libjack2 ];
+    pulse         = [ libpulseaudio ];
+    shout         = [ libshout ];
+    # Commercial services
+    qobuz         = [ curl libgcrypt yajl ];
+    soundcloud    = [ curl yajl ];
+    tidal         = [ curl yajl ];
+    # Client support
+    libmpdclient  = [ mpd_clientlib ];
+    # Tag support
+    id3tag        = [ libid3tag ];
+    # Misc
+    dbus          = [ dbus ];
+    expat         = [ expat ];
+    icu           = [ icu ];
+    pcre          = [ pcre ];
+    sqlite        = [ sqlite ];
+    systemd       = [ systemd ];
+    yajl          = [ yajl ];
+    zeroconf      = [ avahi dbus ];
+  };
+
+  run = { features ? null }:
+    let
+      fl = if (features == null )
+        then keys featureDependencies
+        else features;
+
+      # Disable platform specific features if needed
+      # using libmad to decode mp3 files on darwin is causing a segfault -- there
+      # is probably a solution, but I'm disabling it for now
+      platformMask = lib.optionals stdenv.isDarwin [ "mad" "pulse" "jack" "nfs" "smb" ]
+                  ++ lib.optionals (!stdenv.isLinux) [ "alsa" "systemd" ];
+      features_ = lib.subtractLists platformMask fl;
+
+    in stdenv.mkDerivation rec {
+      name = "mpd-${version}";
+      version = "${major}${if minor == "" then "" else "." + minor}";
+
+      src = fetchFromGitHub {
+        owner  = "MusicPlayerDaemon";
+        repo   = "MPD";
+        rev    = "v${version}";
+        sha256 = "11zi8hmlj63ngzl06vzx05669k20j4cdsp0caz4p4ayn46fd4m17";
+      };
+
+      buildInputs = [ glib boost ]
+        ++ (lib.concatLists (lib.attrVals features_ featureDependencies))
+        ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.AudioToolbox;
+
+      nativeBuildInputs = [ meson ninja pkgconfig ];
+
+      enableParallelBuilding = true;
+
+      mesonFlags =
+        map mkEnable features_ ++ map mkDisable (lib.subtractLists features_ (keys featureDependencies))
+        ++ [ "-Dsyslog=enabled" ]
+        ++ lib.optional (lib.any (x: x == "zeroconf") features_)
+          "-Dzeroconf=avahi"
+        ++ lib.optional stdenv.isLinux
+          "-Dsystemd_system_unit_dir=etc/systemd/system";
+
+      meta = with stdenv.lib; {
+        description = "A flexible, powerful daemon for playing music";
+        homepage    = http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki;
+        license     = licenses.gpl2;
+        maintainers = with maintainers; [ astsmtl fuuzetsu ehmry fpletz ];
+        platforms   = platforms.unix;
+
+        longDescription = ''
+          Music Player Daemon (MPD) is a flexible, powerful daemon for playing
+          music. Through plugins and libraries it can play a variety of sound
+          files while being controlled by its network protocol.
+        '';
+      };
+    };
+in
+{
+  mpd = run { };
+  mpd-small = run { features = [
+    "webdav" "curl" "mms" "nfs" "bzip2" "zzip"
+    "audiofile" "faad" "flac" "gme" "mad"
+    "mpg123" "opus" "vorbis"
+    "vorbisenc" "lame" "libsamplerate"
+    "alsa" "shout" "libmpdclient"
+    "id3tag" "expat" "pcre" "yajl" "sqlite"
+    "soundcloud" "qobuz" "tidal"
+    "systemd"
+  ]; };
+}
diff --git a/pkgs/mtop/default.nix b/pkgs/mtop/default.nix
new file mode 100644 (file)
index 0000000..4a89430
--- /dev/null
@@ -0,0 +1,24 @@
+{ buildPerlPackage, fetchurl, perlPackages, lib }:
+buildPerlPackage rec {
+  name = "mtop-${version}";
+  version = "0.6.6";
+  src = fetchurl {
+    url = "http://downloads.sourceforge.net/project/mtop/mtop/v${version}/mtop-${version}.tar.gz";
+    sha256 = "0x0x5300b1j9i0xxk8rsrki0pspyzj2vylhzv8qg3l6j26aw0zrf";
+  };
+  outputs = ["out"];
+  buildInputs = with perlPackages; [ DBI DBDmysql Curses ];
+
+  postInstall = ''
+    cd "$out"
+    preConfigure || true
+  '';
+
+  meta = with lib; {
+    description = "MySQL top (monitor and examine slow queries)";
+    homepage    = http://mtop.sourceforge.net/;
+    license     = licenses.gpl3;
+    maintainers = with maintainers; [ { name  = "Marc Prewitt"; email = "mprewitt@chelsea.net"; } ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/pkgs/mutt-ics/default.nix b/pkgs/mutt-ics/default.nix
new file mode 100644 (file)
index 0000000..a8a529b
--- /dev/null
@@ -0,0 +1,5 @@
+{ python3Packages, mylibs }:
+with python3Packages;
+buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // {
+  propagatedBuildInputs = [ icalendar ];
+})
diff --git a/pkgs/mutt-ics/mutt-ics.json b/pkgs/mutt-ics/mutt-ics.json
new file mode 100644 (file)
index 0000000..ae8ed37
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "d291187-master",
+  "meta": {
+    "name": "mutt-ics",
+    "url": "https://github.com/dmedvinsky/mutt-ics",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "dmedvinsky",
+    "repo": "mutt-ics",
+    "rev": "d29118788f291f67d34fefa6eda9f95846a2fe34",
+    "sha256": "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/muttprint/0.73-4.diff.gz b/pkgs/muttprint/0.73-4.diff.gz
new file mode 100644 (file)
index 0000000..c4f3cef
Binary files /dev/null and b/pkgs/muttprint/0.73-4.diff.gz differ
diff --git a/pkgs/muttprint/default.nix b/pkgs/muttprint/default.nix
new file mode 100644 (file)
index 0000000..0863a7b
--- /dev/null
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl, lib, psutils, dialog, texlive, makeWrapper, automake, autoconf, imagemagick, ghostscript, perl, perlPackages }:
+stdenv.mkDerivation rec {
+  name = "muttprint-${version}";
+  version = "0.73";
+  src = fetchurl {
+    url = "http://downloads.sf.net/muttprint/${name}.tar.gz";
+    sha256 = "1dny4niyibfgazwlzfcnb37jy6k140rs6baaj629z12rmahfdavw";
+  };
+  patches = [
+    ./0.73-4.diff.gz
+    ./regex.patch
+    ./two_edge.patch
+    ];
+  preConfigure = ''
+    aclocal
+    automake --add-missing --copy
+    autoconf
+    '';
+  preBuild = ''
+    cd pics
+    convert -flop BabyTuX.eps BabyTuX.eps
+    for i in BabyTuX_color.eps BabyTuX.eps Debian_color.eps \
+        Debian.eps Gentoo.eps Gentoo_color.eps ; do
+      convert $i $(basename $i .eps).png
+    done
+    convert penguin.eps penguin.jpg
+    cd ..
+    '';
+  postInstall = ''
+    perlFlags=
+    for i in $(IFS=:; echo $PERL5LIB); do
+        perlFlags="$perlFlags -I$i"
+    done
+
+    sed -i "$out/bin/muttprint" -e "s|^#\!\(.*[ /]perl.*\)$|#\!\1$perlFlags|"
+    sed -i "$out/bin/muttprint" -e "s|ENV{HOME}/.muttprintrc|ENV{XDG_CONFIG_HOME}/muttprint/muttprintrc|"
+
+    wrapProgram $out/bin/muttprint \
+      --prefix PATH : ${lib.makeBinPath [ psutils dialog
+      (texlive.combine { inherit (texlive) scheme-basic utopia fancyvrb lastpage marvosym ucs cm-super; }) ]}
+    '';
+  buildInputs = [ makeWrapper automake autoconf imagemagick ghostscript perl ] ++
+    (with perlPackages; [ TimeDate FileWhich TextIconv ]);
+}
diff --git a/pkgs/muttprint/regex.patch b/pkgs/muttprint/regex.patch
new file mode 100644 (file)
index 0000000..e99c4a2
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/muttprint        2015-07-21 11:18:04.219578426 +1200
++++ b/muttprint        2015-07-21 11:18:53.906243779 +1200
+@@ -1635,7 +1635,7 @@
+       open (AUX, "$auxfile") or fatalError "Could not open $auxfile:\n$!";
+       
+       while (<AUX>) {
+-              ($numberOfPages) = /\\newlabel{LastPage}{{}{(\d+)}}/;
++              ($numberOfPages) = /\\newlabel\{LastPage}\{\{}\{(\d+)}}/;
+       }
+       
+       close AUX or fatalError "Could not close $auxfile:\n$!";
diff --git a/pkgs/muttprint/two_edge.patch b/pkgs/muttprint/two_edge.patch
new file mode 100644 (file)
index 0000000..4a7290d
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/muttprint        2016-05-05 13:48:50.515950744 +1200
++++ b/muttprint        2016-05-05 13:52:10.722623902 +1200
+@@ -643,14 +643,14 @@
+       if ($Config{PAPERSAVE} eq "on") {
+               if ($useCups) {
+                       $Config{PRINT_COMMAND} =~ 
+-                              s/\$CUPS_OPTIONS/ -o sides=two-sided-long-edge \$CUPS_OPTIONS/;
++                              s/\$CUPS_OPTIONS/ -o sides=two-sided-short-edge \$CUPS_OPTIONS/;
+               } else { # no cups
+                       modifyPS("landscape");
+               }
+       } else { # no papersave
+               if ($useCups) {
+                       $Config{PRINT_COMMAND} =~ 
+-                              s/\$CUPS_OPTIONS/ -o sides=two-sided-short-edge \$CUPS_OPTIONS/;
++                              s/\$CUPS_OPTIONS/ -o sides=two-sided-long-edge \$CUPS_OPTIONS/;
+               } else { # no cups
+                       modifyPS("portrait");
+               }
diff --git a/pkgs/nagios-cli/default.nix b/pkgs/nagios-cli/default.nix
new file mode 100644 (file)
index 0000000..7d7e7cc
--- /dev/null
@@ -0,0 +1,2 @@
+{ python2Packages, mylibs }:
+python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json)
diff --git a/pkgs/nagios-cli/nagios-cli.json b/pkgs/nagios-cli/nagios-cli.json
new file mode 100644 (file)
index 0000000..fc91227
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "edc51ea-master",
+  "meta": {
+    "name": "nagios-cli",
+    "url": "https://github.com/tehmaze/nagios-cli",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "tehmaze",
+    "repo": "nagios-cli",
+    "rev": "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9",
+    "sha256": "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/nagnu/default.nix b/pkgs/nagnu/default.nix
new file mode 100644 (file)
index 0000000..2b9c0ec
--- /dev/null
@@ -0,0 +1,12 @@
+{ stdenv, mylibs, ncurses, curl }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./nagnu.json // rec {
+  buildInputs = [ ncurses curl ];
+  installPhase = ''
+    mkdir -p $out/bin
+    cp nagnu $out/bin
+    mkdir -p $out/share/doc/nagnu
+    cp nagnu.conf.sample $out/share/doc/nagnu
+    mkdir -p $out/share/man/man8
+    cp docs/nagnu.8 $out/share/man/man8
+    '';
+})
diff --git a/pkgs/nagnu/nagnu.json b/pkgs/nagnu/nagnu.json
new file mode 100644 (file)
index 0000000..60a8b07
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "c7e65fc-master",
+  "meta": {
+    "name": "nagnu",
+    "url": "https://github.com/frlen/nagnu",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "frlen",
+    "repo": "nagnu",
+    "rev": "c7e65fc02f46a3756a4cc47953ea2f3e57a84728",
+    "sha256": "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/note/default.nix b/pkgs/note/default.nix
new file mode 100644 (file)
index 0000000..0c422bc
--- /dev/null
@@ -0,0 +1,18 @@
+{ lib, buildPerlPackage, fetchurl, perlPackages }:
+buildPerlPackage rec {
+  name = "note-1.3.26";
+  src = fetchurl {
+    url = "mirror://cpan/authors/id/T/TL/TLINDEN/${name}.tar.gz";
+    sha256 = "1h645rnb5vpms48fcyzvp7cwwcbf9k5xq49w2bpniyzzgk2brjrq";
+  };
+  outputs = ["out" "man"];
+  propagatedBuildInputs = with perlPackages; [ YAML ];
+
+  meta = with lib; {
+    description = "A perl script for maintaining notes";
+    homepage    = http://www.daemon.de/NOTE;
+    license     = licenses.gpl3;
+    maintainers = with maintainers; [ { name  = "T.v.Dein"; email = "tlinden@cpan.org"; } ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/pkgs/notmuch/notmuch-python/default.nix b/pkgs/notmuch/notmuch-python/default.nix
new file mode 100644 (file)
index 0000000..d639d9a
--- /dev/null
@@ -0,0 +1,16 @@
+{ stdenv, notmuch, pythonPackages }:
+stdenv.mkDerivation rec {
+  name = "notmuch-${pythonPackages.python.name}-${version}";
+  version = notmuch.version;
+  outputs = [ "out" ];
+  buildInputs = with pythonPackages; [ sphinx python ];
+  src = notmuch.src;
+  phases = [ "unpackPhase" "buildPhase" "installPhase" "fixupPhase" ];
+  buildPhase = ''
+    cd bindings/python
+    python setup.py build
+    '';
+  installPhase = ''
+    python setup.py install --prefix=$out --optimize=1
+    '';
+}
diff --git a/pkgs/notmuch/notmuch-vim/default.nix b/pkgs/notmuch/notmuch-vim/default.nix
new file mode 100644 (file)
index 0000000..e79a253
--- /dev/null
@@ -0,0 +1,11 @@
+{ stdenv, notmuch }:
+stdenv.mkDerivation rec {
+  name = "notmuch-vim-${version}";
+  version = notmuch.version;
+  outputs = [ "out" ];
+  src = notmuch.src;
+  phases = [ "unpackPhase" "installPhase" ];
+  installPhase = ''
+    make -C vim DESTDIR=$out prefix="/share/vim/vimfiles" install
+    '';
+}
diff --git a/pkgs/pg_activity/default.nix b/pkgs/pg_activity/default.nix
new file mode 100644 (file)
index 0000000..a20ee8a
--- /dev/null
@@ -0,0 +1,5 @@
+{ python2Packages, mylibs }:
+with python2Packages;
+buildPythonApplication (mylibs.fetchedGithub ./pg_activity.json // {
+  propagatedBuildInputs = [ psycopg2 psutil ];
+})
diff --git a/pkgs/pg_activity/pg_activity.json b/pkgs/pg_activity/pg_activity.json
new file mode 100644 (file)
index 0000000..4485d9a
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "v1.4.0",
+  "meta": {
+    "name": "pg_activity",
+    "url": "https://github.com/julmon/pg_activity/",
+    "branch": "refs/tags/v1.4.0"
+  },
+  "github": {
+    "owner": "julmon",
+    "repo": "pg_activity",
+    "rev": "f26ae614c204254a805309026eebd5e9230b0214",
+    "sha256": "1bmvgrmna7vz2a6vknxm0k19vl9x7l6hn6vpfd7jgd53rz7c9w5p",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/pgloader/default.nix b/pkgs/pgloader/default.nix
new file mode 100644 (file)
index 0000000..9f1be67
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, mylibs, sbcl, cacert, sqlite, freetds, libzip, curl, git, openssl, makeWrapper }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./pgloader.json // {
+  # was removed from quicklisp packages cd7bfa6f48295f361c691a7520fb122938bd2a68,
+  # but needs curl to build everything otherwise
+  __noChroot = true;
+  buildInputs = [ sbcl cacert sqlite freetds libzip curl git openssl makeWrapper ];
+  LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath [ sqlite libzip curl git openssl freetds ];
+  buildPhase = ''
+    export PATH=$PATH:$out/bin
+    export HOME=$TMPDIR
+    make pgloader
+  '';
+  dontStrip = true;
+  enableParallelBuilding = false;
+  installPhase = ''
+    install -Dm755 build/bin/pgloader "$out/bin/pgloader"
+    wrapProgram $out/bin/pgloader --prefix LD_LIBRARY_PATH : "$LD_LIBRARY_PATH"
+  '';
+})
diff --git a/pkgs/pgloader/pgloader.json b/pkgs/pgloader/pgloader.json
new file mode 100644 (file)
index 0000000..dfe310b
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "v3.5.2",
+  "meta": {
+    "name": "pgloader",
+    "url": "https://github.com/dimitri/pgloader",
+    "branch": "refs/tags/v3.5.2"
+  },
+  "github": {
+    "owner": "dimitri",
+    "repo": "pgloader",
+    "rev": "63af7e7373975391446dcae151f5c61564849025",
+    "sha256": "1rd0k1x7ml6b6x526brachm13v51vx5ikpg64c8k8j29cskq2vqa",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/default.nix b/pkgs/private/default.nix
new file mode 100644 (file)
index 0000000..60fabad
--- /dev/null
@@ -0,0 +1,12 @@
+{ pkgs }:
+with pkgs;
+let
+  mylibs = import ../../libs.nix { inherit pkgs; };
+in
+rec {
+  webapps = callPackage ./webapps {
+    inherit mylibs;
+    inherit (pkgs) composerEnv;
+    inherit (pkgs.webapps) spip;
+  };
+}
diff --git a/pkgs/private/webapps/apache-default/default.nix b/pkgs/private/webapps/apache-default/default.nix
new file mode 100644 (file)
index 0000000..92f558e
--- /dev/null
@@ -0,0 +1,21 @@
+{ www_root ? null }:
+rec {
+  www = ./www;
+  apacheConfig = let
+    www_root' = if isNull www_root then www else www_root;
+  in ''
+      ErrorDocument 500 /maintenance_immae.html
+      ErrorDocument 501 /maintenance_immae.html
+      ErrorDocument 502 /maintenance_immae.html
+      ErrorDocument 503 /maintenance_immae.html
+      ErrorDocument 504 /maintenance_immae.html
+      Alias /maintenance_immae.html ${www_root'}/maintenance_immae.html
+      ProxyPass /maintenance_immae.html !
+
+      AliasMatch "(.*)/googleb6d69446ff4ca3e5.html" ${www_root'}/googleb6d69446ff4ca3e5.html
+      <Directory ${www_root'}>
+        AllowOverride None
+        Require all granted
+      </Directory>
+    '';
+}
diff --git a/pkgs/private/webapps/apache-default/www/googleb6d69446ff4ca3e5.html b/pkgs/private/webapps/apache-default/www/googleb6d69446ff4ca3e5.html
new file mode 100644 (file)
index 0000000..ff6dbf3
--- /dev/null
@@ -0,0 +1 @@
+google-site-verification: googleb6d69446ff4ca3e5.html
\ No newline at end of file
diff --git a/pkgs/private/webapps/apache-default/www/index.htm b/pkgs/private/webapps/apache-default/www/index.htm
new file mode 100644 (file)
index 0000000..0274251
--- /dev/null
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Hello World HTML</title>
+  </head>
+  <body>
+    <h1>It works!</h1>
+  </body>
+</html>
diff --git a/pkgs/private/webapps/apache-default/www/maintenance_immae.html b/pkgs/private/webapps/apache-default/www/maintenance_immae.html
new file mode 100644 (file)
index 0000000..90f265f
--- /dev/null
@@ -0,0 +1,58 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Maintenance</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <style>
+      body {
+        padding-left: 5px;
+        padding-right: 5px;
+        text-align: center;
+        margin: auto;
+        font: 20px Helvetica, sans-serif;
+        color: #333;
+      }
+      h1 {
+        margin: 0px;
+        font-size: 40px;
+      }
+      article {
+        display: block;
+        max-width: 650px;
+        margin: 0 auto;
+        padding-top: 30px;
+      }
+      article + article {
+        border-top: 1px solid lightgrey;
+      }
+      article div {
+        text-align: justify;
+      }
+      a {
+        color: #dc8100;
+        text-decoration: none;
+      }
+      a:hover {
+        color: #333;
+      }
+    </style>
+    <script type="text/javascript">
+      setTimeout(function () { location.reload(true); }, 5000);
+    </script>
+  </head>
+  <body>
+    <article>
+      <h1>Erreur serveur ou maintenance en cours&nbsp;!</h1>
+      <div>
+        <p>Une mise à jour ou une opération de maintenance est en cours sur le site. <a href="">Retentez</a> dans quelques instants ou patientez, la page se rechargera automatiquement.</p>
+      </div>
+    </article>
+
+    <article>
+      <h1>Server error or website in maintenance!</h1>
+      <div>
+        <p>An update or a maintenance is on track on the website. Please try <a href="">again</a> in a few seconds or wait, the page will reload automatically.</p>
+      </div>
+    </article>
+  </body>
+</html>
diff --git a/pkgs/private/webapps/apache-default/www/nossl.html b/pkgs/private/webapps/apache-default/www/nossl.html
new file mode 100644 (file)
index 0000000..4401a80
--- /dev/null
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>No SSL site</title>
+  </head>
+  <body>
+    <h1>No SSL on this site</h1>
+    <p>Use for wifi networks with login page that doesn't work well with
+    https.</p>
+  </body>
+</html>
diff --git a/pkgs/private/webapps/aten/aten.json b/pkgs/private/webapps/aten/aten.json
new file mode 100644 (file)
index 0000000..53569b6
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "b99537f-master",
+  "meta": {
+    "name": "aten",
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Aten",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Aten",
+    "rev": "b99537fdad41291afb4f1bb8b2e2aa4081c71fae",
+    "sha256": "15mlyik6zivxwry6zc906bqnivxhby27yr8kj4lg5n68pvb877dn",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/webapps/aten/default.nix b/pkgs/private/webapps/aten/default.nix
new file mode 100644 (file)
index 0000000..c36e15d
--- /dev/null
@@ -0,0 +1,57 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/aten_${environment}"
+, mylibs, composerEnv, fetchgit, runCommand, nodejs, jq, libsass, python, fetchurl }:
+let
+  packagesource = mylibs.fetchedGitPrivate ./aten.json;
+  packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
+    cat ${packagesource.src}/package.json | jq -r '.version = "v1.0.0"|.name="aten"' > $out
+    '';
+  yarnModules = mylibs.yarn2nixPackage.mkYarnModules rec {
+    name = "aten-yarn";
+    pname = name;
+    version = "v1.0.0";
+    packageJSON = packagejson;
+    yarnLock = "${packagesource.src}/yarn.lock";
+    yarnNix = ./yarn-packages.nix;
+    pkgConfig = {
+      all = {
+        buildInputs = [ mylibs.yarn2nixPackage.src ];
+      };
+      node-sass = {
+        buildInputs = [ libsass python ];
+        postInstall = let
+          nodeHeaders = fetchurl {
+            url = "https://nodejs.org/download/release/v${nodejs.version}/node-v${nodejs.version}-headers.tar.gz";
+            sha256 = "16f20ya3ys6w5w6y6l4536f7jrgk4gz46bf71w1r1xxb26a54m32";
+          };
+        in
+          ''
+            node scripts/build.js --tarball=${nodeHeaders}
+          '';
+      };
+    };
+  };
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+    packagesource //
+    rec {
+      noDev = (environment == "prod");
+      preInstall = ''
+        export SYMFONY_ENV="${environment}"
+        export APP_ENV="${environment}"
+        '';
+      postInstall = ''
+        ln -sf ${yarnModules}/node_modules .
+        yarn run --offline encore production
+        rm -rf var/{log,cache}
+        ln -sf ${varDir}/{log,cache} var/
+        '';
+      buildInputs = [ yarnModules mylibs.yarn2nixPackage.yarn ];
+      passthru = {
+        inherit varDir;
+        inherit environment;
+        webRoot = "${app}/public";
+      };
+    }
+  );
+in app
diff --git a/pkgs/private/webapps/aten/php-packages.nix b/pkgs/private/webapps/aten/php-packages.nix
new file mode 100644 (file)
index 0000000..8d86587
--- /dev/null
@@ -0,0 +1,740 @@
+# Generated with composer2nix and adapted to return only the list of
+# packages
+{ composerEnv, fetchurl, fetchgit ? null }:
+{
+  packages = {
+    "behat/transliterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
+        src = fetchurl {
+          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
+          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
+          sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
+          sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
+          sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
+          sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
+          sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
+          sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
+          sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
+        };
+      };
+    };
+    "doctrine/doctrine-migrations-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
+          sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
+        };
+      };
+    };
+    "doctrine/event-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
+          sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
+          sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
+          sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
+          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
+          sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
+          sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
+        };
+      };
+    };
+    "doctrine/persistence" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
+          sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
+        };
+      };
+    };
+    "doctrine/reflection" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
+          sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
+        };
+      };
+    };
+    "gedmo/doctrine-extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
+        src = fetchurl {
+          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
+          sha256 = "0jfg0a19lhdv5b3c032ghknxhvc1f0x2n7fcwp47bm1rbz222q0z";
+        };
+      };
+    };
+    "giggsey/libphonenumber-for-php" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "giggsey-libphonenumber-for-php-a71f260c2efce10ded8af030a20fa13edfb0e9be";
+        src = fetchurl {
+          url = https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be;
+          sha256 = "15id03c1msyhri7j4i63r535g3g56n3x99i8301as63w7m1ybfj5";
+        };
+      };
+    };
+    "giggsey/locale" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "giggsey-locale-da6845720b5d104d319d7e84576f54e44dd9e4f5";
+        src = fetchurl {
+          url = https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5;
+          sha256 = "0gc8im06h5l794a0drd74s3inps22jr1zr5wnw0b89m06d4nw42j";
+        };
+      };
+    };
+    "jdorn/sql-formatter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
+        src = fetchurl {
+          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
+          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
+        };
+      };
+    };
+    "ocramius/package-versions" = {
+      targetDir = "";
+      needsModifyRights = true;
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
+          sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
+        };
+      };
+    };
+    "ocramius/proxy-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
+          sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
+        };
+      };
+    };
+    "opensoft/doctrine-postgres-types" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "opensoft-doctrine-postgres-types-7e69bdfeb2ae61c2f1e90872370cdf0135fb3006";
+        src = fetchurl {
+          url = https://api.github.com/repos/opensoft/doctrine-postgres-types/zipball/7e69bdfeb2ae61c2f1e90872370cdf0135fb3006;
+          sha256 = "1v9rjq82dxnpnb6bir6irkj54324a02qlybayvq2gf2807241bjj";
+        };
+      };
+    };
+    "presta/sitemap-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "presta-sitemap-bundle-16a2c0eae7320e3647013e48026a6a6bd14f75df";
+        src = fetchurl {
+          url = https://api.github.com/repos/prestaconcept/PrestaSitemapBundle/zipball/16a2c0eae7320e3647013e48026a6a6bd14f75df;
+          sha256 = "1hqh144awazafa2vpv091h9pyqrppbalcvzf9c1n6h387jwwj5l8";
+        };
+      };
+    };
+    "psr/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
+          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
+          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
+        };
+      };
+    };
+    "psr/log" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
+          sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
+        };
+      };
+    };
+    "psr/simple-cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
+          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-1fdf591c4b388e62dbb2579de89c1560b33f865d";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d;
+          sha256 = "0hhw3lsvgm78rqphgmdrg2inc9997lwx0290x71hsixk08khnlb1";
+        };
+      };
+    };
+    "symfony/asset" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-asset-fb06338fd3762f8615b51a58e5e9299ccca03876";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/asset/zipball/fb06338fd3762f8615b51a58e5e9299ccca03876;
+          sha256 = "19fbnz2h4z5nxzcy8n3bfbcjwgncabwdlxh70qfkr7bswpsxr6p3";
+        };
+      };
+    };
+    "symfony/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-cache-5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/cache/zipball/5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41;
+          sha256 = "1wn2rd3n5nj300vsygh60vbjh2k9lh7s9c3ayl614hahrfcfb29s";
+        };
+      };
+    };
+    "symfony/config" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-config-005d9a083d03f588677d15391a716b1ac9b887c0";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0;
+          sha256 = "1h20qhkzsl5xwzs3rg1yyaq5yn8rg92krfzmpmfgv7d3jp1v03as";
+        };
+      };
+    };
+    "symfony/console" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-console-4dff24e5d01e713818805c1862d2e3f901ee7dd0";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0;
+          sha256 = "016l3hxcbvyxz3kkkynk12gi8949hl3x09dwsh0x5wqikgnp64c2";
+        };
+      };
+    };
+    "symfony/contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-contracts-1aa7ab2429c3d594dd70689604b5cf7421254cdf";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf;
+          sha256 = "0jhav49lngmrjg4r5kdpmc7lhmasn2fzkmbvhw62l4i1vnm5r5bm";
+        };
+      };
+    };
+    "symfony/debug" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-debug-e0a2b92ee0b5b934f973d90c2f58e18af109d276";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276;
+          sha256 = "0yzyaprsrmbc93gzwr1wdjx05kin7b4hqy5w74zkcxyab09pan7f";
+        };
+      };
+    };
+    "symfony/dependency-injection" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-dependency-injection-e4adc57a48d3fa7f394edfffa9e954086d7740e5";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/dependency-injection/zipball/e4adc57a48d3fa7f394edfffa9e954086d7740e5;
+          sha256 = "0g8ssf7qm0jf0anvflp033xwdim9z4g73k3kz1vs3smw4pffl6nv";
+        };
+      };
+    };
+    "symfony/doctrine-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-doctrine-bridge-3466c911438e176c20e1943c529131889432d12f";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/doctrine-bridge/zipball/3466c911438e176c20e1943c529131889432d12f;
+          sha256 = "0qq644z7l9j9fyydlj68p9f43a9i20rnmxy8pkq5sn4r0yn06bb8";
+        };
+      };
+    };
+    "symfony/event-dispatcher" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-event-dispatcher-921f49c3158a276d27c0d770a5a347a3b718b328";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328;
+          sha256 = "05i8syqbzhh11cf2i9d64s8b5x41mfsribfa62rvc0mhbqk7ifzf";
+        };
+      };
+    };
+    "symfony/filesystem" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-filesystem-2f4c8b999b3b7cadb2a69390b01af70886753710";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710;
+          sha256 = "1gi14q8gf250a3rzmr6arb08ljpzpfg868vm0z21fgmf0zh0dqr6";
+        };
+      };
+    };
+    "symfony/finder" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-finder-e53d477d7b5c4982d0e1bfd2298dbee63d01441d";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d;
+          sha256 = "1mpxwgvfqzng36xbdvda6nk1zidyr9dgswccmr4z15k0i9gi0qsj";
+        };
+      };
+    };
+    "symfony/flex" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-flex-955774ecf07b10230bb5b44e150ba078b45f68fa";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa;
+          sha256 = "069v1s810mq5kqvx68x87lmlz0h9b2kgla1znnibnbh6j6k4qg6d";
+        };
+      };
+    };
+    "symfony/form" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-form-5ab767b7732154ca6f45c92e30e081178edf30ad";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/form/zipball/5ab767b7732154ca6f45c92e30e081178edf30ad;
+          sha256 = "1g65a7hl1kk6rpa6q52fyzy6vkjafr3233hi2qiggyp0qys20kcc";
+        };
+      };
+    };
+    "symfony/framework-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-framework-bundle-eb32d67140510f04fe9cc5fb9ad38fda09591db1";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/framework-bundle/zipball/eb32d67140510f04fe9cc5fb9ad38fda09591db1;
+          sha256 = "06dpqppwyngq1frww0q0zjs0gj8na0fi67czlhqf2x2lizgz6wjd";
+        };
+      };
+    };
+    "symfony/http-foundation" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-http-foundation-1b31f3017fadd8cb05cf2c8aebdbf3b12a943851";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851;
+          sha256 = "0s6mx79gl6sp39bk8213xcdzx4ld5xim38s8lckm7wqnkvx94mfl";
+        };
+      };
+    };
+    "symfony/http-kernel" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-http-kernel-b39ceffc0388232c309cbde3a7c3685f2ec0a624";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624;
+          sha256 = "17rb1hl9r8rlqw1cv9qx2ckvz81g2ylppirq035mya1a848y5ym5";
+        };
+      };
+    };
+    "symfony/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-inflector-f9a637c0359f74404d44cf0da0a3ce53bae0787e";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/inflector/zipball/f9a637c0359f74404d44cf0da0a3ce53bae0787e;
+          sha256 = "1sp1pk716biyplqpakcpq71ik2h2m1bvsz9cfj9zd63y2723xna3";
+        };
+      };
+    };
+    "symfony/intl" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-intl-748a1c54903344385f88fef75da293915b16a207";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/intl/zipball/748a1c54903344385f88fef75da293915b16a207;
+          sha256 = "1vwa2n7fglxs8rv1yrbxn6vgizg73asimg794igk27i90xdybfmc";
+        };
+      };
+    };
+    "symfony/lts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-lts-c1affae45b78aee036effa1759237e7fa96d4af2";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2;
+          sha256 = "0vk9pn4xl7ascvllak0gschdd1w2mxma3ng04j3r1n13zccxc33s";
+        };
+      };
+    };
+    "symfony/options-resolver" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-options-resolver-a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/options-resolver/zipball/a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba;
+          sha256 = "1fjjlp09mwkjcxg98bihqlq4miq24k13691051f5p39lcy03zmb3";
+        };
+      };
+    };
+    "symfony/orm-pack" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-orm-pack-1b58f752cd917a08c9c8df020781d9c46a2275b1";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1;
+          sha256 = "1sk8jchaw29lmpq76yb24mc1csmifnkvbjdrgjdgqs6x5i39plli";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
+          sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
+          sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
+        };
+      };
+    };
+    "symfony/property-access" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-property-access-b6df4e1849f389468edb36e2e59877d4a8170723";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/property-access/zipball/b6df4e1849f389468edb36e2e59877d4a8170723;
+          sha256 = "16pbnv3x56gp5wxakmbphf3d4igkjyr3v693n3cjm62h72z4dxf3";
+        };
+      };
+    };
+    "symfony/routing" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-routing-649460207e77da6c545326c7f53618d23ad2c866";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866;
+          sha256 = "1qjkgghs0kp4lk4711d3gx26vvilrrrjbbz02navzfqy4xjrf0sw";
+        };
+      };
+    };
+    "symfony/translation" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-translation-c0e2191e9bed845946ab3d99767513b56ca7dcd6";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6;
+          sha256 = "0gzq7f2izsiam9blha85bzvg7x6zc4f3x3bkwhzma6x6ipjfkla2";
+        };
+      };
+    };
+    "symfony/twig-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-twig-bridge-2e928d6c8244e7f3b32bcfac5814095a83179e60";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/twig-bridge/zipball/2e928d6c8244e7f3b32bcfac5814095a83179e60;
+          sha256 = "1f902j8b0lyqjss9r2mf7j63apv5z8ki57vmcdcw5jlqagbmw1y1";
+        };
+      };
+    };
+    "symfony/twig-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-twig-bundle-024820cbb4aeffc4843c4170b69c057fb4840fb3";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/twig-bundle/zipball/024820cbb4aeffc4843c4170b69c057fb4840fb3;
+          sha256 = "1qqfpxw228lc024whpr4j6aa6k9ly290nxz9c9ds826lllg2l1zh";
+        };
+      };
+    };
+    "symfony/validator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-validator-cd35bb14a0e81bd99835e36cac4db1e72ad1939b";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/validator/zipball/cd35bb14a0e81bd99835e36cac4db1e72ad1939b;
+          sha256 = "1809yz483mv5mmrw14v3b371dmjab7i455gxkrqm0z8n0wjdn6i3";
+        };
+      };
+    };
+    "symfony/var-exporter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-var-exporter-a39222e357362424b61dcde50e2f7b5a7d3306db";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/var-exporter/zipball/a39222e357362424b61dcde50e2f7b5a7d3306db;
+          sha256 = "1ys2sc3ivgfxq7kj8cydxqh5179d3niqxsy10lgg18c5a6bsj41j";
+        };
+      };
+    };
+    "symfony/webpack-encore-pack" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-webpack-encore-pack-8d7f51379d7ae17aea7cf501d910a11896895ac4";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/webpack-encore-pack/zipball/8d7f51379d7ae17aea7cf501d910a11896895ac4;
+          sha256 = "0k6xavcyihx45dsrm1r2r1lbn7vryy463akz66w4gycx5dcqrw0j";
+        };
+      };
+    };
+    "symfony/yaml" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-yaml-c41175c801e3edfda90f32e292619d10c27103d7";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7;
+          sha256 = "0bh9365mmvzhdk1m0b1xarlg0swx9pv916m7xifcmdrxn67w552p";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
+          sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
+        };
+      };
+    };
+    "zendframework/zend-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
+          sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
+        };
+      };
+    };
+    "zendframework/zend-eventmanager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
+          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
+        };
+      };
+    };
+  };
+  devPackages = {
+    "nikic/php-parser" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "nikic-php-parser-8aae5b59b83bb4d0dbf07b0a835f2680a658f610";
+        src = fetchurl {
+          url = https://api.github.com/repos/nikic/PHP-Parser/zipball/8aae5b59b83bb4d0dbf07b0a835f2680a658f610;
+          sha256 = "103ix4bsvrwyc4wxh9cqd38xffn25kq3phnpgk8b3z7dqvvr2pss";
+        };
+      };
+    };
+    "symfony/dotenv" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-dotenv-97f135ab40f969cbeae27d482ff63acbc33dbe2a";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/dotenv/zipball/97f135ab40f969cbeae27d482ff63acbc33dbe2a;
+          sha256 = "1jwpxb4w0mi5p89k51l1g84hnnj9s8kjl9jsx3xj39hhc3dy44pc";
+        };
+      };
+    };
+    "symfony/maker-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-maker-bundle-24b19cccad0c658eca516b35b08668d123fabf92";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/maker-bundle/zipball/24b19cccad0c658eca516b35b08668d123fabf92;
+          sha256 = "1wm17jl3gk0m5ma7nz40y7ryxgm0qncrxcrqdqg5x6afwla85grp";
+        };
+      };
+    };
+    "symfony/polyfill-php72" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php72-9050816e2ca34a8e916c3a0ae8b9c2fccf68b631";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631;
+          sha256 = "1smd08fw64mf89s9ma099ayfjlz26wrix9hfr6kh5w4d0rzrhmlw";
+        };
+      };
+    };
+    "symfony/profiler-pack" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-profiler-pack-99c4370632c2a59bb0444852f92140074ef02209";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209;
+          sha256 = "12xisnrqq6q5l0v8bric0p23bsaxh50x43fq7wn2adnsz24nv9pi";
+        };
+      };
+    };
+    "symfony/stopwatch" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-stopwatch-ec076716412274e51f8a7ea675d9515e5c311123";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123;
+          sha256 = "0fzh2bh7lm8f222hk5ihfkpi697babfrz1r0dghlws17hfbgzgax";
+        };
+      };
+    };
+    "symfony/var-dumper" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-var-dumper-db61258540350725f4beb6b84006e32398acd120";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120;
+          sha256 = "0pw3hf4mcc1q9miswrjbgr32x0a2dfjvpi16pjzw173xmf79i4iz";
+        };
+      };
+    };
+    "symfony/web-profiler-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-web-profiler-bundle-198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/web-profiler-bundle/zipball/198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08;
+          sha256 = "0r4r3zf22860mdx8b2l72ghz8liyi3l39cc1934b2lkh2kghlsi6";
+        };
+      };
+    };
+  };
+}
diff --git a/pkgs/private/webapps/aten/yarn-packages.nix b/pkgs/private/webapps/aten/yarn-packages.nix
new file mode 100644 (file)
index 0000000..c16d9dc
--- /dev/null
@@ -0,0 +1,7871 @@
+{fetchurl, linkFarm}: rec {
+  offline_cache = linkFarm "offline" packages;
+  packages = [
+
+    {
+      name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
+      path = fetchurl {
+        name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
+        url  = "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.19.0.tgz";
+        sha1 = "f0725dbbede5ff9d9fdbd7a07f84accafc83ca14";
+      };
+    }
+
+    {
+      name = "_types_node___node_10.5.3.tgz";
+      path = fetchurl {
+        name = "_types_node___node_10.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz";
+        sha1 = "5bcfaf088ad17894232012877669634c06b20cc5";
+      };
+    }
+
+    {
+      name = "_types_tapable___tapable_0.2.5.tgz";
+      path = fetchurl {
+        name = "_types_tapable___tapable_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.5.tgz";
+        sha1 = "2443fc12da514c81346b1a665675559cee21fa75";
+      };
+    }
+
+    {
+      name = "_types_uglify_js___uglify_js_3.0.3.tgz";
+      path = fetchurl {
+        name = "_types_uglify_js___uglify_js_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz";
+        sha1 = "801a5ca1dc642861f47c46d14b700ed2d610840b";
+      };
+    }
+
+    {
+      name = "_types_webpack___webpack_3.8.14.tgz";
+      path = fetchurl {
+        name = "_types_webpack___webpack_3.8.14.tgz";
+        url  = "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.14.tgz";
+        sha1 = "e2bfdf7f604b3f7dc776eaa17446d7f7538f3de7";
+      };
+    }
+
+    {
+      name = "abbrev___abbrev_1.1.1.tgz";
+      path = fetchurl {
+        name = "abbrev___abbrev_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
+        sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.3.5.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz";
+        sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2";
+      };
+    }
+
+    {
+      name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
+      path = fetchurl {
+        name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz";
+        sha1 = "c752bd210bef679501b6c6cb7fc84f8f47158cc4";
+      };
+    }
+
+    {
+      name = "acorn___acorn_4.0.13.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_4.0.13.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz";
+        sha1 = "105495ae5361d697bd195c825192e1ad7f253787";
+      };
+    }
+
+    {
+      name = "acorn___acorn_5.7.1.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_5.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz";
+        sha1 = "f095829297706a7c9776958c0afc8930a9b9d9d8";
+      };
+    }
+
+    {
+      name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
+      path = fetchurl {
+        name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz";
+        sha1 = "e33fde95e50db9f2a802e3647e311d2fc5000c69";
+      };
+    }
+
+    {
+      name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
+      path = fetchurl {
+        name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
+        sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
+      };
+    }
+
+    {
+      name = "ajv___ajv_4.11.8.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_4.11.8.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz";
+        sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
+      };
+    }
+
+    {
+      name = "ajv___ajv_5.5.2.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_5.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz";
+        sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965";
+      };
+    }
+
+    {
+      name = "ajv___ajv_6.5.2.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz";
+        sha1 = "678495f9b82f7cca6be248dd92f59bff5e1f4360";
+      };
+    }
+
+    {
+      name = "align_text___align_text_0.1.4.tgz";
+      path = fetchurl {
+        name = "align_text___align_text_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz";
+        sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
+      };
+    }
+
+    {
+      name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+      path = fetchurl {
+        name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
+        sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
+      };
+    }
+
+    {
+      name = "amdefine___amdefine_1.0.1.tgz";
+      path = fetchurl {
+        name = "amdefine___amdefine_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz";
+        sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
+      };
+    }
+
+    {
+      name = "ansi_html___ansi_html_0.0.7.tgz";
+      path = fetchurl {
+        name = "ansi_html___ansi_html_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz";
+        sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_2.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_3.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_2.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_3.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
+        sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
+      };
+    }
+
+    {
+      name = "anymatch___anymatch_2.0.0.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
+        sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
+      };
+    }
+
+    {
+      name = "aproba___aproba_1.2.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
+        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
+      };
+    }
+
+    {
+      name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+      path = fetchurl {
+        name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
+      };
+    }
+
+    {
+      name = "argparse___argparse_1.0.10.tgz";
+      path = fetchurl {
+        name = "argparse___argparse_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
+        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_2.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
+        sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_4.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
+        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
+      };
+    }
+
+    {
+      name = "arr_flatten___arr_flatten_1.1.0.tgz";
+      path = fetchurl {
+        name = "arr_flatten___arr_flatten_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
+      };
+    }
+
+    {
+      name = "arr_union___arr_union_3.1.0.tgz";
+      path = fetchurl {
+        name = "arr_union___arr_union_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    }
+
+    {
+      name = "array_find_index___array_find_index_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_find_index___array_find_index_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz";
+        sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1";
+      };
+    }
+
+    {
+      name = "array_flatten___array_flatten_1.1.1.tgz";
+      path = fetchurl {
+        name = "array_flatten___array_flatten_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    }
+
+    {
+      name = "array_flatten___array_flatten_2.1.1.tgz";
+      path = fetchurl {
+        name = "array_flatten___array_flatten_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz";
+        sha1 = "426bb9da84090c1838d812c8150af20a8331e296";
+      };
+    }
+
+    {
+      name = "array_includes___array_includes_3.0.3.tgz";
+      path = fetchurl {
+        name = "array_includes___array_includes_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz";
+        sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d";
+      };
+    }
+
+    {
+      name = "array_union___array_union_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_union___array_union_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
+        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
+      };
+    }
+
+    {
+      name = "array_uniq___array_uniq_1.0.3.tgz";
+      path = fetchurl {
+        name = "array_uniq___array_uniq_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.2.1.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
+        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.3.2.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
+        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
+      };
+    }
+
+    {
+      name = "asn1.js___asn1.js_4.10.1.tgz";
+      path = fetchurl {
+        name = "asn1.js___asn1.js_4.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
+        sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
+      };
+    }
+
+    {
+      name = "asn1___asn1_0.2.3.tgz";
+      path = fetchurl {
+        name = "asn1___asn1_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz";
+        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_1.0.0.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_0.2.0.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz";
+        sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
+      };
+    }
+
+    {
+      name = "assert___assert_1.4.1.tgz";
+      path = fetchurl {
+        name = "assert___assert_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz";
+        sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
+      };
+    }
+
+    {
+      name = "assign_symbols___assign_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "assign_symbols___assign_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
+        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
+      };
+    }
+
+    {
+      name = "async_each___async_each_1.0.1.tgz";
+      path = fetchurl {
+        name = "async_each___async_each_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
+        sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
+      };
+    }
+
+    {
+      name = "async_foreach___async_foreach_0.1.3.tgz";
+      path = fetchurl {
+        name = "async_foreach___async_foreach_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz";
+        sha1 = "36121f845c0578172de419a97dbeb1d16ec34542";
+      };
+    }
+
+    {
+      name = "async___async_1.5.2.tgz";
+      path = fetchurl {
+        name = "async___async_1.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
+        sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
+      };
+    }
+
+    {
+      name = "async___async_2.6.1.tgz";
+      path = fetchurl {
+        name = "async___async_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz";
+        sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610";
+      };
+    }
+
+    {
+      name = "asynckit___asynckit_0.4.0.tgz";
+      path = fetchurl {
+        name = "asynckit___asynckit_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    }
+
+    {
+      name = "atob___atob_2.1.1.tgz";
+      path = fetchurl {
+        name = "atob___atob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz";
+        sha1 = "ae2d5a729477f289d60dd7f96a6314a22dd6c22a";
+      };
+    }
+
+    {
+      name = "autoprefixer___autoprefixer_6.7.7.tgz";
+      path = fetchurl {
+        name = "autoprefixer___autoprefixer_6.7.7.tgz";
+        url  = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz";
+        sha1 = "1dbd1c835658e35ce3f9984099db00585c782014";
+      };
+    }
+
+    {
+      name = "aws_sign2___aws_sign2_0.6.0.tgz";
+      path = fetchurl {
+        name = "aws_sign2___aws_sign2_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz";
+        sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
+      };
+    }
+
+    {
+      name = "aws_sign2___aws_sign2_0.7.0.tgz";
+      path = fetchurl {
+        name = "aws_sign2___aws_sign2_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    }
+
+    {
+      name = "aws4___aws4_1.7.0.tgz";
+      path = fetchurl {
+        name = "aws4___aws4_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz";
+        sha1 = "d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289";
+      };
+    }
+
+    {
+      name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
+        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
+      };
+    }
+
+    {
+      name = "babel_core___babel_core_6.26.3.tgz";
+      path = fetchurl {
+        name = "babel_core___babel_core_6.26.3.tgz";
+        url  = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz";
+        sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207";
+      };
+    }
+
+    {
+      name = "babel_generator___babel_generator_6.26.1.tgz";
+      path = fetchurl {
+        name = "babel_generator___babel_generator_6.26.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz";
+        sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90";
+      };
+    }
+
+    {
+      name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz";
+        sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664";
+      };
+    }
+
+    {
+      name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz";
+        sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d";
+      };
+    }
+
+    {
+      name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz";
+        sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f";
+      };
+    }
+
+    {
+      name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz";
+        sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa";
+      };
+    }
+
+    {
+      name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz";
+        sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9";
+      };
+    }
+
+    {
+      name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz";
+        sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d";
+      };
+    }
+
+    {
+      name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz";
+        sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76";
+      };
+    }
+
+    {
+      name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz";
+        sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257";
+      };
+    }
+
+    {
+      name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz";
+        sha1 = "325c59f902f82f24b74faceed0363954f6495e72";
+      };
+    }
+
+    {
+      name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz";
+        sha1 = "5ec581827ad723fecdd381f1c928390676e4551b";
+      };
+    }
+
+    {
+      name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz";
+        sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a";
+      };
+    }
+
+    {
+      name = "babel_helpers___babel_helpers_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helpers___babel_helpers_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz";
+        sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
+      };
+    }
+
+    {
+      name = "babel_loader___babel_loader_7.1.5.tgz";
+      path = fetchurl {
+        name = "babel_loader___babel_loader_7.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz";
+        sha1 = "e3ee0cd7394aa557e013b02d3e492bfd07aa6d68";
+      };
+    }
+
+    {
+      name = "babel_messages___babel_messages_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_messages___babel_messages_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz";
+        sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
+      };
+    }
+
+    {
+      name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz";
+        sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a";
+      };
+    }
+
+    {
+      name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz";
+        sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95";
+      };
+    }
+
+    {
+      name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz";
+        sha1 = "9ee7e8337290da95288201a6a57f4170317830de";
+      };
+    }
+
+    {
+      name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz";
+        sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz";
+        sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz";
+        sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz";
+        sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz";
+        sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz";
+        sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz";
+        sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz";
+        sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz";
+        sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz";
+        sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz";
+        sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz";
+        sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz";
+        sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz";
+        sha1 = "58a793863a9e7ca870bdc5a881117ffac27db6f3";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz";
+        sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz";
+        sha1 = "ac997e6285cd18ed6176adb607d602344ad38468";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz";
+        sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz";
+        sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz";
+        sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz";
+        sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz";
+        sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz";
+        sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz";
+        sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz";
+        sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz";
+        sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz";
+        sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz";
+        sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758";
+      };
+    }
+
+    {
+      name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
+      path = fetchurl {
+        name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz";
+        sha1 = "dea79fa4ebeb883cd35dab07e260c1c9c04df77a";
+      };
+    }
+
+    {
+      name = "babel_register___babel_register_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_register___babel_register_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz";
+        sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
+      };
+    }
+
+    {
+      name = "babel_runtime___babel_runtime_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_runtime___babel_runtime_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
+        sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
+      };
+    }
+
+    {
+      name = "babel_template___babel_template_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_template___babel_template_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz";
+        sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
+      };
+    }
+
+    {
+      name = "babel_traverse___babel_traverse_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_traverse___babel_traverse_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz";
+        sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
+      };
+    }
+
+    {
+      name = "babel_types___babel_types_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_types___babel_types_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
+        sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
+      };
+    }
+
+    {
+      name = "babylon___babylon_6.18.0.tgz";
+      path = fetchurl {
+        name = "babylon___babylon_6.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
+        sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
+      };
+    }
+
+    {
+      name = "balanced_match___balanced_match_0.4.2.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_0.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz";
+        sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838";
+      };
+    }
+
+    {
+      name = "balanced_match___balanced_match_1.0.0.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    }
+
+    {
+      name = "base64_js___base64_js_1.3.0.tgz";
+      path = fetchurl {
+        name = "base64_js___base64_js_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz";
+        sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3";
+      };
+    }
+
+    {
+      name = "base___base_0.11.2.tgz";
+      path = fetchurl {
+        name = "base___base_0.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
+        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
+      };
+    }
+
+    {
+      name = "batch___batch_0.6.1.tgz";
+      path = fetchurl {
+        name = "batch___batch_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz";
+        sha1 = "dc34314f4e679318093fc760272525f94bf25c16";
+      };
+    }
+
+    {
+      name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+      path = fetchurl {
+        name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    }
+
+    {
+      name = "big.js___big.js_3.2.0.tgz";
+      path = fetchurl {
+        name = "big.js___big.js_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
+        sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
+      };
+    }
+
+    {
+      name = "binary_extensions___binary_extensions_1.11.0.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_1.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz";
+        sha1 = "46aa1751fb6a2f93ee5e689bb1087d4b14c6c205";
+      };
+    }
+
+    {
+      name = "block_stream___block_stream_0.0.9.tgz";
+      path = fetchurl {
+        name = "block_stream___block_stream_0.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
+        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
+      };
+    }
+
+    {
+      name = "bn.js___bn.js_4.11.8.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_4.11.8.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz";
+        sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f";
+      };
+    }
+
+    {
+      name = "body_parser___body_parser_1.18.2.tgz";
+      path = fetchurl {
+        name = "body_parser___body_parser_1.18.2.tgz";
+        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz";
+        sha1 = "87678a19d84b47d859b83199bd59bce222b10454";
+      };
+    }
+
+    {
+      name = "bonjour___bonjour_3.5.0.tgz";
+      path = fetchurl {
+        name = "bonjour___bonjour_3.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz";
+        sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5";
+      };
+    }
+
+    {
+      name = "boolbase___boolbase_1.0.0.tgz";
+      path = fetchurl {
+        name = "boolbase___boolbase_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
+        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+      };
+    }
+
+    {
+      name = "boom___boom_2.10.1.tgz";
+      path = fetchurl {
+        name = "boom___boom_2.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz";
+        sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
+      };
+    }
+
+    {
+      name = "bootstrap___bootstrap_4.1.3.tgz";
+      path = fetchurl {
+        name = "bootstrap___bootstrap_4.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz";
+        sha1 = "0eb371af2c8448e8c210411d0cb824a6409a12be";
+      };
+    }
+
+    {
+      name = "brace_expansion___brace_expansion_1.1.11.tgz";
+      path = fetchurl {
+        name = "brace_expansion___brace_expansion_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
+      };
+    }
+
+    {
+      name = "braces___braces_1.8.5.tgz";
+      path = fetchurl {
+        name = "braces___braces_1.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
+        sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
+      };
+    }
+
+    {
+      name = "braces___braces_2.3.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
+        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
+      };
+    }
+
+    {
+      name = "brorand___brorand_1.1.0.tgz";
+      path = fetchurl {
+        name = "brorand___brorand_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
+        sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
+      };
+    }
+
+    {
+      name = "browserify_aes___browserify_aes_1.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_aes___browserify_aes_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
+        sha1 = "326734642f403dabc3003209853bb70ad428ef48";
+      };
+    }
+
+    {
+      name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
+        sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
+      };
+    }
+
+    {
+      name = "browserify_des___browserify_des_1.0.2.tgz";
+      path = fetchurl {
+        name = "browserify_des___browserify_des_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
+        sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
+      };
+    }
+
+    {
+      name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
+        sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
+      };
+    }
+
+    {
+      name = "browserify_sign___browserify_sign_4.0.4.tgz";
+      path = fetchurl {
+        name = "browserify_sign___browserify_sign_4.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz";
+        sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
+      };
+    }
+
+    {
+      name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
+        sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
+      };
+    }
+
+    {
+      name = "browserslist___browserslist_1.7.7.tgz";
+      path = fetchurl {
+        name = "browserslist___browserslist_1.7.7.tgz";
+        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz";
+        sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9";
+      };
+    }
+
+    {
+      name = "browserslist___browserslist_3.2.8.tgz";
+      path = fetchurl {
+        name = "browserslist___browserslist_3.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz";
+        sha1 = "b0005361d6471f0f5952797a76fc985f1f978fc6";
+      };
+    }
+
+    {
+      name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
+      path = fetchurl {
+        name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz";
+        sha1 = "52fabcc6a606d1a00302802648ef68f639da268c";
+      };
+    }
+
+    {
+      name = "buffer_xor___buffer_xor_1.0.3.tgz";
+      path = fetchurl {
+        name = "buffer_xor___buffer_xor_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
+        sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
+      };
+    }
+
+    {
+      name = "buffer___buffer_4.9.1.tgz";
+      path = fetchurl {
+        name = "buffer___buffer_4.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz";
+        sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
+      };
+    }
+
+    {
+      name = "builtin_modules___builtin_modules_1.1.1.tgz";
+      path = fetchurl {
+        name = "builtin_modules___builtin_modules_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz";
+        sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
+      };
+    }
+
+    {
+      name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+      path = fetchurl {
+        name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
+        sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
+      };
+    }
+
+    {
+      name = "bytes___bytes_3.0.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
+      };
+    }
+
+    {
+      name = "cache_base___cache_base_1.0.1.tgz";
+      path = fetchurl {
+        name = "cache_base___cache_base_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
+        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
+      };
+    }
+
+    {
+      name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
+      path = fetchurl {
+        name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
+        sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_1.2.1.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz";
+        sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_2.1.1.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz";
+        sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_3.0.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz";
+        sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_4.1.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz";
+        sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
+      };
+    }
+
+    {
+      name = "caniuse_api___caniuse_api_1.6.1.tgz";
+      path = fetchurl {
+        name = "caniuse_api___caniuse_api_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz";
+        sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
+      };
+    }
+
+    {
+      name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
+      path = fetchurl {
+        name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz";
+        sha1 = "f1995c1fe31892649a7605957a80c92518423d4d";
+      };
+    }
+
+    {
+      name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
+      path = fetchurl {
+        name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz";
+        sha1 = "70026616e8afe6e1442f8bb4e1092987d81a2f25";
+      };
+    }
+
+    {
+      name = "caseless___caseless_0.12.0.tgz";
+      path = fetchurl {
+        name = "caseless___caseless_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    }
+
+    {
+      name = "center_align___center_align_0.1.3.tgz";
+      path = fetchurl {
+        name = "center_align___center_align_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz";
+        sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
+      };
+    }
+
+    {
+      name = "chalk___chalk_1.1.3.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    }
+
+    {
+      name = "chalk___chalk_2.4.1.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_2.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz";
+        sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e";
+      };
+    }
+
+    {
+      name = "chokidar___chokidar_2.0.4.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz";
+        sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26";
+      };
+    }
+
+    {
+      name = "chownr___chownr_1.0.1.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz";
+        sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181";
+      };
+    }
+
+    {
+      name = "cipher_base___cipher_base_1.0.4.tgz";
+      path = fetchurl {
+        name = "cipher_base___cipher_base_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
+        sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
+      };
+    }
+
+    {
+      name = "clap___clap_1.2.3.tgz";
+      path = fetchurl {
+        name = "clap___clap_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz";
+        sha1 = "4f36745b32008492557f46412d66d50cb99bce51";
+      };
+    }
+
+    {
+      name = "class_utils___class_utils_0.3.6.tgz";
+      path = fetchurl {
+        name = "class_utils___class_utils_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
+        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
+      };
+    }
+
+    {
+      name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
+      path = fetchurl {
+        name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
+        url  = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz";
+        sha1 = "ceda8bb96b00fe168e9b080272960d20fdcadd6d";
+      };
+    }
+
+    {
+      name = "cliui___cliui_2.1.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz";
+        sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
+      };
+    }
+
+    {
+      name = "cliui___cliui_3.2.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
+        sha1 = "120601537a916d29940f934da3b48d585a39213d";
+      };
+    }
+
+    {
+      name = "clone_deep___clone_deep_2.0.2.tgz";
+      path = fetchurl {
+        name = "clone_deep___clone_deep_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz";
+        sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713";
+      };
+    }
+
+    {
+      name = "clone___clone_1.0.4.tgz";
+      path = fetchurl {
+        name = "clone___clone_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
+        sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
+      };
+    }
+
+    {
+      name = "co___co_4.6.0.tgz";
+      path = fetchurl {
+        name = "co___co_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    }
+
+    {
+      name = "coa___coa_1.0.4.tgz";
+      path = fetchurl {
+        name = "coa___coa_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz";
+        sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd";
+      };
+    }
+
+    {
+      name = "code_point_at___code_point_at_1.1.0.tgz";
+      path = fetchurl {
+        name = "code_point_at___code_point_at_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    }
+
+    {
+      name = "collection_visit___collection_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "collection_visit___collection_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
+        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
+      };
+    }
+
+    {
+      name = "color_convert___color_convert_1.9.2.tgz";
+      path = fetchurl {
+        name = "color_convert___color_convert_1.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz";
+        sha1 = "49881b8fba67df12a96bdf3f56c0aab9e7913147";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.1.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz";
+        sha1 = "4b1415304cf50028ea81643643bd82ea05803689";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.3.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    }
+
+    {
+      name = "color_string___color_string_0.3.0.tgz";
+      path = fetchurl {
+        name = "color_string___color_string_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz";
+        sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991";
+      };
+    }
+
+    {
+      name = "color___color_0.11.4.tgz";
+      path = fetchurl {
+        name = "color___color_0.11.4.tgz";
+        url  = "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz";
+        sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764";
+      };
+    }
+
+    {
+      name = "colormin___colormin_1.1.2.tgz";
+      path = fetchurl {
+        name = "colormin___colormin_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz";
+        sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133";
+      };
+    }
+
+    {
+      name = "colors___colors_1.1.2.tgz";
+      path = fetchurl {
+        name = "colors___colors_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz";
+        sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+      };
+    }
+
+    {
+      name = "combined_stream___combined_stream_1.0.6.tgz";
+      path = fetchurl {
+        name = "combined_stream___combined_stream_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz";
+        sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
+      };
+    }
+
+    {
+      name = "commondir___commondir_1.0.1.tgz";
+      path = fetchurl {
+        name = "commondir___commondir_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
+        sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.2.1.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    }
+
+    {
+      name = "compressible___compressible_2.0.14.tgz";
+      path = fetchurl {
+        name = "compressible___compressible_2.0.14.tgz";
+        url  = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz";
+        sha1 = "326c5f507fbb055f54116782b969a81b67a29da7";
+      };
+    }
+
+    {
+      name = "compression___compression_1.7.3.tgz";
+      path = fetchurl {
+        name = "compression___compression_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz";
+        sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db";
+      };
+    }
+
+    {
+      name = "concat_map___concat_map_0.0.1.tgz";
+      path = fetchurl {
+        name = "concat_map___concat_map_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    }
+
+    {
+      name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
+      path = fetchurl {
+        name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz";
+        sha1 = "b06873934bc5e344fef611a196a6faae0aee015a";
+      };
+    }
+
+    {
+      name = "console_browserify___console_browserify_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_browserify___console_browserify_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz";
+        sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
+      };
+    }
+
+    {
+      name = "console_control_strings___console_control_strings_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_control_strings___console_control_strings_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    }
+
+    {
+      name = "constants_browserify___constants_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "constants_browserify___constants_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
+        sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
+      };
+    }
+
+    {
+      name = "content_disposition___content_disposition_0.5.2.tgz";
+      path = fetchurl {
+        name = "content_disposition___content_disposition_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz";
+        sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
+      };
+    }
+
+    {
+      name = "content_type___content_type_1.0.4.tgz";
+      path = fetchurl {
+        name = "content_type___content_type_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
+        sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
+      };
+    }
+
+    {
+      name = "convert_source_map___convert_source_map_0.3.5.tgz";
+      path = fetchurl {
+        name = "convert_source_map___convert_source_map_0.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz";
+        sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190";
+      };
+    }
+
+    {
+      name = "convert_source_map___convert_source_map_1.5.1.tgz";
+      path = fetchurl {
+        name = "convert_source_map___convert_source_map_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz";
+        sha1 = "b8278097b9bc229365de5c62cf5fcaed8b5599e5";
+      };
+    }
+
+    {
+      name = "cookie_signature___cookie_signature_1.0.6.tgz";
+      path = fetchurl {
+        name = "cookie_signature___cookie_signature_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    }
+
+    {
+      name = "cookie___cookie_0.3.1.tgz";
+      path = fetchurl {
+        name = "cookie___cookie_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    }
+
+    {
+      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+      path = fetchurl {
+        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
+        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
+      };
+    }
+
+    {
+      name = "core_js___core_js_2.5.7.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_2.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz";
+        sha1 = "f972608ff0cead68b841a16a932d0b183791814e";
+      };
+    }
+
+    {
+      name = "core_util_is___core_util_is_1.0.2.tgz";
+      path = fetchurl {
+        name = "core_util_is___core_util_is_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    }
+
+    {
+      name = "create_ecdh___create_ecdh_4.0.3.tgz";
+      path = fetchurl {
+        name = "create_ecdh___create_ecdh_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
+        sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
+      };
+    }
+
+    {
+      name = "create_hash___create_hash_1.2.0.tgz";
+      path = fetchurl {
+        name = "create_hash___create_hash_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
+        sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
+      };
+    }
+
+    {
+      name = "create_hmac___create_hmac_1.1.7.tgz";
+      path = fetchurl {
+        name = "create_hmac___create_hmac_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
+        sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_3.0.1.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz";
+        sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_5.1.0.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
+        sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
+      };
+    }
+
+    {
+      name = "cryptiles___cryptiles_2.0.5.tgz";
+      path = fetchurl {
+        name = "cryptiles___cryptiles_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz";
+        sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
+      };
+    }
+
+    {
+      name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+      path = fetchurl {
+        name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
+        sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
+      };
+    }
+
+    {
+      name = "css_color_names___css_color_names_0.0.4.tgz";
+      path = fetchurl {
+        name = "css_color_names___css_color_names_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
+        sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
+      };
+    }
+
+    {
+      name = "css_loader___css_loader_0.26.4.tgz";
+      path = fetchurl {
+        name = "css_loader___css_loader_0.26.4.tgz";
+        url  = "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz";
+        sha1 = "b61e9e30db94303e6ffc892f10ecd09ad025a1fd";
+      };
+    }
+
+    {
+      name = "css_select___css_select_1.2.0.tgz";
+      path = fetchurl {
+        name = "css_select___css_select_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz";
+        sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
+      };
+    }
+
+    {
+      name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
+      path = fetchurl {
+        name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz";
+        sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86";
+      };
+    }
+
+    {
+      name = "css_what___css_what_2.1.0.tgz";
+      path = fetchurl {
+        name = "css_what___css_what_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz";
+        sha1 = "9467d032c38cfaefb9f2d79501253062f87fa1bd";
+      };
+    }
+
+    {
+      name = "css___css_2.2.3.tgz";
+      path = fetchurl {
+        name = "css___css_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz";
+        sha1 = "f861f4ba61e79bedc962aa548e5780fd95cbc6be";
+      };
+    }
+
+    {
+      name = "cssesc___cssesc_0.1.0.tgz";
+      path = fetchurl {
+        name = "cssesc___cssesc_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz";
+        sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
+      };
+    }
+
+    {
+      name = "cssnano___cssnano_3.10.0.tgz";
+      path = fetchurl {
+        name = "cssnano___cssnano_3.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz";
+        sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38";
+      };
+    }
+
+    {
+      name = "csso___csso_2.3.2.tgz";
+      path = fetchurl {
+        name = "csso___csso_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz";
+        sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85";
+      };
+    }
+
+    {
+      name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
+      path = fetchurl {
+        name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
+        sha1 = "988df33feab191ef799a61369dd76c17adf957ea";
+      };
+    }
+
+    {
+      name = "d___d_1.0.0.tgz";
+      path = fetchurl {
+        name = "d___d_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz";
+        sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
+      };
+    }
+
+    {
+      name = "dashdash___dashdash_1.14.1.tgz";
+      path = fetchurl {
+        name = "dashdash___dashdash_1.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    }
+
+    {
+      name = "date_now___date_now_0.1.4.tgz";
+      path = fetchurl {
+        name = "date_now___date_now_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz";
+        sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
+      };
+    }
+
+    {
+      name = "debug___debug_2.6.9.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.6.9.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
+        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
+      };
+    }
+
+    {
+      name = "debug___debug_3.1.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz";
+        sha1 = "5bb5a0672628b64149566ba16819e61518c67261";
+      };
+    }
+
+    {
+      name = "decamelize___decamelize_1.2.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    }
+
+    {
+      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+      path = fetchurl {
+        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
+        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
+      };
+    }
+
+    {
+      name = "deep_equal___deep_equal_1.0.1.tgz";
+      path = fetchurl {
+        name = "deep_equal___deep_equal_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz";
+        sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5";
+      };
+    }
+
+    {
+      name = "deep_extend___deep_extend_0.6.0.tgz";
+      path = fetchurl {
+        name = "deep_extend___deep_extend_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
+      };
+    }
+
+    {
+      name = "define_properties___define_properties_1.1.2.tgz";
+      path = fetchurl {
+        name = "define_properties___define_properties_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz";
+        sha1 = "83a73f2fea569898fb737193c8f873caf6d45c94";
+      };
+    }
+
+    {
+      name = "define_property___define_property_0.2.5.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
+        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
+      };
+    }
+
+    {
+      name = "define_property___define_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
+        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
+      };
+    }
+
+    {
+      name = "define_property___define_property_2.0.2.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
+        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
+      };
+    }
+
+    {
+      name = "defined___defined_1.0.0.tgz";
+      path = fetchurl {
+        name = "defined___defined_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz";
+        sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
+      };
+    }
+
+    {
+      name = "del___del_3.0.0.tgz";
+      path = fetchurl {
+        name = "del___del_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz";
+        sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5";
+      };
+    }
+
+    {
+      name = "delayed_stream___delayed_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "delayed_stream___delayed_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    }
+
+    {
+      name = "delegates___delegates_1.0.0.tgz";
+      path = fetchurl {
+        name = "delegates___delegates_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    }
+
+    {
+      name = "depd___depd_1.1.1.tgz";
+      path = fetchurl {
+        name = "depd___depd_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz";
+        sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359";
+      };
+    }
+
+    {
+      name = "depd___depd_1.1.2.tgz";
+      path = fetchurl {
+        name = "depd___depd_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    }
+
+    {
+      name = "des.js___des.js_1.0.0.tgz";
+      path = fetchurl {
+        name = "des.js___des.js_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz";
+        sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
+      };
+    }
+
+    {
+      name = "destroy___destroy_1.0.4.tgz";
+      path = fetchurl {
+        name = "destroy___destroy_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    }
+
+    {
+      name = "detect_indent___detect_indent_4.0.0.tgz";
+      path = fetchurl {
+        name = "detect_indent___detect_indent_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz";
+        sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
+      };
+    }
+
+    {
+      name = "detect_libc___detect_libc_1.0.3.tgz";
+      path = fetchurl {
+        name = "detect_libc___detect_libc_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
+        sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
+      };
+    }
+
+    {
+      name = "detect_node___detect_node_2.0.3.tgz";
+      path = fetchurl {
+        name = "detect_node___detect_node_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz";
+        sha1 = "a2033c09cc8e158d37748fbde7507832bd6ce127";
+      };
+    }
+
+    {
+      name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+      path = fetchurl {
+        name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
+        sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
+      };
+    }
+
+    {
+      name = "dns_equal___dns_equal_1.0.0.tgz";
+      path = fetchurl {
+        name = "dns_equal___dns_equal_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz";
+        sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d";
+      };
+    }
+
+    {
+      name = "dns_packet___dns_packet_1.3.1.tgz";
+      path = fetchurl {
+        name = "dns_packet___dns_packet_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz";
+        sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a";
+      };
+    }
+
+    {
+      name = "dns_txt___dns_txt_2.0.2.tgz";
+      path = fetchurl {
+        name = "dns_txt___dns_txt_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz";
+        sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6";
+      };
+    }
+
+    {
+      name = "dom_converter___dom_converter_0.1.4.tgz";
+      path = fetchurl {
+        name = "dom_converter___dom_converter_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz";
+        sha1 = "a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b";
+      };
+    }
+
+    {
+      name = "dom_serializer___dom_serializer_0.1.0.tgz";
+      path = fetchurl {
+        name = "dom_serializer___dom_serializer_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz";
+        sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
+      };
+    }
+
+    {
+      name = "domain_browser___domain_browser_1.2.0.tgz";
+      path = fetchurl {
+        name = "domain_browser___domain_browser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
+        sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
+      };
+    }
+
+    {
+      name = "domelementtype___domelementtype_1.3.0.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz";
+        sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
+      };
+    }
+
+    {
+      name = "domelementtype___domelementtype_1.1.3.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz";
+        sha1 = "bd28773e2642881aec51544924299c5cd822185b";
+      };
+    }
+
+    {
+      name = "domhandler___domhandler_2.1.0.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz";
+        sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594";
+      };
+    }
+
+    {
+      name = "domutils___domutils_1.1.6.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz";
+        sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485";
+      };
+    }
+
+    {
+      name = "domutils___domutils_1.5.1.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
+        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
+      };
+    }
+
+    {
+      name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
+      path = fetchurl {
+        name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz";
+        sha1 = "0fc73a9ed5f0d53c38193398523ef7e543777505";
+      };
+    }
+
+    {
+      name = "ee_first___ee_first_1.1.1.tgz";
+      path = fetchurl {
+        name = "ee_first___ee_first_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    }
+
+    {
+      name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
+      path = fetchurl {
+        name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
+        url  = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz";
+        sha1 = "d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0";
+      };
+    }
+
+    {
+      name = "elliptic___elliptic_6.4.0.tgz";
+      path = fetchurl {
+        name = "elliptic___elliptic_6.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz";
+        sha1 = "cac9af8762c85836187003c8dfe193e5e2eae5df";
+      };
+    }
+
+    {
+      name = "emojis_list___emojis_list_2.1.0.tgz";
+      path = fetchurl {
+        name = "emojis_list___emojis_list_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
+        sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
+      };
+    }
+
+    {
+      name = "encodeurl___encodeurl_1.0.2.tgz";
+      path = fetchurl {
+        name = "encodeurl___encodeurl_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    }
+
+    {
+      name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
+      path = fetchurl {
+        name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz";
+        sha1 = "0421e339fd71419b3da13d129b3979040230476e";
+      };
+    }
+
+    {
+      name = "entities___entities_1.1.1.tgz";
+      path = fetchurl {
+        name = "entities___entities_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz";
+        sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
+      };
+    }
+
+    {
+      name = "errno___errno_0.1.7.tgz";
+      path = fetchurl {
+        name = "errno___errno_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
+        sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
+      };
+    }
+
+    {
+      name = "error_ex___error_ex_1.3.2.tgz";
+      path = fetchurl {
+        name = "error_ex___error_ex_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
+        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
+      };
+    }
+
+    {
+      name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
+      path = fetchurl {
+        name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz";
+        sha1 = "4ae8dbaa2bf90a8b450707b9149dcabca135520d";
+      };
+    }
+
+    {
+      name = "es_abstract___es_abstract_1.12.0.tgz";
+      path = fetchurl {
+        name = "es_abstract___es_abstract_1.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz";
+        sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165";
+      };
+    }
+
+    {
+      name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
+      path = fetchurl {
+        name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz";
+        sha1 = "45355248a88979034b6792e19bb81f2b7975dd0d";
+      };
+    }
+
+    {
+      name = "es5_ext___es5_ext_0.10.45.tgz";
+      path = fetchurl {
+        name = "es5_ext___es5_ext_0.10.45.tgz";
+        url  = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz";
+        sha1 = "0bfdf7b473da5919d5adf3bd25ceb754fccc3653";
+      };
+    }
+
+    {
+      name = "es6_iterator___es6_iterator_2.0.3.tgz";
+      path = fetchurl {
+        name = "es6_iterator___es6_iterator_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
+        sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
+      };
+    }
+
+    {
+      name = "es6_map___es6_map_0.1.5.tgz";
+      path = fetchurl {
+        name = "es6_map___es6_map_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz";
+        sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0";
+      };
+    }
+
+    {
+      name = "es6_set___es6_set_0.1.5.tgz";
+      path = fetchurl {
+        name = "es6_set___es6_set_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz";
+        sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1";
+      };
+    }
+
+    {
+      name = "es6_symbol___es6_symbol_3.1.1.tgz";
+      path = fetchurl {
+        name = "es6_symbol___es6_symbol_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz";
+        sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
+      };
+    }
+
+    {
+      name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
+      path = fetchurl {
+        name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz";
+        sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f";
+      };
+    }
+
+    {
+      name = "escape_html___escape_html_1.0.3.tgz";
+      path = fetchurl {
+        name = "escape_html___escape_html_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    }
+
+    {
+      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+      path = fetchurl {
+        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    }
+
+    {
+      name = "escope___escope_3.6.0.tgz";
+      path = fetchurl {
+        name = "escope___escope_3.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz";
+        sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3";
+      };
+    }
+
+    {
+      name = "esprima___esprima_2.7.3.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_2.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz";
+        sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
+      };
+    }
+
+    {
+      name = "esrecurse___esrecurse_4.2.1.tgz";
+      path = fetchurl {
+        name = "esrecurse___esrecurse_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
+        sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
+      };
+    }
+
+    {
+      name = "estraverse___estraverse_4.2.0.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz";
+        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
+      };
+    }
+
+    {
+      name = "esutils___esutils_2.0.2.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    }
+
+    {
+      name = "etag___etag_1.8.1.tgz";
+      path = fetchurl {
+        name = "etag___etag_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    }
+
+    {
+      name = "event_emitter___event_emitter_0.3.5.tgz";
+      path = fetchurl {
+        name = "event_emitter___event_emitter_0.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz";
+        sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
+      };
+    }
+
+    {
+      name = "eventemitter3___eventemitter3_3.1.0.tgz";
+      path = fetchurl {
+        name = "eventemitter3___eventemitter3_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz";
+        sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163";
+      };
+    }
+
+    {
+      name = "events___events_1.1.1.tgz";
+      path = fetchurl {
+        name = "events___events_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz";
+        sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
+      };
+    }
+
+    {
+      name = "eventsource___eventsource_0.1.6.tgz";
+      path = fetchurl {
+        name = "eventsource___eventsource_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz";
+        sha1 = "0acede849ed7dd1ccc32c811bb11b944d4f29232";
+      };
+    }
+
+    {
+      name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+      path = fetchurl {
+        name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
+        sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
+      };
+    }
+
+    {
+      name = "execa___execa_0.7.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz";
+        sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_0.1.5.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
+        sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_2.1.4.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
+        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
+      };
+    }
+
+    {
+      name = "expand_range___expand_range_1.8.2.tgz";
+      path = fetchurl {
+        name = "expand_range___expand_range_1.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
+        sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
+      };
+    }
+
+    {
+      name = "express___express_4.16.3.tgz";
+      path = fetchurl {
+        name = "express___express_4.16.3.tgz";
+        url  = "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz";
+        sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_2.0.1.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
+        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
+        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
+      };
+    }
+
+    {
+      name = "extend___extend_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend___extend_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
+        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
+      };
+    }
+
+    {
+      name = "extglob___extglob_0.3.2.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
+        sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
+      };
+    }
+
+    {
+      name = "extglob___extglob_2.0.4.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
+        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
+      };
+    }
+
+    {
+      name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
+      path = fetchurl {
+        name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz";
+        sha1 = "5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.3.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.4.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
+        sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
+      };
+    }
+
+    {
+      name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz";
+        sha1 = "c053477817c86b51daa853c81e059b733d023614";
+      };
+    }
+
+    {
+      name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
+        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
+      };
+    }
+
+    {
+      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+      path = fetchurl {
+        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
+        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
+      };
+    }
+
+    {
+      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    }
+
+    {
+      name = "fastparse___fastparse_1.1.1.tgz";
+      path = fetchurl {
+        name = "fastparse___fastparse_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz";
+        sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8";
+      };
+    }
+
+    {
+      name = "faye_websocket___faye_websocket_0.10.0.tgz";
+      path = fetchurl {
+        name = "faye_websocket___faye_websocket_0.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz";
+        sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4";
+      };
+    }
+
+    {
+      name = "faye_websocket___faye_websocket_0.11.1.tgz";
+      path = fetchurl {
+        name = "faye_websocket___faye_websocket_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz";
+        sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38";
+      };
+    }
+
+    {
+      name = "file_loader___file_loader_0.10.1.tgz";
+      path = fetchurl {
+        name = "file_loader___file_loader_0.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz";
+        sha1 = "815034119891fc6441fb5a64c11bc93c22ddd842";
+      };
+    }
+
+    {
+      name = "filename_regex___filename_regex_2.0.1.tgz";
+      path = fetchurl {
+        name = "filename_regex___filename_regex_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
+        sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_2.2.4.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
+        sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_4.0.0.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
+        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
+      };
+    }
+
+    {
+      name = "finalhandler___finalhandler_1.1.1.tgz";
+      path = fetchurl {
+        name = "finalhandler___finalhandler_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz";
+        sha1 = "eebf4ed840079c83f4249038c9d703008301b105";
+      };
+    }
+
+    {
+      name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
+      path = fetchurl {
+        name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
+        sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
+      };
+    }
+
+    {
+      name = "find_up___find_up_1.1.2.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
+        sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
+      };
+    }
+
+    {
+      name = "find_up___find_up_2.1.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
+        sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
+      };
+    }
+
+    {
+      name = "flatten___flatten_1.0.2.tgz";
+      path = fetchurl {
+        name = "flatten___flatten_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz";
+        sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
+      };
+    }
+
+    {
+      name = "follow_redirects___follow_redirects_1.5.1.tgz";
+      path = fetchurl {
+        name = "follow_redirects___follow_redirects_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz";
+        sha1 = "67a8f14f5a1f67f962c2c46469c79eaec0a90291";
+      };
+    }
+
+    {
+      name = "for_in___for_in_0.1.8.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz";
+        sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
+      };
+    }
+
+    {
+      name = "for_in___for_in_1.0.2.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    }
+
+    {
+      name = "for_own___for_own_0.1.5.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
+        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
+      };
+    }
+
+    {
+      name = "for_own___for_own_1.0.0.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
+        sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
+      };
+    }
+
+    {
+      name = "foreach___foreach_2.0.5.tgz";
+      path = fetchurl {
+        name = "foreach___foreach_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz";
+        sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
+      };
+    }
+
+    {
+      name = "forever_agent___forever_agent_0.6.1.tgz";
+      path = fetchurl {
+        name = "forever_agent___forever_agent_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    }
+
+    {
+      name = "form_data___form_data_2.1.4.tgz";
+      path = fetchurl {
+        name = "form_data___form_data_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz";
+        sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
+      };
+    }
+
+    {
+      name = "form_data___form_data_2.3.2.tgz";
+      path = fetchurl {
+        name = "form_data___form_data_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz";
+        sha1 = "4970498be604c20c005d4f5c23aecd21d6b49099";
+      };
+    }
+
+    {
+      name = "forwarded___forwarded_0.1.2.tgz";
+      path = fetchurl {
+        name = "forwarded___forwarded_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    }
+
+    {
+      name = "fragment_cache___fragment_cache_0.2.1.tgz";
+      path = fetchurl {
+        name = "fragment_cache___fragment_cache_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
+        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
+      };
+    }
+
+    {
+      name = "fresh___fresh_0.5.2.tgz";
+      path = fetchurl {
+        name = "fresh___fresh_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    }
+
+    {
+      name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
+      path = fetchurl {
+        name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz";
+        sha1 = "efc86cbb816224565861a1be7a9d84d0aafea136";
+      };
+    }
+
+    {
+      name = "fs_extra___fs_extra_2.1.2.tgz";
+      path = fetchurl {
+        name = "fs_extra___fs_extra_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz";
+        sha1 = "046c70163cef9aad46b0e4a7fa467fb22d71de35";
+      };
+    }
+
+    {
+      name = "fs_minipass___fs_minipass_1.2.5.tgz";
+      path = fetchurl {
+        name = "fs_minipass___fs_minipass_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
+        sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
+      };
+    }
+
+    {
+      name = "fs.realpath___fs.realpath_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs.realpath___fs.realpath_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    }
+
+    {
+      name = "fsevents___fsevents_1.2.4.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz";
+        sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426";
+      };
+    }
+
+    {
+      name = "fstream___fstream_1.0.11.tgz";
+      path = fetchurl {
+        name = "fstream___fstream_1.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz";
+        sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171";
+      };
+    }
+
+    {
+      name = "function_bind___function_bind_1.1.1.tgz";
+      path = fetchurl {
+        name = "function_bind___function_bind_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
+        sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
+      };
+    }
+
+    {
+      name = "gauge___gauge_2.7.4.tgz";
+      path = fetchurl {
+        name = "gauge___gauge_2.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    }
+
+    {
+      name = "gaze___gaze_1.1.3.tgz";
+      path = fetchurl {
+        name = "gaze___gaze_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz";
+        sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a";
+      };
+    }
+
+    {
+      name = "get_caller_file___get_caller_file_1.0.3.tgz";
+      path = fetchurl {
+        name = "get_caller_file___get_caller_file_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
+        sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
+      };
+    }
+
+    {
+      name = "get_stdin___get_stdin_4.0.1.tgz";
+      path = fetchurl {
+        name = "get_stdin___get_stdin_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz";
+        sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe";
+      };
+    }
+
+    {
+      name = "get_stream___get_stream_3.0.0.tgz";
+      path = fetchurl {
+        name = "get_stream___get_stream_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
+        sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
+      };
+    }
+
+    {
+      name = "get_value___get_value_2.0.6.tgz";
+      path = fetchurl {
+        name = "get_value___get_value_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
+        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
+      };
+    }
+
+    {
+      name = "getpass___getpass_0.1.7.tgz";
+      path = fetchurl {
+        name = "getpass___getpass_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    }
+
+    {
+      name = "glob_base___glob_base_0.3.0.tgz";
+      path = fetchurl {
+        name = "glob_base___glob_base_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
+        sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_2.0.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
+        sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_3.1.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
+        sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
+      };
+    }
+
+    {
+      name = "glob___glob_6.0.4.tgz";
+      path = fetchurl {
+        name = "glob___glob_6.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz";
+        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
+      };
+    }
+
+    {
+      name = "glob___glob_7.1.2.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz";
+        sha1 = "c19c9df9a028702d678612384a6552404c636d15";
+      };
+    }
+
+    {
+      name = "globals___globals_9.18.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_9.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
+        sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
+      };
+    }
+
+    {
+      name = "globby___globby_6.1.0.tgz";
+      path = fetchurl {
+        name = "globby___globby_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
+        sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
+      };
+    }
+
+    {
+      name = "globule___globule_1.2.1.tgz";
+      path = fetchurl {
+        name = "globule___globule_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz";
+        sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_4.1.11.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz";
+        sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
+      };
+    }
+
+    {
+      name = "handle_thing___handle_thing_1.2.5.tgz";
+      path = fetchurl {
+        name = "handle_thing___handle_thing_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz";
+        sha1 = "fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4";
+      };
+    }
+
+    {
+      name = "har_schema___har_schema_1.0.5.tgz";
+      path = fetchurl {
+        name = "har_schema___har_schema_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz";
+        sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
+      };
+    }
+
+    {
+      name = "har_schema___har_schema_2.0.0.tgz";
+      path = fetchurl {
+        name = "har_schema___har_schema_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    }
+
+    {
+      name = "har_validator___har_validator_4.2.1.tgz";
+      path = fetchurl {
+        name = "har_validator___har_validator_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz";
+        sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
+      };
+    }
+
+    {
+      name = "har_validator___har_validator_5.0.3.tgz";
+      path = fetchurl {
+        name = "har_validator___har_validator_5.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz";
+        sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd";
+      };
+    }
+
+    {
+      name = "has_ansi___has_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
+        sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz";
+        sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_3.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
+        sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
+      };
+    }
+
+    {
+      name = "has_unicode___has_unicode_2.0.1.tgz";
+      path = fetchurl {
+        name = "has_unicode___has_unicode_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    }
+
+    {
+      name = "has_value___has_value_0.3.1.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
+        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
+      };
+    }
+
+    {
+      name = "has_value___has_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
+        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
+      };
+    }
+
+    {
+      name = "has_values___has_values_0.1.4.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    }
+
+    {
+      name = "has_values___has_values_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
+        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
+      };
+    }
+
+    {
+      name = "has___has_1.0.3.tgz";
+      path = fetchurl {
+        name = "has___has_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
+        sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
+      };
+    }
+
+    {
+      name = "hash_base___hash_base_3.0.4.tgz";
+      path = fetchurl {
+        name = "hash_base___hash_base_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz";
+        sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
+      };
+    }
+
+    {
+      name = "hash.js___hash.js_1.1.5.tgz";
+      path = fetchurl {
+        name = "hash.js___hash.js_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz";
+        sha1 = "e38ab4b85dfb1e0c40fe9265c0e9b54854c23812";
+      };
+    }
+
+    {
+      name = "hawk___hawk_3.1.3.tgz";
+      path = fetchurl {
+        name = "hawk___hawk_3.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz";
+        sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
+      };
+    }
+
+    {
+      name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+      path = fetchurl {
+        name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
+        sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
+      };
+    }
+
+    {
+      name = "hoek___hoek_2.16.3.tgz";
+      path = fetchurl {
+        name = "hoek___hoek_2.16.3.tgz";
+        url  = "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz";
+        sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
+      };
+    }
+
+    {
+      name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+      path = fetchurl {
+        name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
+        sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
+      };
+    }
+
+    {
+      name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
+        sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
+      };
+    }
+
+    {
+      name = "hpack.js___hpack.js_2.1.6.tgz";
+      path = fetchurl {
+        name = "hpack.js___hpack.js_2.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz";
+        sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2";
+      };
+    }
+
+    {
+      name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
+      path = fetchurl {
+        name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz";
+        sha1 = "668b93776eaae55ebde8f3ad464b307a4963625e";
+      };
+    }
+
+    {
+      name = "html_entities___html_entities_1.2.1.tgz";
+      path = fetchurl {
+        name = "html_entities___html_entities_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz";
+        sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f";
+      };
+    }
+
+    {
+      name = "htmlparser2___htmlparser2_3.3.0.tgz";
+      path = fetchurl {
+        name = "htmlparser2___htmlparser2_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz";
+        sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe";
+      };
+    }
+
+    {
+      name = "http_deceiver___http_deceiver_1.2.7.tgz";
+      path = fetchurl {
+        name = "http_deceiver___http_deceiver_1.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz";
+        sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.6.2.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz";
+        sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.6.3.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
+        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
+      };
+    }
+
+    {
+      name = "http_parser_js___http_parser_js_0.4.13.tgz";
+      path = fetchurl {
+        name = "http_parser_js___http_parser_js_0.4.13.tgz";
+        url  = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz";
+        sha1 = "3bd6d6fde6e3172c9334c3b33b6c193d80fe1137";
+      };
+    }
+
+    {
+      name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
+      path = fetchurl {
+        name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz";
+        sha1 = "642e8848851d66f09d4f124912846dbaeb41b833";
+      };
+    }
+
+    {
+      name = "http_proxy___http_proxy_1.17.0.tgz";
+      path = fetchurl {
+        name = "http_proxy___http_proxy_1.17.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz";
+        sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a";
+      };
+    }
+
+    {
+      name = "http_signature___http_signature_1.1.1.tgz";
+      path = fetchurl {
+        name = "http_signature___http_signature_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz";
+        sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
+      };
+    }
+
+    {
+      name = "http_signature___http_signature_1.2.0.tgz";
+      path = fetchurl {
+        name = "http_signature___http_signature_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    }
+
+    {
+      name = "https_browserify___https_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "https_browserify___https_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
+        sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.19.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.19.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz";
+        sha1 = "f7468f60135f5e5dad3399c0a81be9a1603a082b";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.23.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.23.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
+        sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
+      };
+    }
+
+    {
+      name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+      path = fetchurl {
+        name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
+        sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
+      };
+    }
+
+    {
+      name = "ieee754___ieee754_1.1.12.tgz";
+      path = fetchurl {
+        name = "ieee754___ieee754_1.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz";
+        sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b";
+      };
+    }
+
+    {
+      name = "ignore_walk___ignore_walk_3.0.1.tgz";
+      path = fetchurl {
+        name = "ignore_walk___ignore_walk_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
+        sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
+      };
+    }
+
+    {
+      name = "import_local___import_local_1.0.0.tgz";
+      path = fetchurl {
+        name = "import_local___import_local_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz";
+        sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc";
+      };
+    }
+
+    {
+      name = "in_publish___in_publish_2.0.0.tgz";
+      path = fetchurl {
+        name = "in_publish___in_publish_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz";
+        sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51";
+      };
+    }
+
+    {
+      name = "indent_string___indent_string_2.1.0.tgz";
+      path = fetchurl {
+        name = "indent_string___indent_string_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz";
+        sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80";
+      };
+    }
+
+    {
+      name = "indexes_of___indexes_of_1.0.1.tgz";
+      path = fetchurl {
+        name = "indexes_of___indexes_of_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
+        sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
+      };
+    }
+
+    {
+      name = "indexof___indexof_0.0.1.tgz";
+      path = fetchurl {
+        name = "indexof___indexof_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    }
+
+    {
+      name = "inflight___inflight_1.0.6.tgz";
+      path = fetchurl {
+        name = "inflight___inflight_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.3.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.1.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
+        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
+      };
+    }
+
+    {
+      name = "ini___ini_1.3.5.tgz";
+      path = fetchurl {
+        name = "ini___ini_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
+        sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
+      };
+    }
+
+    {
+      name = "internal_ip___internal_ip_1.2.0.tgz";
+      path = fetchurl {
+        name = "internal_ip___internal_ip_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz";
+        sha1 = "ae9fbf93b984878785d50a8de1b356956058cf5c";
+      };
+    }
+
+    {
+      name = "interpret___interpret_1.1.0.tgz";
+      path = fetchurl {
+        name = "interpret___interpret_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz";
+        sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
+      };
+    }
+
+    {
+      name = "invariant___invariant_2.2.4.tgz";
+      path = fetchurl {
+        name = "invariant___invariant_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
+        sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_1.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
+        sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
+      };
+    }
+
+    {
+      name = "ip___ip_1.1.5.tgz";
+      path = fetchurl {
+        name = "ip___ip_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
+        sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz";
+        sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e";
+      };
+    }
+
+    {
+      name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
+        sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
+        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
+        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
+      };
+    }
+
+    {
+      name = "is_binary_path___is_binary_path_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
+        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
+      };
+    }
+
+    {
+      name = "is_buffer___is_buffer_1.1.6.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
+      };
+    }
+
+    {
+      name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
+        sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
+      };
+    }
+
+    {
+      name = "is_callable___is_callable_1.1.4.tgz";
+      path = fetchurl {
+        name = "is_callable___is_callable_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz";
+        sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
+        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
+        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
+      };
+    }
+
+    {
+      name = "is_date_object___is_date_object_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_date_object___is_date_object_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz";
+        sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
+        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
+        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
+      };
+    }
+
+    {
+      name = "is_dotfile___is_dotfile_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_dotfile___is_dotfile_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
+        sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
+      };
+    }
+
+    {
+      name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+      path = fetchurl {
+        name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
+        sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
+        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
+        sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_2.1.1.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
+        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
+      };
+    }
+
+    {
+      name = "is_finite___is_finite_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_finite___is_finite_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
+        sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_2.0.1.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
+        sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_3.1.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
+        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz";
+        sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
+      };
+    }
+
+    {
+      name = "is_number___is_number_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
+        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
+      };
+    }
+
+    {
+      name = "is_number___is_number_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
+        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
+      };
+    }
+
+    {
+      name = "is_number___is_number_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
+        sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
+      };
+    }
+
+    {
+      name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
+        sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
+      };
+    }
+
+    {
+      name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz";
+        sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52";
+      };
+    }
+
+    {
+      name = "is_path_inside___is_path_inside_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_inside___is_path_inside_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz";
+        sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
+      };
+    }
+
+    {
+      name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
+        sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
+      };
+    }
+
+    {
+      name = "is_plain_object___is_plain_object_2.0.4.tgz";
+      path = fetchurl {
+        name = "is_plain_object___is_plain_object_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
+      };
+    }
+
+    {
+      name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
+        sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
+      };
+    }
+
+    {
+      name = "is_primitive___is_primitive_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_primitive___is_primitive_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
+        sha1 = "207bab91638499c07b2adf240a41a87210034575";
+      };
+    }
+
+    {
+      name = "is_regex___is_regex_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_regex___is_regex_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz";
+        sha1 = "5517489b547091b0930e095654ced25ee97e9491";
+      };
+    }
+
+    {
+      name = "is_stream___is_stream_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_stream___is_stream_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
+        sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
+      };
+    }
+
+    {
+      name = "is_svg___is_svg_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_svg___is_svg_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz";
+        sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
+      };
+    }
+
+    {
+      name = "is_symbol___is_symbol_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_symbol___is_symbol_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz";
+        sha1 = "3cc59f00025194b6ab2e38dbae6689256b660572";
+      };
+    }
+
+    {
+      name = "is_typedarray___is_typedarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_typedarray___is_typedarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    }
+
+    {
+      name = "is_utf8___is_utf8_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_utf8___is_utf8_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
+        sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
+      };
+    }
+
+    {
+      name = "is_windows___is_windows_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_windows___is_windows_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
+        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
+      };
+    }
+
+    {
+      name = "is_wsl___is_wsl_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_wsl___is_wsl_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
+        sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
+      };
+    }
+
+    {
+      name = "isarray___isarray_0.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    }
+
+    {
+      name = "isarray___isarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    }
+
+    {
+      name = "isexe___isexe_2.0.0.tgz";
+      path = fetchurl {
+        name = "isexe___isexe_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    }
+
+    {
+      name = "isobject___isobject_2.1.0.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
+        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
+      };
+    }
+
+    {
+      name = "isobject___isobject_3.0.1.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    }
+
+    {
+      name = "isstream___isstream_0.1.2.tgz";
+      path = fetchurl {
+        name = "isstream___isstream_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    }
+
+    {
+      name = "jquery___jquery_3.3.1.tgz";
+      path = fetchurl {
+        name = "jquery___jquery_3.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz";
+        sha1 = "958ce29e81c9790f31be7792df5d4d95fc57fbca";
+      };
+    }
+
+    {
+      name = "js_base64___js_base64_2.4.8.tgz";
+      path = fetchurl {
+        name = "js_base64___js_base64_2.4.8.tgz";
+        url  = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz";
+        sha1 = "57a9b130888f956834aa40c5b165ba59c758f033";
+      };
+    }
+
+    {
+      name = "js_tokens___js_tokens_4.0.0.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
+        sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
+      };
+    }
+
+    {
+      name = "js_tokens___js_tokens_3.0.2.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
+        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
+      };
+    }
+
+    {
+      name = "js_yaml___js_yaml_3.7.0.tgz";
+      path = fetchurl {
+        name = "js_yaml___js_yaml_3.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz";
+        sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80";
+      };
+    }
+
+    {
+      name = "jsbn___jsbn_0.1.1.tgz";
+      path = fetchurl {
+        name = "jsbn___jsbn_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    }
+
+    {
+      name = "jsesc___jsesc_1.3.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz";
+        sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
+      };
+    }
+
+    {
+      name = "jsesc___jsesc_0.5.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
+        sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
+      };
+    }
+
+    {
+      name = "json_loader___json_loader_0.5.7.tgz";
+      path = fetchurl {
+        name = "json_loader___json_loader_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz";
+        sha1 = "dca14a70235ff82f0ac9a3abeb60d337a365185d";
+      };
+    }
+
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz";
+        sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340";
+      };
+    }
+
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
+      };
+    }
+
+    {
+      name = "json_schema___json_schema_0.2.3.tgz";
+      path = fetchurl {
+        name = "json_schema___json_schema_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    }
+
+    {
+      name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+      path = fetchurl {
+        name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
+        sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
+      };
+    }
+
+    {
+      name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+      path = fetchurl {
+        name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    }
+
+    {
+      name = "json3___json3_3.3.2.tgz";
+      path = fetchurl {
+        name = "json3___json3_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
+        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+      };
+    }
+
+    {
+      name = "json5___json5_0.5.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
+        sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
+      };
+    }
+
+    {
+      name = "jsonfile___jsonfile_2.4.0.tgz";
+      path = fetchurl {
+        name = "jsonfile___jsonfile_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz";
+        sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
+      };
+    }
+
+    {
+      name = "jsonify___jsonify_0.0.0.tgz";
+      path = fetchurl {
+        name = "jsonify___jsonify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
+        sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
+      };
+    }
+
+    {
+      name = "jsprim___jsprim_1.4.1.tgz";
+      path = fetchurl {
+        name = "jsprim___jsprim_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    }
+
+    {
+      name = "killable___killable_1.0.0.tgz";
+      path = fetchurl {
+        name = "killable___killable_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz";
+        sha1 = "da8b84bd47de5395878f95d64d02f2449fe05e6b";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_3.2.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_4.0.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
+        sha1 = "20813df3d712928b207378691a45066fae72dd57";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_5.1.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
+        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_6.0.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
+        sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
+      };
+    }
+
+    {
+      name = "lazy_cache___lazy_cache_1.0.4.tgz";
+      path = fetchurl {
+        name = "lazy_cache___lazy_cache_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz";
+        sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
+      };
+    }
+
+    {
+      name = "lcid___lcid_1.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
+        sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
+      };
+    }
+
+    {
+      name = "load_json_file___load_json_file_1.1.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
+        sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
+      };
+    }
+
+    {
+      name = "load_json_file___load_json_file_2.0.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz";
+        sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8";
+      };
+    }
+
+    {
+      name = "loader_runner___loader_runner_2.3.0.tgz";
+      path = fetchurl {
+        name = "loader_runner___loader_runner_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz";
+        sha1 = "f482aea82d543e07921700d5a46ef26fdac6b8a2";
+      };
+    }
+
+    {
+      name = "loader_utils___loader_utils_1.1.0.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz";
+        sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd";
+      };
+    }
+
+    {
+      name = "locate_path___locate_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
+        sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
+      };
+    }
+
+    {
+      name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
+      path = fetchurl {
+        name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz";
+        sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e";
+      };
+    }
+
+    {
+      name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz";
+        sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36";
+      };
+    }
+
+    {
+      name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz";
+        sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e";
+      };
+    }
+
+    {
+      name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
+      path = fetchurl {
+        name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz";
+        sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11";
+      };
+    }
+
+    {
+      name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
+      path = fetchurl {
+        name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz";
+        sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5";
+      };
+    }
+
+    {
+      name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
+      path = fetchurl {
+        name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz";
+        sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c";
+      };
+    }
+
+    {
+      name = "lodash.assign___lodash.assign_3.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.assign___lodash.assign_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz";
+        sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa";
+      };
+    }
+
+    {
+      name = "lodash.assign___lodash.assign_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.assign___lodash.assign_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
+        sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
+      };
+    }
+
+    {
+      name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
+      path = fetchurl {
+        name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz";
+        sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6";
+      };
+    }
+
+    {
+      name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
+        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
+      };
+    }
+
+    {
+      name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+      path = fetchurl {
+        name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
+        sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
+      };
+    }
+
+    {
+      name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz";
+        sha1 = "c7308b18dbf8bc9372d701a73493c61192bd2e2c";
+      };
+    }
+
+    {
+      name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
+        sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
+      };
+    }
+
+    {
+      name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
+      path = fetchurl {
+        name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz";
+        sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a";
+      };
+    }
+
+    {
+      name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
+      path = fetchurl {
+        name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz";
+        sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55";
+      };
+    }
+
+    {
+      name = "lodash.keys___lodash.keys_3.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.keys___lodash.keys_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz";
+        sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a";
+      };
+    }
+
+    {
+      name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
+        sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
+      };
+    }
+
+    {
+      name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
+      path = fetchurl {
+        name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz";
+        sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927";
+      };
+    }
+
+    {
+      name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
+      path = fetchurl {
+        name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz";
+        sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805";
+      };
+    }
+
+    {
+      name = "lodash.tail___lodash.tail_4.1.1.tgz";
+      path = fetchurl {
+        name = "lodash.tail___lodash.tail_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz";
+        sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664";
+      };
+    }
+
+    {
+      name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
+        sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
+      };
+    }
+
+    {
+      name = "lodash___lodash_4.17.10.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.10.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz";
+        sha1 = "1b7793cf7259ea38fb3661d4d38b3260af8ae4e7";
+      };
+    }
+
+    {
+      name = "loglevel___loglevel_1.6.1.tgz";
+      path = fetchurl {
+        name = "loglevel___loglevel_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz";
+        sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa";
+      };
+    }
+
+    {
+      name = "longest___longest_1.0.1.tgz";
+      path = fetchurl {
+        name = "longest___longest_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz";
+        sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
+      };
+    }
+
+    {
+      name = "loose_envify___loose_envify_1.4.0.tgz";
+      path = fetchurl {
+        name = "loose_envify___loose_envify_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
+        sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
+      };
+    }
+
+    {
+      name = "loud_rejection___loud_rejection_1.6.0.tgz";
+      path = fetchurl {
+        name = "loud_rejection___loud_rejection_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz";
+        sha1 = "5b46f80147edee578870f086d04821cf998e551f";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_4.1.3.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_4.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz";
+        sha1 = "a1175cf3496dfc8436c156c334b4955992bce69c";
+      };
+    }
+
+    {
+      name = "make_dir___make_dir_1.3.0.tgz";
+      path = fetchurl {
+        name = "make_dir___make_dir_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz";
+        sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c";
+      };
+    }
+
+    {
+      name = "map_cache___map_cache_0.2.2.tgz";
+      path = fetchurl {
+        name = "map_cache___map_cache_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
+        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
+      };
+    }
+
+    {
+      name = "map_obj___map_obj_1.0.1.tgz";
+      path = fetchurl {
+        name = "map_obj___map_obj_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
+        sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
+      };
+    }
+
+    {
+      name = "map_visit___map_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "map_visit___map_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
+        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
+      };
+    }
+
+    {
+      name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
+      path = fetchurl {
+        name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
+        url  = "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
+        sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
+      };
+    }
+
+    {
+      name = "math_random___math_random_1.0.1.tgz";
+      path = fetchurl {
+        name = "math_random___math_random_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz";
+        sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac";
+      };
+    }
+
+    {
+      name = "md5.js___md5.js_1.3.4.tgz";
+      path = fetchurl {
+        name = "md5.js___md5.js_1.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz";
+        sha1 = "e9bdbde94a20a5ac18b04340fc5764d5b09d901d";
+      };
+    }
+
+    {
+      name = "media_typer___media_typer_0.3.0.tgz";
+      path = fetchurl {
+        name = "media_typer___media_typer_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    }
+
+    {
+      name = "mem___mem_1.1.0.tgz";
+      path = fetchurl {
+        name = "mem___mem_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz";
+        sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76";
+      };
+    }
+
+    {
+      name = "memory_fs___memory_fs_0.4.1.tgz";
+      path = fetchurl {
+        name = "memory_fs___memory_fs_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
+        sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
+      };
+    }
+
+    {
+      name = "meow___meow_3.7.0.tgz";
+      path = fetchurl {
+        name = "meow___meow_3.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz";
+        sha1 = "72cb668b425228290abbfa856892587308a801fb";
+      };
+    }
+
+    {
+      name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+      path = fetchurl {
+        name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    }
+
+    {
+      name = "methods___methods_1.1.2.tgz";
+      path = fetchurl {
+        name = "methods___methods_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_2.3.11.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_2.3.11.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
+        sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_3.1.10.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_3.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
+        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
+      };
+    }
+
+    {
+      name = "miller_rabin___miller_rabin_4.0.1.tgz";
+      path = fetchurl {
+        name = "miller_rabin___miller_rabin_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
+        sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
+      };
+    }
+
+    {
+      name = "mime_db___mime_db_1.35.0.tgz";
+      path = fetchurl {
+        name = "mime_db___mime_db_1.35.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz";
+        sha1 = "0569d657466491283709663ad379a99b90d9ab47";
+      };
+    }
+
+    {
+      name = "mime_types___mime_types_2.1.19.tgz";
+      path = fetchurl {
+        name = "mime_types___mime_types_2.1.19.tgz";
+        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz";
+        sha1 = "71e464537a7ef81c15f2db9d97e913fc0ff606f0";
+      };
+    }
+
+    {
+      name = "mime___mime_1.4.1.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz";
+        sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6";
+      };
+    }
+
+    {
+      name = "mime___mime_1.6.0.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
+        sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
+      };
+    }
+
+    {
+      name = "mimic_fn___mimic_fn_1.2.0.tgz";
+      path = fetchurl {
+        name = "mimic_fn___mimic_fn_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
+        sha1 = "820c86a39334640e99516928bd03fca88057d022";
+      };
+    }
+
+    {
+      name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
+        sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
+      };
+    }
+
+    {
+      name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
+        sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_3.0.4.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
+        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.8.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    }
+
+    {
+      name = "minimist___minimist_1.2.0.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
+        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
+      };
+    }
+
+    {
+      name = "minipass___minipass_2.3.3.tgz";
+      path = fetchurl {
+        name = "minipass___minipass_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz";
+        sha1 = "a7dcc8b7b833f5d368759cce544dccb55f50f233";
+      };
+    }
+
+    {
+      name = "minizlib___minizlib_1.1.0.tgz";
+      path = fetchurl {
+        name = "minizlib___minizlib_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz";
+        sha1 = "11e13658ce46bc3a70a267aac58359d1e0c29ceb";
+      };
+    }
+
+    {
+      name = "mixin_deep___mixin_deep_1.3.1.tgz";
+      path = fetchurl {
+        name = "mixin_deep___mixin_deep_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
+        sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
+      };
+    }
+
+    {
+      name = "mixin_object___mixin_object_2.0.1.tgz";
+      path = fetchurl {
+        name = "mixin_object___mixin_object_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz";
+        sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e";
+      };
+    }
+
+    {
+      name = "mkdirp___mkdirp_0.5.1.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    }
+
+    {
+      name = "ms___ms_2.0.0.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    }
+
+    {
+      name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
+      path = fetchurl {
+        name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz";
+        sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901";
+      };
+    }
+
+    {
+      name = "multicast_dns___multicast_dns_6.2.3.tgz";
+      path = fetchurl {
+        name = "multicast_dns___multicast_dns_6.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz";
+        sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229";
+      };
+    }
+
+    {
+      name = "nan___nan_2.10.0.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz";
+        sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f";
+      };
+    }
+
+    {
+      name = "nanomatch___nanomatch_1.2.13.tgz";
+      path = fetchurl {
+        name = "nanomatch___nanomatch_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
+        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
+      };
+    }
+
+    {
+      name = "needle___needle_2.2.1.tgz";
+      path = fetchurl {
+        name = "needle___needle_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz";
+        sha1 = "b5e325bd3aae8c2678902fa296f729455d1d3a7d";
+      };
+    }
+
+    {
+      name = "negotiator___negotiator_0.6.1.tgz";
+      path = fetchurl {
+        name = "negotiator___negotiator_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
+        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
+      };
+    }
+
+    {
+      name = "neo_async___neo_async_2.5.1.tgz";
+      path = fetchurl {
+        name = "neo_async___neo_async_2.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz";
+        sha1 = "acb909e327b1e87ec9ef15f41b8a269512ad41ee";
+      };
+    }
+
+    {
+      name = "next_tick___next_tick_1.0.0.tgz";
+      path = fetchurl {
+        name = "next_tick___next_tick_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
+        sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
+      };
+    }
+
+    {
+      name = "node_forge___node_forge_0.7.5.tgz";
+      path = fetchurl {
+        name = "node_forge___node_forge_0.7.5.tgz";
+        url  = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz";
+        sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df";
+      };
+    }
+
+    {
+      name = "node_gyp___node_gyp_3.7.0.tgz";
+      path = fetchurl {
+        name = "node_gyp___node_gyp_3.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz";
+        sha1 = "789478e8f6c45e277aa014f3e28f958f286f9203";
+      };
+    }
+
+    {
+      name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
+      path = fetchurl {
+        name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
+        sha1 = "5f94263d404f6e44767d726901fff05478d600df";
+      };
+    }
+
+    {
+      name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+      path = fetchurl {
+        name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
+        sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
+      };
+    }
+
+    {
+      name = "node_sass___node_sass_4.9.2.tgz";
+      path = fetchurl {
+        name = "node_sass___node_sass_4.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz";
+        sha1 = "5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437";
+      };
+    }
+
+    {
+      name = "nopt___nopt_3.0.6.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_3.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
+        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
+      };
+    }
+
+    {
+      name = "nopt___nopt_4.0.1.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
+        sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
+      };
+    }
+
+    {
+      name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
+        sha1 = "12f95a307d58352075a04907b84ac8be98ac012f";
+      };
+    }
+
+    {
+      name = "normalize_path___normalize_path_2.1.1.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
+        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
+      };
+    }
+
+    {
+      name = "normalize_range___normalize_range_0.1.2.tgz";
+      path = fetchurl {
+        name = "normalize_range___normalize_range_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
+        sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
+      };
+    }
+
+    {
+      name = "normalize_url___normalize_url_1.9.1.tgz";
+      path = fetchurl {
+        name = "normalize_url___normalize_url_1.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz";
+        sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
+      };
+    }
+
+    {
+      name = "npm_bundled___npm_bundled_1.0.3.tgz";
+      path = fetchurl {
+        name = "npm_bundled___npm_bundled_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz";
+        sha1 = "7e71703d973af3370a9591bafe3a63aca0be2308";
+      };
+    }
+
+    {
+      name = "npm_packlist___npm_packlist_1.1.11.tgz";
+      path = fetchurl {
+        name = "npm_packlist___npm_packlist_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz";
+        sha1 = "84e8c683cbe7867d34b1d357d893ce29e28a02de";
+      };
+    }
+
+    {
+      name = "npm_run_path___npm_run_path_2.0.2.tgz";
+      path = fetchurl {
+        name = "npm_run_path___npm_run_path_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
+        sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
+      };
+    }
+
+    {
+      name = "npmlog___npmlog_4.1.2.tgz";
+      path = fetchurl {
+        name = "npmlog___npmlog_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
+        sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
+      };
+    }
+
+    {
+      name = "nth_check___nth_check_1.0.1.tgz";
+      path = fetchurl {
+        name = "nth_check___nth_check_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz";
+        sha1 = "9929acdf628fc2c41098deab82ac580cf149aae4";
+      };
+    }
+
+    {
+      name = "num2fraction___num2fraction_1.2.2.tgz";
+      path = fetchurl {
+        name = "num2fraction___num2fraction_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
+        sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
+      };
+    }
+
+    {
+      name = "number_is_nan___number_is_nan_1.0.1.tgz";
+      path = fetchurl {
+        name = "number_is_nan___number_is_nan_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    }
+
+    {
+      name = "oauth_sign___oauth_sign_0.8.2.tgz";
+      path = fetchurl {
+        name = "oauth_sign___oauth_sign_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz";
+        sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.1.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    }
+
+    {
+      name = "object_copy___object_copy_0.1.0.tgz";
+      path = fetchurl {
+        name = "object_copy___object_copy_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
+        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
+      };
+    }
+
+    {
+      name = "object_keys___object_keys_1.0.12.tgz";
+      path = fetchurl {
+        name = "object_keys___object_keys_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz";
+        sha1 = "09c53855377575310cca62f55bb334abff7b3ed2";
+      };
+    }
+
+    {
+      name = "object_path___object_path_0.9.2.tgz";
+      path = fetchurl {
+        name = "object_path___object_path_0.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz";
+        sha1 = "0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5";
+      };
+    }
+
+    {
+      name = "object_visit___object_visit_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_visit___object_visit_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
+        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
+      };
+    }
+
+    {
+      name = "object.omit___object.omit_2.0.1.tgz";
+      path = fetchurl {
+        name = "object.omit___object.omit_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
+        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
+      };
+    }
+
+    {
+      name = "object.pick___object.pick_1.3.0.tgz";
+      path = fetchurl {
+        name = "object.pick___object.pick_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    }
+
+    {
+      name = "obuf___obuf_1.1.2.tgz";
+      path = fetchurl {
+        name = "obuf___obuf_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz";
+        sha1 = "09bea3343d41859ebd446292d11c9d4db619084e";
+      };
+    }
+
+    {
+      name = "on_finished___on_finished_2.3.0.tgz";
+      path = fetchurl {
+        name = "on_finished___on_finished_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    }
+
+    {
+      name = "on_headers___on_headers_1.0.1.tgz";
+      path = fetchurl {
+        name = "on_headers___on_headers_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz";
+        sha1 = "928f5d0f470d49342651ea6794b0857c100693f7";
+      };
+    }
+
+    {
+      name = "once___once_1.4.0.tgz";
+      path = fetchurl {
+        name = "once___once_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    }
+
+    {
+      name = "open_iconic___open_iconic_1.1.1.tgz";
+      path = fetchurl {
+        name = "open_iconic___open_iconic_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz";
+        sha1 = "9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6";
+      };
+    }
+
+    {
+      name = "opn___opn_5.3.0.tgz";
+      path = fetchurl {
+        name = "opn___opn_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz";
+        sha1 = "64871565c863875f052cfdf53d3e3cb5adb53b1c";
+      };
+    }
+
+    {
+      name = "original___original_1.0.1.tgz";
+      path = fetchurl {
+        name = "original___original_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz";
+        sha1 = "b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190";
+      };
+    }
+
+    {
+      name = "os_browserify___os_browserify_0.3.0.tgz";
+      path = fetchurl {
+        name = "os_browserify___os_browserify_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
+        sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
+      };
+    }
+
+    {
+      name = "os_homedir___os_homedir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_homedir___os_homedir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_1.4.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz";
+        sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_2.1.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz";
+        sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2";
+      };
+    }
+
+    {
+      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    }
+
+    {
+      name = "osenv___osenv_0.1.5.tgz";
+      path = fetchurl {
+        name = "osenv___osenv_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
+        sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
+      };
+    }
+
+    {
+      name = "p_finally___p_finally_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_finally___p_finally_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
+        sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
+      };
+    }
+
+    {
+      name = "p_limit___p_limit_1.3.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
+        sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
+      };
+    }
+
+    {
+      name = "p_locate___p_locate_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
+        sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
+      };
+    }
+
+    {
+      name = "p_map___p_map_1.2.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz";
+        sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b";
+      };
+    }
+
+    {
+      name = "p_try___p_try_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
+        sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
+      };
+    }
+
+    {
+      name = "pako___pako_1.0.6.tgz";
+      path = fetchurl {
+        name = "pako___pako_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz";
+        sha1 = "0101211baa70c4bca4a0f63f2206e97b7dfaf258";
+      };
+    }
+
+    {
+      name = "parse_asn1___parse_asn1_5.1.1.tgz";
+      path = fetchurl {
+        name = "parse_asn1___parse_asn1_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz";
+        sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8";
+      };
+    }
+
+    {
+      name = "parse_glob___parse_glob_3.0.4.tgz";
+      path = fetchurl {
+        name = "parse_glob___parse_glob_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
+        sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
+      };
+    }
+
+    {
+      name = "parse_json___parse_json_2.2.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
+        sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
+      };
+    }
+
+    {
+      name = "parseurl___parseurl_1.3.2.tgz";
+      path = fetchurl {
+        name = "parseurl___parseurl_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
+        sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
+      };
+    }
+
+    {
+      name = "pascalcase___pascalcase_0.1.1.tgz";
+      path = fetchurl {
+        name = "pascalcase___pascalcase_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
+        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
+      };
+    }
+
+    {
+      name = "path_browserify___path_browserify_0.0.0.tgz";
+      path = fetchurl {
+        name = "path_browserify___path_browserify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz";
+        sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
+      };
+    }
+
+    {
+      name = "path_dirname___path_dirname_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_dirname___path_dirname_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
+        sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_2.1.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
+        sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_3.0.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
+        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
+      };
+    }
+
+    {
+      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+      path = fetchurl {
+        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    }
+
+    {
+      name = "path_is_inside___path_is_inside_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_is_inside___path_is_inside_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
+        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
+      };
+    }
+
+    {
+      name = "path_key___path_key_2.0.1.tgz";
+      path = fetchurl {
+        name = "path_key___path_key_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
+        sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
+      };
+    }
+
+    {
+      name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+      path = fetchurl {
+        name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    }
+
+    {
+      name = "path_type___path_type_1.1.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
+        sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
+      };
+    }
+
+    {
+      name = "path_type___path_type_2.0.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz";
+        sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73";
+      };
+    }
+
+    {
+      name = "pbkdf2___pbkdf2_3.0.16.tgz";
+      path = fetchurl {
+        name = "pbkdf2___pbkdf2_3.0.16.tgz";
+        url  = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz";
+        sha1 = "7404208ec6b01b62d85bf83853a8064f8d9c2a5c";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_0.2.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz";
+        sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_2.1.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    }
+
+    {
+      name = "pify___pify_2.3.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    }
+
+    {
+      name = "pify___pify_3.0.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
+        sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
+      };
+    }
+
+    {
+      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+      path = fetchurl {
+        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    }
+
+    {
+      name = "pinkie___pinkie_2.0.4.tgz";
+      path = fetchurl {
+        name = "pinkie___pinkie_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    }
+
+    {
+      name = "pkg_dir___pkg_dir_2.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz";
+        sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
+      };
+    }
+
+    {
+      name = "pkg_up___pkg_up_1.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_up___pkg_up_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz";
+        sha1 = "3e08fb461525c4421624a33b9f7e6d0af5b05a26";
+      };
+    }
+
+    {
+      name = "popper.js___popper.js_1.14.4.tgz";
+      path = fetchurl {
+        name = "popper.js___popper.js_1.14.4.tgz";
+        url  = "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz";
+        sha1 = "8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6";
+      };
+    }
+
+    {
+      name = "portfinder___portfinder_1.0.13.tgz";
+      path = fetchurl {
+        name = "portfinder___portfinder_1.0.13.tgz";
+        url  = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz";
+        sha1 = "bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9";
+      };
+    }
+
+    {
+      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+      path = fetchurl {
+        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
+        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
+      };
+    }
+
+    {
+      name = "postcss_calc___postcss_calc_5.3.1.tgz";
+      path = fetchurl {
+        name = "postcss_calc___postcss_calc_5.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz";
+        sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e";
+      };
+    }
+
+    {
+      name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
+      path = fetchurl {
+        name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz";
+        sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b";
+      };
+    }
+
+    {
+      name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
+      path = fetchurl {
+        name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz";
+        sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d";
+      };
+    }
+
+    {
+      name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
+      path = fetchurl {
+        name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz";
+        sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d";
+      };
+    }
+
+    {
+      name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz";
+        sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932";
+      };
+    }
+
+    {
+      name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz";
+        sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5";
+      };
+    }
+
+    {
+      name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz";
+        sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58";
+      };
+    }
+
+    {
+      name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
+      path = fetchurl {
+        name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz";
+        sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433";
+      };
+    }
+
+    {
+      name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
+      path = fetchurl {
+        name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz";
+        sha1 = "82245fdf82337041645e477114d8e593aa18b8ec";
+      };
+    }
+
+    {
+      name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
+      path = fetchurl {
+        name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz";
+        sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270";
+      };
+    }
+
+    {
+      name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz";
+        sha1 = "23d90cd127b0a77994915332739034a1a4f3d658";
+      };
+    }
+
+    {
+      name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
+      path = fetchurl {
+        name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz";
+        sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721";
+      };
+    }
+
+    {
+      name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz";
+        sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e";
+      };
+    }
+
+    {
+      name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
+      path = fetchurl {
+        name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz";
+        sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69";
+      };
+    }
+
+    {
+      name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
+      path = fetchurl {
+        name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz";
+        sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1";
+      };
+    }
+
+    {
+      name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
+      path = fetchurl {
+        name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz";
+        sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3";
+      };
+    }
+
+    {
+      name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz";
+        sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf";
+      };
+    }
+
+    {
+      name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
+        sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
+      };
+    }
+
+    {
+      name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
+        sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
+      };
+    }
+
+    {
+      name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
+        sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
+      };
+    }
+
+    {
+      name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
+        sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
+      };
+    }
+
+    {
+      name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz";
+        sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1";
+      };
+    }
+
+    {
+      name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz";
+        sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222";
+      };
+    }
+
+    {
+      name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
+      path = fetchurl {
+        name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz";
+        sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d";
+      };
+    }
+
+    {
+      name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz";
+        sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3";
+      };
+    }
+
+    {
+      name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz";
+        sha1 = "68f80695f045d08263a879ad240df8dd64f644ea";
+      };
+    }
+
+    {
+      name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz";
+        sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1";
+      };
+    }
+
+    {
+      name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
+      path = fetchurl {
+        name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz";
+        sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90";
+      };
+    }
+
+    {
+      name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
+      path = fetchurl {
+        name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz";
+        sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d";
+      };
+    }
+
+    {
+      name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz";
+        sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d";
+      };
+    }
+
+    {
+      name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
+      path = fetchurl {
+        name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz";
+        sha1 = "87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15";
+      };
+    }
+
+    {
+      name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
+      path = fetchurl {
+        name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz";
+        sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22";
+      };
+    }
+
+    {
+      name = "postcss___postcss_5.2.18.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_5.2.18.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz";
+        sha1 = "badfa1497d46244f6390f58b319830d9107853c5";
+      };
+    }
+
+    {
+      name = "postcss___postcss_6.0.23.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_6.0.23.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz";
+        sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324";
+      };
+    }
+
+    {
+      name = "prepend_http___prepend_http_1.0.4.tgz";
+      path = fetchurl {
+        name = "prepend_http___prepend_http_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
+        sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
+      };
+    }
+
+    {
+      name = "preserve___preserve_0.2.0.tgz";
+      path = fetchurl {
+        name = "preserve___preserve_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
+        sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
+      };
+    }
+
+    {
+      name = "pretty_error___pretty_error_2.1.1.tgz";
+      path = fetchurl {
+        name = "pretty_error___pretty_error_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz";
+        sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
+      };
+    }
+
+    {
+      name = "private___private_0.1.8.tgz";
+      path = fetchurl {
+        name = "private___private_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
+        sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
+      };
+    }
+
+    {
+      name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+      path = fetchurl {
+        name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
+        sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
+      };
+    }
+
+    {
+      name = "process___process_0.11.10.tgz";
+      path = fetchurl {
+        name = "process___process_0.11.10.tgz";
+        url  = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
+        sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
+      };
+    }
+
+    {
+      name = "proxy_addr___proxy_addr_2.0.4.tgz";
+      path = fetchurl {
+        name = "proxy_addr___proxy_addr_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz";
+        sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93";
+      };
+    }
+
+    {
+      name = "prr___prr_1.0.1.tgz";
+      path = fetchurl {
+        name = "prr___prr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
+        sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
+      };
+    }
+
+    {
+      name = "pseudomap___pseudomap_1.0.2.tgz";
+      path = fetchurl {
+        name = "pseudomap___pseudomap_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
+        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
+      };
+    }
+
+    {
+      name = "public_encrypt___public_encrypt_4.0.2.tgz";
+      path = fetchurl {
+        name = "public_encrypt___public_encrypt_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz";
+        sha1 = "46eb9107206bf73489f8b85b69d91334c6610994";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.3.2.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
+        sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.4.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    }
+
+    {
+      name = "punycode___punycode_2.1.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
+        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
+      };
+    }
+
+    {
+      name = "q___q_1.5.1.tgz";
+      path = fetchurl {
+        name = "q___q_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
+        sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
+      };
+    }
+
+    {
+      name = "qs___qs_6.5.1.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz";
+        sha1 = "349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8";
+      };
+    }
+
+    {
+      name = "qs___qs_6.4.0.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz";
+        sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
+      };
+    }
+
+    {
+      name = "qs___qs_6.5.2.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
+        sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
+      };
+    }
+
+    {
+      name = "query_string___query_string_4.3.4.tgz";
+      path = fetchurl {
+        name = "query_string___query_string_4.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz";
+        sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
+      };
+    }
+
+    {
+      name = "querystring_es3___querystring_es3_0.2.1.tgz";
+      path = fetchurl {
+        name = "querystring_es3___querystring_es3_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
+        sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
+      };
+    }
+
+    {
+      name = "querystring___querystring_0.2.0.tgz";
+      path = fetchurl {
+        name = "querystring___querystring_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
+        sha1 = "b209849203bb25df820da756e747005878521620";
+      };
+    }
+
+    {
+      name = "querystringify___querystringify_2.0.0.tgz";
+      path = fetchurl {
+        name = "querystringify___querystringify_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz";
+        sha1 = "fa3ed6e68eb15159457c89b37bc6472833195755";
+      };
+    }
+
+    {
+      name = "randomatic___randomatic_3.0.0.tgz";
+      path = fetchurl {
+        name = "randomatic___randomatic_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz";
+        sha1 = "d35490030eb4f7578de292ce6dfb04a91a128923";
+      };
+    }
+
+    {
+      name = "randombytes___randombytes_2.0.6.tgz";
+      path = fetchurl {
+        name = "randombytes___randombytes_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz";
+        sha1 = "d302c522948588848a8d300c932b44c24231da80";
+      };
+    }
+
+    {
+      name = "randomfill___randomfill_1.0.4.tgz";
+      path = fetchurl {
+        name = "randomfill___randomfill_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
+        sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
+      };
+    }
+
+    {
+      name = "range_parser___range_parser_1.2.0.tgz";
+      path = fetchurl {
+        name = "range_parser___range_parser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz";
+        sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
+      };
+    }
+
+    {
+      name = "raw_body___raw_body_2.3.2.tgz";
+      path = fetchurl {
+        name = "raw_body___raw_body_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz";
+        sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89";
+      };
+    }
+
+    {
+      name = "rc___rc_1.2.8.tgz";
+      path = fetchurl {
+        name = "rc___rc_1.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
+        sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
+      };
+    }
+
+    {
+      name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
+        sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
+      };
+    }
+
+    {
+      name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz";
+        sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_1.1.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
+        sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz";
+        sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_1.0.34.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.0.34.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
+        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_2.3.6.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_2.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
+        sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
+      };
+    }
+
+    {
+      name = "readdirp___readdirp_2.1.0.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz";
+        sha1 = "4ed0ad060df3073300c48440373f72d1cc642d78";
+      };
+    }
+
+    {
+      name = "redent___redent_1.0.0.tgz";
+      path = fetchurl {
+        name = "redent___redent_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz";
+        sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde";
+      };
+    }
+
+    {
+      name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
+      path = fetchurl {
+        name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz";
+        sha1 = "747c914e049614a4c9cfbba629871ad1d2927716";
+      };
+    }
+
+    {
+      name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
+      path = fetchurl {
+        name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz";
+        sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99";
+      };
+    }
+
+    {
+      name = "regenerate___regenerate_1.4.0.tgz";
+      path = fetchurl {
+        name = "regenerate___regenerate_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz";
+        sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11";
+      };
+    }
+
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
+        sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
+      };
+    }
+
+    {
+      name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
+      path = fetchurl {
+        name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz";
+        sha1 = "1e4996837231da8b7f3cf4114d71b5691a0680dd";
+      };
+    }
+
+    {
+      name = "regex_cache___regex_cache_0.4.4.tgz";
+      path = fetchurl {
+        name = "regex_cache___regex_cache_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
+        sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
+      };
+    }
+
+    {
+      name = "regex_not___regex_not_1.0.2.tgz";
+      path = fetchurl {
+        name = "regex_not___regex_not_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
+        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
+      };
+    }
+
+    {
+      name = "regex_parser___regex_parser_2.2.9.tgz";
+      path = fetchurl {
+        name = "regex_parser___regex_parser_2.2.9.tgz";
+        url  = "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz";
+        sha1 = "a372f45a248b62976a568037c1b6e60a60599192";
+      };
+    }
+
+    {
+      name = "regexpu_core___regexpu_core_1.0.0.tgz";
+      path = fetchurl {
+        name = "regexpu_core___regexpu_core_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz";
+        sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
+      };
+    }
+
+    {
+      name = "regexpu_core___regexpu_core_2.0.0.tgz";
+      path = fetchurl {
+        name = "regexpu_core___regexpu_core_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz";
+        sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
+      };
+    }
+
+    {
+      name = "regjsgen___regjsgen_0.2.0.tgz";
+      path = fetchurl {
+        name = "regjsgen___regjsgen_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz";
+        sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
+      };
+    }
+
+    {
+      name = "regjsparser___regjsparser_0.1.5.tgz";
+      path = fetchurl {
+        name = "regjsparser___regjsparser_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz";
+        sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
+      };
+    }
+
+    {
+      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+      path = fetchurl {
+        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
+        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
+      };
+    }
+
+    {
+      name = "renderkid___renderkid_2.0.1.tgz";
+      path = fetchurl {
+        name = "renderkid___renderkid_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz";
+        sha1 = "898cabfc8bede4b7b91135a3ffd323e58c0db319";
+      };
+    }
+
+    {
+      name = "repeat_element___repeat_element_1.1.2.tgz";
+      path = fetchurl {
+        name = "repeat_element___repeat_element_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz";
+        sha1 = "ef089a178d1483baae4d93eb98b4f9e4e11d990a";
+      };
+    }
+
+    {
+      name = "repeat_string___repeat_string_1.6.1.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    }
+
+    {
+      name = "repeating___repeating_2.0.1.tgz";
+      path = fetchurl {
+        name = "repeating___repeating_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
+        sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
+      };
+    }
+
+    {
+      name = "request___request_2.87.0.tgz";
+      path = fetchurl {
+        name = "request___request_2.87.0.tgz";
+        url  = "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz";
+        sha1 = "32f00235cd08d482b4d0d68db93a829c0ed5756e";
+      };
+    }
+
+    {
+      name = "request___request_2.81.0.tgz";
+      path = fetchurl {
+        name = "request___request_2.81.0.tgz";
+        url  = "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz";
+        sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
+      };
+    }
+
+    {
+      name = "require_directory___require_directory_2.1.1.tgz";
+      path = fetchurl {
+        name = "require_directory___require_directory_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    }
+
+    {
+      name = "require_main_filename___require_main_filename_1.0.1.tgz";
+      path = fetchurl {
+        name = "require_main_filename___require_main_filename_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
+        sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
+      };
+    }
+
+    {
+      name = "requires_port___requires_port_1.0.0.tgz";
+      path = fetchurl {
+        name = "requires_port___requires_port_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
+        sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
+      };
+    }
+
+    {
+      name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
+        sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_3.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
+        sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
+      };
+    }
+
+    {
+      name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
+      path = fetchurl {
+        name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz";
+        sha1 = "e1b37034d48f22f8cfb9f04c026faaa070fdaf26";
+      };
+    }
+
+    {
+      name = "resolve_url___resolve_url_0.2.1.tgz";
+      path = fetchurl {
+        name = "resolve_url___resolve_url_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
+        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
+      };
+    }
+
+    {
+      name = "ret___ret_0.1.15.tgz";
+      path = fetchurl {
+        name = "ret___ret_0.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
+        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+      };
+    }
+
+    {
+      name = "rework_visit___rework_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "rework_visit___rework_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz";
+        sha1 = "9945b2803f219e2f7aca00adb8bc9f640f842c9a";
+      };
+    }
+
+    {
+      name = "rework___rework_1.0.1.tgz";
+      path = fetchurl {
+        name = "rework___rework_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz";
+        sha1 = "30806a841342b54510aa4110850cd48534144aa7";
+      };
+    }
+
+    {
+      name = "right_align___right_align_0.1.3.tgz";
+      path = fetchurl {
+        name = "right_align___right_align_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz";
+        sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
+      };
+    }
+
+    {
+      name = "rimraf___rimraf_2.6.2.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz";
+        sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36";
+      };
+    }
+
+    {
+      name = "ripemd160___ripemd160_2.0.2.tgz";
+      path = fetchurl {
+        name = "ripemd160___ripemd160_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
+        sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
+      };
+    }
+
+    {
+      name = "safe_buffer___safe_buffer_5.1.1.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz";
+        sha1 = "893312af69b2123def71f57889001671eeb2c853";
+      };
+    }
+
+    {
+      name = "safe_buffer___safe_buffer_5.1.2.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
+      };
+    }
+
+    {
+      name = "safe_regex___safe_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "safe_regex___safe_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
+        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
+      };
+    }
+
+    {
+      name = "safer_buffer___safer_buffer_2.1.2.tgz";
+      path = fetchurl {
+        name = "safer_buffer___safer_buffer_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
+      };
+    }
+
+    {
+      name = "sass_graph___sass_graph_2.2.4.tgz";
+      path = fetchurl {
+        name = "sass_graph___sass_graph_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz";
+        sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49";
+      };
+    }
+
+    {
+      name = "sass_loader___sass_loader_7.0.3.tgz";
+      path = fetchurl {
+        name = "sass_loader___sass_loader_7.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz";
+        sha1 = "6ca10871a1cc7549f8143db5a9958242c4e4ca2a";
+      };
+    }
+
+    {
+      name = "sax___sax_1.2.4.tgz";
+      path = fetchurl {
+        name = "sax___sax_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
+        sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
+      };
+    }
+
+    {
+      name = "schema_utils___schema_utils_0.3.0.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz";
+        sha1 = "f5877222ce3e931edae039f17eb3716e7137f8cf";
+      };
+    }
+
+    {
+      name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
+      path = fetchurl {
+        name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz";
+        sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1";
+      };
+    }
+
+    {
+      name = "select_hose___select_hose_2.0.0.tgz";
+      path = fetchurl {
+        name = "select_hose___select_hose_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz";
+        sha1 = "625d8658f865af43ec962bfc376a37359a4994ca";
+      };
+    }
+
+    {
+      name = "selfsigned___selfsigned_1.10.3.tgz";
+      path = fetchurl {
+        name = "selfsigned___selfsigned_1.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz";
+        sha1 = "d628ecf9e3735f84e8bafba936b3cf85bea43823";
+      };
+    }
+
+    {
+      name = "semver___semver_5.5.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz";
+        sha1 = "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab";
+      };
+    }
+
+    {
+      name = "semver___semver_5.3.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
+        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+      };
+    }
+
+    {
+      name = "send___send_0.16.2.tgz";
+      path = fetchurl {
+        name = "send___send_0.16.2.tgz";
+        url  = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz";
+        sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1";
+      };
+    }
+
+    {
+      name = "serve_index___serve_index_1.9.1.tgz";
+      path = fetchurl {
+        name = "serve_index___serve_index_1.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz";
+        sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239";
+      };
+    }
+
+    {
+      name = "serve_static___serve_static_1.13.2.tgz";
+      path = fetchurl {
+        name = "serve_static___serve_static_1.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz";
+        sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1";
+      };
+    }
+
+    {
+      name = "set_blocking___set_blocking_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_blocking___set_blocking_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    }
+
+    {
+      name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
+      path = fetchurl {
+        name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz";
+        sha1 = "4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61";
+      };
+    }
+
+    {
+      name = "set_value___set_value_0.4.3.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_0.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
+        sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
+      };
+    }
+
+    {
+      name = "set_value___set_value_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
+        sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
+      };
+    }
+
+    {
+      name = "setimmediate___setimmediate_1.0.5.tgz";
+      path = fetchurl {
+        name = "setimmediate___setimmediate_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
+        sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
+      };
+    }
+
+    {
+      name = "setprototypeof___setprototypeof_1.0.3.tgz";
+      path = fetchurl {
+        name = "setprototypeof___setprototypeof_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz";
+        sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04";
+      };
+    }
+
+    {
+      name = "setprototypeof___setprototypeof_1.1.0.tgz";
+      path = fetchurl {
+        name = "setprototypeof___setprototypeof_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
+        sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
+      };
+    }
+
+    {
+      name = "sha.js___sha.js_2.4.11.tgz";
+      path = fetchurl {
+        name = "sha.js___sha.js_2.4.11.tgz";
+        url  = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
+        sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
+      };
+    }
+
+    {
+      name = "shallow_clone___shallow_clone_1.0.0.tgz";
+      path = fetchurl {
+        name = "shallow_clone___shallow_clone_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz";
+        sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571";
+      };
+    }
+
+    {
+      name = "shebang_command___shebang_command_1.2.0.tgz";
+      path = fetchurl {
+        name = "shebang_command___shebang_command_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
+        sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
+      };
+    }
+
+    {
+      name = "shebang_regex___shebang_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_regex___shebang_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
+        sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
+      };
+    }
+
+    {
+      name = "signal_exit___signal_exit_3.0.2.tgz";
+      path = fetchurl {
+        name = "signal_exit___signal_exit_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
+        sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
+      };
+    }
+
+    {
+      name = "slash___slash_1.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
+        sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+      };
+    }
+
+    {
+      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
+        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
+      };
+    }
+
+    {
+      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
+        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
+      };
+    }
+
+    {
+      name = "snapdragon___snapdragon_0.8.2.tgz";
+      path = fetchurl {
+        name = "snapdragon___snapdragon_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
+        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
+      };
+    }
+
+    {
+      name = "sntp___sntp_1.0.9.tgz";
+      path = fetchurl {
+        name = "sntp___sntp_1.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz";
+        sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
+      };
+    }
+
+    {
+      name = "sockjs_client___sockjs_client_1.1.4.tgz";
+      path = fetchurl {
+        name = "sockjs_client___sockjs_client_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz";
+        sha1 = "5babe386b775e4cf14e7520911452654016c8b12";
+      };
+    }
+
+    {
+      name = "sockjs___sockjs_0.3.19.tgz";
+      path = fetchurl {
+        name = "sockjs___sockjs_0.3.19.tgz";
+        url  = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz";
+        sha1 = "d976bbe800af7bd20ae08598d582393508993c0d";
+      };
+    }
+
+    {
+      name = "sort_keys___sort_keys_1.1.2.tgz";
+      path = fetchurl {
+        name = "sort_keys___sort_keys_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz";
+        sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
+      };
+    }
+
+    {
+      name = "source_list_map___source_list_map_0.1.8.tgz";
+      path = fetchurl {
+        name = "source_list_map___source_list_map_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz";
+        sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106";
+      };
+    }
+
+    {
+      name = "source_list_map___source_list_map_2.0.0.tgz";
+      path = fetchurl {
+        name = "source_list_map___source_list_map_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz";
+        sha1 = "aaa47403f7b245a92fbc97ea08f250d6087ed085";
+      };
+    }
+
+    {
+      name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+      path = fetchurl {
+        name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
+        sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
+      };
+    }
+
+    {
+      name = "source_map_support___source_map_support_0.4.18.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.4.18.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz";
+        sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f";
+      };
+    }
+
+    {
+      name = "source_map_url___source_map_url_0.4.0.tgz";
+      path = fetchurl {
+        name = "source_map_url___source_map_url_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
+        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.1.43.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.1.43.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz";
+        sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.4.4.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz";
+        sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.5.7.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.6.1.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
+        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
+      };
+    }
+
+    {
+      name = "spdx_correct___spdx_correct_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_correct___spdx_correct_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz";
+        sha1 = "05a5b4d7153a195bc92c3c425b69f3b2a9524c82";
+      };
+    }
+
+    {
+      name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
+      path = fetchurl {
+        name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
+        sha1 = "2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9";
+      };
+    }
+
+    {
+      name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
+        sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
+      };
+    }
+
+    {
+      name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
+        sha1 = "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87";
+      };
+    }
+
+    {
+      name = "spdy_transport___spdy_transport_2.1.0.tgz";
+      path = fetchurl {
+        name = "spdy_transport___spdy_transport_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz";
+        sha1 = "4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1";
+      };
+    }
+
+    {
+      name = "spdy___spdy_3.4.7.tgz";
+      path = fetchurl {
+        name = "spdy___spdy_3.4.7.tgz";
+        url  = "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz";
+        sha1 = "42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc";
+      };
+    }
+
+    {
+      name = "split_string___split_string_3.1.0.tgz";
+      path = fetchurl {
+        name = "split_string___split_string_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
+        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
+      };
+    }
+
+    {
+      name = "sprintf_js___sprintf_js_1.0.3.tgz";
+      path = fetchurl {
+        name = "sprintf_js___sprintf_js_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    }
+
+    {
+      name = "sshpk___sshpk_1.14.2.tgz";
+      path = fetchurl {
+        name = "sshpk___sshpk_1.14.2.tgz";
+        url  = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz";
+        sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
+      };
+    }
+
+    {
+      name = "stackframe___stackframe_1.0.4.tgz";
+      path = fetchurl {
+        name = "stackframe___stackframe_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz";
+        sha1 = "357b24a992f9427cba6b545d96a14ed2cbca187b";
+      };
+    }
+
+    {
+      name = "static_extend___static_extend_0.1.2.tgz";
+      path = fetchurl {
+        name = "static_extend___static_extend_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
+        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.5.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.4.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz";
+        sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087";
+      };
+    }
+
+    {
+      name = "stdout_stream___stdout_stream_1.4.0.tgz";
+      path = fetchurl {
+        name = "stdout_stream___stdout_stream_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz";
+        sha1 = "a2c7c8587e54d9427ea9edb3ac3f2cd522df378b";
+      };
+    }
+
+    {
+      name = "stream_browserify___stream_browserify_2.0.1.tgz";
+      path = fetchurl {
+        name = "stream_browserify___stream_browserify_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz";
+        sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
+      };
+    }
+
+    {
+      name = "stream_http___stream_http_2.8.3.tgz";
+      path = fetchurl {
+        name = "stream_http___stream_http_2.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
+        sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
+      };
+    }
+
+    {
+      name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
+      path = fetchurl {
+        name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
+        sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
+      };
+    }
+
+    {
+      name = "string_width___string_width_1.0.2.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    }
+
+    {
+      name = "string_width___string_width_2.1.1.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
+        sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.1.1.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_0.10.31.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_0.10.31.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    }
+
+    {
+      name = "stringstream___stringstream_0.0.6.tgz";
+      path = fetchurl {
+        name = "stringstream___stringstream_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz";
+        sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_4.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_2.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
+        sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_3.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz";
+        sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
+      };
+    }
+
+    {
+      name = "strip_eof___strip_eof_1.0.0.tgz";
+      path = fetchurl {
+        name = "strip_eof___strip_eof_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
+        sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
+      };
+    }
+
+    {
+      name = "strip_indent___strip_indent_1.0.1.tgz";
+      path = fetchurl {
+        name = "strip_indent___strip_indent_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz";
+        sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2";
+      };
+    }
+
+    {
+      name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
+      };
+    }
+
+    {
+      name = "style_loader___style_loader_0.13.2.tgz";
+      path = fetchurl {
+        name = "style_loader___style_loader_0.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz";
+        sha1 = "74533384cf698c7104c7951150b49717adc2f3bb";
+      };
+    }
+
+    {
+      name = "summernote___summernote_0.8.10.tgz";
+      path = fetchurl {
+        name = "summernote___summernote_0.8.10.tgz";
+        url  = "https://registry.yarnpkg.com/summernote/-/summernote-0.8.10.tgz";
+        sha1 = "21a5d7f18a3b07500b58b60d5907417a54897520";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_2.0.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_3.2.3.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_3.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
+        sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_4.5.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz";
+        sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_5.4.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_5.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz";
+        sha1 = "1c6b337402c2137605efe19f10fec390f6faab54";
+      };
+    }
+
+    {
+      name = "svgo___svgo_0.7.2.tgz";
+      path = fetchurl {
+        name = "svgo___svgo_0.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz";
+        sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
+      };
+    }
+
+    {
+      name = "tapable___tapable_0.2.8.tgz";
+      path = fetchurl {
+        name = "tapable___tapable_0.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz";
+        sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22";
+      };
+    }
+
+    {
+      name = "tar___tar_2.2.1.tgz";
+      path = fetchurl {
+        name = "tar___tar_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz";
+        sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
+      };
+    }
+
+    {
+      name = "tar___tar_4.4.4.tgz";
+      path = fetchurl {
+        name = "tar___tar_4.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz";
+        sha1 = "ec8409fae9f665a4355cc3b4087d0820232bb8cd";
+      };
+    }
+
+    {
+      name = "thunky___thunky_1.0.2.tgz";
+      path = fetchurl {
+        name = "thunky___thunky_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz";
+        sha1 = "a862e018e3fb1ea2ec3fce5d55605cf57f247371";
+      };
+    }
+
+    {
+      name = "time_stamp___time_stamp_2.0.0.tgz";
+      path = fetchurl {
+        name = "time_stamp___time_stamp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz";
+        sha1 = "95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357";
+      };
+    }
+
+    {
+      name = "timers_browserify___timers_browserify_2.0.10.tgz";
+      path = fetchurl {
+        name = "timers_browserify___timers_browserify_2.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz";
+        sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae";
+      };
+    }
+
+    {
+      name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+      path = fetchurl {
+        name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
+        sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
+      };
+    }
+
+    {
+      name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+      path = fetchurl {
+        name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
+        sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
+      };
+    }
+
+    {
+      name = "to_object_path___to_object_path_0.3.0.tgz";
+      path = fetchurl {
+        name = "to_object_path___to_object_path_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
+        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
+      };
+    }
+
+    {
+      name = "to_regex_range___to_regex_range_2.1.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
+        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
+      };
+    }
+
+    {
+      name = "to_regex___to_regex_3.0.2.tgz";
+      path = fetchurl {
+        name = "to_regex___to_regex_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
+        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
+      };
+    }
+
+    {
+      name = "tough_cookie___tough_cookie_2.3.4.tgz";
+      path = fetchurl {
+        name = "tough_cookie___tough_cookie_2.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz";
+        sha1 = "ec60cee38ac675063ffc97a5c18970578ee83655";
+      };
+    }
+
+    {
+      name = "trim_newlines___trim_newlines_1.0.0.tgz";
+      path = fetchurl {
+        name = "trim_newlines___trim_newlines_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz";
+        sha1 = "5887966bb582a4503a41eb524f7d35011815a613";
+      };
+    }
+
+    {
+      name = "trim_right___trim_right_1.0.1.tgz";
+      path = fetchurl {
+        name = "trim_right___trim_right_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz";
+        sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
+      };
+    }
+
+    {
+      name = "true_case_path___true_case_path_1.0.2.tgz";
+      path = fetchurl {
+        name = "true_case_path___true_case_path_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz";
+        sha1 = "7ec91130924766c7f573be3020c34f8fdfd00d62";
+      };
+    }
+
+    {
+      name = "tty_browserify___tty_browserify_0.0.0.tgz";
+      path = fetchurl {
+        name = "tty_browserify___tty_browserify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
+        sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
+      };
+    }
+
+    {
+      name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+      path = fetchurl {
+        name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    }
+
+    {
+      name = "tweetnacl___tweetnacl_0.14.5.tgz";
+      path = fetchurl {
+        name = "tweetnacl___tweetnacl_0.14.5.tgz";
+        url  = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    }
+
+    {
+      name = "type_is___type_is_1.6.16.tgz";
+      path = fetchurl {
+        name = "type_is___type_is_1.6.16.tgz";
+        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
+        sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
+      };
+    }
+
+    {
+      name = "uglify_js___uglify_js_2.8.29.tgz";
+      path = fetchurl {
+        name = "uglify_js___uglify_js_2.8.29.tgz";
+        url  = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz";
+        sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
+      };
+    }
+
+    {
+      name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
+      path = fetchurl {
+        name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
+        sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
+      };
+    }
+
+    {
+      name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
+      path = fetchurl {
+        name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz";
+        sha1 = "b951f4abb6bd617e66f63eb891498e391763e309";
+      };
+    }
+
+    {
+      name = "union_value___union_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "union_value___union_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
+        sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
+      };
+    }
+
+    {
+      name = "uniq___uniq_1.0.1.tgz";
+      path = fetchurl {
+        name = "uniq___uniq_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
+        sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
+      };
+    }
+
+    {
+      name = "uniqs___uniqs_2.0.0.tgz";
+      path = fetchurl {
+        name = "uniqs___uniqs_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
+        sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
+      };
+    }
+
+    {
+      name = "unpipe___unpipe_1.0.0.tgz";
+      path = fetchurl {
+        name = "unpipe___unpipe_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    }
+
+    {
+      name = "unset_value___unset_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "unset_value___unset_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
+        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
+      };
+    }
+
+    {
+      name = "upath___upath_1.1.0.tgz";
+      path = fetchurl {
+        name = "upath___upath_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz";
+        sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd";
+      };
+    }
+
+    {
+      name = "uri_js___uri_js_4.2.2.tgz";
+      path = fetchurl {
+        name = "uri_js___uri_js_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
+        sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
+      };
+    }
+
+    {
+      name = "urix___urix_0.1.0.tgz";
+      path = fetchurl {
+        name = "urix___urix_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
+        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
+      };
+    }
+
+    {
+      name = "url_parse___url_parse_1.4.1.tgz";
+      path = fetchurl {
+        name = "url_parse___url_parse_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz";
+        sha1 = "4dec9dad3dc8585f862fed461d2e19bbf623df30";
+      };
+    }
+
+    {
+      name = "url___url_0.11.0.tgz";
+      path = fetchurl {
+        name = "url___url_0.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
+        sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
+      };
+    }
+
+    {
+      name = "use___use_3.1.1.tgz";
+      path = fetchurl {
+        name = "use___use_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
+        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
+      };
+    }
+
+    {
+      name = "util_deprecate___util_deprecate_1.0.2.tgz";
+      path = fetchurl {
+        name = "util_deprecate___util_deprecate_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    }
+
+    {
+      name = "util___util_0.10.3.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
+        sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
+      };
+    }
+
+    {
+      name = "util___util_0.10.4.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
+        sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
+      };
+    }
+
+    {
+      name = "utila___utila_0.3.3.tgz";
+      path = fetchurl {
+        name = "utila___utila_0.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz";
+        sha1 = "d7e8e7d7e309107092b05f8d9688824d633a4226";
+      };
+    }
+
+    {
+      name = "utila___utila_0.4.0.tgz";
+      path = fetchurl {
+        name = "utila___utila_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz";
+        sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
+      };
+    }
+
+    {
+      name = "utils_merge___utils_merge_1.0.1.tgz";
+      path = fetchurl {
+        name = "utils_merge___utils_merge_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    }
+
+    {
+      name = "uuid___uuid_3.3.2.tgz";
+      path = fetchurl {
+        name = "uuid___uuid_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
+        sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
+      };
+    }
+
+    {
+      name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
+        sha1 = "81643bcbef1bdfecd4623793dc4648948ba98338";
+      };
+    }
+
+    {
+      name = "vary___vary_1.1.2.tgz";
+      path = fetchurl {
+        name = "vary___vary_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    }
+
+    {
+      name = "vendors___vendors_1.0.2.tgz";
+      path = fetchurl {
+        name = "vendors___vendors_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz";
+        sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801";
+      };
+    }
+
+    {
+      name = "verror___verror_1.10.0.tgz";
+      path = fetchurl {
+        name = "verror___verror_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    }
+
+    {
+      name = "vm_browserify___vm_browserify_0.0.4.tgz";
+      path = fetchurl {
+        name = "vm_browserify___vm_browserify_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz";
+        sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
+      };
+    }
+
+    {
+      name = "watchpack___watchpack_1.6.0.tgz";
+      path = fetchurl {
+        name = "watchpack___watchpack_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz";
+        sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00";
+      };
+    }
+
+    {
+      name = "wbuf___wbuf_1.7.3.tgz";
+      path = fetchurl {
+        name = "wbuf___wbuf_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz";
+        sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df";
+      };
+    }
+
+    {
+      name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
+      path = fetchurl {
+        name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz";
+        sha1 = "1dba38203d73c1e6ab069b6810a5a37402399dec";
+      };
+    }
+
+    {
+      name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
+      path = fetchurl {
+        name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz";
+        sha1 = "f8fc1120ce3b4fc5680ceecb43d777966b21105e";
+      };
+    }
+
+    {
+      name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
+      path = fetchurl {
+        name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz";
+        sha1 = "1f4f4c78bf1895378f376815910812daf79a216f";
+      };
+    }
+
+    {
+      name = "webpack_sources___webpack_sources_1.1.0.tgz";
+      path = fetchurl {
+        name = "webpack_sources___webpack_sources_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz";
+        sha1 = "a101ebae59d6507354d71d8013950a3a8b7a5a54";
+      };
+    }
+
+    {
+      name = "webpack___webpack_3.12.0.tgz";
+      path = fetchurl {
+        name = "webpack___webpack_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz";
+        sha1 = "3f9e34360370602fcf639e97939db486f4ec0d74";
+      };
+    }
+
+    {
+      name = "websocket_driver___websocket_driver_0.7.0.tgz";
+      path = fetchurl {
+        name = "websocket_driver___websocket_driver_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz";
+        sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb";
+      };
+    }
+
+    {
+      name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+      path = fetchurl {
+        name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
+        sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
+      };
+    }
+
+    {
+      name = "whet.extend___whet.extend_0.9.9.tgz";
+      path = fetchurl {
+        name = "whet.extend___whet.extend_0.9.9.tgz";
+        url  = "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz";
+        sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1";
+      };
+    }
+
+    {
+      name = "which_module___which_module_1.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz";
+        sha1 = "bba63ca861948994ff307736089e3b96026c2a4f";
+      };
+    }
+
+    {
+      name = "which_module___which_module_2.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
+        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
+      };
+    }
+
+    {
+      name = "which___which_1.3.1.tgz";
+      path = fetchurl {
+        name = "which___which_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
+        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
+      };
+    }
+
+    {
+      name = "wide_align___wide_align_1.1.3.tgz";
+      path = fetchurl {
+        name = "wide_align___wide_align_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
+        sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
+      };
+    }
+
+    {
+      name = "window_size___window_size_0.1.0.tgz";
+      path = fetchurl {
+        name = "window_size___window_size_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz";
+        sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_0.0.2.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz";
+        sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
+      };
+    }
+
+    {
+      name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
+        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
+      };
+    }
+
+    {
+      name = "wrappy___wrappy_1.0.2.tgz";
+      path = fetchurl {
+        name = "wrappy___wrappy_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    }
+
+    {
+      name = "xtend___xtend_4.0.1.tgz";
+      path = fetchurl {
+        name = "xtend___xtend_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    }
+
+    {
+      name = "y18n___y18n_3.2.1.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
+        sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
+      };
+    }
+
+    {
+      name = "yallist___yallist_2.1.2.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
+        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
+      };
+    }
+
+    {
+      name = "yallist___yallist_3.0.2.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz";
+        sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_4.2.1.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz";
+        sha1 = "29cceac0dc4f03c6c87b4a9f217dd18c9f74871c";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_5.0.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz";
+        sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_7.0.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz";
+        sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9";
+      };
+    }
+
+    {
+      name = "yargs___yargs_6.6.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_6.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz";
+        sha1 = "782ec21ef403345f830a808ca3d513af56065208";
+      };
+    }
+
+    {
+      name = "yargs___yargs_7.1.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz";
+        sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8";
+      };
+    }
+
+    {
+      name = "yargs___yargs_8.0.2.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_8.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz";
+        sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360";
+      };
+    }
+
+    {
+      name = "yargs___yargs_3.10.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_3.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz";
+        sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
+      };
+    }
+  ];
+}
diff --git a/pkgs/private/webapps/chloe/chloe.json b/pkgs/private/webapps/chloe/chloe.json
new file mode 100644 (file)
index 0000000..686d751
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "96fc4eb-master",
+  "meta": {
+    "name": "chloe",
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Chloe",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Chloe",
+    "rev": "96fc4eb0099a29b0f9a58fb4eaec4bf14ac65f0a",
+    "sha256": "0mf15j6z86j2smm2k360cmm5djhcjbs9949pznwi57kw97vkm1s3",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/webapps/chloe/default.nix b/pkgs/private/webapps/chloe/default.nix
new file mode 100644 (file)
index 0000000..f148d4b
--- /dev/null
@@ -0,0 +1,19 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/chloe_${environment}"
+, spip, stdenv, mylibs, sassc }:
+let
+  siteDir = stdenv.mkDerivation (mylibs.fetchedGitPrivate ./chloe.json // rec {
+    buildPhase = ''
+      make
+      '';
+    installPhase = ''
+      cp -a . $out
+      '';
+    buildInputs = [ sassc ];
+  });
+in
+spip.override {
+  ldap = true;
+  siteName = "chloe";
+  inherit environment siteDir;
+}
diff --git a/pkgs/private/webapps/connexionswing/connexionswing.json b/pkgs/private/webapps/connexionswing/connexionswing.json
new file mode 100644 (file)
index 0000000..44d9f0e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "dfcdce0-master",
+  "meta": {
+    "name": "connexionswing",
+    "url": "gitolite@git.immae.eu:perso/Immae/Projets/Connexionswing",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:perso/Immae/Projets/Connexionswing",
+    "rev": "dfcdce04d11a75f5e850e6dc3a049de4517fc107",
+    "sha256": "0ddirwxs2ify3bni6nv787nb31ckyn2hsrcq8g01b5cfv5havkwq",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/webapps/connexionswing/default.nix b/pkgs/private/webapps/connexionswing/default.nix
new file mode 100644 (file)
index 0000000..04e296b
--- /dev/null
@@ -0,0 +1,27 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/connexionswing_${environment}"
+, composerEnv, fetchurl, fetchgit, mylibs }:
+let
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+    mylibs.fetchedGitPrivate ./connexionswing.json //
+    rec {
+      noDev = (environment == "prod");
+      preInstall = ''
+          export SYMFONY_ENV="${environment}"
+      '';
+      postInstall = ''
+          cd $out
+          ${if environment == "prod" then "php ./bin/console assetic:dump --env=prod --no-debug" else ""}
+          rm app/config/parameters.yml
+          ln -sf /var/secrets/webapps/${environment}-connexionswing app/config/parameters.yml
+          rm -rf var/{logs,cache}
+          ln -sf ${varDir}/var/{logs,cache} var/
+          ln -sf ${varDir}/{medias,uploads} web/images/
+      '';
+      passthru = {
+        inherit varDir environment;
+        webRoot = "${app}/web";
+      };
+    });
+in app
diff --git a/pkgs/private/webapps/connexionswing/php-packages.nix b/pkgs/private/webapps/connexionswing/php-packages.nix
new file mode 100644 (file)
index 0000000..581b437
--- /dev/null
@@ -0,0 +1,597 @@
+# Generated with composer2nix and adapted to return only the list of
+# packages
+{ composerEnv, fetchurl, fetchgit ? null }:
+{
+  packages = {
+    "behat/transliterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
+        src = fetchurl {
+          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
+          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
+        };
+      };
+    };
+    "components/bootstrap" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-bootstrap-670295b9d6170a79acc8586a15e729bf24128275";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/bootstrap/zipball/670295b9d6170a79acc8586a15e729bf24128275;
+          sha256 = "0lcq9cjnywvf1nd8k99flgcf2dmfgyyxzsvcpip8xiibmh5x04p9";
+        };
+      };
+    };
+    "components/jquery" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jquery-5dd7297d7603e11e53bdcca2a71074d92de37b8f";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jquery/zipball/5dd7297d7603e11e53bdcca2a71074d92de37b8f;
+          sha256 = "1maplw3yic1pzbwwl2amjlivipsi1w0r8bq7i0mmjaqf7wij506i";
+        };
+      };
+    };
+    "components/jqueryui" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jqueryui-44ecf3794cc56b65954cc19737234a3119d036cc";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc;
+          sha256 = "1y0ppxk44jkxbh38i05sg0zcgk927s5wy6sjngwr5qifibqbcbhk";
+        };
+      };
+    };
+    "composer/ca-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-ca-bundle-d2c0a83b7533d6912e8d516756ebd34f893e9169";
+        src = fetchurl {
+          url = https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169;
+          sha256 = "1as399dzrfbjnifb87j1g5cvrbacyddbay8fv59i56xx1bdq7lwc";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-54cacc9b81758b14e3ce750f205a393d52339e97";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97;
+          sha256 = "1wi5skihqbcinlkrkr15nmmvqkn2gydqib8xl232abdvfq1q0w24";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
+          sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-1a4fb7e902202c33cce8c55989b945612943c2ba";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba;
+          sha256 = "0fkiwkx7zbmfnh4p21za807lh1n7g1f4lpgy8y59g4r5krvpl90w";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9;
+          sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
+          sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-703fad32e4c8cbe609caf45a71a1d4266c830f0f";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f;
+          sha256 = "0v2f63j22i3im8jbmv7spi8j42fay6dnxjvbxnbwj190ajxl6sdp";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-4c8e363f96427924e7e519c5b5119b4f54512697";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697;
+          sha256 = "1irm04iijzq6gziknwyb10a9s0xbzh04xs5i2d6aac86cc29187c";
+        };
+      };
+    };
+    "doctrine/doctrine-migrations-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-migrations-bundle-a9e506369f931351a2a6dd2aef588a822802b1b7";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a9e506369f931351a2a6dd2aef588a822802b1b7;
+          sha256 = "1jgrqsgdwcm2g8rml76qr6b19s1vxfbnrp43qr6n1g9kbx7y9wg9";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
+          sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
+          sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
+          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-c81147c0f2938a6566594455367e095150547f72";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/migrations/zipball/c81147c0f2938a6566594455367e095150547f72;
+          sha256 = "0x8hvxbm3f40sx25nq8zlh1kr936pagghzp89l0gdy5bar7cdzi5";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
+          sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
+        };
+      };
+    };
+    "fig/link-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
+          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
+        };
+      };
+    };
+    "friendsofsymfony/jsrouting-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "friendsofsymfony-jsrouting-bundle-49c1069132dcef371fb526351569deabeb6f0d8e";
+        src = fetchurl {
+          url = https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/49c1069132dcef371fb526351569deabeb6f0d8e;
+          sha256 = "0ymmxhxbjnzj8bk3zq55vq0xvsaq82348v321gy2jyi90d19p5j7";
+        };
+      };
+    };
+    "gedmo/doctrine-extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gedmo-doctrine-extensions-1e400fbd05b7e5f912f55fe95805450f7d3bed60";
+        src = fetchurl {
+          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/1e400fbd05b7e5f912f55fe95805450f7d3bed60;
+          sha256 = "0mpdpmar1hxamz2x2iqjickf1msjh67kkfpsblnklxk5izjwzhxx";
+        };
+      };
+    };
+    "immae/connexionswing-ckeditor-component" = {
+      targetDir = "";
+      src = fetchgit {
+        name = "immae-connexionswing-ckeditor-component-3b35bd273a79f6b01fda7a246aed64aca147ea7a";
+        url = "https://git.immae.eu/perso/Immae/Projets/packagist/connexionswing-ckeditor-component.git";
+        rev = "3b35bd273a79f6b01fda7a246aed64aca147ea7a";
+        sha256 = "1w0y6k28ci73n0db9gwvqg7grzvh1z718ys9v1ik8cla7zw83bni";
+      };
+    };
+    "immae/jquery-touchswipe" = {
+      targetDir = "";
+      src = fetchgit {
+        name = "immae-jquery-touchswipe-3e15949df974d6612d76dc9ee75cd976dbcc2114";
+        url = "https://git.immae.eu/perso/Immae/Projets/packagist/jquery-touchswipe.git";
+        rev = "3e15949df974d6612d76dc9ee75cd976dbcc2114";
+        sha256 = "1pnvki1j3a65cdwwqs0id790ni813lh3r0m7556gdn0hsqa1cc4d";
+      };
+    };
+    "incenteev/composer-parameter-handler" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
+        src = fetchurl {
+          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
+          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
+        };
+      };
+    };
+    "jdorn/sql-formatter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
+        src = fetchurl {
+          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
+          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
+        };
+      };
+    };
+    "kriswallsmith/assetic" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
+        src = fetchurl {
+          url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
+          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
+        };
+      };
+    };
+    "monolog/monolog" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
+        src = fetchurl {
+          url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
+          sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
+        };
+      };
+    };
+    "ocramius/proxy-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-proxy-manager-57e9272ec0e8deccf09421596e0e2252df440e11";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11;
+          sha256 = "10crhcnhz42b01i6lv6ysgc7awp7yw82p4i2a4sg6bjihw677yps";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-258c89a6b97de7dfaf5b8c7607d0478e236b04fb";
+        src = fetchurl {
+          url = https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb;
+          sha256 = "11arrici2mgfj7r847wm423pqrvfj9wn9jcgyxnq4rzyahaxz5l1";
+        };
+      };
+    };
+    "psr/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
+          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
+          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
+        };
+      };
+    };
+    "psr/link" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
+          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
+        };
+      };
+    };
+    "psr/log" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
+          sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
+        };
+      };
+    };
+    "psr/simple-cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
+          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
+        };
+      };
+    };
+    "ricbra/robots-txt-bundle" = {
+      targetDir = "Ricbra/Bundle/RobotsTxtBundle";
+      src = composerEnv.buildZipPackage {
+        name = "ricbra-robots-txt-bundle-80d122a708893a762041464890e59a76babd6c22";
+        src = fetchurl {
+          url = https://api.github.com/repos/ricbra/robots-txt-bundle/zipball/80d122a708893a762041464890e59a76babd6c22;
+          sha256 = "0w3lfzy1ys0bwl3shy4ychldfd711w1p2y13i1az2z2gh731d0ad";
+        };
+      };
+    };
+    "robloach/component-installer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
+        src = fetchurl {
+          url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
+          sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
+        };
+      };
+    };
+    "sensio/distribution-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
+          sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
+          sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
+        };
+      };
+    };
+    "sensiolabs/security-checker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
+          sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
+        };
+      };
+    };
+    "swiftmailer/swiftmailer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
+        src = fetchurl {
+          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
+          sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
+        };
+      };
+    };
+    "symfony/assetic-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
+          sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
+        };
+      };
+    };
+    "symfony/monolog-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
+          sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
+        };
+      };
+    };
+    "symfony/polyfill-apcu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-apcu-9b83bd010112ec196410849e840d9b9fefcb15ad";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/9b83bd010112ec196410849e840d9b9fefcb15ad;
+          sha256 = "0iiiqbn0bs0zqc95nz8l1qa5ysy0iifx4f27r9wnhzsh6f1h02mv";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-80ee17ae83c10cd513e5144f91a73607a21edb4e";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/80ee17ae83c10cd513e5144f91a73607a21edb4e;
+          sha256 = "1hck9bn8zfb1pmx2yccf4w5dd9rbmvwii7hncin6px6nasi6wzvv";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-3296adf6a6454a050679cde90f95350ad604b171";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171;
+          sha256 = "02wyx9fjx9lyc5q5d3bnn8aw9xag8im2wqanmbkljwd5vmx9k9b2";
+        };
+      };
+    };
+    "symfony/polyfill-php56" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php56-af98553c84912459db3f636329567809d639a8f6";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6;
+          sha256 = "1l1ydsd7cq3s97cpgl4fw1qxc2wmv27yfxa3q8ng9p66ypzvkw42";
+        };
+      };
+    };
+    "symfony/polyfill-php70" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php70-77454693d8f10dd23bb24955cffd2d82db1007a6";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6;
+          sha256 = "146d620ca725iqdh7j0dqb99h20d4vs641c9vjy9x4jws3rgj905";
+        };
+      };
+    };
+    "symfony/polyfill-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-util-1a5ad95d9436cbff3296034fe9f8d586dce3fb3a";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a;
+          sha256 = "0l7w4dlr7y3qijpaiq7hfhbhv1qqz9jjknr1n6k4vrss2a8d1sxk";
+        };
+      };
+    };
+    "symfony/swiftmailer-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
+          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
+        };
+      };
+    };
+    "symfony/symfony" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-symfony-4babd75194d45f7a4412560038924f3008c67ef2";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/symfony/zipball/4babd75194d45f7a4412560038924f3008c67ef2;
+          sha256 = "1347qp994yg6k91v5gwdwnn202bz92m0pj4090b59z5nqxh7463d";
+        };
+      };
+    };
+    "twig/extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-extensions-d188c76168b853481cc75879ea045bf93d718e9c";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c;
+          sha256 = "0d6wywys5fqzi3m8g8h3sb5phl5y3a7vfc95n214mqp0iwrcmzwm";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-b48680b6eb7d16b5025b9bfc4108d86f6b8af86f";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f;
+          sha256 = "1q82f246wq7whl11lx00n0skwmllppvpzg20x6q4frmw44dc6v9a";
+        };
+      };
+    };
+    "willdurand/jsonp-callback-validator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "willdurand-jsonp-callback-validator-1a7d388bb521959e612ef50c5c7b1691b097e909";
+        src = fetchurl {
+          url = https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909;
+          sha256 = "19ds8f3nbss4b2xvqkcjkcvz0l4c5nhrm8w8yxc8a508r0jmd9in";
+        };
+      };
+    };
+    "zendframework/zend-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-code-95033f061b083e16cdee60530ec260d7d628b887";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887;
+          sha256 = "0h77qf267l2sp9wg3n61dpgpf6wh6p5jssy8mrg7vlns2j03f9f5";
+        };
+      };
+    };
+    "zendframework/zend-eventmanager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
+          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
+        };
+      };
+    };
+  };
+  devPackages = {
+    "doctrine/data-fixtures" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-data-fixtures-17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e;
+          sha256 = "15k7vl58kwh02g0a93rab82ifbgmc91srgminzlkjq5kx8agh7ab";
+        };
+      };
+    };
+    "doctrine/doctrine-fixtures-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
+          sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
+        };
+      };
+    };
+    "sensio/generator-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
+          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
+        };
+      };
+    };
+    "symfony/phpunit-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-phpunit-bridge-7470518370113785f67a7fd8e6e1667661e88805";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/7470518370113785f67a7fd8e6e1667661e88805;
+          sha256 = "0jd28ag0wks9sv62rkwsbx68csvdl5gabbz2h01hkqpa23gdkhs9";
+        };
+      };
+    };
+  };
+}
diff --git a/pkgs/private/webapps/default.nix b/pkgs/private/webapps/default.nix
new file mode 100644 (file)
index 0000000..e9aa13c
--- /dev/null
@@ -0,0 +1,11 @@
+{ callPackage, mylibs, composerEnv, lib, spip }:
+rec {
+  apache-default = callPackage ./apache-default {};
+
+  aten = callPackage ./aten { inherit composerEnv mylibs; };
+  chloe = callPackage ./chloe { inherit mylibs spip; };
+  connexionswing = callPackage ./connexionswing { inherit composerEnv mylibs;};
+  ludivinecassal = callPackage ./ludivinecassal { inherit composerEnv mylibs; };
+  piedsjaloux = callPackage ./piedsjaloux { inherit composerEnv mylibs; };
+  tellesflorian = callPackage ./tellesflorian { inherit composerEnv mylibs; };
+}
diff --git a/pkgs/private/webapps/ludivinecassal/default.nix b/pkgs/private/webapps/ludivinecassal/default.nix
new file mode 100644 (file)
index 0000000..3401435
--- /dev/null
@@ -0,0 +1,35 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/ludivinecassal_${environment}"
+, composerEnv, fetchurl, fetchgit, imagemagick, sass, ruby, mylibs }:
+let
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+    mylibs.fetchedGitPrivate ./ludivinecassal.json //
+    rec {
+      noDev = (environment == "prod");
+      preInstall = ''
+        export SYMFONY_ENV="${environment}"
+        cp app/config/parameters.yml.dist app/config/parameters.yml
+        cat >> app/config/parameters.yml <<EOF
+        leapt_im:
+            binary_path: ${imagemagick}/bin
+        assetic:
+            sass: ${sass}/bin/sass
+            ruby: ${ruby}/bin/ruby
+        EOF
+        sed -i -e "/Incenteev..ParameterHandler..ScriptHandler::buildParameters/d" composer.json
+        '';
+      # /!\ miniatures and data need to be in the same physical dir due to a
+      #     bug in leapt.im (searches for data/../miniatures)
+      postInstall = ''
+        rm -rf var/{logs,cache,data,miniatures,tmp}
+        ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
+        ln -sf /var/secrets/webapps/${environment}-ludivinecassal app/config/parameters.yml
+        '';
+      buildInputs = [ sass ];
+      passthru = {
+        inherit varDir environment;
+        webRoot = "${app}/web";
+      };
+    });
+in app
diff --git a/pkgs/private/webapps/ludivinecassal/ludivinecassal.json b/pkgs/private/webapps/ludivinecassal/ludivinecassal.json
new file mode 100644 (file)
index 0000000..f39b143
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "0dacc32-master",
+  "meta": {
+    "name": "ludivinecassal",
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Ludivine",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:perso/Immae/Sites/Ludivine",
+    "rev": "0dacc320ea052b69f79861c84bceaa89be53de60",
+    "sha256": "10khg1fq9ixly3xak591n3v0rv3f2hn91rd46d75yv3wjxaj1c2d",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/webapps/ludivinecassal/php-packages.nix b/pkgs/private/webapps/ludivinecassal/php-packages.nix
new file mode 100644 (file)
index 0000000..be0c559
--- /dev/null
@@ -0,0 +1,868 @@
+# Generated with composer2nix and adapted to return only the list of
+# packages
+{ composerEnv, fetchurl, fetchgit ? null }:
+{
+  packages = {
+    "behat/transliterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
+        src = fetchurl {
+          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
+          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
+        };
+      };
+    };
+    "components/bootstrap" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
+          sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
+        };
+      };
+    };
+    "components/jquery" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
+          sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
+        };
+      };
+    };
+    "components/jqueryui" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
+          sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
+        };
+      };
+    };
+    "composer/ca-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
+        src = fetchurl {
+          url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
+          sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
+          sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
+          sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
+          sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
+          sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
+          sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
+          sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
+          sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
+        };
+      };
+    };
+    "doctrine/doctrine-migrations-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
+          sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
+        };
+      };
+    };
+    "doctrine/event-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
+          sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
+          sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
+          sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
+          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
+          sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
+          sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
+        };
+      };
+    };
+    "doctrine/persistence" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
+          sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
+        };
+      };
+    };
+    "doctrine/reflection" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
+          sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
+        };
+      };
+    };
+    "fig/link-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
+          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
+        };
+      };
+    };
+    "gedmo/doctrine-extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
+        src = fetchurl {
+          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
+          sha256 = "0jfg0a19lhdv5b3c032ghknxhvc1f0x2n7fcwp47bm1rbz222q0z";
+        };
+      };
+    };
+    "immae/ludivine-ckeditor-component" = {
+      targetDir = "";
+      src = fetchgit {
+        name = "immae-ludivine-ckeditor-component-1794320dcfdfcd19572fb1676294f9853a6bbc20";
+        url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-ckeditor-component.git";
+        rev = "1794320dcfdfcd19572fb1676294f9853a6bbc20";
+        sha256 = "080f3znvp0aj5jdpc3ywis0kfzvkwz5mw2jcj12gwq3r5g5i8zdq";
+      };
+    };
+    "immae/ludivine-slick-component" = {
+      targetDir = "";
+      src = fetchgit {
+        name = "immae-ludivine-slick-component-604734c4a960aac3d99f1008337181ed2b0f04db";
+        url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-slick-component.git";
+        rev = "604734c4a960aac3d99f1008337181ed2b0f04db";
+        sha256 = "041wqv9pa9nvqcgqykx6cnbj539qnr9h1iym7l54igw12yj57w06";
+      };
+    };
+    "incenteev/composer-parameter-handler" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
+        src = fetchurl {
+          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
+          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
+        };
+      };
+    };
+    "jdorn/sql-formatter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
+        src = fetchurl {
+          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
+          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
+        };
+      };
+    };
+    "kriswallsmith/assetic" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
+        src = fetchurl {
+          url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
+          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
+        };
+      };
+    };
+    "leapt/im-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1";
+        src = fetchurl {
+          url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1;
+          sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a";
+        };
+      };
+    };
+    "luxifer/doctrine-functions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c";
+        src = fetchurl {
+          url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c;
+          sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9";
+        };
+      };
+    };
+    "monolog/monolog" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";
+        src = fetchurl {
+          url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266;
+          sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png";
+        };
+      };
+    };
+    "ocramius/package-versions" = {
+      targetDir = "";
+      needsModifyRights = true;
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
+          sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
+        };
+      };
+    };
+    "ocramius/proxy-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
+          sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";
+        src = fetchurl {
+          url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95;
+          sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09";
+        };
+      };
+    };
+    "psr/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
+          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
+          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
+        };
+      };
+    };
+    "psr/link" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
+          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
+        };
+      };
+    };
+    "psr/log" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
+          sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
+        };
+      };
+    };
+    "psr/simple-cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
+          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
+        };
+      };
+    };
+    "robloach/component-installer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
+        src = fetchurl {
+          url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
+          sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
+        };
+      };
+    };
+    "sensio/distribution-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b;
+          sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
+          sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
+        };
+      };
+    };
+    "sensiolabs/security-checker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1;
+          sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi";
+        };
+      };
+    };
+    "swiftmailer/swiftmailer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950";
+        src = fetchurl {
+          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950;
+          sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d";
+        };
+      };
+    };
+    "symfony/assetic-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
+          sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
+        };
+      };
+    };
+    "symfony/monolog-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff;
+          sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7";
+        };
+      };
+    };
+    "symfony/polyfill-apcu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2;
+          sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r";
+        };
+      };
+    };
+    "symfony/polyfill-ctype" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19;
+          sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
+          sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
+          sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
+        };
+      };
+    };
+    "symfony/polyfill-php56" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af;
+          sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk";
+        };
+      };
+    };
+    "symfony/polyfill-php70" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224;
+          sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik";
+        };
+      };
+    };
+    "symfony/polyfill-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c;
+          sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i";
+        };
+      };
+    };
+    "symfony/swiftmailer-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
+          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
+        };
+      };
+    };
+    "symfony/symfony" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412;
+          sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q";
+        };
+      };
+    };
+    "twig/extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202;
+          sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
+          sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
+        };
+      };
+    };
+    "zendframework/zend-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
+          sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
+        };
+      };
+    };
+    "zendframework/zend-eventmanager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
+          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
+        };
+      };
+    };
+  };
+  devPackages = {
+    "doctrine/data-fixtures" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a;
+          sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm";
+        };
+      };
+    };
+    "doctrine/doctrine-fixtures-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
+          sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
+        };
+      };
+    };
+    "fzaninotto/faker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d";
+        src = fetchurl {
+          url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d;
+          sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi";
+        };
+      };
+    };
+    "league/factory-muffin" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a";
+        src = fetchurl {
+          url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a;
+          sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq";
+        };
+      };
+    };
+    "league/factory-muffin-faker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426";
+        src = fetchurl {
+          url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426;
+          sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1";
+        };
+      };
+    };
+    "mikey179/vfsStream" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145";
+        src = fetchurl {
+          url = https://api.github.com/repos/mikey179/vfsStream/zipball/d5fec95f541d4d71c4823bb5e30cf9b9e5b96145;
+          sha256 = "034rdds85qr3n7kqz161dqinl909gwnxgjsvychw8m7dyk2dbl99";
+        };
+      };
+    };
+    "phpdocumentor/reflection-common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6;
+          sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2";
+        };
+      };
+    };
+    "phpdocumentor/reflection-docblock" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08;
+          sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x";
+        };
+      };
+    };
+    "phpdocumentor/type-resolver" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7;
+          sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb";
+        };
+      };
+    };
+    "phpspec/prophecy" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06;
+          sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6";
+        };
+      };
+    };
+    "phpunit/php-code-coverage" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979;
+          sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d";
+        };
+      };
+    };
+    "phpunit/php-file-iterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4;
+          sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060";
+        };
+      };
+    };
+    "phpunit/php-text-template" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686;
+          sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76";
+        };
+      };
+    };
+    "phpunit/php-timer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f;
+          sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr";
+        };
+      };
+    };
+    "phpunit/php-token-stream" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16;
+          sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk";
+        };
+      };
+    };
+    "phpunit/phpunit" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517;
+          sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6";
+        };
+      };
+    };
+    "phpunit/phpunit-mock-objects" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983;
+          sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i";
+        };
+      };
+    };
+    "sebastian/comparator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be;
+          sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq";
+        };
+      };
+    };
+    "sebastian/diff" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4;
+          sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6";
+        };
+      };
+    };
+    "sebastian/environment" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea;
+          sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0";
+        };
+      };
+    };
+    "sebastian/exporter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4;
+          sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn";
+        };
+      };
+    };
+    "sebastian/global-state" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4;
+          sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb";
+        };
+      };
+    };
+    "sebastian/recursion-context" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7;
+          sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm";
+        };
+      };
+    };
+    "sebastian/version" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6;
+          sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz";
+        };
+      };
+    };
+    "sensio/generator-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
+          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
+        };
+      };
+    };
+    "symfony/phpunit-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5;
+          sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj";
+        };
+      };
+    };
+    "webmozart/assert" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9";
+        src = fetchurl {
+          url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9;
+          sha256 = "0d84b0ms9mjpqx368gs7c3qs06mpbx5565j3vs43b1ygnyhhhaqk";
+        };
+      };
+    };
+  };
+}
diff --git a/pkgs/private/webapps/piedsjaloux/default.nix b/pkgs/private/webapps/piedsjaloux/default.nix
new file mode 100644 (file)
index 0000000..f5370db
--- /dev/null
@@ -0,0 +1,27 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/piedsjaloux_${environment}"
+, composerEnv, fetchurl, fetchgit, mylibs }:
+let
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+    mylibs.fetchedGitPrivate ./piedsjaloux.json //
+    rec {
+      noDev = (environment == "prod");
+      preInstall = ''
+        export SYMFONY_ENV="${environment}"
+        '';
+      # /!\ miniatures and data need to be in the same physical dir due to a
+      #     bug in leapt.im (searches for data/../miniatures)
+      postInstall = ''
+        cd $out
+        rm app/config/parameters.yml
+        ln -sf /var/secrets/webapps/${environment}-piedsjaloux app/config/parameters.yml
+        rm -rf var/{logs,cache,data,miniatures,tmp}
+        ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
+        '';
+        passthru = {
+          inherit varDir environment;
+          webRoot = "${app}/web";
+      };
+    });
+in app
diff --git a/pkgs/private/webapps/piedsjaloux/php-packages.nix b/pkgs/private/webapps/piedsjaloux/php-packages.nix
new file mode 100644 (file)
index 0000000..49c5bd2
--- /dev/null
@@ -0,0 +1,1009 @@
+# Generated with composer2nix and adapted to return only the list of
+# packages
+{ composerEnv, fetchurl, fetchgit ? null }:
+{
+  packages = {
+    "behat/transliterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
+        src = fetchurl {
+          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
+          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
+        };
+      };
+    };
+    "components/bootstrap" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
+          sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
+        };
+      };
+    };
+    "components/jquery" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
+          sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
+        };
+      };
+    };
+    "components/jqueryui" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
+        src = fetchurl {
+          url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
+          sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
+        };
+      };
+    };
+    "composer/ca-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
+        src = fetchurl {
+          url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
+          sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
+        };
+      };
+    };
+    "container-interop/container-interop" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "container-interop-container-interop-79cbf1341c22ec75643d841642dd5d6acd83bdb8";
+        src = fetchurl {
+          url = https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8;
+          sha256 = "1pxm461g5flcq50yabr01nw8w17n3g7klpman9ps3im4z0604m52";
+        };
+      };
+    };
+    "dmishh/settings-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "dmishh-settings-bundle-0ee48b015691694a8dcbd3ee654d33386e7bf478";
+        src = fetchurl {
+          url = https://api.github.com/repos/dmishh/SettingsBundle/zipball/0ee48b015691694a8dcbd3ee654d33386e7bf478;
+          sha256 = "0m2fw5shvnkqlz0nm27ggpmkipfh377y1hjsw343zv1nn72nxfqf";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
+          sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
+          sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
+          sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
+          sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
+          sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
+          sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
+          sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
+        };
+      };
+    };
+    "doctrine/doctrine-migrations-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
+          sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
+        };
+      };
+    };
+    "doctrine/event-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
+          sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
+          sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
+          sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
+          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
+          sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
+          sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
+        };
+      };
+    };
+    "doctrine/persistence" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
+          sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
+        };
+      };
+    };
+    "doctrine/reflection" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
+          sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
+        };
+      };
+    };
+    "eko/feedbundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "eko-feedbundle-d4e626616d9ccf6527212d3bdda15f9af3838e4f";
+        src = fetchurl {
+          url = https://api.github.com/repos/eko/FeedBundle/zipball/d4e626616d9ccf6527212d3bdda15f9af3838e4f;
+          sha256 = "145f4mq2bpsdayaiqmgz1asmjx2is4v327h2ny2wp03knnkjvnfq";
+        };
+      };
+    };
+    "fig/link-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
+          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
+        };
+      };
+    };
+    "gedmo/doctrine-extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
+        src = fetchurl {
+          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
+          sha256 = "0jfg0a19lhdv5b3c032ghknxhvc1f0x2n7fcwp47bm1rbz222q0z";
+        };
+      };
+    };
+    "gregwar/captcha" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gregwar-captcha-cf953dd79748406e0292cea8c565399681e4d345";
+        src = fetchurl {
+          url = https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345;
+          sha256 = "153m7bkhs3drxk0jfbq67a8vr1m13g7isc4ck44k5hyfzpcazb5i";
+        };
+      };
+    };
+    "gregwar/captcha-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "gregwar-captcha-bundle-c2d5468556890dd25e0b53bd345fc205562c86f7";
+        src = fetchurl {
+          url = https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/c2d5468556890dd25e0b53bd345fc205562c86f7;
+          sha256 = "04wcvqq457h6v7mzmrar946swd9akk27fmfig4qj8hpxzj250cgk";
+        };
+      };
+    };
+    "helios-ag/fm-bbcode-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "helios-ag-fm-bbcode-bundle-d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363";
+        src = fetchurl {
+          url = https://api.github.com/repos/helios-ag/FMBbCodeBundle/zipball/d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363;
+          sha256 = "13g9ddd2p3nf1vrbkf6l00qdqz89rq6d8l20p68dmiy7mb6kpynl";
+        };
+      };
+    };
+    "immae/piedsjaloux-ckeditor-component" = {
+      targetDir = "";
+      src = fetchgit {
+        name = "immae-piedsjaloux-ckeditor-component-9946db9daaa76448d0e43247472cdedd2a5ea22a";
+        url = "https://git.immae.eu/perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git";
+        rev = "9946db9daaa76448d0e43247472cdedd2a5ea22a";
+        sha256 = "183rgl23li3bqsynfmvv2s7jvlmqf6a5pskgrcxlaxcrr0d09n8c";
+      };
+    };
+    "incenteev/composer-parameter-handler" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
+        src = fetchurl {
+          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
+          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
+        };
+      };
+    };
+    "jdorn/sql-formatter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
+        src = fetchurl {
+          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
+          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
+        };
+      };
+    };
+    "kriswallsmith/assetic" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
+        src = fetchurl {
+          url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
+          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
+        };
+      };
+    };
+    "leapt/im-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1";
+        src = fetchurl {
+          url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1;
+          sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a";
+        };
+      };
+    };
+    "luxifer/doctrine-functions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c";
+        src = fetchurl {
+          url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c;
+          sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9";
+        };
+      };
+    };
+    "mjohnson/decoda" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "mjohnson-decoda-8cd0928b78a4bf5ade48b80c934370fc1f5f84a1";
+        src = fetchurl {
+          url = https://api.github.com/repos/milesj/decoda/zipball/8cd0928b78a4bf5ade48b80c934370fc1f5f84a1;
+          sha256 = "0wcxz9yirz4zir06xvnlchqgppmyasymak06gn46jn6v6c9dsykc";
+        };
+      };
+    };
+    "monolog/monolog" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";
+        src = fetchurl {
+          url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266;
+          sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png";
+        };
+      };
+    };
+    "ocramius/package-versions" = {
+      targetDir = "";
+      needsModifyRights = true;
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
+          sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
+        };
+      };
+    };
+    "ocramius/proxy-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
+        src = fetchurl {
+          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
+          sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";
+        src = fetchurl {
+          url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95;
+          sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09";
+        };
+      };
+    };
+    "psr/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
+          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
+          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
+        };
+      };
+    };
+    "psr/link" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
+          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
+        };
+      };
+    };
+    "psr/log" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
+          sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
+        };
+      };
+    };
+    "psr/simple-cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
+          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
+        };
+      };
+    };
+    "robloach/component-installer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
+        src = fetchurl {
+          url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
+          sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
+        };
+      };
+    };
+    "sensio/distribution-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b;
+          sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
+          sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
+        };
+      };
+    };
+    "sensiolabs/security-checker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1;
+          sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi";
+        };
+      };
+    };
+    "swiftmailer/swiftmailer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950";
+        src = fetchurl {
+          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950;
+          sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d";
+        };
+      };
+    };
+    "symfony/assetic-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
+          sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
+        };
+      };
+    };
+    "symfony/monolog-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff;
+          sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7";
+        };
+      };
+    };
+    "symfony/polyfill-apcu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2;
+          sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r";
+        };
+      };
+    };
+    "symfony/polyfill-ctype" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19;
+          sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
+          sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
+          sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
+        };
+      };
+    };
+    "symfony/polyfill-php56" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af;
+          sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk";
+        };
+      };
+    };
+    "symfony/polyfill-php70" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224;
+          sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik";
+        };
+      };
+    };
+    "symfony/polyfill-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c;
+          sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i";
+        };
+      };
+    };
+    "symfony/swiftmailer-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
+          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
+        };
+      };
+    };
+    "symfony/symfony" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412;
+          sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q";
+        };
+      };
+    };
+    "twig/extensions" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202;
+          sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
+          sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
+        };
+      };
+    };
+    "zendframework/zend-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
+          sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
+        };
+      };
+    };
+    "zendframework/zend-escaper" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-escaper-31d8aafae982f9568287cb4dce987e6aff8fd074";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074;
+          sha256 = "16gwqh9zpclc3fmf89cf738mxfh36ar3wdf9i0wvby0g0nhknkd7";
+        };
+      };
+    };
+    "zendframework/zend-eventmanager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
+          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
+        };
+      };
+    };
+    "zendframework/zend-feed" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-feed-6641f4cf3f4586c63f83fd70b6d19966025c8888";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-feed/zipball/6641f4cf3f4586c63f83fd70b6d19966025c8888;
+          sha256 = "0wl2pf4cq0snlp3gbl2ia662i48yils464qlfqf7gdmbn1ryzcpi";
+        };
+      };
+    };
+    "zendframework/zend-http" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-http-2c8aed3d25522618573194e7cc51351f8cd4a45b";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b;
+          sha256 = "1vy6b24ihwv1g08hjnw4pd7c5171g866jnlr3j6fg0xqv79s4dn9";
+        };
+      };
+    };
+    "zendframework/zend-loader" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-loader-78f11749ea340f6ca316bca5958eef80b38f9b6c";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c;
+          sha256 = "056zp0xchc4ckijg969im5him3j4cji6hsy26fiaycwprniaqdmg";
+        };
+      };
+    };
+    "zendframework/zend-servicemanager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-servicemanager-a1ed6140d0d3ee803fec96582593ed024950067b";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-servicemanager/zipball/a1ed6140d0d3ee803fec96582593ed024950067b;
+          sha256 = "0s3aplkilrd8b18xh55h9m1yvnp9b6vnlgby4gqhqv8npnxxqir9";
+        };
+      };
+    };
+    "zendframework/zend-stdlib" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-stdlib-66536006722aff9e62d1b331025089b7ec71c065";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065;
+          sha256 = "0cl0lcgqb5aja6iijp0wrclxra57imwsmhkfpahdl2bsgs1inf2f";
+        };
+      };
+    };
+    "zendframework/zend-uri" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-uri-3b6463645c6766f78ce537c70cb4fdabee1e725f";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f;
+          sha256 = "0zkb88y9qbgshm8ys5yjxhz6a7fhxl7waygwn37pqsbvz74mbbvp";
+        };
+      };
+    };
+    "zendframework/zend-validator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-validator-f0789b4c4c099afdd2ecc58cc209a26c64bd4f17";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17;
+          sha256 = "1lwxbr3jlldll4ccw5cn2ny1cbzh279mnfz7m1djqc8qnw16c8jl";
+        };
+      };
+    };
+  };
+  devPackages = {
+    "doctrine/data-fixtures" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a;
+          sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm";
+        };
+      };
+    };
+    "doctrine/doctrine-fixtures-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
+          sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
+        };
+      };
+    };
+    "fzaninotto/faker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d";
+        src = fetchurl {
+          url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d;
+          sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi";
+        };
+      };
+    };
+    "league/factory-muffin" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a";
+        src = fetchurl {
+          url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a;
+          sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq";
+        };
+      };
+    };
+    "league/factory-muffin-faker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426";
+        src = fetchurl {
+          url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426;
+          sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1";
+        };
+      };
+    };
+    "mikey179/vfsStream" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145";
+        src = fetchurl {
+          url = https://api.github.com/repos/mikey179/vfsStream/zipball/d5fec95f541d4d71c4823bb5e30cf9b9e5b96145;
+          sha256 = "034rdds85qr3n7kqz161dqinl909gwnxgjsvychw8m7dyk2dbl99";
+        };
+      };
+    };
+    "phpdocumentor/reflection-common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6;
+          sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2";
+        };
+      };
+    };
+    "phpdocumentor/reflection-docblock" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08;
+          sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x";
+        };
+      };
+    };
+    "phpdocumentor/type-resolver" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7;
+          sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb";
+        };
+      };
+    };
+    "phpspec/prophecy" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06";
+        src = fetchurl {
+          url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06;
+          sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6";
+        };
+      };
+    };
+    "phpunit/php-code-coverage" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979;
+          sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d";
+        };
+      };
+    };
+    "phpunit/php-file-iterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4;
+          sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060";
+        };
+      };
+    };
+    "phpunit/php-text-template" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686;
+          sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76";
+        };
+      };
+    };
+    "phpunit/php-timer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f;
+          sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr";
+        };
+      };
+    };
+    "phpunit/php-token-stream" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16;
+          sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk";
+        };
+      };
+    };
+    "phpunit/phpunit" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517;
+          sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6";
+        };
+      };
+    };
+    "phpunit/phpunit-mock-objects" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983;
+          sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i";
+        };
+      };
+    };
+    "sebastian/comparator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be;
+          sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq";
+        };
+      };
+    };
+    "sebastian/diff" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4;
+          sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6";
+        };
+      };
+    };
+    "sebastian/environment" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea;
+          sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0";
+        };
+      };
+    };
+    "sebastian/exporter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4;
+          sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn";
+        };
+      };
+    };
+    "sebastian/global-state" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4;
+          sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb";
+        };
+      };
+    };
+    "sebastian/recursion-context" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7;
+          sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm";
+        };
+      };
+    };
+    "sebastian/version" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6";
+        src = fetchurl {
+          url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6;
+          sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz";
+        };
+      };
+    };
+    "sensio/generator-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
+          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
+        };
+      };
+    };
+    "symfony/phpunit-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5;
+          sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj";
+        };
+      };
+    };
+    "webmozart/assert" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9";
+        src = fetchurl {
+          url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9;
+          sha256 = "0d84b0ms9mjpqx368gs7c3qs06mpbx5565j3vs43b1ygnyhhhaqk";
+        };
+      };
+    };
+  };
+}
diff --git a/pkgs/private/webapps/piedsjaloux/piedsjaloux.json b/pkgs/private/webapps/piedsjaloux/piedsjaloux.json
new file mode 100644 (file)
index 0000000..a34c7e8
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "4ee4538-master",
+  "meta": {
+    "name": "piedsjaloux",
+    "url": "gitolite@git.immae.eu:Pieds_jaloux/NewSite",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:Pieds_jaloux/NewSite",
+    "rev": "4ee45386ad9ec9c081234a2fbde66e5b0c3294be",
+    "sha256": "10a41chh4crn95z6lk6nhkx27089djkngypa9m76bg7ph508mvnq",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/private/webapps/tellesflorian/default.nix b/pkgs/private/webapps/tellesflorian/default.nix
new file mode 100644 (file)
index 0000000..b1ccb98
--- /dev/null
@@ -0,0 +1,25 @@
+{ environment ? "prod"
+, varDir ? "/var/lib/tellesflorian_${environment}"
+, composerEnv, fetchurl, mylibs }:
+let
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl; } //
+    mylibs.fetchedGitPrivate ./tellesflorian.json //
+    rec {
+      noDev = (environment == "prod");
+      preInstall = ''
+        export SYMFONY_ENV="${environment}"
+        '';
+      postInstall = ''
+        cd $out
+        rm app/config/parameters.yml
+        ln -sf /var/secrets/webapps/${environment}-tellesflorian app/config/parameters.yml
+        rm -rf var/{logs,cache}
+        ln -sf ${varDir}/var/{logs,cache,sessions} var/
+        '';
+      passthru = {
+        inherit varDir environment;
+        webRoot = "${app}/web";
+      };
+    });
+in app
diff --git a/pkgs/private/webapps/tellesflorian/php-packages.nix b/pkgs/private/webapps/tellesflorian/php-packages.nix
new file mode 100644 (file)
index 0000000..0c7e00c
--- /dev/null
@@ -0,0 +1,389 @@
+# Generated with composer2nix and adapted to return only the list of
+# packages
+{ composerEnv, fetchurl }:
+{
+  packages = {
+    "composer/ca-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-ca-bundle-943b2c4fcad1ef178d16a713c2468bf7e579c288";
+        src = fetchurl {
+          url = https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288;
+          sha256 = "1gljia7akifp57w4rjzyh1km23kwymmvglz0mgafdgqzczcw0m6w";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-f25c8aab83e0c3e976fd7d19875f198ccf2f7535";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535;
+          sha256 = "08vm22fqq8r4bg2fk06y4inqnc8x0yfmsss28w5ra2011x2phq4z";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
+          sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-6c1e4eef75f310ea1b3e30945e9f06e652128b8a";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a;
+          sha256 = "1dkxr2vjycykpcnnmq68rcnn1ww0kbpizd5pxxm6x9i2ilj8cbn7";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-7bce00698899aa2c06fe7365c76e4d78ddb15fa3";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3;
+          sha256 = "12yizcsxsbhhi8hwaik4zalr12n5nxbpld05zygqhx6miyr92jyd";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
+          sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-eb6e4fb904a459be28872765ab6e2d246aac7c87";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87;
+          sha256 = "0kkisgyblc9hf9x3zpbb1wif51fa8mi6svyd44nls38k9k93dp17";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1;
+          sha256 = "08bqz18vk4673pnm2r2pcph6pdchc36zajnma1p9c6dp21sv7iki";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
+          sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
+          sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
+          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
+        src = fetchurl {
+          url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
+          sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
+        };
+      };
+    };
+    "fig/link-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
+          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
+        };
+      };
+    };
+    "incenteev/composer-parameter-handler" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
+        src = fetchurl {
+          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
+          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
+        };
+      };
+    };
+    "jdorn/sql-formatter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
+        src = fetchurl {
+          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
+          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
+        };
+      };
+    };
+    "monolog/monolog" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
+        src = fetchurl {
+          url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
+          sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-5da4d3c796c275c55f057af5a643ae297d96b4d8";
+        src = fetchurl {
+          url = https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8;
+          sha256 = "1hp6pin4923c300yi85m7qk04gsrbygv52wv5zm7giyyf0k0g073";
+        };
+      };
+    };
+    "psr/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
+          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
+          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
+        };
+      };
+    };
+    "psr/link" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
+          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
+        };
+      };
+    };
+    "psr/log" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
+          sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
+        };
+      };
+    };
+    "psr/simple-cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
+        src = fetchurl {
+          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
+          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
+        };
+      };
+    };
+    "sensio/distribution-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
+          sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-bf4940572e43af679aaa13be98f3446a1c237bd8";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bf4940572e43af679aaa13be98f3446a1c237bd8;
+          sha256 = "1kb1n5w3kfc0kf4pslqdx5pgp0g4hmaag0i00wvjj2n3pjfm5lhf";
+        };
+      };
+    };
+    "sensiolabs/security-checker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
+          sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
+        };
+      };
+    };
+    "swiftmailer/swiftmailer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
+        src = fetchurl {
+          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
+          sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
+        };
+      };
+    };
+    "symfony/monolog-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
+          sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
+        };
+      };
+    };
+    "symfony/polyfill-apcu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-apcu-e8ae2136ddb53dea314df56fcd88e318ab936c00";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00;
+          sha256 = "07wdszb9ircnidjk3fp3cvcrggxv3sfm996jzd0a9pm6vfz9hymv";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-254919c03761d46c29291616576ed003f10e91c1";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/254919c03761d46c29291616576ed003f10e91c1;
+          sha256 = "01yivzv7p55fzrkkyvgd57zpyz82zn1qp0h6nzr77k01rkv3w0ds";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-78be803ce01e55d3491c1397cf1c64beb9c1b63b";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b;
+          sha256 = "0cqr8ni6wpbaxa9gyr40y5bsv54pa2g8kdarlfw3qg2rgzmk0yz1";
+        };
+      };
+    };
+    "symfony/polyfill-php56" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php56-ebc999ce5f14204c5150b9bd15f8f04e621409d8";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8;
+          sha256 = "0b2j56l6d6rdggx7vr20d527df4pjfp4lgxpglsgbf5912rcyf83";
+        };
+      };
+    };
+    "symfony/polyfill-php70" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php70-3532bfcd8f933a7816f3a0a59682fc404776600f";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f;
+          sha256 = "151m76lc9w0kxnnwk4zdcjlmj7fppibnp8jisgpvvq32ml3fizdi";
+        };
+      };
+    };
+    "symfony/polyfill-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-util-e17c808ec4228026d4f5a8832afa19be85979563";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563;
+          sha256 = "17sdpdidc0b701f9rippjv1grfci7wrdpy2i1inlwwpr6zy782cq";
+        };
+      };
+    };
+    "symfony/swiftmailer-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
+          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
+        };
+      };
+    };
+    "symfony/symfony" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-symfony-874d4d659774d7bab90538072c83ed532dd17dc5";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/symfony/zipball/874d4d659774d7bab90538072c83ed532dd17dc5;
+          sha256 = "02rsn3sc34jh107n576jfbh666k06y44yr7hw61nir0d864k8api";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-9c24f2cd39dc1906b76879e099970b7e53724601";
+        src = fetchurl {
+          url = https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601;
+          sha256 = "0brfj2lahrrw1322zy6jyd380hjks1ynzzkmq3875a282gzrfkdz";
+        };
+      };
+    };
+  };
+  devPackages = {
+    "sensio/generator-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
+        src = fetchurl {
+          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
+          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
+        };
+      };
+    };
+    "symfony/phpunit-bridge" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-phpunit-bridge-32b06d2b0babf3216e55acfce42249321a304f03";
+        src = fetchurl {
+          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/32b06d2b0babf3216e55acfce42249321a304f03;
+          sha256 = "0vw4q3lvz8gfs0r93ds8yymz8586k0czwa01c7d172rc8x02v0qq";
+        };
+      };
+    };
+  };
+}
diff --git a/pkgs/private/webapps/tellesflorian/tellesflorian.json b/pkgs/private/webapps/tellesflorian/tellesflorian.json
new file mode 100644 (file)
index 0000000..81b42af
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "1793d5c-master",
+  "meta": {
+    "name": "tellesflorian",
+    "url": "gitolite@git.immae.eu:perso/florian_telles/stabilo",
+    "branch": "master"
+  },
+  "git": {
+    "url": "gitolite@git.immae.eu:perso/florian_telles/stabilo",
+    "rev": "1793d5c7912d1b20ad1df1ac59be9d7f1220e919",
+    "sha256": "1zhxcrbglbjb6xfr8sfm4m2miabbkkb0a7543va3b5akrn6yk0cb",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/pure-ftpd/default.nix b/pkgs/pure-ftpd/default.nix
new file mode 100644 (file)
index 0000000..37ce695
--- /dev/null
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, openssl, postgresql, openldap }:
+
+stdenv.mkDerivation rec {
+  name = "pure-ftpd-1.0.47";
+
+  src = fetchurl {
+    url = "https://download.pureftpd.org/pub/pure-ftpd/releases/${name}.tar.gz";
+    sha256 = "1b97ixva8m10vln8xrfwwwzi344bkgxqji26d0nrm1yzylbc6h27";
+  };
+
+  preConfigure = ''
+    sed -i -e "s#FTPuid#immaeFtpUid#" src/log_ldap.h
+    sed -i -e "s#FTPgid#immaeFtpGid#" src/log_ldap.h
+    '';
+  postConfigure = ''
+    sed -i 's/define MAX_DATA_SIZE (40/define MAX_DATA_SIZE (70/' src/ftpd.h
+    '';
+  buildInputs = [ openssl postgresql openldap ];
+
+  configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ];
+
+  meta = with stdenv.lib; {
+    description = "A free, secure, production-quality and standard-conformant FTP server";
+    homepage = https://www.pureftpd.org;
+    license = licenses.isc; # with some parts covered by BSD3(?)
+    maintainers = [ maintainers.lethalman ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/python-packages/apprise/apprise.json b/pkgs/python-packages/apprise/apprise.json
new file mode 100644 (file)
index 0000000..b408ea4
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "c9b957c-master",
+  "meta": {
+    "name": "apprise",
+    "url": "https://github.com/caronc/apprise",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "caronc",
+    "repo": "apprise",
+    "rev": "c9b957c4341e7d43e5be6463bd317a7401d083d9",
+    "sha256": "01zz4mh3xvplrm5xalzrcncnh0jq5y51pmdxkr4hdd6dz9wx0mbg",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/python-packages/apprise/default.nix b/pkgs/python-packages/apprise/default.nix
new file mode 100644 (file)
index 0000000..d310599
--- /dev/null
@@ -0,0 +1,11 @@
+{ mylibs, pythonPackages }: with pythonPackages;
+buildPythonPackage rec {
+  pname = "apprise";
+  version = "0.7.4";
+  src = (mylibs.fetchedGithub ./apprise.json).src;
+  propagatedBuildInputs = [ decorator requests
+    requests_oauthlib oauthlib urllib3 six click markdown pyyaml
+    sleekxmpp
+  ];
+  doChecks = false;
+}
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix b/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix
new file mode 100644 (file)
index 0000000..8b26e0a
--- /dev/null
@@ -0,0 +1,9 @@
+# Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
+{ fetchbower, buildEnv }:
+buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
+  (fetchbower "jquery" "2.1.1" "2.1.1" "1qir36vi0bppjr9ckm6303vk1f1dkvq5wandpihb7dxl76s832bd")
+  (fetchbower "angular" "1.5.11" "~1.5.3" "1sw31v3dhmxwgrmncw2f9yl07i9px62ssbj0739zsgi59cq2khl7")
+  (fetchbower "lodash" "2.4.2" "~2.4.1" "0bhqarlvhlrxfvcgnxgsrsjgi6az4c117ffxyfi7gjwr9cvrzz4q")
+  (fetchbower "angular-mocks" "1.5.11" "~1.5.3" "0yv0396fw51i6d9lwiwf241rmc28rnxgg2aa9vsc7dnm4qjkn6gx")
+  (fetchbower "buildbot-data" "2.1.0" "~2.1.0" "0hkmm1byy7d712898lhkxf7i0wshmd1f8cr98iz67679nm6abimk")
+]; }
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/buildslist.json b/pkgs/python-packages/buildbot/plugins/buildslist/buildslist.json
new file mode 100644 (file)
index 0000000..27ca94c
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "9e87787-master",
+  "meta": {
+    "name": "buildslist",
+    "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist",
+    "branch": "master"
+  },
+  "git": {
+    "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist",
+    "rev": "9e87787b40f4d6435218268e516be56eacd8d17b",
+    "sha256": "0bli9w0xwpij23jblggz2zwhb7y3gkjdvsppcy6ia3m0x0siclpi",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix b/pkgs/python-packages/buildbot/plugins/buildslist/default.nix
new file mode 100644 (file)
index 0000000..08e6955
--- /dev/null
@@ -0,0 +1,45 @@
+{ mylibs, runCommand, buildBowerComponents, pythonPackages, jq, yarn, nodejs }:
+let
+  buildslist_src = mylibs.fetchedGit ./buildslist.json;
+  packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
+    cat ${buildslist_src.src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"' > $out
+    '';
+  buildslist_yarn = mylibs.yarn2nixPackage.mkYarnModules rec {
+    name = "buildslist-yarn-modules";
+    pname = name;
+    inherit (pythonPackages.buildbot-pkg) version;
+    packageJSON = packagejson;
+    yarnLock = "${buildslist_src.src}/yarn.lock";
+    yarnNix = ./yarn-packages.nix;
+    pkgConfig = {
+      all = { buildInputs = [ mylibs.yarn2nixPackage.src ]; };
+    };
+  };
+  buildslist_bower = buildBowerComponents {
+    name = "buildslist";
+    generated = ./bower.nix;
+    src = "${buildslist_src.src}/guanlecoja/";
+  };
+in
+pythonPackages.buildPythonPackage rec {
+  pname = "buildbot-buildslist";
+  inherit (pythonPackages.buildbot-pkg) version;
+
+  __noChroot = true;
+  preConfigure = ''
+    export HOME=$PWD
+    cp -a ${buildslist_yarn}/node_modules .
+    chmod -R u+w node_modules
+    cp -a ${buildslist_bower}/bower_components ./libs
+    chmod -R u+w libs
+    '';
+  propagatedBuildInputs = with pythonPackages; [
+    (klein.overridePythonAttrs(old: { checkPhase = ""; }))
+    buildbot-pkg
+  ];
+  nativeBuildInputs = [ yarn nodejs ];
+  buildInputs = [ buildslist_yarn buildslist_bower ];
+
+  doCheck = false;
+  src = buildslist_src.src;
+}
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix b/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix
new file mode 100644 (file)
index 0000000..7ab3c63
--- /dev/null
@@ -0,0 +1,5459 @@
+{fetchurl, linkFarm}: rec {
+  offline_cache = linkFarm "offline" packages;
+  packages = [
+
+    {
+      name = "abbrev___abbrev_1.1.1.tgz";
+      path = fetchurl {
+        name = "abbrev___abbrev_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
+        sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
+      };
+    }
+
+    {
+      name = "abbrev___abbrev_1.0.9.tgz";
+      path = fetchurl {
+        name = "abbrev___abbrev_1.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz";
+        sha1 = "91b4792588a7738c25f35dd6f63752a2f8776135";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.3.3.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz";
+        sha1 = "c3ca7434938648c3e0d9c1e328dd68b622c284ca";
+      };
+    }
+
+    {
+      name = "after___after_0.8.2.tgz";
+      path = fetchurl {
+        name = "after___after_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    }
+
+    {
+      name = "ajv___ajv_6.10.0.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz";
+        sha1 = "90d0d54439da587cd7e843bfb7045f50bd22bdf1";
+      };
+    }
+
+    {
+      name = "amdefine___amdefine_1.0.1.tgz";
+      path = fetchurl {
+        name = "amdefine___amdefine_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz";
+        sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
+      };
+    }
+
+    {
+      name = "ansi_gray___ansi_gray_0.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_gray___ansi_gray_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz";
+        sha1 = "2962cf54ec9792c48510a3deb524436861ef7251";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_0.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz";
+        sha1 = "0d8e946967a3d8143f93e24e298525fc1b2235f9";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_2.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_3.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_1.1.0.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz";
+        sha1 = "eaecbf66cd706882760b2f4691582b8f55d7a7de";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_2.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    }
+
+    {
+      name = "ansi_wrap___ansi_wrap_0.1.0.tgz";
+      path = fetchurl {
+        name = "ansi_wrap___ansi_wrap_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz";
+        sha1 = "a82250ddb0015e9a27ca82e82ea603bbfa45efaf";
+      };
+    }
+
+    {
+      name = "anymatch___anymatch_1.3.2.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz";
+        sha1 = "553dcb8f91e3c889845dfdba34c77721b90b9d7a";
+      };
+    }
+
+    {
+      name = "aproba___aproba_1.2.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
+        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
+      };
+    }
+
+    {
+      name = "archy___archy_1.0.0.tgz";
+      path = fetchurl {
+        name = "archy___archy_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz";
+        sha1 = "f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40";
+      };
+    }
+
+    {
+      name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+      path = fetchurl {
+        name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
+      };
+    }
+
+    {
+      name = "argparse___argparse_1.0.10.tgz";
+      path = fetchurl {
+        name = "argparse___argparse_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
+        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_2.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
+        sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_4.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
+        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
+      };
+    }
+
+    {
+      name = "arr_flatten___arr_flatten_1.1.0.tgz";
+      path = fetchurl {
+        name = "arr_flatten___arr_flatten_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
+      };
+    }
+
+    {
+      name = "arr_union___arr_union_3.1.0.tgz";
+      path = fetchurl {
+        name = "arr_union___arr_union_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    }
+
+    {
+      name = "array_differ___array_differ_1.0.0.tgz";
+      path = fetchurl {
+        name = "array_differ___array_differ_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz";
+        sha1 = "eff52e3758249d33be402b8bb8e564bb2b5d4031";
+      };
+    }
+
+    {
+      name = "array_each___array_each_1.0.1.tgz";
+      path = fetchurl {
+        name = "array_each___array_each_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz";
+        sha1 = "a794af0c05ab1752846ee753a1f211a05ba0c44f";
+      };
+    }
+
+    {
+      name = "array_find_index___array_find_index_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_find_index___array_find_index_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz";
+        sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1";
+      };
+    }
+
+    {
+      name = "array_slice___array_slice_0.2.3.tgz";
+      path = fetchurl {
+        name = "array_slice___array_slice_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz";
+        sha1 = "dd3cfb80ed7973a75117cdac69b0b99ec86186f5";
+      };
+    }
+
+    {
+      name = "array_slice___array_slice_1.1.0.tgz";
+      path = fetchurl {
+        name = "array_slice___array_slice_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz";
+        sha1 = "e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4";
+      };
+    }
+
+    {
+      name = "array_uniq___array_uniq_1.0.3.tgz";
+      path = fetchurl {
+        name = "array_uniq___array_uniq_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.2.1.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
+        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.3.2.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
+        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
+      };
+    }
+
+    {
+      name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
+      path = fetchurl {
+        name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz";
+        sha1 = "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca";
+      };
+    }
+
+    {
+      name = "asn1___asn1_0.2.4.tgz";
+      path = fetchurl {
+        name = "asn1___asn1_0.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz";
+        sha1 = "8d2475dfab553bb33e77b54e59e880bb8ce23136";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_1.0.0.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    }
+
+    {
+      name = "assign_symbols___assign_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "assign_symbols___assign_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
+        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
+      };
+    }
+
+    {
+      name = "async_each___async_each_1.0.1.tgz";
+      path = fetchurl {
+        name = "async_each___async_each_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
+        sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
+      };
+    }
+
+    {
+      name = "async_foreach___async_foreach_0.1.3.tgz";
+      path = fetchurl {
+        name = "async_foreach___async_foreach_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz";
+        sha1 = "36121f845c0578172de419a97dbeb1d16ec34542";
+      };
+    }
+
+    {
+      name = "async___async_1.5.2.tgz";
+      path = fetchurl {
+        name = "async___async_1.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
+        sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
+      };
+    }
+
+    {
+      name = "async___async_2.6.2.tgz";
+      path = fetchurl {
+        name = "async___async_2.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz";
+        sha1 = "18330ea7e6e313887f5d2f2a904bac6fe4dd5381";
+      };
+    }
+
+    {
+      name = "asynckit___asynckit_0.4.0.tgz";
+      path = fetchurl {
+        name = "asynckit___asynckit_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    }
+
+    {
+      name = "atob___atob_2.1.2.tgz";
+      path = fetchurl {
+        name = "atob___atob_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
+        sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
+      };
+    }
+
+    {
+      name = "aws_sign2___aws_sign2_0.7.0.tgz";
+      path = fetchurl {
+        name = "aws_sign2___aws_sign2_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    }
+
+    {
+      name = "aws4___aws4_1.8.0.tgz";
+      path = fetchurl {
+        name = "aws4___aws4_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz";
+        sha1 = "f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f";
+      };
+    }
+
+    {
+      name = "backo2___backo2_1.0.2.tgz";
+      path = fetchurl {
+        name = "backo2___backo2_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    }
+
+    {
+      name = "balanced_match___balanced_match_1.0.0.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    }
+
+    {
+      name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
+      path = fetchurl {
+        name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    }
+
+    {
+      name = "base64id___base64id_1.0.0.tgz";
+      path = fetchurl {
+        name = "base64id___base64id_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz";
+        sha1 = "47688cb99bb6804f0e06d3e763b1c32e57d8e6b6";
+      };
+    }
+
+    {
+      name = "base___base_0.11.2.tgz";
+      path = fetchurl {
+        name = "base___base_0.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
+        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
+      };
+    }
+
+    {
+      name = "batch___batch_0.5.3.tgz";
+      path = fetchurl {
+        name = "batch___batch_0.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz";
+        sha1 = "3f3414f380321743bfc1042f9a83ff1d5824d464";
+      };
+    }
+
+    {
+      name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+      path = fetchurl {
+        name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    }
+
+    {
+      name = "beeper___beeper_1.1.1.tgz";
+      path = fetchurl {
+        name = "beeper___beeper_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz";
+        sha1 = "e6d5ea8c5dad001304a70b22638447f69cb2f809";
+      };
+    }
+
+    {
+      name = "better_assert___better_assert_1.0.2.tgz";
+      path = fetchurl {
+        name = "better_assert___better_assert_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    }
+
+    {
+      name = "binary_extensions___binary_extensions_1.13.0.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_1.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz";
+        sha1 = "9523e001306a32444b907423f1de2164222f6ab1";
+      };
+    }
+
+    {
+      name = "blob___blob_0.0.4.tgz";
+      path = fetchurl {
+        name = "blob___blob_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz";
+        sha1 = "bcf13052ca54463f30f9fc7e95b9a47630a94921";
+      };
+    }
+
+    {
+      name = "block_stream___block_stream_0.0.9.tgz";
+      path = fetchurl {
+        name = "block_stream___block_stream_0.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
+        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
+      };
+    }
+
+    {
+      name = "bluebird___bluebird_2.11.0.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_2.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz";
+        sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
+      };
+    }
+
+    {
+      name = "body_parser___body_parser_1.18.3.tgz";
+      path = fetchurl {
+        name = "body_parser___body_parser_1.18.3.tgz";
+        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz";
+        sha1 = "5b292198ffdd553b3a0f20ded0592b956955c8b4";
+      };
+    }
+
+    {
+      name = "body_parser___body_parser_1.14.2.tgz";
+      path = fetchurl {
+        name = "body_parser___body_parser_1.14.2.tgz";
+        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz";
+        sha1 = "1015cb1fe2c443858259581db53332f8d0cf50f9";
+      };
+    }
+
+    {
+      name = "brace_expansion___brace_expansion_1.1.11.tgz";
+      path = fetchurl {
+        name = "brace_expansion___brace_expansion_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
+      };
+    }
+
+    {
+      name = "braces___braces_0.1.5.tgz";
+      path = fetchurl {
+        name = "braces___braces_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz";
+        sha1 = "c085711085291d8b75fdd74eab0f8597280711e6";
+      };
+    }
+
+    {
+      name = "braces___braces_1.8.5.tgz";
+      path = fetchurl {
+        name = "braces___braces_1.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
+        sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
+      };
+    }
+
+    {
+      name = "braces___braces_2.3.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
+        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
+      };
+    }
+
+    {
+      name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
+      path = fetchurl {
+        name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz";
+        sha1 = "bd7dc26ae2972d0eda253be061dba992349c19f0";
+      };
+    }
+
+    {
+      name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
+      path = fetchurl {
+        name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz";
+        sha1 = "890dd90d923a873e08e10e5fd51a57e5b7cce0ec";
+      };
+    }
+
+    {
+      name = "buffer_fill___buffer_fill_1.0.0.tgz";
+      path = fetchurl {
+        name = "buffer_fill___buffer_fill_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz";
+        sha1 = "f8f78b76789888ef39f205cd637f68e702122b2c";
+      };
+    }
+
+    {
+      name = "bytes___bytes_2.2.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz";
+        sha1 = "fd35464a403f6f9117c2de3609ecff9cae000588";
+      };
+    }
+
+    {
+      name = "bytes___bytes_2.4.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz";
+        sha1 = "7d97196f9d5baf7f6935e25985549edd2a6c2339";
+      };
+    }
+
+    {
+      name = "bytes___bytes_3.0.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
+      };
+    }
+
+    {
+      name = "cache_base___cache_base_1.0.1.tgz";
+      path = fetchurl {
+        name = "cache_base___cache_base_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
+        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
+      };
+    }
+
+    {
+      name = "callsite___callsite_1.0.0.tgz";
+      path = fetchurl {
+        name = "callsite___callsite_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    }
+
+    {
+      name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
+      path = fetchurl {
+        name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
+        sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_2.1.1.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz";
+        sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_3.0.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz";
+        sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
+      };
+    }
+
+    {
+      name = "caseless___caseless_0.12.0.tgz";
+      path = fetchurl {
+        name = "caseless___caseless_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    }
+
+    {
+      name = "chalk___chalk_0.5.1.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz";
+        sha1 = "663b3a648b68b55d04690d49167aa837858f2174";
+      };
+    }
+
+    {
+      name = "chalk___chalk_1.1.3.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    }
+
+    {
+      name = "chokidar___chokidar_1.7.0.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz";
+        sha1 = "798e689778151c8076b4b360e5edd28cda2bb468";
+      };
+    }
+
+    {
+      name = "chownr___chownr_1.1.1.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz";
+        sha1 = "54726b8b8fff4df053c42187e801fb4412df1494";
+      };
+    }
+
+    {
+      name = "class_utils___class_utils_0.3.6.tgz";
+      path = fetchurl {
+        name = "class_utils___class_utils_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
+        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
+      };
+    }
+
+    {
+      name = "cliui___cliui_3.2.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
+        sha1 = "120601537a916d29940f934da3b48d585a39213d";
+      };
+    }
+
+    {
+      name = "clone_stats___clone_stats_0.0.1.tgz";
+      path = fetchurl {
+        name = "clone_stats___clone_stats_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz";
+        sha1 = "b88f94a82cf38b8791d58046ea4029ad88ca99d1";
+      };
+    }
+
+    {
+      name = "clone___clone_0.2.0.tgz";
+      path = fetchurl {
+        name = "clone___clone_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz";
+        sha1 = "c6126a90ad4f72dbf5acdb243cc37724fe93fc1f";
+      };
+    }
+
+    {
+      name = "clone___clone_1.0.4.tgz";
+      path = fetchurl {
+        name = "clone___clone_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
+        sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
+      };
+    }
+
+    {
+      name = "code_point_at___code_point_at_1.1.0.tgz";
+      path = fetchurl {
+        name = "code_point_at___code_point_at_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    }
+
+    {
+      name = "coffee_script___coffee_script_1.12.7.tgz";
+      path = fetchurl {
+        name = "coffee_script___coffee_script_1.12.7.tgz";
+        url  = "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz";
+        sha1 = "c05dae0cb79591d05b3070a8433a98c9a89ccc53";
+      };
+    }
+
+    {
+      name = "coffee_script___coffee_script_1.10.0.tgz";
+      path = fetchurl {
+        name = "coffee_script___coffee_script_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.10.0.tgz";
+        sha1 = "12938bcf9be1948fa006f92e0c4c9e81705108c0";
+      };
+    }
+
+    {
+      name = "collection_visit___collection_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "collection_visit___collection_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
+        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
+      };
+    }
+
+    {
+      name = "color_support___color_support_1.1.3.tgz";
+      path = fetchurl {
+        name = "color_support___color_support_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz";
+        sha1 = "93834379a1cc9a0c61f82f52f0d04322251bd5a2";
+      };
+    }
+
+    {
+      name = "colors___colors_1.3.3.tgz";
+      path = fetchurl {
+        name = "colors___colors_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz";
+        sha1 = "39e005d546afe01e01f9c4ca8fa50f686a01205d";
+      };
+    }
+
+    {
+      name = "combined_stream___combined_stream_1.0.7.tgz";
+      path = fetchurl {
+        name = "combined_stream___combined_stream_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz";
+        sha1 = "2d1d24317afb8abe95d6d2c0b07b57813539d828";
+      };
+    }
+
+    {
+      name = "commander___commander_2.17.1.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.17.1.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz";
+        sha1 = "bd77ab7de6de94205ceacc72f1716d29f20a77bf";
+      };
+    }
+
+    {
+      name = "component_bind___component_bind_1.0.0.tgz";
+      path = fetchurl {
+        name = "component_bind___component_bind_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.1.2.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz";
+        sha1 = "296594f2753daa63996d2af08d15a95116c9aec3";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.2.1.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    }
+
+    {
+      name = "component_inherit___component_inherit_0.0.3.tgz";
+      path = fetchurl {
+        name = "component_inherit___component_inherit_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    }
+
+    {
+      name = "concat_map___concat_map_0.0.1.tgz";
+      path = fetchurl {
+        name = "concat_map___concat_map_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    }
+
+    {
+      name = "connect___connect_3.6.6.tgz";
+      path = fetchurl {
+        name = "connect___connect_3.6.6.tgz";
+        url  = "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz";
+        sha1 = "09eff6c55af7236e137135a72574858b6786f524";
+      };
+    }
+
+    {
+      name = "console_control_strings___console_control_strings_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_control_strings___console_control_strings_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    }
+
+    {
+      name = "content_type___content_type_1.0.4.tgz";
+      path = fetchurl {
+        name = "content_type___content_type_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
+        sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
+      };
+    }
+
+    {
+      name = "cookie___cookie_0.3.1.tgz";
+      path = fetchurl {
+        name = "cookie___cookie_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    }
+
+    {
+      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+      path = fetchurl {
+        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
+        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
+      };
+    }
+
+    {
+      name = "core_js___core_js_2.6.5.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_2.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz";
+        sha1 = "44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895";
+      };
+    }
+
+    {
+      name = "core_util_is___core_util_is_1.0.2.tgz";
+      path = fetchurl {
+        name = "core_util_is___core_util_is_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_3.0.1.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz";
+        sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982";
+      };
+    }
+
+    {
+      name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
+      path = fetchurl {
+        name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
+        sha1 = "988df33feab191ef799a61369dd76c17adf957ea";
+      };
+    }
+
+    {
+      name = "custom_event___custom_event_1.0.1.tgz";
+      path = fetchurl {
+        name = "custom_event___custom_event_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz";
+        sha1 = "5d02a46850adf1b4a317946a3928fccb5bfd0425";
+      };
+    }
+
+    {
+      name = "dashdash___dashdash_1.14.1.tgz";
+      path = fetchurl {
+        name = "dashdash___dashdash_1.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    }
+
+    {
+      name = "dateformat___dateformat_1.0.12.tgz";
+      path = fetchurl {
+        name = "dateformat___dateformat_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz";
+        sha1 = "9f124b67594c937ff706932e4a642cca8dbbfee9";
+      };
+    }
+
+    {
+      name = "dateformat___dateformat_2.2.0.tgz";
+      path = fetchurl {
+        name = "dateformat___dateformat_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz";
+        sha1 = "4065e2013cf9fb916ddfd82efb506ad4c6769062";
+      };
+    }
+
+    {
+      name = "debug___debug_2.2.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz";
+        sha1 = "f87057e995b1a1f6ae6a4960664137bc56f039da";
+      };
+    }
+
+    {
+      name = "debug___debug_2.3.3.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz";
+        sha1 = "40c453e67e6e13c901ddec317af8986cda9eff8c";
+      };
+    }
+
+    {
+      name = "debug___debug_2.6.9.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.6.9.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
+        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
+      };
+    }
+
+    {
+      name = "debug___debug_3.2.6.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz";
+        sha1 = "e83d17de16d8a7efb7717edbe5fb10135eee629b";
+      };
+    }
+
+    {
+      name = "decamelize___decamelize_1.2.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    }
+
+    {
+      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+      path = fetchurl {
+        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
+        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
+      };
+    }
+
+    {
+      name = "deep_extend___deep_extend_0.6.0.tgz";
+      path = fetchurl {
+        name = "deep_extend___deep_extend_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
+      };
+    }
+
+    {
+      name = "deep_is___deep_is_0.1.3.tgz";
+      path = fetchurl {
+        name = "deep_is___deep_is_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    }
+
+    {
+      name = "defaults___defaults_1.0.3.tgz";
+      path = fetchurl {
+        name = "defaults___defaults_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz";
+        sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
+      };
+    }
+
+    {
+      name = "define_property___define_property_0.2.5.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
+        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
+      };
+    }
+
+    {
+      name = "define_property___define_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
+        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
+      };
+    }
+
+    {
+      name = "define_property___define_property_2.0.2.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
+        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
+      };
+    }
+
+    {
+      name = "delayed_stream___delayed_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "delayed_stream___delayed_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    }
+
+    {
+      name = "delegates___delegates_1.0.0.tgz";
+      path = fetchurl {
+        name = "delegates___delegates_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    }
+
+    {
+      name = "depd___depd_1.1.2.tgz";
+      path = fetchurl {
+        name = "depd___depd_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    }
+
+    {
+      name = "deprecated___deprecated_0.0.1.tgz";
+      path = fetchurl {
+        name = "deprecated___deprecated_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz";
+        sha1 = "f9c9af5464afa1e7a971458a8bdef2aa94d5bb19";
+      };
+    }
+
+    {
+      name = "detect_file___detect_file_1.0.0.tgz";
+      path = fetchurl {
+        name = "detect_file___detect_file_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz";
+        sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
+      };
+    }
+
+    {
+      name = "detect_libc___detect_libc_1.0.3.tgz";
+      path = fetchurl {
+        name = "detect_libc___detect_libc_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
+        sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
+      };
+    }
+
+    {
+      name = "di___di_0.0.1.tgz";
+      path = fetchurl {
+        name = "di___di_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz";
+        sha1 = "806649326ceaa7caa3306d75d985ea2748ba913c";
+      };
+    }
+
+    {
+      name = "dom_serialize___dom_serialize_2.2.1.tgz";
+      path = fetchurl {
+        name = "dom_serialize___dom_serialize_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz";
+        sha1 = "562ae8999f44be5ea3076f5419dcd59eb43ac95b";
+      };
+    }
+
+    {
+      name = "duplexer2___duplexer2_0.0.2.tgz";
+      path = fetchurl {
+        name = "duplexer2___duplexer2_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz";
+        sha1 = "c614dcf67e2fb14995a91711e5a617e8a60a31db";
+      };
+    }
+
+    {
+      name = "duplexer___duplexer_0.1.1.tgz";
+      path = fetchurl {
+        name = "duplexer___duplexer_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz";
+        sha1 = "ace6ff808c1ce66b57d1ebf97977acb02334cfc1";
+      };
+    }
+
+    {
+      name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+      path = fetchurl {
+        name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    }
+
+    {
+      name = "ee_first___ee_first_1.1.1.tgz";
+      path = fetchurl {
+        name = "ee_first___ee_first_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    }
+
+    {
+      name = "encodeurl___encodeurl_1.0.2.tgz";
+      path = fetchurl {
+        name = "encodeurl___encodeurl_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    }
+
+    {
+      name = "end_of_stream___end_of_stream_0.1.5.tgz";
+      path = fetchurl {
+        name = "end_of_stream___end_of_stream_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz";
+        sha1 = "8e177206c3c80837d85632e8b9359dfe8b2f6eaf";
+      };
+    }
+
+    {
+      name = "engine.io_client___engine.io_client_1.8.5.tgz";
+      path = fetchurl {
+        name = "engine.io_client___engine.io_client_1.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.5.tgz";
+        sha1 = "fe7fb60cb0dcf2fa2859489329cb5968dedeb11f";
+      };
+    }
+
+    {
+      name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
+      path = fetchurl {
+        name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz";
+        sha1 = "937b079f0007d0893ec56d46cb220b8cb435220a";
+      };
+    }
+
+    {
+      name = "engine.io___engine.io_1.8.5.tgz";
+      path = fetchurl {
+        name = "engine.io___engine.io_1.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.5.tgz";
+        sha1 = "4ebe5e75c6dc123dee4afdce6e5fdced21eb93f6";
+      };
+    }
+
+    {
+      name = "ent___ent_2.2.0.tgz";
+      path = fetchurl {
+        name = "ent___ent_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz";
+        sha1 = "e964219325a21d05f44466a2f686ed6ce5f5dd1d";
+      };
+    }
+
+    {
+      name = "error_ex___error_ex_1.3.2.tgz";
+      path = fetchurl {
+        name = "error_ex___error_ex_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
+        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
+      };
+    }
+
+    {
+      name = "escape_html___escape_html_1.0.3.tgz";
+      path = fetchurl {
+        name = "escape_html___escape_html_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    }
+
+    {
+      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+      path = fetchurl {
+        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    }
+
+    {
+      name = "escodegen___escodegen_1.8.1.tgz";
+      path = fetchurl {
+        name = "escodegen___escodegen_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz";
+        sha1 = "5a5b53af4693110bebb0867aa3430dd3b70a1018";
+      };
+    }
+
+    {
+      name = "esprima___esprima_2.7.3.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_2.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz";
+        sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
+      };
+    }
+
+    {
+      name = "esprima___esprima_4.0.1.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
+        sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
+      };
+    }
+
+    {
+      name = "estraverse___estraverse_1.9.3.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz";
+        sha1 = "af67f2dc922582415950926091a4005d29c9bb44";
+      };
+    }
+
+    {
+      name = "esutils___esutils_2.0.2.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    }
+
+    {
+      name = "event_stream___event_stream_3.3.5.tgz";
+      path = fetchurl {
+        name = "event_stream___event_stream_3.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.5.tgz";
+        sha1 = "e5dd8989543630d94c6cf4d657120341fa31636b";
+      };
+    }
+
+    {
+      name = "eventemitter3___eventemitter3_3.1.0.tgz";
+      path = fetchurl {
+        name = "eventemitter3___eventemitter3_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz";
+        sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163";
+      };
+    }
+
+    {
+      name = "expand_braces___expand_braces_0.1.2.tgz";
+      path = fetchurl {
+        name = "expand_braces___expand_braces_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz";
+        sha1 = "488b1d1d2451cb3d3a6b192cfc030f44c5855fea";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_0.1.5.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
+        sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_2.1.4.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
+        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
+      };
+    }
+
+    {
+      name = "expand_range___expand_range_0.1.1.tgz";
+      path = fetchurl {
+        name = "expand_range___expand_range_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz";
+        sha1 = "4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044";
+      };
+    }
+
+    {
+      name = "expand_range___expand_range_1.8.2.tgz";
+      path = fetchurl {
+        name = "expand_range___expand_range_1.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
+        sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
+      };
+    }
+
+    {
+      name = "expand_tilde___expand_tilde_2.0.2.tgz";
+      path = fetchurl {
+        name = "expand_tilde___expand_tilde_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz";
+        sha1 = "97e801aa052df02454de46b02bf621642cdc8502";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_2.0.1.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
+        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
+        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
+      };
+    }
+
+    {
+      name = "extend___extend_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend___extend_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
+        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
+      };
+    }
+
+    {
+      name = "extglob___extglob_0.3.2.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
+        sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
+      };
+    }
+
+    {
+      name = "extglob___extglob_2.0.4.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
+        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.3.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.4.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
+        sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
+      };
+    }
+
+    {
+      name = "fancy_log___fancy_log_1.3.3.tgz";
+      path = fetchurl {
+        name = "fancy_log___fancy_log_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz";
+        sha1 = "dbc19154f558690150a23953a0adbd035be45fc7";
+      };
+    }
+
+    {
+      name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
+        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
+      };
+    }
+
+    {
+      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+      path = fetchurl {
+        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
+        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
+      };
+    }
+
+    {
+      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    }
+
+    {
+      name = "faye_websocket___faye_websocket_0.7.3.tgz";
+      path = fetchurl {
+        name = "faye_websocket___faye_websocket_0.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz";
+        sha1 = "cc4074c7f4a4dfd03af54dd65c354b135132ce11";
+      };
+    }
+
+    {
+      name = "filename_regex___filename_regex_2.0.1.tgz";
+      path = fetchurl {
+        name = "filename_regex___filename_regex_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
+        sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_2.2.4.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
+        sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_4.0.0.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
+        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
+      };
+    }
+
+    {
+      name = "finalhandler___finalhandler_1.1.0.tgz";
+      path = fetchurl {
+        name = "finalhandler___finalhandler_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz";
+        sha1 = "ce0b6855b45853e791b2fcc680046d88253dd7f5";
+      };
+    }
+
+    {
+      name = "find_index___find_index_0.1.1.tgz";
+      path = fetchurl {
+        name = "find_index___find_index_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz";
+        sha1 = "675d358b2ca3892d795a1ab47232f8b6e2e0dde4";
+      };
+    }
+
+    {
+      name = "find_up___find_up_1.1.2.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
+        sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
+      };
+    }
+
+    {
+      name = "findup_sync___findup_sync_2.0.0.tgz";
+      path = fetchurl {
+        name = "findup_sync___findup_sync_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz";
+        sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc";
+      };
+    }
+
+    {
+      name = "fined___fined_1.1.1.tgz";
+      path = fetchurl {
+        name = "fined___fined_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/fined/-/fined-1.1.1.tgz";
+        sha1 = "95d88ff329123dd1a6950fdfcd321f746271e01f";
+      };
+    }
+
+    {
+      name = "first_chunk_stream___first_chunk_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "first_chunk_stream___first_chunk_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz";
+        sha1 = "59bfb50cd905f60d7c394cd3d9acaab4e6ad934e";
+      };
+    }
+
+    {
+      name = "flagged_respawn___flagged_respawn_1.0.1.tgz";
+      path = fetchurl {
+        name = "flagged_respawn___flagged_respawn_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz";
+        sha1 = "e7de6f1279ddd9ca9aac8a5971d618606b3aab41";
+      };
+    }
+
+    {
+      name = "follow_redirects___follow_redirects_1.7.0.tgz";
+      path = fetchurl {
+        name = "follow_redirects___follow_redirects_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz";
+        sha1 = "489ebc198dc0e7f64167bd23b03c4c19b5784c76";
+      };
+    }
+
+    {
+      name = "for_in___for_in_1.0.2.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    }
+
+    {
+      name = "for_own___for_own_0.1.5.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
+        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
+      };
+    }
+
+    {
+      name = "for_own___for_own_1.0.0.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
+        sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
+      };
+    }
+
+    {
+      name = "forever_agent___forever_agent_0.6.1.tgz";
+      path = fetchurl {
+        name = "forever_agent___forever_agent_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    }
+
+    {
+      name = "form_data___form_data_2.3.3.tgz";
+      path = fetchurl {
+        name = "form_data___form_data_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz";
+        sha1 = "dcce52c05f644f298c6a7ab936bd724ceffbf3a6";
+      };
+    }
+
+    {
+      name = "fragment_cache___fragment_cache_0.2.1.tgz";
+      path = fetchurl {
+        name = "fragment_cache___fragment_cache_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
+        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
+      };
+    }
+
+    {
+      name = "from___from_0.1.7.tgz";
+      path = fetchurl {
+        name = "from___from_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz";
+        sha1 = "83c60afc58b9c56997007ed1a768b3ab303a44fe";
+      };
+    }
+
+    {
+      name = "fs_access___fs_access_1.0.1.tgz";
+      path = fetchurl {
+        name = "fs_access___fs_access_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz";
+        sha1 = "d6a87f262271cefebec30c553407fb995da8777a";
+      };
+    }
+
+    {
+      name = "fs_minipass___fs_minipass_1.2.5.tgz";
+      path = fetchurl {
+        name = "fs_minipass___fs_minipass_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
+        sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
+      };
+    }
+
+    {
+      name = "fs.realpath___fs.realpath_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs.realpath___fs.realpath_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    }
+
+    {
+      name = "fsevents___fsevents_1.2.7.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_1.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz";
+        sha1 = "4851b664a3783e52003b3c66eb0eee1074933aa4";
+      };
+    }
+
+    {
+      name = "fstream___fstream_1.0.11.tgz";
+      path = fetchurl {
+        name = "fstream___fstream_1.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz";
+        sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171";
+      };
+    }
+
+    {
+      name = "function_bind___function_bind_1.1.1.tgz";
+      path = fetchurl {
+        name = "function_bind___function_bind_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
+        sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
+      };
+    }
+
+    {
+      name = "gauge___gauge_2.7.4.tgz";
+      path = fetchurl {
+        name = "gauge___gauge_2.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    }
+
+    {
+      name = "gaze___gaze_0.5.2.tgz";
+      path = fetchurl {
+        name = "gaze___gaze_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz";
+        sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
+      };
+    }
+
+    {
+      name = "gaze___gaze_1.1.3.tgz";
+      path = fetchurl {
+        name = "gaze___gaze_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz";
+        sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a";
+      };
+    }
+
+    {
+      name = "get_caller_file___get_caller_file_1.0.3.tgz";
+      path = fetchurl {
+        name = "get_caller_file___get_caller_file_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
+        sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
+      };
+    }
+
+    {
+      name = "get_stdin___get_stdin_4.0.1.tgz";
+      path = fetchurl {
+        name = "get_stdin___get_stdin_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz";
+        sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe";
+      };
+    }
+
+    {
+      name = "get_value___get_value_2.0.6.tgz";
+      path = fetchurl {
+        name = "get_value___get_value_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
+        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
+      };
+    }
+
+    {
+      name = "getpass___getpass_0.1.7.tgz";
+      path = fetchurl {
+        name = "getpass___getpass_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    }
+
+    {
+      name = "glob_base___glob_base_0.3.0.tgz";
+      path = fetchurl {
+        name = "glob_base___glob_base_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
+        sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_2.0.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
+        sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
+      };
+    }
+
+    {
+      name = "glob_stream___glob_stream_3.1.18.tgz";
+      path = fetchurl {
+        name = "glob_stream___glob_stream_3.1.18.tgz";
+        url  = "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz";
+        sha1 = "9170a5f12b790306fdfe598f313f8f7954fd143b";
+      };
+    }
+
+    {
+      name = "glob_watcher___glob_watcher_0.0.6.tgz";
+      path = fetchurl {
+        name = "glob_watcher___glob_watcher_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz";
+        sha1 = "b95b4a8df74b39c83298b0c05c978b4d9a3b710b";
+      };
+    }
+
+    {
+      name = "glob2base___glob2base_0.0.12.tgz";
+      path = fetchurl {
+        name = "glob2base___glob2base_0.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz";
+        sha1 = "9d419b3e28f12e83a362164a277055922c9c0d56";
+      };
+    }
+
+    {
+      name = "glob___glob_4.5.3.tgz";
+      path = fetchurl {
+        name = "glob___glob_4.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz";
+        sha1 = "c6cb73d3226c1efef04de3c56d012f03377ee15f";
+      };
+    }
+
+    {
+      name = "glob___glob_5.0.15.tgz";
+      path = fetchurl {
+        name = "glob___glob_5.0.15.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz";
+        sha1 = "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1";
+      };
+    }
+
+    {
+      name = "glob___glob_7.1.3.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz";
+        sha1 = "3960832d3f1574108342dafd3a67b332c0969df1";
+      };
+    }
+
+    {
+      name = "glob___glob_3.1.21.tgz";
+      path = fetchurl {
+        name = "glob___glob_3.1.21.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz";
+        sha1 = "d29e0a055dea5138f4d07ed40e8982e83c2066cd";
+      };
+    }
+
+    {
+      name = "global_modules___global_modules_1.0.0.tgz";
+      path = fetchurl {
+        name = "global_modules___global_modules_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz";
+        sha1 = "6d770f0eb523ac78164d72b5e71a8877265cc3ea";
+      };
+    }
+
+    {
+      name = "global_prefix___global_prefix_1.0.2.tgz";
+      path = fetchurl {
+        name = "global_prefix___global_prefix_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz";
+        sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe";
+      };
+    }
+
+    {
+      name = "globule___globule_1.2.1.tgz";
+      path = fetchurl {
+        name = "globule___globule_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz";
+        sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d";
+      };
+    }
+
+    {
+      name = "globule___globule_0.1.0.tgz";
+      path = fetchurl {
+        name = "globule___globule_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz";
+        sha1 = "d9c8edde1da79d125a151b79533b978676346ae5";
+      };
+    }
+
+    {
+      name = "glogg___glogg_1.0.2.tgz";
+      path = fetchurl {
+        name = "glogg___glogg_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz";
+        sha1 = "2d7dd702beda22eb3bffadf880696da6d846313f";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_3.0.11.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_3.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz";
+        sha1 = "7613c778a1afea62f25c630a086d7f3acbbdd818";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_4.1.15.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz";
+        sha1 = "ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_1.2.3.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz";
+        sha1 = "15a4806a57547cb2d2dbf27f42e89a8c3451b364";
+      };
+    }
+
+    {
+      name = "guanlecoja___guanlecoja_0.8.8.tgz";
+      path = fetchurl {
+        name = "guanlecoja___guanlecoja_0.8.8.tgz";
+        url  = "https://registry.yarnpkg.com/guanlecoja/-/guanlecoja-0.8.8.tgz";
+        sha1 = "210099a9f4ea9bf80d78fda730226f7862478a26";
+      };
+    }
+
+    {
+      name = "gulp_livereload___gulp_livereload_3.8.1.tgz";
+      path = fetchurl {
+        name = "gulp_livereload___gulp_livereload_3.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz";
+        sha1 = "00f744b2d749d3e9e3746589c8a44acac779b50f";
+      };
+    }
+
+    {
+      name = "gulp_ng_classify___gulp_ng_classify_4.0.1.tgz";
+      path = fetchurl {
+        name = "gulp_ng_classify___gulp_ng_classify_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/gulp-ng-classify/-/gulp-ng-classify-4.0.1.tgz";
+        sha1 = "3019161127c35c317ea08dc2a65ea35b592dbfd7";
+      };
+    }
+
+    {
+      name = "gulp_sass___gulp_sass_3.2.1.tgz";
+      path = fetchurl {
+        name = "gulp_sass___gulp_sass_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-3.2.1.tgz";
+        sha1 = "2e3688a96fd8be1c0c01340750c191b2e79fab94";
+      };
+    }
+
+    {
+      name = "gulp_util___gulp_util_3.0.8.tgz";
+      path = fetchurl {
+        name = "gulp_util___gulp_util_3.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz";
+        sha1 = "0054e1e744502e27c04c187c3ecc505dd54bbb4f";
+      };
+    }
+
+    {
+      name = "gulp___gulp_3.9.0.tgz";
+      path = fetchurl {
+        name = "gulp___gulp_3.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/gulp/-/gulp-3.9.0.tgz";
+        sha1 = "cf1fba4cb558bb8c6ae6c9613f583ae2620d214a";
+      };
+    }
+
+    {
+      name = "gulplog___gulplog_1.0.0.tgz";
+      path = fetchurl {
+        name = "gulplog___gulplog_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz";
+        sha1 = "e28c4d45d05ecbbed818363ce8f9c5926229ffe5";
+      };
+    }
+
+    {
+      name = "handlebars___handlebars_4.1.0.tgz";
+      path = fetchurl {
+        name = "handlebars___handlebars_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz";
+        sha1 = "0d6a6f34ff1f63cecec8423aa4169827bf787c3a";
+      };
+    }
+
+    {
+      name = "har_schema___har_schema_2.0.0.tgz";
+      path = fetchurl {
+        name = "har_schema___har_schema_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    }
+
+    {
+      name = "har_validator___har_validator_5.1.3.tgz";
+      path = fetchurl {
+        name = "har_validator___har_validator_5.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz";
+        sha1 = "1ef89ebd3e4996557675eed9893110dc350fa080";
+      };
+    }
+
+    {
+      name = "has_ansi___has_ansi_0.1.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz";
+        sha1 = "84f265aae8c0e6a88a12d7022894b7568894c62e";
+      };
+    }
+
+    {
+      name = "has_ansi___has_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    }
+
+    {
+      name = "has_binary___has_binary_0.1.7.tgz";
+      path = fetchurl {
+        name = "has_binary___has_binary_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz";
+        sha1 = "68e61eb16210c9545a0a5cce06a873912fe1e68c";
+      };
+    }
+
+    {
+      name = "has_cors___has_cors_1.1.0.tgz";
+      path = fetchurl {
+        name = "has_cors___has_cors_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
+        sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
+      };
+    }
+
+    {
+      name = "has_gulplog___has_gulplog_0.1.0.tgz";
+      path = fetchurl {
+        name = "has_gulplog___has_gulplog_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz";
+        sha1 = "6414c82913697da51590397dafb12f22967811ce";
+      };
+    }
+
+    {
+      name = "has_unicode___has_unicode_2.0.1.tgz";
+      path = fetchurl {
+        name = "has_unicode___has_unicode_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    }
+
+    {
+      name = "has_value___has_value_0.3.1.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
+        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
+      };
+    }
+
+    {
+      name = "has_value___has_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
+        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
+      };
+    }
+
+    {
+      name = "has_values___has_values_0.1.4.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    }
+
+    {
+      name = "has_values___has_values_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
+        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
+      };
+    }
+
+    {
+      name = "has___has_1.0.3.tgz";
+      path = fetchurl {
+        name = "has___has_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
+        sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
+      };
+    }
+
+    {
+      name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
+      path = fetchurl {
+        name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz";
+        sha1 = "743298cef4e5af3e194161fbadcc2151d3a058e8";
+      };
+    }
+
+    {
+      name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
+        sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.6.3.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
+        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.3.1.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz";
+        sha1 = "197e22cdebd4198585e8694ef6786197b91ed942";
+      };
+    }
+
+    {
+      name = "http_parser_js___http_parser_js_0.5.0.tgz";
+      path = fetchurl {
+        name = "http_parser_js___http_parser_js_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz";
+        sha1 = "d65edbede84349d0dc30320815a15d39cc3cbbd8";
+      };
+    }
+
+    {
+      name = "http_proxy___http_proxy_1.17.0.tgz";
+      path = fetchurl {
+        name = "http_proxy___http_proxy_1.17.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz";
+        sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a";
+      };
+    }
+
+    {
+      name = "http_signature___http_signature_1.2.0.tgz";
+      path = fetchurl {
+        name = "http_signature___http_signature_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.13.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.13.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz";
+        sha1 = "1f88aba4ab0b1508e8312acc39345f36e992e2f2";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.23.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.23.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
+        sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.24.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.24.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
+      };
+    }
+
+    {
+      name = "ignore_walk___ignore_walk_3.0.1.tgz";
+      path = fetchurl {
+        name = "ignore_walk___ignore_walk_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
+        sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
+      };
+    }
+
+    {
+      name = "in_publish___in_publish_2.0.0.tgz";
+      path = fetchurl {
+        name = "in_publish___in_publish_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz";
+        sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51";
+      };
+    }
+
+    {
+      name = "indent_string___indent_string_2.1.0.tgz";
+      path = fetchurl {
+        name = "indent_string___indent_string_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz";
+        sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80";
+      };
+    }
+
+    {
+      name = "indexof___indexof_0.0.1.tgz";
+      path = fetchurl {
+        name = "indexof___indexof_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    }
+
+    {
+      name = "inflight___inflight_1.0.6.tgz";
+      path = fetchurl {
+        name = "inflight___inflight_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    }
+
+    {
+      name = "inherits___inherits_1.0.2.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz";
+        sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.3.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    }
+
+    {
+      name = "ini___ini_1.3.5.tgz";
+      path = fetchurl {
+        name = "ini___ini_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
+        sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
+      };
+    }
+
+    {
+      name = "interpret___interpret_0.6.6.tgz";
+      path = fetchurl {
+        name = "interpret___interpret_0.6.6.tgz";
+        url  = "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz";
+        sha1 = "fecd7a18e7ce5ca6abfb953e1f86213a49f1625b";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_1.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
+        sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
+      };
+    }
+
+    {
+      name = "is_absolute___is_absolute_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_absolute___is_absolute_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz";
+        sha1 = "395e1ae84b11f26ad1795e73c17378e48a301576";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
+        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
+        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
+      };
+    }
+
+    {
+      name = "is_binary_path___is_binary_path_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
+        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
+      };
+    }
+
+    {
+      name = "is_buffer___is_buffer_1.1.6.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
+        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
+        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
+        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
+        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
+      };
+    }
+
+    {
+      name = "is_dotfile___is_dotfile_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_dotfile___is_dotfile_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
+        sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
+      };
+    }
+
+    {
+      name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+      path = fetchurl {
+        name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
+        sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
+        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
+        sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_2.1.1.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
+        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
+      };
+    }
+
+    {
+      name = "is_finite___is_finite_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_finite___is_finite_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
+        sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_2.0.1.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
+        sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_3.1.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
+        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
+      };
+    }
+
+    {
+      name = "is_number___is_number_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz";
+        sha1 = "69a7af116963d47206ec9bd9b48a14216f1e3806";
+      };
+    }
+
+    {
+      name = "is_number___is_number_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
+        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
+      };
+    }
+
+    {
+      name = "is_number___is_number_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
+        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
+      };
+    }
+
+    {
+      name = "is_number___is_number_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
+        sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
+      };
+    }
+
+    {
+      name = "is_plain_object___is_plain_object_2.0.4.tgz";
+      path = fetchurl {
+        name = "is_plain_object___is_plain_object_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
+      };
+    }
+
+    {
+      name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
+        sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
+      };
+    }
+
+    {
+      name = "is_primitive___is_primitive_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_primitive___is_primitive_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
+        sha1 = "207bab91638499c07b2adf240a41a87210034575";
+      };
+    }
+
+    {
+      name = "is_relative___is_relative_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_relative___is_relative_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz";
+        sha1 = "a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d";
+      };
+    }
+
+    {
+      name = "is_typedarray___is_typedarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_typedarray___is_typedarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    }
+
+    {
+      name = "is_unc_path___is_unc_path_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_unc_path___is_unc_path_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz";
+        sha1 = "d731e8898ed090a12c352ad2eaed5095ad322c9d";
+      };
+    }
+
+    {
+      name = "is_utf8___is_utf8_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_utf8___is_utf8_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
+        sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
+      };
+    }
+
+    {
+      name = "is_windows___is_windows_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_windows___is_windows_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
+        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
+      };
+    }
+
+    {
+      name = "is___is_3.3.0.tgz";
+      path = fetchurl {
+        name = "is___is_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz";
+        sha1 = "61cff6dd3c4193db94a3d62582072b44e5645d79";
+      };
+    }
+
+    {
+      name = "isarray___isarray_0.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    }
+
+    {
+      name = "isarray___isarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    }
+
+    {
+      name = "isbinaryfile___isbinaryfile_3.0.3.tgz";
+      path = fetchurl {
+        name = "isbinaryfile___isbinaryfile_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz";
+        sha1 = "5d6def3edebf6e8ca8cae9c30183a804b5f8be80";
+      };
+    }
+
+    {
+      name = "isexe___isexe_2.0.0.tgz";
+      path = fetchurl {
+        name = "isexe___isexe_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    }
+
+    {
+      name = "isobject___isobject_2.1.0.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
+        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
+      };
+    }
+
+    {
+      name = "isobject___isobject_3.0.1.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    }
+
+    {
+      name = "isstream___isstream_0.1.2.tgz";
+      path = fetchurl {
+        name = "isstream___isstream_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    }
+
+    {
+      name = "istanbul___istanbul_0.4.5.tgz";
+      path = fetchurl {
+        name = "istanbul___istanbul_0.4.5.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz";
+        sha1 = "65c7d73d4c4da84d4f3ac310b918fb0b8033733b";
+      };
+    }
+
+    {
+      name = "jasmine_core___jasmine_core_2.99.1.tgz";
+      path = fetchurl {
+        name = "jasmine_core___jasmine_core_2.99.1.tgz";
+        url  = "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.99.1.tgz";
+        sha1 = "e6400df1e6b56e130b61c4bcd093daa7f6e8ca15";
+      };
+    }
+
+    {
+      name = "js_base64___js_base64_2.5.1.tgz";
+      path = fetchurl {
+        name = "js_base64___js_base64_2.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz";
+        sha1 = "1efa39ef2c5f7980bb1784ade4a8af2de3291121";
+      };
+    }
+
+    {
+      name = "js_yaml___js_yaml_3.12.2.tgz";
+      path = fetchurl {
+        name = "js_yaml___js_yaml_3.12.2.tgz";
+        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz";
+        sha1 = "ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc";
+      };
+    }
+
+    {
+      name = "jsbn___jsbn_0.1.1.tgz";
+      path = fetchurl {
+        name = "jsbn___jsbn_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    }
+
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
+      };
+    }
+
+    {
+      name = "json_schema___json_schema_0.2.3.tgz";
+      path = fetchurl {
+        name = "json_schema___json_schema_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    }
+
+    {
+      name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+      path = fetchurl {
+        name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    }
+
+    {
+      name = "json3___json3_3.3.2.tgz";
+      path = fetchurl {
+        name = "json3___json3_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
+        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+      };
+    }
+
+    {
+      name = "jsprim___jsprim_1.4.1.tgz";
+      path = fetchurl {
+        name = "jsprim___jsprim_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    }
+
+    {
+      name = "karma_chrome_launcher___karma_chrome_launcher_2.1.1.tgz";
+      path = fetchurl {
+        name = "karma_chrome_launcher___karma_chrome_launcher_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz";
+        sha1 = "216879c68ac04d8d5140e99619ba04b59afd46cf";
+      };
+    }
+
+    {
+      name = "karma_coffee_preprocessor___karma_coffee_preprocessor_0.3.0.tgz";
+      path = fetchurl {
+        name = "karma_coffee_preprocessor___karma_coffee_preprocessor_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/karma-coffee-preprocessor/-/karma-coffee-preprocessor-0.3.0.tgz";
+        sha1 = "a4d8dc2b145bfef458a203d308b63bc03c9b4259";
+      };
+    }
+
+    {
+      name = "karma_coverage___karma_coverage_0.5.5.tgz";
+      path = fetchurl {
+        name = "karma_coverage___karma_coverage_0.5.5.tgz";
+        url  = "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-0.5.5.tgz";
+        sha1 = "b0d58b1025d59d5c6620263186f1d58f5d5348c5";
+      };
+    }
+
+    {
+      name = "karma_jasmine___karma_jasmine_0.3.8.tgz";
+      path = fetchurl {
+        name = "karma_jasmine___karma_jasmine_0.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-0.3.8.tgz";
+        sha1 = "5b6457791ad9b89aa173f079e3ebe1b8c805236c";
+      };
+    }
+
+    {
+      name = "karma_sourcemap_loader___karma_sourcemap_loader_0.3.7.tgz";
+      path = fetchurl {
+        name = "karma_sourcemap_loader___karma_sourcemap_loader_0.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz";
+        sha1 = "91322c77f8f13d46fed062b042e1009d4c4505d8";
+      };
+    }
+
+    {
+      name = "karma___karma_0.13.22.tgz";
+      path = fetchurl {
+        name = "karma___karma_0.13.22.tgz";
+        url  = "https://registry.yarnpkg.com/karma/-/karma-0.13.22.tgz";
+        sha1 = "07750b1bd063d7e7e7b91bcd2e6354d8f2aa8744";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_3.2.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_4.0.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
+        sha1 = "20813df3d712928b207378691a45066fae72dd57";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_5.1.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
+        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_6.0.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
+        sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
+      };
+    }
+
+    {
+      name = "lcid___lcid_1.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
+        sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
+      };
+    }
+
+    {
+      name = "levn___levn_0.3.0.tgz";
+      path = fetchurl {
+        name = "levn___levn_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    }
+
+    {
+      name = "liftoff___liftoff_2.5.0.tgz";
+      path = fetchurl {
+        name = "liftoff___liftoff_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz";
+        sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec";
+      };
+    }
+
+    {
+      name = "livereload_js___livereload_js_2.4.0.tgz";
+      path = fetchurl {
+        name = "livereload_js___livereload_js_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz";
+        sha1 = "447c31cf1ea9ab52fc20db615c5ddf678f78009c";
+      };
+    }
+
+    {
+      name = "load_json_file___load_json_file_1.1.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
+        sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
+      };
+    }
+
+    {
+      name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
+      path = fetchurl {
+        name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz";
+        sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e";
+      };
+    }
+
+    {
+      name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz";
+        sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36";
+      };
+    }
+
+    {
+      name = "lodash._basetostring___lodash._basetostring_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._basetostring___lodash._basetostring_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz";
+        sha1 = "d1861d877f824a52f669832dcaf3ee15566a07d5";
+      };
+    }
+
+    {
+      name = "lodash._basevalues___lodash._basevalues_3.0.0.tgz";
+      path = fetchurl {
+        name = "lodash._basevalues___lodash._basevalues_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz";
+        sha1 = "5b775762802bde3d3297503e26300820fdf661b7";
+      };
+    }
+
+    {
+      name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz";
+        sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e";
+      };
+    }
+
+    {
+      name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
+      path = fetchurl {
+        name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz";
+        sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11";
+      };
+    }
+
+    {
+      name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
+      path = fetchurl {
+        name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz";
+        sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5";
+      };
+    }
+
+    {
+      name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
+      path = fetchurl {
+        name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz";
+        sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c";
+      };
+    }
+
+    {
+      name = "lodash._reescape___lodash._reescape_3.0.0.tgz";
+      path = fetchurl {
+        name = "lodash._reescape___lodash._reescape_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz";
+        sha1 = "2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a";
+      };
+    }
+
+    {
+      name = "lodash._reevaluate___lodash._reevaluate_3.0.0.tgz";
+      path = fetchurl {
+        name = "lodash._reevaluate___lodash._reevaluate_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz";
+        sha1 = "58bc74c40664953ae0b124d806996daca431e2ed";
+      };
+    }
+
+    {
+      name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
+      path = fetchurl {
+        name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz";
+        sha1 = "0ccf2d89166af03b3663c796538b75ac6e114d9d";
+      };
+    }
+
+    {
+      name = "lodash._root___lodash._root_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._root___lodash._root_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz";
+        sha1 = "fba1c4524c19ee9a5f8136b4609f017cf4ded692";
+      };
+    }
+
+    {
+      name = "lodash.assign___lodash.assign_3.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.assign___lodash.assign_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz";
+        sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa";
+      };
+    }
+
+    {
+      name = "lodash.assign___lodash.assign_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.assign___lodash.assign_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
+        sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
+      };
+    }
+
+    {
+      name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
+        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
+      };
+    }
+
+    {
+      name = "lodash.escape___lodash.escape_3.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.escape___lodash.escape_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz";
+        sha1 = "995ee0dc18c1b48cc92effae71a10aab5b487698";
+      };
+    }
+
+    {
+      name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
+      path = fetchurl {
+        name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz";
+        sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a";
+      };
+    }
+
+    {
+      name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
+      path = fetchurl {
+        name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz";
+        sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55";
+      };
+    }
+
+    {
+      name = "lodash.keys___lodash.keys_3.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.keys___lodash.keys_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz";
+        sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a";
+      };
+    }
+
+    {
+      name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
+      path = fetchurl {
+        name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz";
+        sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927";
+      };
+    }
+
+    {
+      name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
+      path = fetchurl {
+        name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz";
+        sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805";
+      };
+    }
+
+    {
+      name = "lodash.template___lodash.template_3.6.2.tgz";
+      path = fetchurl {
+        name = "lodash.template___lodash.template_3.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz";
+        sha1 = "f8cdecc6169a255be9098ae8b0c53d378931d14f";
+      };
+    }
+
+    {
+      name = "lodash.templatesettings___lodash.templatesettings_3.1.1.tgz";
+      path = fetchurl {
+        name = "lodash.templatesettings___lodash.templatesettings_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz";
+        sha1 = "fb307844753b66b9f1afa54e262c745307dba8e5";
+      };
+    }
+
+    {
+      name = "lodash___lodash_3.10.1.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_3.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz";
+        sha1 = "5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+      };
+    }
+
+    {
+      name = "lodash___lodash_4.17.11.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.11.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz";
+        sha1 = "b39ea6229ef607ecd89e2c8df12536891cac9b8d";
+      };
+    }
+
+    {
+      name = "lodash___lodash_1.0.2.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz";
+        sha1 = "8f57560c83b59fc270bd3d561b690043430e2551";
+      };
+    }
+
+    {
+      name = "log4js___log4js_0.6.38.tgz";
+      path = fetchurl {
+        name = "log4js___log4js_0.6.38.tgz";
+        url  = "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz";
+        sha1 = "2c494116695d6fb25480943d3fc872e662a522fd";
+      };
+    }
+
+    {
+      name = "loophole___loophole_1.1.0.tgz";
+      path = fetchurl {
+        name = "loophole___loophole_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/loophole/-/loophole-1.1.0.tgz";
+        sha1 = "37949fea453b6256acc725c320ce0c5a7f70a2bd";
+      };
+    }
+
+    {
+      name = "loud_rejection___loud_rejection_1.6.0.tgz";
+      path = fetchurl {
+        name = "loud_rejection___loud_rejection_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz";
+        sha1 = "5b46f80147edee578870f086d04821cf998e551f";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_2.7.3.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_2.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz";
+        sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_4.1.5.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_4.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz";
+        sha1 = "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
+      };
+    }
+
+    {
+      name = "make_iterator___make_iterator_1.0.1.tgz";
+      path = fetchurl {
+        name = "make_iterator___make_iterator_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz";
+        sha1 = "29b33f312aa8f547c4a5e490f56afcec99133ad6";
+      };
+    }
+
+    {
+      name = "map_cache___map_cache_0.2.2.tgz";
+      path = fetchurl {
+        name = "map_cache___map_cache_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
+        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
+      };
+    }
+
+    {
+      name = "map_obj___map_obj_1.0.1.tgz";
+      path = fetchurl {
+        name = "map_obj___map_obj_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
+        sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
+      };
+    }
+
+    {
+      name = "map_stream___map_stream_0.0.7.tgz";
+      path = fetchurl {
+        name = "map_stream___map_stream_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz";
+        sha1 = "8a1f07896d82b10926bd3744a2420009f88974a8";
+      };
+    }
+
+    {
+      name = "map_visit___map_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "map_visit___map_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
+        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
+      };
+    }
+
+    {
+      name = "math_random___math_random_1.0.4.tgz";
+      path = fetchurl {
+        name = "math_random___math_random_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz";
+        sha1 = "5dd6943c938548267016d4e34f057583080c514c";
+      };
+    }
+
+    {
+      name = "media_typer___media_typer_0.3.0.tgz";
+      path = fetchurl {
+        name = "media_typer___media_typer_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    }
+
+    {
+      name = "meow___meow_3.7.0.tgz";
+      path = fetchurl {
+        name = "meow___meow_3.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz";
+        sha1 = "72cb668b425228290abbfa856892587308a801fb";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_2.3.11.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_2.3.11.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
+        sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_3.1.10.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_3.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
+        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
+      };
+    }
+
+    {
+      name = "mime_db___mime_db_1.38.0.tgz";
+      path = fetchurl {
+        name = "mime_db___mime_db_1.38.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz";
+        sha1 = "1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad";
+      };
+    }
+
+    {
+      name = "mime_types___mime_types_2.1.22.tgz";
+      path = fetchurl {
+        name = "mime_types___mime_types_2.1.22.tgz";
+        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz";
+        sha1 = "fe6b355a190926ab7698c9a0556a11199b2199bd";
+      };
+    }
+
+    {
+      name = "mime___mime_1.6.0.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
+        sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
+      };
+    }
+
+    {
+      name = "mini_lr___mini_lr_0.1.9.tgz";
+      path = fetchurl {
+        name = "mini_lr___mini_lr_0.1.9.tgz";
+        url  = "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz";
+        sha1 = "02199d27347953d1fd1d6dbded4261f187b2d0f6";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_3.0.4.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
+        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_2.0.10.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_2.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz";
+        sha1 = "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_0.2.14.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_0.2.14.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz";
+        sha1 = "c74e780574f63c6f9a090e90efbe6ef53a6a756a";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.8.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    }
+
+    {
+      name = "minimist___minimist_1.2.0.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
+        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.10.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz";
+        sha1 = "de3f98543dbf96082be48ad1a0c7cda836301dcf";
+      };
+    }
+
+    {
+      name = "minipass___minipass_2.3.5.tgz";
+      path = fetchurl {
+        name = "minipass___minipass_2.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz";
+        sha1 = "cacebe492022497f656b0f0f51e2682a9ed2d848";
+      };
+    }
+
+    {
+      name = "minizlib___minizlib_1.2.1.tgz";
+      path = fetchurl {
+        name = "minizlib___minizlib_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz";
+        sha1 = "dd27ea6136243c7c880684e8672bb3a45fd9b614";
+      };
+    }
+
+    {
+      name = "mixin_deep___mixin_deep_1.3.1.tgz";
+      path = fetchurl {
+        name = "mixin_deep___mixin_deep_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
+        sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
+      };
+    }
+
+    {
+      name = "mkdirp___mkdirp_0.5.1.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    }
+
+    {
+      name = "ms___ms_0.7.1.tgz";
+      path = fetchurl {
+        name = "ms___ms_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz";
+        sha1 = "9cd13c03adbff25b65effde7ce864ee952017098";
+      };
+    }
+
+    {
+      name = "ms___ms_0.7.2.tgz";
+      path = fetchurl {
+        name = "ms___ms_0.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz";
+        sha1 = "ae25cf2512b3885a1d95d7f037868d8431124765";
+      };
+    }
+
+    {
+      name = "ms___ms_2.0.0.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    }
+
+    {
+      name = "ms___ms_2.1.1.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz";
+        sha1 = "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a";
+      };
+    }
+
+    {
+      name = "multipipe___multipipe_0.1.2.tgz";
+      path = fetchurl {
+        name = "multipipe___multipipe_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz";
+        sha1 = "2a8f2ddf70eed564dff2d57f1e1a137d9f05078b";
+      };
+    }
+
+    {
+      name = "nan___nan_2.12.1.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz";
+        sha1 = "7b1aa193e9aa86057e3c7bbd0ac448e770925552";
+      };
+    }
+
+    {
+      name = "nanomatch___nanomatch_1.2.13.tgz";
+      path = fetchurl {
+        name = "nanomatch___nanomatch_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
+        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
+      };
+    }
+
+    {
+      name = "natives___natives_1.1.6.tgz";
+      path = fetchurl {
+        name = "natives___natives_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz";
+        sha1 = "a603b4a498ab77173612b9ea1acdec4d980f00bb";
+      };
+    }
+
+    {
+      name = "needle___needle_2.2.4.tgz";
+      path = fetchurl {
+        name = "needle___needle_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz";
+        sha1 = "51931bff82533b1928b7d1d69e01f1b00ffd2a4e";
+      };
+    }
+
+    {
+      name = "negotiator___negotiator_0.6.1.tgz";
+      path = fetchurl {
+        name = "negotiator___negotiator_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
+        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
+      };
+    }
+
+    {
+      name = "ng_classify___ng_classify_4.1.1.tgz";
+      path = fetchurl {
+        name = "ng_classify___ng_classify_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ng-classify/-/ng-classify-4.1.1.tgz";
+        sha1 = "6688b924c3c9b5f94da5f8fbc0d55176f3dda122";
+      };
+    }
+
+    {
+      name = "node_gyp___node_gyp_3.8.0.tgz";
+      path = fetchurl {
+        name = "node_gyp___node_gyp_3.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz";
+        sha1 = "540304261c330e80d0d5edce253a68cb3964218c";
+      };
+    }
+
+    {
+      name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+      path = fetchurl {
+        name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
+        sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
+      };
+    }
+
+    {
+      name = "node_sass___node_sass_4.11.0.tgz";
+      path = fetchurl {
+        name = "node_sass___node_sass_4.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz";
+        sha1 = "183faec398e9cbe93ba43362e2768ca988a6369a";
+      };
+    }
+
+    {
+      name = "node.extend___node.extend_1.1.8.tgz";
+      path = fetchurl {
+        name = "node.extend___node.extend_1.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz";
+        sha1 = "0aab3e63789f4e6d68b42bc00073ad1881243cf0";
+      };
+    }
+
+    {
+      name = "nopt___nopt_3.0.6.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_3.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
+        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
+      };
+    }
+
+    {
+      name = "nopt___nopt_4.0.1.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
+        sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
+      };
+    }
+
+    {
+      name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz";
+        sha1 = "e66db1838b200c1dfc233225d12cb36520e234a8";
+      };
+    }
+
+    {
+      name = "normalize_path___normalize_path_2.1.1.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
+        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
+      };
+    }
+
+    {
+      name = "npm_bundled___npm_bundled_1.0.6.tgz";
+      path = fetchurl {
+        name = "npm_bundled___npm_bundled_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz";
+        sha1 = "e7ba9aadcef962bb61248f91721cd932b3fe6bdd";
+      };
+    }
+
+    {
+      name = "npm_packlist___npm_packlist_1.4.1.tgz";
+      path = fetchurl {
+        name = "npm_packlist___npm_packlist_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz";
+        sha1 = "19064cdf988da80ea3cee45533879d90192bbfbc";
+      };
+    }
+
+    {
+      name = "npmlog___npmlog_4.1.2.tgz";
+      path = fetchurl {
+        name = "npmlog___npmlog_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
+        sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
+      };
+    }
+
+    {
+      name = "null_check___null_check_1.0.0.tgz";
+      path = fetchurl {
+        name = "null_check___null_check_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz";
+        sha1 = "977dffd7176012b9ec30d2a39db5cf72a0439edd";
+      };
+    }
+
+    {
+      name = "number_is_nan___number_is_nan_1.0.1.tgz";
+      path = fetchurl {
+        name = "number_is_nan___number_is_nan_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    }
+
+    {
+      name = "oauth_sign___oauth_sign_0.9.0.tgz";
+      path = fetchurl {
+        name = "oauth_sign___oauth_sign_0.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha1 = "47a7b016baa68b5fa0ecf3dee08a85c679ac6455";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.0.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz";
+        sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_3.0.0.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz";
+        sha1 = "9bedd5ca0897949bca47e7ff408062d549f587f2";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.1.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    }
+
+    {
+      name = "object_component___object_component_0.0.3.tgz";
+      path = fetchurl {
+        name = "object_component___object_component_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    }
+
+    {
+      name = "object_copy___object_copy_0.1.0.tgz";
+      path = fetchurl {
+        name = "object_copy___object_copy_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
+        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
+      };
+    }
+
+    {
+      name = "object_visit___object_visit_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_visit___object_visit_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
+        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
+      };
+    }
+
+    {
+      name = "object.defaults___object.defaults_1.1.0.tgz";
+      path = fetchurl {
+        name = "object.defaults___object.defaults_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz";
+        sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
+      };
+    }
+
+    {
+      name = "object.map___object.map_1.0.1.tgz";
+      path = fetchurl {
+        name = "object.map___object.map_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz";
+        sha1 = "cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37";
+      };
+    }
+
+    {
+      name = "object.omit___object.omit_2.0.1.tgz";
+      path = fetchurl {
+        name = "object.omit___object.omit_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
+        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
+      };
+    }
+
+    {
+      name = "object.pick___object.pick_1.3.0.tgz";
+      path = fetchurl {
+        name = "object.pick___object.pick_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    }
+
+    {
+      name = "on_finished___on_finished_2.3.0.tgz";
+      path = fetchurl {
+        name = "on_finished___on_finished_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    }
+
+    {
+      name = "once___once_1.4.0.tgz";
+      path = fetchurl {
+        name = "once___once_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    }
+
+    {
+      name = "once___once_1.3.3.tgz";
+      path = fetchurl {
+        name = "once___once_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz";
+        sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
+      };
+    }
+
+    {
+      name = "optimist___optimist_0.6.1.tgz";
+      path = fetchurl {
+        name = "optimist___optimist_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz";
+        sha1 = "da3ea74686fa21a19a111c326e90eb15a0196686";
+      };
+    }
+
+    {
+      name = "optionator___optionator_0.8.2.tgz";
+      path = fetchurl {
+        name = "optionator___optionator_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz";
+        sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
+      };
+    }
+
+    {
+      name = "options___options_0.0.6.tgz";
+      path = fetchurl {
+        name = "options___options_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz";
+        sha1 = "ec22d312806bb53e731773e7cdaefcf1c643128f";
+      };
+    }
+
+    {
+      name = "orchestrator___orchestrator_0.3.8.tgz";
+      path = fetchurl {
+        name = "orchestrator___orchestrator_0.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz";
+        sha1 = "14e7e9e2764f7315fbac184e506c7aa6df94ad7e";
+      };
+    }
+
+    {
+      name = "ordered_read_streams___ordered_read_streams_0.1.0.tgz";
+      path = fetchurl {
+        name = "ordered_read_streams___ordered_read_streams_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz";
+        sha1 = "fd565a9af8eb4473ba69b6ed8a34352cb552f126";
+      };
+    }
+
+    {
+      name = "os_homedir___os_homedir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_homedir___os_homedir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_1.4.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz";
+        sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9";
+      };
+    }
+
+    {
+      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    }
+
+    {
+      name = "osenv___osenv_0.1.5.tgz";
+      path = fetchurl {
+        name = "osenv___osenv_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
+        sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
+      };
+    }
+
+    {
+      name = "parse_filepath___parse_filepath_1.0.2.tgz";
+      path = fetchurl {
+        name = "parse_filepath___parse_filepath_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz";
+        sha1 = "a632127f53aaf3d15876f5872f3ffac763d6c891";
+      };
+    }
+
+    {
+      name = "parse_glob___parse_glob_3.0.4.tgz";
+      path = fetchurl {
+        name = "parse_glob___parse_glob_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
+        sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
+      };
+    }
+
+    {
+      name = "parse_json___parse_json_2.2.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
+        sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
+      };
+    }
+
+    {
+      name = "parse_node_version___parse_node_version_1.0.1.tgz";
+      path = fetchurl {
+        name = "parse_node_version___parse_node_version_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz";
+        sha1 = "e2b5dbede00e7fa9bc363607f53327e8b073189b";
+      };
+    }
+
+    {
+      name = "parse_passwd___parse_passwd_1.0.0.tgz";
+      path = fetchurl {
+        name = "parse_passwd___parse_passwd_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz";
+        sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6";
+      };
+    }
+
+    {
+      name = "parsejson___parsejson_0.0.3.tgz";
+      path = fetchurl {
+        name = "parsejson___parsejson_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz";
+        sha1 = "ab7e3759f209ece99437973f7d0f1f64ae0e64ab";
+      };
+    }
+
+    {
+      name = "parseqs___parseqs_0.0.5.tgz";
+      path = fetchurl {
+        name = "parseqs___parseqs_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    }
+
+    {
+      name = "parseuri___parseuri_0.0.5.tgz";
+      path = fetchurl {
+        name = "parseuri___parseuri_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    }
+
+    {
+      name = "parseurl___parseurl_1.3.2.tgz";
+      path = fetchurl {
+        name = "parseurl___parseurl_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
+        sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
+      };
+    }
+
+    {
+      name = "pascalcase___pascalcase_0.1.1.tgz";
+      path = fetchurl {
+        name = "pascalcase___pascalcase_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
+        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_2.1.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
+        sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
+      };
+    }
+
+    {
+      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+      path = fetchurl {
+        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    }
+
+    {
+      name = "path_parse___path_parse_1.0.6.tgz";
+      path = fetchurl {
+        name = "path_parse___path_parse_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
+        sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
+      };
+    }
+
+    {
+      name = "path_root_regex___path_root_regex_0.1.2.tgz";
+      path = fetchurl {
+        name = "path_root_regex___path_root_regex_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz";
+        sha1 = "bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d";
+      };
+    }
+
+    {
+      name = "path_root___path_root_0.1.1.tgz";
+      path = fetchurl {
+        name = "path_root___path_root_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz";
+        sha1 = "9a4a6814cac1c0cd73360a95f32083c8ea4745b7";
+      };
+    }
+
+    {
+      name = "path_type___path_type_1.1.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
+        sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
+      };
+    }
+
+    {
+      name = "pause_stream___pause_stream_0.0.11.tgz";
+      path = fetchurl {
+        name = "pause_stream___pause_stream_0.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz";
+        sha1 = "fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_2.1.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    }
+
+    {
+      name = "pify___pify_2.3.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    }
+
+    {
+      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+      path = fetchurl {
+        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    }
+
+    {
+      name = "pinkie___pinkie_2.0.4.tgz";
+      path = fetchurl {
+        name = "pinkie___pinkie_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    }
+
+    {
+      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+      path = fetchurl {
+        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
+        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
+      };
+    }
+
+    {
+      name = "prelude_ls___prelude_ls_1.1.2.tgz";
+      path = fetchurl {
+        name = "prelude_ls___prelude_ls_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
+      };
+    }
+
+    {
+      name = "preserve___preserve_0.2.0.tgz";
+      path = fetchurl {
+        name = "preserve___preserve_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
+        sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
+      };
+    }
+
+    {
+      name = "pretty_hrtime___pretty_hrtime_1.0.3.tgz";
+      path = fetchurl {
+        name = "pretty_hrtime___pretty_hrtime_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz";
+        sha1 = "b7e3ea42435a4c9b2759d99e0f201eb195802ee1";
+      };
+    }
+
+    {
+      name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+      path = fetchurl {
+        name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
+        sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
+      };
+    }
+
+    {
+      name = "pseudomap___pseudomap_1.0.2.tgz";
+      path = fetchurl {
+        name = "pseudomap___pseudomap_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
+        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
+      };
+    }
+
+    {
+      name = "psl___psl_1.1.31.tgz";
+      path = fetchurl {
+        name = "psl___psl_1.1.31.tgz";
+        url  = "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz";
+        sha1 = "e9aa86d0101b5b105cbe93ac6b784cd547276184";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.4.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    }
+
+    {
+      name = "punycode___punycode_2.1.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
+        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
+      };
+    }
+
+    {
+      name = "qs___qs_5.2.0.tgz";
+      path = fetchurl {
+        name = "qs___qs_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz";
+        sha1 = "a9f31142af468cb72b25b30136ba2456834916be";
+      };
+    }
+
+    {
+      name = "qs___qs_6.5.2.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
+        sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
+      };
+    }
+
+    {
+      name = "qs___qs_2.2.5.tgz";
+      path = fetchurl {
+        name = "qs___qs_2.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz";
+        sha1 = "1088abaf9dcc0ae5ae45b709e6c6b5888b23923c";
+      };
+    }
+
+    {
+      name = "randomatic___randomatic_3.1.1.tgz";
+      path = fetchurl {
+        name = "randomatic___randomatic_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz";
+        sha1 = "b776efc59375984e36c537b2f51a1f0aff0da1ed";
+      };
+    }
+
+    {
+      name = "raw_body___raw_body_2.3.3.tgz";
+      path = fetchurl {
+        name = "raw_body___raw_body_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz";
+        sha1 = "1b324ece6b5706e153855bc1148c65bb7f6ea0c3";
+      };
+    }
+
+    {
+      name = "raw_body___raw_body_2.1.7.tgz";
+      path = fetchurl {
+        name = "raw_body___raw_body_2.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz";
+        sha1 = "adfeace2e4fb3098058014d08c072dcc59758774";
+      };
+    }
+
+    {
+      name = "rc___rc_1.2.8.tgz";
+      path = fetchurl {
+        name = "rc___rc_1.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
+        sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
+      };
+    }
+
+    {
+      name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
+        sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_1.1.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
+        sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_1.0.34.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.0.34.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
+        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_2.3.6.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_2.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
+        sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_1.1.14.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.1.14.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz";
+        sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
+      };
+    }
+
+    {
+      name = "readdirp___readdirp_2.2.1.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
+        sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
+      };
+    }
+
+    {
+      name = "rechoir___rechoir_0.6.2.tgz";
+      path = fetchurl {
+        name = "rechoir___rechoir_0.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz";
+        sha1 = "85204b54dba82d5742e28c96756ef43af50e3384";
+      };
+    }
+
+    {
+      name = "redent___redent_1.0.0.tgz";
+      path = fetchurl {
+        name = "redent___redent_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz";
+        sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde";
+      };
+    }
+
+    {
+      name = "regex_cache___regex_cache_0.4.4.tgz";
+      path = fetchurl {
+        name = "regex_cache___regex_cache_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
+        sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
+      };
+    }
+
+    {
+      name = "regex_not___regex_not_1.0.2.tgz";
+      path = fetchurl {
+        name = "regex_not___regex_not_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
+        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
+      };
+    }
+
+    {
+      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+      path = fetchurl {
+        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
+        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
+      };
+    }
+
+    {
+      name = "repeat_element___repeat_element_1.1.3.tgz";
+      path = fetchurl {
+        name = "repeat_element___repeat_element_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
+        sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
+      };
+    }
+
+    {
+      name = "repeat_string___repeat_string_0.2.2.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz";
+        sha1 = "c7a8d3236068362059a7e4651fc6884e8b1fb4ae";
+      };
+    }
+
+    {
+      name = "repeat_string___repeat_string_1.6.1.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    }
+
+    {
+      name = "repeating___repeating_2.0.1.tgz";
+      path = fetchurl {
+        name = "repeating___repeating_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
+        sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
+      };
+    }
+
+    {
+      name = "replace_ext___replace_ext_0.0.1.tgz";
+      path = fetchurl {
+        name = "replace_ext___replace_ext_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz";
+        sha1 = "29bbd92078a739f0bcce2b4ee41e837953522924";
+      };
+    }
+
+    {
+      name = "request___request_2.88.0.tgz";
+      path = fetchurl {
+        name = "request___request_2.88.0.tgz";
+        url  = "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz";
+        sha1 = "9c2fca4f7d35b592efe57c7f0a55e81052124fef";
+      };
+    }
+
+    {
+      name = "require_directory___require_directory_2.1.1.tgz";
+      path = fetchurl {
+        name = "require_directory___require_directory_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    }
+
+    {
+      name = "require_main_filename___require_main_filename_1.0.1.tgz";
+      path = fetchurl {
+        name = "require_main_filename___require_main_filename_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
+        sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
+      };
+    }
+
+    {
+      name = "requires_port___requires_port_1.0.0.tgz";
+      path = fetchurl {
+        name = "requires_port___requires_port_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
+        sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
+      };
+    }
+
+    {
+      name = "resolve_dir___resolve_dir_1.0.1.tgz";
+      path = fetchurl {
+        name = "resolve_dir___resolve_dir_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz";
+        sha1 = "79a40644c362be82f26effe739c9bb5382046f43";
+      };
+    }
+
+    {
+      name = "resolve_url___resolve_url_0.2.1.tgz";
+      path = fetchurl {
+        name = "resolve_url___resolve_url_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
+        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
+      };
+    }
+
+    {
+      name = "resolve___resolve_1.1.7.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz";
+        sha1 = "203114d82ad2c5ed9e8e0411b3932875e889e97b";
+      };
+    }
+
+    {
+      name = "resolve___resolve_1.10.0.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz";
+        sha1 = "3bdaaeaf45cc07f375656dfd2e54ed0810b101ba";
+      };
+    }
+
+    {
+      name = "ret___ret_0.1.15.tgz";
+      path = fetchurl {
+        name = "ret___ret_0.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
+        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+      };
+    }
+
+    {
+      name = "rimraf___rimraf_2.6.3.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz";
+        sha1 = "b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab";
+      };
+    }
+
+    {
+      name = "safe_buffer___safe_buffer_5.1.2.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
+      };
+    }
+
+    {
+      name = "safe_regex___safe_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "safe_regex___safe_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
+        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
+      };
+    }
+
+    {
+      name = "safer_buffer___safer_buffer_2.1.2.tgz";
+      path = fetchurl {
+        name = "safer_buffer___safer_buffer_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
+      };
+    }
+
+    {
+      name = "sass_graph___sass_graph_2.2.4.tgz";
+      path = fetchurl {
+        name = "sass_graph___sass_graph_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz";
+        sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49";
+      };
+    }
+
+    {
+      name = "sax___sax_1.2.4.tgz";
+      path = fetchurl {
+        name = "sax___sax_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
+        sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
+      };
+    }
+
+    {
+      name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
+      path = fetchurl {
+        name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz";
+        sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1";
+      };
+    }
+
+    {
+      name = "semver___semver_5.6.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz";
+        sha1 = "7e74256fbaa49c75aa7c7a205cc22799cac80004";
+      };
+    }
+
+    {
+      name = "semver___semver_4.3.6.tgz";
+      path = fetchurl {
+        name = "semver___semver_4.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz";
+        sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
+      };
+    }
+
+    {
+      name = "semver___semver_5.3.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
+        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+      };
+    }
+
+    {
+      name = "sequencify___sequencify_0.0.7.tgz";
+      path = fetchurl {
+        name = "sequencify___sequencify_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz";
+        sha1 = "90cff19d02e07027fd767f5ead3e7b95d1e7380c";
+      };
+    }
+
+    {
+      name = "set_blocking___set_blocking_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_blocking___set_blocking_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    }
+
+    {
+      name = "set_value___set_value_0.4.3.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_0.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
+        sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
+      };
+    }
+
+    {
+      name = "set_value___set_value_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
+        sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
+      };
+    }
+
+    {
+      name = "setprototypeof___setprototypeof_1.1.0.tgz";
+      path = fetchurl {
+        name = "setprototypeof___setprototypeof_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
+        sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
+      };
+    }
+
+    {
+      name = "sigmund___sigmund_1.0.1.tgz";
+      path = fetchurl {
+        name = "sigmund___sigmund_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz";
+        sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
+      };
+    }
+
+    {
+      name = "signal_exit___signal_exit_3.0.2.tgz";
+      path = fetchurl {
+        name = "signal_exit___signal_exit_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
+        sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
+      };
+    }
+
+    {
+      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
+        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
+      };
+    }
+
+    {
+      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
+        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
+      };
+    }
+
+    {
+      name = "snapdragon___snapdragon_0.8.2.tgz";
+      path = fetchurl {
+        name = "snapdragon___snapdragon_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
+        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
+      };
+    }
+
+    {
+      name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
+      path = fetchurl {
+        name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz";
+        sha1 = "cb6d4bb8bec81e1078b99677f9ced0046066bb8b";
+      };
+    }
+
+    {
+      name = "socket.io_client___socket.io_client_1.7.4.tgz";
+      path = fetchurl {
+        name = "socket.io_client___socket.io_client_1.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.4.tgz";
+        sha1 = "ec9f820356ed99ef6d357f0756d648717bdd4281";
+      };
+    }
+
+    {
+      name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
+      path = fetchurl {
+        name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz";
+        sha1 = "dd532025103ce429697326befd64005fcfe5b4a0";
+      };
+    }
+
+    {
+      name = "socket.io___socket.io_1.7.4.tgz";
+      path = fetchurl {
+        name = "socket.io___socket.io_1.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.4.tgz";
+        sha1 = "2f7ecedc3391bf2d5c73e291fe233e6e34d4dd00";
+      };
+    }
+
+    {
+      name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+      path = fetchurl {
+        name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
+        sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
+      };
+    }
+
+    {
+      name = "source_map_url___source_map_url_0.4.0.tgz";
+      path = fetchurl {
+        name = "source_map_url___source_map_url_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
+        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.4.4.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz";
+        sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.5.7.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.6.1.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
+        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.2.0.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz";
+        sha1 = "dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d";
+      };
+    }
+
+    {
+      name = "sparkles___sparkles_1.0.1.tgz";
+      path = fetchurl {
+        name = "sparkles___sparkles_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz";
+        sha1 = "008db65edce6c50eec0c5e228e1945061dd0437c";
+      };
+    }
+
+    {
+      name = "spdx_correct___spdx_correct_3.1.0.tgz";
+      path = fetchurl {
+        name = "spdx_correct___spdx_correct_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz";
+        sha1 = "fb83e504445268f154b074e218c87c003cd31df4";
+      };
+    }
+
+    {
+      name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+      path = fetchurl {
+        name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
+        sha1 = "2ea450aee74f2a89bfb94519c07fcd6f41322977";
+      };
+    }
+
+    {
+      name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
+        sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
+      };
+    }
+
+    {
+      name = "spdx_license_ids___spdx_license_ids_3.0.3.tgz";
+      path = fetchurl {
+        name = "spdx_license_ids___spdx_license_ids_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz";
+        sha1 = "81c0ce8f21474756148bbb5f3bfc0f36bf15d76e";
+      };
+    }
+
+    {
+      name = "split_string___split_string_3.1.0.tgz";
+      path = fetchurl {
+        name = "split_string___split_string_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
+        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
+      };
+    }
+
+    {
+      name = "split___split_1.0.1.tgz";
+      path = fetchurl {
+        name = "split___split_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz";
+        sha1 = "605bd9be303aa59fb35f9229fbea0ddec9ea07d9";
+      };
+    }
+
+    {
+      name = "sprintf_js___sprintf_js_1.0.3.tgz";
+      path = fetchurl {
+        name = "sprintf_js___sprintf_js_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    }
+
+    {
+      name = "sshpk___sshpk_1.16.1.tgz";
+      path = fetchurl {
+        name = "sshpk___sshpk_1.16.1.tgz";
+        url  = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz";
+        sha1 = "fb661c0bef29b39db40769ee39fa70093d6f6877";
+      };
+    }
+
+    {
+      name = "static_extend___static_extend_0.1.2.tgz";
+      path = fetchurl {
+        name = "static_extend___static_extend_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
+        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.5.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.3.1.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz";
+        sha1 = "faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e";
+      };
+    }
+
+    {
+      name = "stdout_stream___stdout_stream_1.4.1.tgz";
+      path = fetchurl {
+        name = "stdout_stream___stdout_stream_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz";
+        sha1 = "5ac174cdd5cd726104aa0c0b2bd83815d8d535de";
+      };
+    }
+
+    {
+      name = "stream_combiner___stream_combiner_0.2.2.tgz";
+      path = fetchurl {
+        name = "stream_combiner___stream_combiner_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz";
+        sha1 = "aec8cbac177b56b6f4fa479ced8c1912cee52858";
+      };
+    }
+
+    {
+      name = "stream_consume___stream_consume_0.1.1.tgz";
+      path = fetchurl {
+        name = "stream_consume___stream_consume_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz";
+        sha1 = "d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48";
+      };
+    }
+
+    {
+      name = "string_width___string_width_1.0.2.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    }
+
+    {
+      name = "string_width___string_width_2.1.1.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
+        sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_0.10.31.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_0.10.31.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.1.1.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_0.3.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz";
+        sha1 = "25f48ea22ca79187f3174a4db8759347bb126220";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_4.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_1.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz";
+        sha1 = "85b8862f3844b5a6d5ec8467a93598173a36f794";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_2.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
+        sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
+      };
+    }
+
+    {
+      name = "strip_indent___strip_indent_1.0.1.tgz";
+      path = fetchurl {
+        name = "strip_indent___strip_indent_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz";
+        sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2";
+      };
+    }
+
+    {
+      name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_0.2.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz";
+        sha1 = "d92de2694eb3f67323973d7ae3d8b55b4c22190a";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_2.0.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_3.2.3.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_3.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
+        sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
+      };
+    }
+
+    {
+      name = "tar___tar_2.2.1.tgz";
+      path = fetchurl {
+        name = "tar___tar_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz";
+        sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
+      };
+    }
+
+    {
+      name = "tar___tar_4.4.8.tgz";
+      path = fetchurl {
+        name = "tar___tar_4.4.8.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz";
+        sha1 = "b19eec3fde2a96e64666df9fdb40c5ca1bc3747d";
+      };
+    }
+
+    {
+      name = "through2___through2_0.6.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_0.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz";
+        sha1 = "41ab9c67b29d57209071410e1d7a7a968cd3ad48";
+      };
+    }
+
+    {
+      name = "through2___through2_2.0.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
+        sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
+      };
+    }
+
+    {
+      name = "through___through_2.3.8.tgz";
+      path = fetchurl {
+        name = "through___through_2.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    }
+
+    {
+      name = "tildify___tildify_1.2.0.tgz";
+      path = fetchurl {
+        name = "tildify___tildify_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz";
+        sha1 = "dcec03f55dca9b7aa3e5b04f21817eb56e63588a";
+      };
+    }
+
+    {
+      name = "time_stamp___time_stamp_1.1.0.tgz";
+      path = fetchurl {
+        name = "time_stamp___time_stamp_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz";
+        sha1 = "764a5a11af50561921b133f3b44e618687e0f5c3";
+      };
+    }
+
+    {
+      name = "tmp___tmp_0.0.33.tgz";
+      path = fetchurl {
+        name = "tmp___tmp_0.0.33.tgz";
+        url  = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz";
+        sha1 = "6d34335889768d21b2bcda0aa277ced3b1bfadf9";
+      };
+    }
+
+    {
+      name = "to_array___to_array_0.1.4.tgz";
+      path = fetchurl {
+        name = "to_array___to_array_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    }
+
+    {
+      name = "to_object_path___to_object_path_0.3.0.tgz";
+      path = fetchurl {
+        name = "to_object_path___to_object_path_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
+        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
+      };
+    }
+
+    {
+      name = "to_regex_range___to_regex_range_2.1.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
+        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
+      };
+    }
+
+    {
+      name = "to_regex___to_regex_3.0.2.tgz";
+      path = fetchurl {
+        name = "to_regex___to_regex_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
+        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
+      };
+    }
+
+    {
+      name = "tough_cookie___tough_cookie_2.4.3.tgz";
+      path = fetchurl {
+        name = "tough_cookie___tough_cookie_2.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz";
+        sha1 = "53f36da3f47783b0925afa06ff9f3b165280f781";
+      };
+    }
+
+    {
+      name = "trim_newlines___trim_newlines_1.0.0.tgz";
+      path = fetchurl {
+        name = "trim_newlines___trim_newlines_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz";
+        sha1 = "5887966bb582a4503a41eb524f7d35011815a613";
+      };
+    }
+
+    {
+      name = "true_case_path___true_case_path_1.0.3.tgz";
+      path = fetchurl {
+        name = "true_case_path___true_case_path_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz";
+        sha1 = "f813b5a8c86b40da59606722b144e3225799f47d";
+      };
+    }
+
+    {
+      name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+      path = fetchurl {
+        name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    }
+
+    {
+      name = "tweetnacl___tweetnacl_0.14.5.tgz";
+      path = fetchurl {
+        name = "tweetnacl___tweetnacl_0.14.5.tgz";
+        url  = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    }
+
+    {
+      name = "type_check___type_check_0.3.2.tgz";
+      path = fetchurl {
+        name = "type_check___type_check_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    }
+
+    {
+      name = "type_is___type_is_1.6.16.tgz";
+      path = fetchurl {
+        name = "type_is___type_is_1.6.16.tgz";
+        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
+        sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
+      };
+    }
+
+    {
+      name = "uglify_js___uglify_js_3.4.9.tgz";
+      path = fetchurl {
+        name = "uglify_js___uglify_js_3.4.9.tgz";
+        url  = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz";
+        sha1 = "af02f180c1207d76432e473ed24a28f4a782bae3";
+      };
+    }
+
+    {
+      name = "ultron___ultron_1.0.2.tgz";
+      path = fetchurl {
+        name = "ultron___ultron_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz";
+        sha1 = "ace116ab557cd197386a4e88f4685378c8b2e4fa";
+      };
+    }
+
+    {
+      name = "unc_path_regex___unc_path_regex_0.1.2.tgz";
+      path = fetchurl {
+        name = "unc_path_regex___unc_path_regex_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz";
+        sha1 = "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa";
+      };
+    }
+
+    {
+      name = "union_value___union_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "union_value___union_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
+        sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
+      };
+    }
+
+    {
+      name = "unique_stream___unique_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "unique_stream___unique_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz";
+        sha1 = "d59a4a75427447d9aa6c91e70263f8d26a4b104b";
+      };
+    }
+
+    {
+      name = "unpipe___unpipe_1.0.0.tgz";
+      path = fetchurl {
+        name = "unpipe___unpipe_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    }
+
+    {
+      name = "unset_value___unset_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "unset_value___unset_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
+        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
+      };
+    }
+
+    {
+      name = "uri_js___uri_js_4.2.2.tgz";
+      path = fetchurl {
+        name = "uri_js___uri_js_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
+        sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
+      };
+    }
+
+    {
+      name = "urix___urix_0.1.0.tgz";
+      path = fetchurl {
+        name = "urix___urix_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
+        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
+      };
+    }
+
+    {
+      name = "use___use_3.1.1.tgz";
+      path = fetchurl {
+        name = "use___use_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
+        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
+      };
+    }
+
+    {
+      name = "user_home___user_home_1.1.1.tgz";
+      path = fetchurl {
+        name = "user_home___user_home_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz";
+        sha1 = "2b5be23a32b63a7c9deb8d0f28d485724a3df190";
+      };
+    }
+
+    {
+      name = "useragent___useragent_2.3.0.tgz";
+      path = fetchurl {
+        name = "useragent___useragent_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz";
+        sha1 = "217f943ad540cb2128658ab23fc960f6a88c9972";
+      };
+    }
+
+    {
+      name = "util_deprecate___util_deprecate_1.0.2.tgz";
+      path = fetchurl {
+        name = "util_deprecate___util_deprecate_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    }
+
+    {
+      name = "utils_merge___utils_merge_1.0.1.tgz";
+      path = fetchurl {
+        name = "utils_merge___utils_merge_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    }
+
+    {
+      name = "uuid___uuid_3.3.2.tgz";
+      path = fetchurl {
+        name = "uuid___uuid_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
+        sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
+      };
+    }
+
+    {
+      name = "v8flags___v8flags_2.1.1.tgz";
+      path = fetchurl {
+        name = "v8flags___v8flags_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz";
+        sha1 = "aab1a1fa30d45f88dd321148875ac02c0b55e5b4";
+      };
+    }
+
+    {
+      name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
+        sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
+      };
+    }
+
+    {
+      name = "verror___verror_1.10.0.tgz";
+      path = fetchurl {
+        name = "verror___verror_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    }
+
+    {
+      name = "vinyl_fs___vinyl_fs_0.3.14.tgz";
+      path = fetchurl {
+        name = "vinyl_fs___vinyl_fs_0.3.14.tgz";
+        url  = "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz";
+        sha1 = "9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6";
+      };
+    }
+
+    {
+      name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.2.1.tgz";
+      path = fetchurl {
+        name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz";
+        sha1 = "ab6549d61d172c2b1b87be5c508d239c8ef87705";
+      };
+    }
+
+    {
+      name = "vinyl___vinyl_0.4.6.tgz";
+      path = fetchurl {
+        name = "vinyl___vinyl_0.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz";
+        sha1 = "2f356c87a550a255461f36bbeb2a5ba8bf784847";
+      };
+    }
+
+    {
+      name = "vinyl___vinyl_0.5.3.tgz";
+      path = fetchurl {
+        name = "vinyl___vinyl_0.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz";
+        sha1 = "b0455b38fc5e0cf30d4325132e461970c2091cde";
+      };
+    }
+
+    {
+      name = "void_elements___void_elements_2.0.1.tgz";
+      path = fetchurl {
+        name = "void_elements___void_elements_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz";
+        sha1 = "c066afb582bb1cb4128d60ea92392e94d5e9dbec";
+      };
+    }
+
+    {
+      name = "websocket_driver___websocket_driver_0.7.0.tgz";
+      path = fetchurl {
+        name = "websocket_driver___websocket_driver_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz";
+        sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb";
+      };
+    }
+
+    {
+      name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+      path = fetchurl {
+        name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
+        sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
+      };
+    }
+
+    {
+      name = "which_module___which_module_1.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz";
+        sha1 = "bba63ca861948994ff307736089e3b96026c2a4f";
+      };
+    }
+
+    {
+      name = "which___which_1.3.1.tgz";
+      path = fetchurl {
+        name = "which___which_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
+        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
+      };
+    }
+
+    {
+      name = "wide_align___wide_align_1.1.3.tgz";
+      path = fetchurl {
+        name = "wide_align___wide_align_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
+        sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_1.0.0.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz";
+        sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_0.0.3.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz";
+        sha1 = "a3d5da6cd5c0bc0008d37234bbaf1bed63059107";
+      };
+    }
+
+    {
+      name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
+        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
+      };
+    }
+
+    {
+      name = "wrappy___wrappy_1.0.2.tgz";
+      path = fetchurl {
+        name = "wrappy___wrappy_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    }
+
+    {
+      name = "ws___ws_1.1.5.tgz";
+      path = fetchurl {
+        name = "ws___ws_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz";
+        sha1 = "cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51";
+      };
+    }
+
+    {
+      name = "wtf_8___wtf_8_1.0.0.tgz";
+      path = fetchurl {
+        name = "wtf_8___wtf_8_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz";
+        sha1 = "392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
+      };
+    }
+
+    {
+      name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
+      path = fetchurl {
+        name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz";
+        sha1 = "185a888c04eca46c3e4070d99f7b49de3528992d";
+      };
+    }
+
+    {
+      name = "xtend___xtend_4.0.1.tgz";
+      path = fetchurl {
+        name = "xtend___xtend_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    }
+
+    {
+      name = "y18n___y18n_3.2.1.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
+        sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
+      };
+    }
+
+    {
+      name = "yallist___yallist_2.1.2.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
+        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
+      };
+    }
+
+    {
+      name = "yallist___yallist_3.0.3.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz";
+        sha1 = "b4b049e314be545e3ce802236d6cd22cd91c3de9";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_5.0.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz";
+        sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
+      };
+    }
+
+    {
+      name = "yargs___yargs_7.1.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz";
+        sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8";
+      };
+    }
+
+    {
+      name = "yeast___yeast_0.1.2.tgz";
+      path = fetchurl {
+        name = "yeast___yeast_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    }
+  ];
+}
diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix
new file mode 100644 (file)
index 0000000..4952819
--- /dev/null
@@ -0,0 +1,7 @@
+{ mylibs, callPackage, python }:
+{
+  buildslist = callPackage ./buildslist {
+    inherit mylibs;
+    pythonPackages = python.pkgs;
+  };
+}
diff --git a/pkgs/python-packages/default.nix b/pkgs/python-packages/default.nix
new file mode 100644 (file)
index 0000000..747bbe6
--- /dev/null
@@ -0,0 +1,6 @@
+{ mylibs, callPackage, python }:
+{
+  apprise = callPackage ./apprise { inherit mylibs; pythonPackages = python.pkgs; };
+  buildbot-plugins = callPackage ./buildbot/plugins { inherit mylibs python; };
+  wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; };
+}
diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix
new file mode 100644 (file)
index 0000000..b34caec
--- /dev/null
@@ -0,0 +1,11 @@
+{ pythonPackages }: with pythonPackages;
+buildPythonPackage rec {
+  pname = "wokkel";
+  version = "18.0.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
+  };
+  propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ];
+  doChecks = false;
+}
diff --git a/pkgs/slang_1/default.nix b/pkgs/slang_1/default.nix
new file mode 100644 (file)
index 0000000..3054b1d
--- /dev/null
@@ -0,0 +1,25 @@
+{ stdenv, fetchpatch, fetchurl }:
+stdenv.mkDerivation rec {
+  name = "slang-debian-patched-${version}";
+  version = "1.4.9";
+  src = fetchurl {
+    url = "ftp://space.mit.edu/pub/davis/slang/v1.4/slang-1.4.9.tar.gz";
+    sha256 = "1y2mg0whqh4b3acd0k17i4biz55bimxg8aaxhmwd165cvspxns9r";
+  };
+  patches = [
+    (fetchpatch {
+      name = "slang_1.4.9dbs-8.diff.gz";
+      url = "http://archive.debian.org/debian-archive/debian-amd64/pool/main/s/slang/slang_1.4.9dbs-8.diff.gz";
+      sha256 = "0xdq14k5ynqfwpmis1rcggs7m4n921i3bs27icbmbhfg5gb2hap2";
+    })
+  ];
+  preConfigure = ''
+    for i in debian/patches/*; do
+      patch -p1 < $i
+    done
+    makeFlagsArray=(CFLAGS=" -g -O2 -fno-strength-reduce -DUTF8 -D_REENTRANT -D_XOPEN_SOURCE=500")
+    '';
+  postBuild = ''
+    sed -i "1i#ifndef UTF8\n#define UTF8\n#endif" src/slang.h
+    '';
+}
diff --git a/pkgs/telegram-cli/default.nix b/pkgs/telegram-cli/default.nix
new file mode 100644 (file)
index 0000000..6987748
--- /dev/null
@@ -0,0 +1,16 @@
+{ stdenv, mylibs, pkgconfig, libevent, lua, jansson, openssl, readline, zlib, libconfig }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-cli.json // {
+  patches = [
+    ./telegram-cli.patch
+    ];
+  buildInputs = [ pkgconfig libevent lua jansson openssl readline zlib libconfig ];
+  preBuild = ''
+    sed -i -e 's@"/etc/" PROG_NAME "/server.pub"@"'$out'/etc/server.pub"@' main.c
+    '';
+  installPhase = ''
+    mkdir -p $out
+    install -Dm755 bin/telegram-cli $out/bin/telegram-cli
+    install -Dm644 tg-server.pub $out/etc/server.pub
+    install -Dm644 debian/telegram-cli.8 $out/man/man8/telegram-cli.8
+    '';
+})
diff --git a/pkgs/telegram-cli/telegram-cli.json b/pkgs/telegram-cli/telegram-cli.json
new file mode 100644 (file)
index 0000000..53e0a7b
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "6547c0b-master",
+  "meta": {
+    "name": "telegram-cli",
+    "url": "https://github.com/vysheng/tg",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "vysheng",
+    "repo": "tg",
+    "rev": "6547c0b21b977b327b3c5e8142963f4bc246187a",
+    "sha256": "07sss5cnw2ygd7mp8f5532lmj7qm6ywqf4cjaq5g13i8igzqzwzj",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/telegram-cli/telegram-cli.patch b/pkgs/telegram-cli/telegram-cli.patch
new file mode 100644 (file)
index 0000000..2d2b7b0
--- /dev/null
@@ -0,0 +1,90 @@
+diff --git a/tgl/crypto/rsa_pem_openssl.c b/tgl/crypto/rsa_pem_openssl.c
+index db653f2..5e6a697 100644
+--- a/tgl/crypto/rsa_pem_openssl.c
++++ b/tgl/crypto/rsa_pem_openssl.c
+@@ -36,6 +36,12 @@ TGLC_WRAPPER_ASSOC(rsa,RSA)
+ // TODO: Refactor crucial struct-identity into its own header.
+ TGLC_WRAPPER_ASSOC(bn,BIGNUM)
++/*
++ * Since OpenSSL version 1.1.0 the RSA struct (rsa_st) is opaque,
++ * see also https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
++ */
++#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
++
+ TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) {
+   RSA *ret = RSA_new ();
+   ret->e = unwrap_bn (TGLC_bn_new ());
+@@ -47,7 +53,30 @@ TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) {
+ #define RSA_GETTER(M)                                                          \
+   TGLC_bn *TGLC_rsa_ ## M (TGLC_rsa *key) {                                    \
+     return wrap_bn (unwrap_rsa (key)->M);                                      \
+-  }                                                                            \
++  }
++
++#else // OPENSSL_VERSION_NUMBER
++
++TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) {
++  RSA *ret = RSA_new ();
++  BIGNUM *ret_e = unwrap_bn (TGLC_bn_new ());
++  BIGNUM *ret_n = unwrap_bn (TGLC_bn_bin2bn (n, n_bytes, NULL));
++  RSA_set0_key (ret, ret_n, ret_e, NULL);
++  TGLC_bn_set_word (wrap_bn (ret_e), e);
++  return wrap_rsa (ret);
++}
++
++#define RSA_GETTER(M)                       \
++TGLC_bn *TGLC_rsa_ ## M (TGLC_rsa *key) {   \
++    BIGNUM *rsa_n, *rsa_e, *rsa_d;          \
++    RSA_get0_key(unwrap_rsa (key),          \
++        (const BIGNUM **) &rsa_n,           \
++        (const BIGNUM **) &rsa_e,           \
++        (const BIGNUM **) &rsa_d);          \
++    return wrap_bn (rsa_ ## M);             \
++}
++
++#endif // OPENSSL_VERSION_NUMBER
+ RSA_GETTER(n);
+ RSA_GETTER(e);
+@@ -60,4 +89,4 @@ TGLC_rsa *TGLC_pem_read_RSAPublicKey (FILE *fp) {
+   return wrap_rsa (PEM_read_RSAPublicKey (fp, NULL, NULL, NULL));
+ }
+-#endif
++#endif // TGL_AVOID_OPENSSL
+diff --git a/tgl/mtproto-utils.c b/tgl/mtproto-utils.c
+index 0948bc8..cfdb216 100644
+--- a/tgl/mtproto-utils.c
++++ b/tgl/mtproto-utils.c
+@@ -98,7 +98,7 @@ static unsigned long long BN2ull (TGLC_bn *b) {
+   if (sizeof (unsigned long) == 8) {
+     return TGLC_bn_get_word (b);
+   } else if (sizeof (unsigned long long) == 8) {
+-    assert (0); // As long as nobody ever uses this code, assume it is broken.
++//    assert (0); // As long as nobody ever uses this code, assume it is broken.
+     unsigned long long tmp;
+     /* Here be dragons, but it should be okay due to be64toh */
+     TGLC_bn_bn2bin (b, (unsigned char *) &tmp);
+@@ -112,7 +112,7 @@ static void ull2BN (TGLC_bn *b, unsigned long long val) {
+   if (sizeof (unsigned long) == 8 || val < (1ll << 32)) {
+     TGLC_bn_set_word (b, val);
+   } else if (sizeof (unsigned long long) == 8) {
+-    assert (0); // As long as nobody ever uses this code, assume it is broken.
++//    assert (0); // As long as nobody ever uses this code, assume it is broken.
+     htobe64(val);
+     /* Here be dragons, but it should be okay due to htobe64 */
+     TGLC_bn_bin2bn ((unsigned char *) &val, 8, b);
+diff --git a/tgl/tl-parser/tl-parser.c b/tgl/tl-parser/tl-parser.c
+index 524b196..aeadbd2 100644
+--- a/tgl/tl-parser/tl-parser.c
++++ b/tgl/tl-parser/tl-parser.c
+@@ -1903,7 +1903,7 @@ struct tl_combinator_tree *tl_parse_args134 (struct tree *T) {
+       //assert (S->data);
+       char *name = S->data;
+       if (!name) {
+-        static char s[20];
++        static char s[21];
+         sprintf (s, "%lld", lrand48 () * (1ll << 32) + lrand48 ());
+         name = s;
+       }
diff --git a/pkgs/telegram-history-dump/default.nix b/pkgs/telegram-history-dump/default.nix
new file mode 100644 (file)
index 0000000..050b351
--- /dev/null
@@ -0,0 +1,9 @@
+{ stdenv, ruby, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-history-dump.json // {
+  installPhase = ''
+    mkdir -p $out/lib $out/bin
+    cp -a $src $out/lib/telegram-history-dump
+    ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump
+    '';
+  buildInputs = [ ruby ];
+})
diff --git a/pkgs/telegram-history-dump/telegram-history-dump.json b/pkgs/telegram-history-dump/telegram-history-dump.json
new file mode 100644 (file)
index 0000000..487df73
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "468ea91-master",
+  "meta": {
+    "name": "telegram-history-dump",
+    "url": "https://github.com/tvdstaaij/telegram-history-dump",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "tvdstaaij",
+    "repo": "telegram-history-dump",
+    "rev": "468ea91e543529b54bc2c5ea28b1ea17f362fd3e",
+    "sha256": "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/telegramircd/default.nix b/pkgs/telegramircd/default.nix
new file mode 100644 (file)
index 0000000..2f1d7ca
--- /dev/null
@@ -0,0 +1,16 @@
+{ openssl, telethon, python3Packages, mylibs }:
+with python3Packages;
+buildPythonApplication rec {
+  format = "other";
+  pname = "telegramircd";
+  version = "master";
+  propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ];
+  src = (mylibs.fetchedGithub ./telegramircd.json).src;
+  LD_LIBRARY_PATH = "${openssl.out}/lib";
+  installPhase = ''
+    install -D $src/telegramircd.py $out/bin/telegramircd
+    wrapProgram "$out/bin/telegramircd" \
+      --prefix LD_LIBRARY_PATH : "${openssl.out}/lib"
+    install -Dm644 "$src/config" -t "$out/etc/telegramircd/"
+    '';
+}
diff --git a/pkgs/telegramircd/telegramircd.json b/pkgs/telegramircd/telegramircd.json
new file mode 100644 (file)
index 0000000..3d219f8
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "40a0c7c-master",
+  "meta": {
+    "name": "telegramircd",
+    "url": "https://github.com/MaskRay/telegramircd",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "MaskRay",
+    "repo": "telegramircd",
+    "rev": "40a0c7cf60492bde3f44d43f06f62e3792480139",
+    "sha256": "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/telethon_sync/default.nix b/pkgs/telethon_sync/default.nix
new file mode 100644 (file)
index 0000000..aa58d5b
--- /dev/null
@@ -0,0 +1,23 @@
+{ lib, python3Packages }:
+with python3Packages;
+buildPythonPackage rec {
+  pname = "Telethon-sync";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 =
+      "01z8fzqn0qs5pxhvzq891r3mwffq1ga3f8xvm7qdn6kvmxjni9fy";
+  };
+
+  propagatedBuildInputs = [
+    rsa pyaes async_generator
+  ];
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = https://github.com/LonamiWebs/Telethon;
+    description = "Full-featured Telegram client library for Python 3";
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/terminal-velocity/default.nix b/pkgs/terminal-velocity/default.nix
new file mode 100644 (file)
index 0000000..9e79dee
--- /dev/null
@@ -0,0 +1,33 @@
+{ python36Packages }:
+with python36Packages;
+buildPythonApplication rec {
+  pname = "terminal-velocity-git";
+  version = "0.2.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13yrkcmvh5h5fwnai61sbmqkrjyisz08n62pq0ada2lyyqf7g6b9";
+  };
+
+  patches = [
+    ./sort_found_notes.patch
+    ./python3_support.patch
+    # FIXME: update this patch when version changes
+    ./fix_build.patch
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    urwid
+    (sh.overridePythonAttrs { doCheck = false; })
+    pyyaml
+  ];
+  buildInputs = [
+    m2r
+    (restructuredtext_lint.overridePythonAttrs { doCheck = false; })
+    pygments
+  ];
+
+  postInstall = ''
+    rm $out/bin/terminal_velocity
+    '';
+}
diff --git a/pkgs/terminal-velocity/fix_build.patch b/pkgs/terminal-velocity/fix_build.patch
new file mode 100644 (file)
index 0000000..b08e0c4
--- /dev/null
@@ -0,0 +1,21 @@
+commit a64bf3d58f6ba7f5fa72fe5b89a3973cac0c1a99
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Sat Mar 9 20:13:52 2019 +0100
+
+    Remove mister_bump dependency
+
+diff --git a/setup.py b/setup.py
+index 84a99e9..a783dff 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,7 +1,9 @@
+ from setuptools import setup
+ from m2r import parse_from_file
+ import restructuredtext_lint
+-from mister_bump import bump
++
++def bump():
++    return "0.2.0"
+ # Parser README.md into reStructuredText format
+ rst_readme = parse_from_file('README.md')
diff --git a/pkgs/terminal-velocity/python3_support.patch b/pkgs/terminal-velocity/python3_support.patch
new file mode 100644 (file)
index 0000000..bd4aec7
--- /dev/null
@@ -0,0 +1,215 @@
+commit 6ca19964b9e8a7866fd7e21a3dac9ccd35f0d434
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Sat Mar 9 20:13:18 2019 +0100
+
+    Add python3 support
+
+diff --git a/terminal_velocity/notebook.py b/terminal_velocity/notebook.py
+index b6226dc..11f76de 100644
+--- a/terminal_velocity/notebook.py
++++ b/terminal_velocity/notebook.py
+@@ -60,51 +60,6 @@ import sys
+ import chardet
+-def unicode_or_bust(raw_text):
+-    """Return the given raw text data decoded to unicode.
+-
+-    If the text cannot be decoded, return None.
+-
+-    """
+-    encodings = ["utf-8"]
+-    for encoding in (sys.getfilesystemencoding(), sys.getdefaultencoding()):
+-        # I would use a set for this, but they don't maintain order.
+-        if encoding not in encodings:
+-            encodings.append(encoding)
+-
+-    for encoding in encodings:
+-        if encoding:  # getfilesystemencoding() may return None
+-            try:
+-                decoded = unicode(raw_text, encoding=encoding)
+-                return decoded
+-            except UnicodeDecodeError:
+-                pass
+-
+-    # If none of those guesses worked, let chardet have a go.
+-    encoding = chardet.detect(raw_text)["encoding"]
+-    if encoding and encoding not in encodings:
+-        try:
+-            decoded = unicode(raw_text, encoding=encoding)
+-            logger.debug("File decoded with chardet, encoding was {0}".format(
+-                encoding))
+-            return decoded
+-        except UnicodeDecodeError:
+-            pass
+-        except LookupError:
+-            pass
+-
+-    # I've heard that decoding with cp1252 never fails, so try that last.
+-    try:
+-        decoded = unicode(raw_text, encoding="cp1252")
+-        logger.debug("File decoded with encoding cp1252")
+-        return decoded
+-    except UnicodeDecodeError:
+-        pass
+-
+-    # If nothing worked then give up.
+-    return None
+-
+-
+ class Error(Exception):
+     """Base class for exceptions in this module."""
+     pass
+@@ -192,12 +147,12 @@ class PlainTextNote(object):
+         # subdirs) if they don't exist.
+         directory = os.path.split(self.abspath)[0]
+         if not os.path.isdir(directory):
+-            logger.debug(u"'{0} doesn't exist, creating it".format(directory))
++            logger.debug("'{0} doesn't exist, creating it".format(directory))
+             try:
+                 os.makedirs(directory)
+             except os.error as e:
+                 raise NewNoteError(
+-                        u"{0} could not be created: {1}".format(directory, e))
++                        "{0} could not be created: {1}".format(directory, e))
+         # Create an empty file if the file doesn't exist.
+         open(self.abspath, 'a')
+@@ -217,11 +172,11 @@ class PlainTextNote(object):
+     @property
+     def contents(self):
+-        contents = unicode_or_bust(open(self.abspath, "r").read())
++        contents = open(self.abspath, "rb").read().decode(errors='ignore')
+         if contents is None:
+             logger.error(
+-                u"Could not decode file contents: {0}".format(self.abspath))
+-            return u""
++                "Could not decode file contents: {0}".format(self.abspath))
++            return ""
+         else:
+             return contents
+@@ -322,12 +277,12 @@ class PlainTextNoteBook(object):
+         # Create notebook_dir if it doesn't exist.
+         if not os.path.isdir(self.path):
+-            logger.debug(u"'{0} doesn't exist, creating it".format(self.path))
++            logger.debug("'{0} doesn't exist, creating it".format(self.path))
+             try:
+                 os.makedirs(self.path)
+             except os.error as e:
+                 raise NewNoteBookError(
+-                        u"{0} could not be created: {1}".format(self.path, e))
++                        "{0} could not be created: {1}".format(self.path, e))
+         else:
+             # TODO: Check that self.path is a directory, if not raise.
+             pass
+@@ -358,13 +313,12 @@ class PlainTextNoteBook(object):
+                 abspath = os.path.join(root, filename)
+                 relpath = os.path.relpath(abspath, self.path)
+                 relpath, ext = os.path.splitext(relpath)
+-                unicode_relpath = unicode_or_bust(relpath)
+                 if relpath is None:
+                     # The filename could not be decoded.
+                     logger.error(
+                             "Could not decode filename: {0}".format(relpath))
+                 else:
+-                    self.add_new(title=unicode_relpath, extension=ext)
++                    self.add_new(title=relpath, extension=ext)
+     @property
+     def path(self):
+@@ -418,7 +372,7 @@ class PlainTextNoteBook(object):
+         for note in self._notes:
+             if note.title == title and note.extension == extension:
+                 raise NoteAlreadyExistsError(
+-                        u"Note already in NoteBook: {0}".format(note.title))
++                        "Note already in NoteBook: {0}".format(note.title))
+         # Ok, add the note.
+         note = PlainTextNote(title, self, extension)
+diff --git a/terminal_velocity/terminal_velocity.py b/terminal_velocity/terminal_velocity.py
+index 5f0e213..9234bea 100755
+--- a/terminal_velocity/terminal_velocity.py
++++ b/terminal_velocity/terminal_velocity.py
+@@ -1,7 +1,7 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ """A fast note-taking app for the UNIX terminal"""
+ from __future__ import print_function
+-import ConfigParser
++import configparser
+ import argparse
+ import os
+ import logging
+@@ -9,9 +9,9 @@ import logging.handlers
+ import sys
+ #import terminal_velocity.urwid_ui as urwid_ui
+-import urwid_ui
++from . import urwid_ui
+-from git import get_git_project_config, git_project_is_configured, fetch_changes, push_changes
++from .git import get_git_project_config, git_project_is_configured, fetch_changes, push_changes
+ def startup():
+@@ -37,7 +37,7 @@ def main():
+     # Parse the config file.
+     config_file = os.path.abspath(os.path.expanduser(args.config))
+-    config = ConfigParser.SafeConfigParser()
++    config = configparser.ConfigParser()
+     config.read(config_file)
+     defaults = dict(config.items('DEFAULT'))
+diff --git a/terminal_velocity/urwid_ui.py b/terminal_velocity/urwid_ui.py
+index caebcb9..89bab35 100644
+--- a/terminal_velocity/urwid_ui.py
++++ b/terminal_velocity/urwid_ui.py
+@@ -10,7 +10,7 @@ import logging
+ logger = logging.getLogger(__name__)
+ import urwid
+-import notebook
++from . import notebook
+ palette = [
+@@ -27,8 +27,6 @@ def system(cmd, loop):
+     loop.screen.stop()
+-    cmd = u"{0}".format(cmd)
+-    cmd = cmd.encode("utf-8")  # FIXME: Correct encoding?
+     safe_cmd = shlex.split(cmd)
+     logger.debug("System command: {0}".format(safe_cmd))
+@@ -114,7 +112,7 @@ class AutocompleteWidget(urwid.Edit):
+         # When search bar is empty show placeholder text.
+         if not self.edit_text and not self.autocomplete_text:
+-            placeholder_text = u"Find or Create"
++            placeholder_text = "Find or Create"
+             return (placeholder_text,
+                     [("placeholder", len(placeholder_text))])
+@@ -186,7 +184,7 @@ class NoteFilterListBox(urwid.ListBox):
+     def render(self, size, focus=False):
+         if len(self.list_walker) == 0:
+-            placeholder = placeholder_text(u"No matching notes, press Enter "
++            placeholder = placeholder_text("No matching notes, press Enter "
+                 "to create a new note")
+             return placeholder.render(size)
+         return super(NoteFilterListBox, self).render(size, self.fake_focus)
+@@ -399,7 +397,7 @@ class MainFrame(urwid.Frame):
+         # If the user has no notes yet show some placeholder text, otherwise
+         # show the note list.
+         if len(self.notebook) == 0:
+-            self.body = placeholder_text(u"You have no notes yet, to create "
++            self.body = placeholder_text("You have no notes yet, to create "
+                 "a note type a note title then press Enter")
+         else:
+             self.body = urwid.Padding(self.list_box, left=1, right=1)
diff --git a/pkgs/terminal-velocity/sort_found_notes.patch b/pkgs/terminal-velocity/sort_found_notes.patch
new file mode 100644 (file)
index 0000000..2bc563c
--- /dev/null
@@ -0,0 +1,73 @@
+commit 0f9df37046e58c8963aff93c649e5d3dbf2202bd
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Sat Mar 9 20:11:46 2019 +0100
+
+    Add sorting option
+
+diff --git a/terminal_velocity/terminal_velocity.py b/terminal_velocity/terminal_velocity.py
+index a53eda3..5f0e213 100755
+--- a/terminal_velocity/terminal_velocity.py
++++ b/terminal_velocity/terminal_velocity.py
+@@ -90,6 +90,10 @@ the default default will be used"""
+         default=defaults.get("log_file", "~/.tvlog"),
+         help="the file to log to (default: %(default)s)")
++    parser.add_argument("-s", "--sort", dest="sort", action="store",
++        default=defaults.get("sort", "date"),
++        help="the note sorting rules. Possible values: date, title (default: %(default)s)")
++
+     parser.add_argument("-p", "--print-config", dest="print_config",
+             action="store_true", default=False,
+             help="print your configuration settings then exit")
+@@ -138,7 +142,7 @@ the default default will be used"""
+     try:
+         urwid_ui.launch(notes_dir=args.notes_dir, editor=args.editor,
+                 extension=args.extension, extensions=args.extensions,
+-                exclude=args.exclude)
++                exclude=args.exclude, sort=args.sort)
+     except KeyboardInterrupt:
+         # Run the shutdown hook
+         shutdown()
+diff --git a/terminal_velocity/urwid_ui.py b/terminal_velocity/urwid_ui.py
+index 34cf4f6..caebcb9 100644
+--- a/terminal_velocity/urwid_ui.py
++++ b/terminal_velocity/urwid_ui.py
+@@ -237,11 +237,12 @@ class NoteFilterListBox(urwid.ListBox):
+ class MainFrame(urwid.Frame):
+     """The topmost urwid widget."""
+-    def __init__(self, notes_dir, editor, extension, extensions, exclude=None):
++    def __init__(self, notes_dir, editor, extension, extensions, exclude=None, sort="date"):
+         self.editor = editor
+         self.notebook = notebook.PlainTextNoteBook(notes_dir, extension,
+                 extensions, exclude=exclude)
++        self.sort = sort
+         # Don't filter the note list when the text in the search box changes.
+         self.suppress_filter = False
+@@ -408,7 +409,10 @@ class MainFrame(urwid.Frame):
+         # Sort the notes.
+         # TODO: Support different sort orderings.
+-        matching_notes.sort(key=lambda x: x.mtime, reverse=True)
++        if self.sort == "title":
++            matching_notes.sort(key=lambda x: x.title)
++        else:
++            matching_notes.sort(key=lambda x: x.mtime, reverse=True)
+         # Tell the list box to show only the matching notes.
+         self.list_box.filter(matching_notes)
+@@ -433,10 +437,10 @@ class MainFrame(urwid.Frame):
+         self.selected_note = note
+-def launch(notes_dir, editor, extension, extensions, exclude=None):
++def launch(notes_dir, editor, extension, extensions, exclude=None, sort="date"):
+     """Launch the user interface."""
+-    frame = MainFrame(notes_dir, editor, extension, extensions, exclude=exclude)
++    frame = MainFrame(notes_dir, editor, extension, extensions, exclude=exclude, sort=sort)
+     loop = urwid.MainLoop(frame, palette)
+     frame.loop = loop
+     loop.run()
diff --git a/pkgs/tiv/default.nix b/pkgs/tiv/default.nix
new file mode 100644 (file)
index 0000000..c03aabe
--- /dev/null
@@ -0,0 +1,19 @@
+{ buildPerlPackage, fetchurl, perlPackages }:
+buildPerlPackage rec {
+  name = "tiv-${version}";
+  version = "2015";
+  src = fetchurl {
+    url = "http://xyne.archlinux.ca/projects/tiv/src/tiv-${version}.tar.xz";
+    sha256 = "1vq073v7z7vmcd57lhs4rf4jasji69cpjgkz4dykp94a77p1qq90";
+  };
+
+  outputs = ["out"];
+  buildInputs = with perlPackages; [ PerlMagick ];
+  perlPreHookScript = ./tiv_builder.sh;
+  perlPreHook = ''
+    source $perlPreHookScript
+  '';
+  installPhase = ''
+    install -Dm755 tiv "$out/bin/tiv"
+  '';
+}
diff --git a/pkgs/tiv/tiv_builder.sh b/pkgs/tiv/tiv_builder.sh
new file mode 100644 (file)
index 0000000..ea16682
--- /dev/null
@@ -0,0 +1,8 @@
+orig=$(declare -f preConfigure)
+new_name="preConfigure2 ${orig#preConfigure}"
+eval "$new_name"
+
+preConfigure() {
+  preConfigure2 || true
+}
+
diff --git a/pkgs/unicode/default.nix b/pkgs/unicode/default.nix
new file mode 100644 (file)
index 0000000..756e939
--- /dev/null
@@ -0,0 +1,48 @@
+{ lib, fetchurl, runCommand, libarchive }:
+with lib.attrsets;
+let
+  version = "12.0";
+  version-full = "${version}.0";
+  files = {
+    emoji-data = fetchurl {
+      url = "http://www.unicode.org/Public/emoji/${version}/emoji-data.txt";
+      sha256 = "03sf7h1d6kb9m5s02lif88jsi5kjszpkfvcymaqxj8ds70ar9pgv";
+    };
+    emoji-sequences = fetchurl {
+      url = "http://www.unicode.org/Public/emoji/${version}/emoji-sequences.txt";
+      sha256 = "1hghki2rn3n7m4lwpwi2a5wrsf2nij4bxga9ldabx4g0g2k23svs";
+    };
+    emoji-test = fetchurl {
+      url = "http://www.unicode.org/Public/emoji/${version}/emoji-test.txt";
+      sha256 = "1dqd0fh999mh6naj816ni113m9dimfy3ih9nffjq2lrv9mmlgdck";
+    };
+    emoji-variation-sequences = fetchurl {
+      url = "http://www.unicode.org/Public/emoji/${version}/emoji-variation-sequences.txt";
+      sha256 = "1cccwx5bl79w4c19vi5dhjqxrph92s8hihp9y8s2cqvdzmgbln7a";
+    };
+    emoji-zwj-sequences = fetchurl {
+      url = "http://www.unicode.org/Public/emoji/${version}/emoji-zwj-sequences.txt";
+      sha256 = "1l791nbijmmhwa7kmvfn8gp26ban512l6mgqpz1mnbq3xm19181n";
+    };
+  };
+  zippedFiles = {
+    UCD = fetchurl {
+      url = "http://www.unicode.org/Public/zipped/${version-full}/UCD.zip";
+      sha256 = "1ighy39cjkmqnv1797wrxjz76mv1fdw7zp5j04q55bkwxsdkvrmh";
+    };
+    Unihan = fetchurl {
+      url = "http://www.unicode.org/Public/zipped/${version-full}/Unihan.zip";
+      sha256 = "1kfdhgg2gm52x3s07bijb5cxjy0jxwhd097k5lqhvzpznprm6ibf";
+    };
+  };
+in
+  runCommand "unicode" {
+    buildInputs = [ libarchive ];
+  } ''
+  mkdir -p $out/share/unicode
+  ${builtins.concatStringsSep "\n" (mapAttrsToList (n: u: "install -Dm644 ${u} $out/share/unicode/emoji/${n}.txt") files)}
+  ${builtins.concatStringsSep "\n" (mapAttrsToList (n: u: ''
+    install -Dm644 ${u} $out/share/unicode/${n}.zip
+    bsdtar -C "$out/share/unicode" -x -f "$out/share/unicode/${n}.zip"
+    '') zippedFiles)}
+  ''
diff --git a/pkgs/webapps/adminer/default.nix b/pkgs/webapps/adminer/default.nix
new file mode 100644 (file)
index 0000000..b78a2e0
--- /dev/null
@@ -0,0 +1,14 @@
+{ stdenv, fetchurl }:
+stdenv.mkDerivation rec {
+  version = "4.7.1";
+  name = "adminer-${version}";
+  src = fetchurl {
+    url = "https://www.adminer.org/static/download/${version}/${name}.php";
+    sha256 = "00gnck9vd44wc6ihf7hh4ma6jvdsw69xgjlkbrdf6irnni6rnvhn";
+  };
+  phases = "installPhase";
+  installPhase = ''
+    mkdir -p $out
+    cp $src $out/index.php
+  '';
+}
diff --git a/pkgs/webapps/apache-theme/default.nix b/pkgs/webapps/apache-theme/default.nix
new file mode 100644 (file)
index 0000000..4b5755a
--- /dev/null
@@ -0,0 +1,88 @@
+{ theme_root ? null }:
+rec {
+  theme = ./theme;
+  apacheConfig = let
+    theme_root' = if isNull theme_root then theme else theme_root;
+  in ''
+    <Macro Apaxy %{folder} %{ignored}>
+      Alias /theme ${theme_root'}
+      <Directory ${theme_root'}>
+        Options -Indexes
+        AllowOverride None
+        Require all granted
+      </Directory>
+
+      # mod_autoindex
+      <Directory %{folder}>
+        Options Indexes
+        AllowOverride None
+        Require all granted
+
+        # Inspired from Apaxy by @adamwhitcroft
+
+        IndexOptions +Charset=UTF-8 +FancyIndexing +IgnoreCase +FoldersFirst +XHTML +HTMLTable +SuppressRules +SuppressDescription +NameWidth=* +IconsAreLinks +ShowForbidden
+
+        IndexHeadInsert "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />"
+
+        IndexIgnoreReset ON
+        IndexIgnore /theme .htaccess %{ignored}
+
+        AddIcon /theme/icons/blank.png ^^BLANKICON^^
+        AddIcon /theme/icons/folder.png ^^DIRECTORY^^
+        AddIcon /theme/icons/folder-home.png ..
+
+        AddIconByType (TXT,/theme/icons/text.png) text/*
+        AddIconByType (IMG,/theme/icons/image.png) image/*
+        AddIconByType (SND,/theme/icons/audio.png) audio/*
+        AddIconByType (VID,/theme/icons/video.png) video/*
+
+        AddIcon /theme/icons/archive.png .7z .bz2 .cab .gz .tar
+        AddIcon /theme/icons/audio.png .aac .aif .aifc .aiff .ape .au .flac .iff .m4a .mid .mp3 .mpa .ra .wav .wma .f4a .f4b .oga .ogg .xm .it .s3m .mod
+        AddIcon /theme/icons/bin.png .bin .hex
+        AddIcon /theme/icons/bmp.png .bmp
+        AddIcon /theme/icons/c.png .c
+        AddIcon /theme/icons/calc.png .xlsx .xlsm .xltx .xltm .xlam .xlr .xls .csv
+        AddIcon /theme/icons/cd.png .iso
+        AddIcon /theme/icons/cpp.png .cpp
+        AddIcon /theme/icons/css.png .css .sass .scss
+        AddIcon /theme/icons/deb.png .deb
+        AddIcon /theme/icons/doc.png .doc .docx .docm .dot .dotx .dotm .log .msg .odt .pages .rtf .tex .wpd .wps
+        AddIcon /theme/icons/draw.png .svg .svgz
+        AddIcon /theme/icons/eps.png .ai .eps
+        AddIcon /theme/icons/exe.png .exe
+        AddIcon /theme/icons/gif.png .gif
+        AddIcon /theme/icons/h.png .h
+        AddIcon /theme/icons/html.png .html .xhtml .shtml .htm .URL .url
+        AddIcon /theme/icons/ico.png .ico
+        AddIcon /theme/icons/java.png .jar
+        AddIcon /theme/icons/jpg.png .jpg .jpeg .jpe
+        AddIcon /theme/icons/js.png .js .json
+        AddIcon /theme/icons/markdown.png .md
+        AddIcon /theme/icons/package.png .pkg .dmg
+        AddIcon /theme/icons/pdf.png .pdf
+        AddIcon /theme/icons/php.png .php .phtml
+        AddIcon /theme/icons/playlist.png .m3u .m3u8 .pls .pls8
+        AddIcon /theme/icons/png.png .png
+        AddIcon /theme/icons/ps.png .ps
+        AddIcon /theme/icons/psd.png .psd
+        AddIcon /theme/icons/py.png .py
+        AddIcon /theme/icons/rar.png .rar
+        AddIcon /theme/icons/rb.png .rb
+        AddIcon /theme/icons/rpm.png .rpm
+        AddIcon /theme/icons/rss.png .rss
+        AddIcon /theme/icons/script.png .bat .cmd .sh
+        AddIcon /theme/icons/sql.png .sql
+        AddIcon /theme/icons/tiff.png .tiff .tif
+        AddIcon /theme/icons/text.png .txt .nfo
+        AddIcon /theme/icons/video.png .asf .asx .avi .flv .mkv .mov .mp4 .mpg .rm .srt .swf .vob .wmv .m4v .f4v .f4p .ogv
+        AddIcon /theme/icons/xml.png .xml
+        AddIcon /theme/icons/zip.png .zip
+        DefaultIcon /theme/icons/default.png
+
+        HeaderName /theme/header.html
+        ReadmeName /theme/footer.html
+        IndexStyleSheet /theme/style.css
+      </Directory>
+    </Macro>
+  '';
+}
diff --git a/pkgs/webapps/apache-theme/theme/.htaccess b/pkgs/webapps/apache-theme/theme/.htaccess
new file mode 100644 (file)
index 0000000..f9e5472
--- /dev/null
@@ -0,0 +1,9 @@
+#
+#      Apaxy by @adamwhitcroft
+#
+#      For a full breakdown of the mod_autoindex module
+#      http://apache.org/docs/2.2/mod/mod_autoindex.html
+#
+
+#      Don't index this folder
+Options -Indexes
diff --git a/pkgs/webapps/apache-theme/theme/footer.html b/pkgs/webapps/apache-theme/theme/footer.html
new file mode 100644 (file)
index 0000000..57a2012
--- /dev/null
@@ -0,0 +1,31 @@
+</div><!--/.wrapper-->
+
+<script type="text/javascript">
+// grab the 2nd child and add the parent class. tr:nth-child(2)
+document.getElementsByTagName('tr')[1].className = 'parent';
+// fix links when not adding a / at the end of the URI
+var uri = window.location.pathname.substr(1);
+if (uri.length > 0 && uri.substring(uri.length-1) != '/'){
+       var indexes = document.getElementsByClassName('indexcolname'),
+       i = indexes.length;
+       while (i--){
+           var a = indexes[i].getElementsByTagName('a')[0];
+           a.href = '/' + uri + '/' + a.getAttribute('href',2);
+       }
+}
+
+function getAjax(url, success) {
+  var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+  xhr.open('GET', url);
+  xhr.onreadystatechange = function() {
+    if (xhr.readyState>3 && xhr.status==200)
+      success(xhr.responseText);
+  };
+  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+  xhr.send();
+  return xhr;
+}
+getAjax("title", function(data) {
+  document.getElementById('pagetitle').innerHTML = data;
+});
+</script>
diff --git a/pkgs/webapps/apache-theme/theme/header.html b/pkgs/webapps/apache-theme/theme/header.html
new file mode 100644 (file)
index 0000000..cbded6a
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="wrapper">
+  <h1 id="pagetitle"></h1>
+<!-- we open the `wrapper` element here, but close it in the `footer.html` file -->
diff --git a/pkgs/webapps/apache-theme/theme/icons/archive.png b/pkgs/webapps/apache-theme/theme/icons/archive.png
new file mode 100644 (file)
index 0000000..99ae6fc
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/archive.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/audio.png b/pkgs/webapps/apache-theme/theme/icons/audio.png
new file mode 100644 (file)
index 0000000..a67618d
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/audio.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/authors.png b/pkgs/webapps/apache-theme/theme/icons/authors.png
new file mode 100644 (file)
index 0000000..78bf784
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/authors.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/bin.png b/pkgs/webapps/apache-theme/theme/icons/bin.png
new file mode 100644 (file)
index 0000000..ec2220b
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/bin.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/blank.png b/pkgs/webapps/apache-theme/theme/icons/blank.png
new file mode 100644 (file)
index 0000000..bef1f60
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/blank.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/bmp.png b/pkgs/webapps/apache-theme/theme/icons/bmp.png
new file mode 100644 (file)
index 0000000..c6f3044
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/bmp.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/c.png b/pkgs/webapps/apache-theme/theme/icons/c.png
new file mode 100644 (file)
index 0000000..12adaa3
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/c.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/calc.png b/pkgs/webapps/apache-theme/theme/icons/calc.png
new file mode 100644 (file)
index 0000000..a034367
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/calc.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/cd.png b/pkgs/webapps/apache-theme/theme/icons/cd.png
new file mode 100644 (file)
index 0000000..3a3ffbb
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/cd.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/copying.png b/pkgs/webapps/apache-theme/theme/icons/copying.png
new file mode 100644 (file)
index 0000000..83fa06e
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/copying.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/cpp.png b/pkgs/webapps/apache-theme/theme/icons/cpp.png
new file mode 100644 (file)
index 0000000..47e8b1e
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/cpp.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/css.png b/pkgs/webapps/apache-theme/theme/icons/css.png
new file mode 100644 (file)
index 0000000..15f7695
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/css.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/deb.png b/pkgs/webapps/apache-theme/theme/icons/deb.png
new file mode 100644 (file)
index 0000000..1b12d29
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/deb.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/default.png b/pkgs/webapps/apache-theme/theme/icons/default.png
new file mode 100644 (file)
index 0000000..6997229
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/default.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/diff.png b/pkgs/webapps/apache-theme/theme/icons/diff.png
new file mode 100644 (file)
index 0000000..5bef920
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/diff.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/doc.png b/pkgs/webapps/apache-theme/theme/icons/doc.png
new file mode 100644 (file)
index 0000000..5732f9b
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/doc.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/draw.png b/pkgs/webapps/apache-theme/theme/icons/draw.png
new file mode 100644 (file)
index 0000000..8f1da5c
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/draw.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/eps.png b/pkgs/webapps/apache-theme/theme/icons/eps.png
new file mode 100644 (file)
index 0000000..93736bb
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/eps.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/exe.png b/pkgs/webapps/apache-theme/theme/icons/exe.png
new file mode 100644 (file)
index 0000000..31299b7
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/exe.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-home.png b/pkgs/webapps/apache-theme/theme/icons/folder-home.png
new file mode 100644 (file)
index 0000000..14fe20a
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder-home.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-open.png b/pkgs/webapps/apache-theme/theme/icons/folder-open.png
new file mode 100644 (file)
index 0000000..2aa5cc7
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder-open.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-page.png b/pkgs/webapps/apache-theme/theme/icons/folder-page.png
new file mode 100644 (file)
index 0000000..604f9ad
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder-page.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png b/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png
new file mode 100644 (file)
index 0000000..b82d7a9
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent.png b/pkgs/webapps/apache-theme/theme/icons/folder-parent.png
new file mode 100644 (file)
index 0000000..3c964f1
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder-parent.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder.png b/pkgs/webapps/apache-theme/theme/icons/folder.png
new file mode 100644 (file)
index 0000000..7c613e0
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/folder.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/gif.png b/pkgs/webapps/apache-theme/theme/icons/gif.png
new file mode 100644 (file)
index 0000000..01a2f2a
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/gif.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/gzip.png b/pkgs/webapps/apache-theme/theme/icons/gzip.png
new file mode 100644 (file)
index 0000000..99ae6fc
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/gzip.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/h.png b/pkgs/webapps/apache-theme/theme/icons/h.png
new file mode 100644 (file)
index 0000000..d3c7a9c
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/h.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/hpp.png b/pkgs/webapps/apache-theme/theme/icons/hpp.png
new file mode 100644 (file)
index 0000000..e5e52e2
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/hpp.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/html.png b/pkgs/webapps/apache-theme/theme/icons/html.png
new file mode 100644 (file)
index 0000000..2f94a78
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/html.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/ico.png b/pkgs/webapps/apache-theme/theme/icons/ico.png
new file mode 100644 (file)
index 0000000..82227e8
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/ico.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/image.png b/pkgs/webapps/apache-theme/theme/icons/image.png
new file mode 100644 (file)
index 0000000..add1c59
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/image.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/install.png b/pkgs/webapps/apache-theme/theme/icons/install.png
new file mode 100644 (file)
index 0000000..0a9c036
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/install.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/java.png b/pkgs/webapps/apache-theme/theme/icons/java.png
new file mode 100644 (file)
index 0000000..63b8683
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/java.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/jpg.png b/pkgs/webapps/apache-theme/theme/icons/jpg.png
new file mode 100644 (file)
index 0000000..a50c99b
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/jpg.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/js.png b/pkgs/webapps/apache-theme/theme/icons/js.png
new file mode 100644 (file)
index 0000000..af1a475
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/js.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/json.png b/pkgs/webapps/apache-theme/theme/icons/json.png
new file mode 100644 (file)
index 0000000..af1a475
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/json.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/log.png b/pkgs/webapps/apache-theme/theme/icons/log.png
new file mode 100644 (file)
index 0000000..02f1b9a
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/log.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/makefile.png b/pkgs/webapps/apache-theme/theme/icons/makefile.png
new file mode 100644 (file)
index 0000000..f99ea4c
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/makefile.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/markdown.png b/pkgs/webapps/apache-theme/theme/icons/markdown.png
new file mode 100644 (file)
index 0000000..25c8373
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/markdown.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/package.png b/pkgs/webapps/apache-theme/theme/icons/package.png
new file mode 100644 (file)
index 0000000..fb1343e
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/package.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/pdf.png b/pkgs/webapps/apache-theme/theme/icons/pdf.png
new file mode 100644 (file)
index 0000000..7408d8d
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/pdf.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/php.png b/pkgs/webapps/apache-theme/theme/icons/php.png
new file mode 100644 (file)
index 0000000..22c4df6
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/php.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/playlist.png b/pkgs/webapps/apache-theme/theme/icons/playlist.png
new file mode 100644 (file)
index 0000000..8d6f281
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/playlist.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/png.png b/pkgs/webapps/apache-theme/theme/icons/png.png
new file mode 100644 (file)
index 0000000..1fe1ec4
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/png.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/pres.png b/pkgs/webapps/apache-theme/theme/icons/pres.png
new file mode 100644 (file)
index 0000000..db195e9
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/pres.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/ps.png b/pkgs/webapps/apache-theme/theme/icons/ps.png
new file mode 100644 (file)
index 0000000..05f3ed9
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/ps.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/psd.png b/pkgs/webapps/apache-theme/theme/icons/psd.png
new file mode 100644 (file)
index 0000000..62718ee
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/psd.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/py.png b/pkgs/webapps/apache-theme/theme/icons/py.png
new file mode 100644 (file)
index 0000000..0aaffd1
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/py.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rar.png b/pkgs/webapps/apache-theme/theme/icons/rar.png
new file mode 100644 (file)
index 0000000..8a0ff54
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/rar.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rb.png b/pkgs/webapps/apache-theme/theme/icons/rb.png
new file mode 100644 (file)
index 0000000..c7db42f
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/rb.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/readme.png b/pkgs/webapps/apache-theme/theme/icons/readme.png
new file mode 100644 (file)
index 0000000..3ae48cd
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/readme.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rpm.png b/pkgs/webapps/apache-theme/theme/icons/rpm.png
new file mode 100644 (file)
index 0000000..64699ac
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/rpm.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rss.png b/pkgs/webapps/apache-theme/theme/icons/rss.png
new file mode 100644 (file)
index 0000000..a1130a1
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/rss.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rtf.png b/pkgs/webapps/apache-theme/theme/icons/rtf.png
new file mode 100644 (file)
index 0000000..25c8373
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/rtf.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/script.png b/pkgs/webapps/apache-theme/theme/icons/script.png
new file mode 100644 (file)
index 0000000..1099b5f
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/script.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/source.png b/pkgs/webapps/apache-theme/theme/icons/source.png
new file mode 100644 (file)
index 0000000..5bef920
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/source.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/sql.png b/pkgs/webapps/apache-theme/theme/icons/sql.png
new file mode 100644 (file)
index 0000000..b3b1467
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/sql.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tar.png b/pkgs/webapps/apache-theme/theme/icons/tar.png
new file mode 100644 (file)
index 0000000..bab3b6a
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/tar.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tex.png b/pkgs/webapps/apache-theme/theme/icons/tex.png
new file mode 100644 (file)
index 0000000..1487b25
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/tex.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/text.png b/pkgs/webapps/apache-theme/theme/icons/text.png
new file mode 100644 (file)
index 0000000..1d48677
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/text.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tiff.png b/pkgs/webapps/apache-theme/theme/icons/tiff.png
new file mode 100644 (file)
index 0000000..819e64c
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/tiff.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/unknown.png b/pkgs/webapps/apache-theme/theme/icons/unknown.png
new file mode 100644 (file)
index 0000000..b1dcc3f
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/unknown.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/vcal.png b/pkgs/webapps/apache-theme/theme/icons/vcal.png
new file mode 100644 (file)
index 0000000..3d81455
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/vcal.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/video.png b/pkgs/webapps/apache-theme/theme/icons/video.png
new file mode 100644 (file)
index 0000000..f92f7e1
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/video.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/xml.png b/pkgs/webapps/apache-theme/theme/icons/xml.png
new file mode 100644 (file)
index 0000000..83a83df
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/xml.png differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/zip.png b/pkgs/webapps/apache-theme/theme/icons/zip.png
new file mode 100644 (file)
index 0000000..cc196c1
Binary files /dev/null and b/pkgs/webapps/apache-theme/theme/icons/zip.png differ
diff --git a/pkgs/webapps/apache-theme/theme/style.css b/pkgs/webapps/apache-theme/theme/style.css
new file mode 100644 (file)
index 0000000..4d25c9f
--- /dev/null
@@ -0,0 +1,160 @@
+/*------------------------------------*\
+    Apaxy
+    by @adamwhitcroft
+
+    Theme name: Apaxy
+    Theme author: @adamwhitcroft
+\*------------------------------------*/
+@import url('//fonts.googleapis.com/css?family=Open+Sans');
+/* Have to use @import for the font, as you can only specify a single stylesheet */
+* {
+       margin:0;
+       padding:0;
+       -webkit-box-sizing:border-box;
+          -moz-box-sizing:border-box;
+              box-sizing: border-box; 
+}
+
+html {
+       min-height:100%;
+       border-top:10px solid #ECEEF1;
+       border-bottom:10px solid #ECEEF1;
+       color:#61666c;
+       font-weight:400;
+       font-size:1em;
+       font-family:'Open Sans', sans-serif;
+       line-height:2em;
+}
+body {
+       padding:20px;
+       -webkit-backface-visibility:hidden;
+}
+code {
+       font-family:consolas,monospace; 
+}
+a {
+       color:#61666c;
+       text-decoration:none;
+}
+a, img {
+        border:none;
+        outline:none
+}
+a:hover {
+       color:#2a2a2a;
+}
+/*------------------------------------*\
+    Wrapper
+\*------------------------------------*/
+.wrapper {
+       margin:0 auto;
+       padding-top:20px;
+       max-width:80%;
+}
+/*------------------------------------*\
+    Demo block
+\*------------------------------------*/
+.block {
+       font-size:.875em;
+       margin:20px 0;
+       padding:20px;
+       color:#9099A3;
+}
+/*------------------------------------*\
+    Table (directory listing)
+\*------------------------------------*/
+table {
+       width:100%;
+       border-collapse:collapse;
+       font-size:.875em;
+}
+tr {
+       outline:0;
+       border:0;
+}
+tr:hover td {
+       background:#f6f6f6;
+}
+th {
+       text-align:left;
+       font-size:.75em;
+       padding-right:20px;
+}
+/* 2nd Column: Filename */
+th + th {
+       width:65%;
+}
+/* 3rd Column: Last Modified */
+th + th + th {
+}
+/* 4th Column: Size */
+th + th + th + th {
+       width:5%;
+}
+tr td:first-of-type {
+       padding-left:10px;
+       padding-right:10px;
+}
+td {
+       padding:5px 0;
+       outline:0;
+       border:0;
+       border-bottom:1px solid #edf1f5;
+       vertical-align:middle;
+       text-align:left;
+       -webkit-transition:background 300ms ease;
+          -moz-transition:background 300ms ease;
+           -ms-transition:background 300ms ease;
+            -o-transition:background 300ms ease;
+               transition:background 300ms ease;
+}
+td a{
+       display: block;
+}
+tr.parent a[href^="/"] {
+       color:#9099A3;
+}
+       .parent a[href^="/"]:hover {
+               color:#2281d0;
+       }
+/*------------------------------------*\
+    Footer
+\*------------------------------------*/
+.footer {
+       text-align:center;
+       font-size:.75em;
+}
+
+h1#pagetitle {
+  text-align: center;
+}
+tr.parent a[href="/"]{
+  display: none;
+}
+
+tr.indexhead {
+  visibility: hidden;
+}
+
+th.indexcollastmod, td.indexcollastmod, th.indexcolsize, td.indexcolsize {
+  visibility: hidden;
+}
+
+.instructions a {
+  text-decoration: underline;
+}
+
+.instructions h2 {
+  margin-top: 10px;
+}
+.instructions em.important:before {
+  content: "⚠ Important ⚠ ";
+  color: red;
+}
+.instructions pre {
+  width: 50em;
+  padding: 10px 15px;
+  display: table;
+  border: 1px inset black;
+  line-height: 1em;
+}
diff --git a/pkgs/webapps/awl/default.nix b/pkgs/webapps/awl/default.nix
new file mode 100644 (file)
index 0000000..8564fc3
--- /dev/null
@@ -0,0 +1,16 @@
+{ stdenv, fetchurl }:
+stdenv.mkDerivation rec {
+  version = "0.59";
+  name = "awl-${version}";
+  src = fetchurl {
+    url = "https://www.davical.org/downloads/awl_${version}.orig.tar.xz";
+    sha256 = "01b7km7ga3ggbpp8axkc55nizgk5c35fl2z93iydb3hwbxmsvnjp";
+  };
+  unpackCmd = ''
+    tar --one-top-level -xf $curSrc
+  '';
+  installPhase = ''
+    mkdir -p $out
+    cp -ra dba docs inc scripts tests $out
+  '';
+}
diff --git a/pkgs/webapps/davical/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch b/pkgs/webapps/davical/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch
new file mode 100644 (file)
index 0000000..2a08a5c
--- /dev/null
@@ -0,0 +1,26 @@
+diff --git a/inc/ui/collection-edit.php b/inc/ui/collection-edit.php
+index 3af9edd3b8c4ad9074113273175098841af6a28e..8c1d84012b035f7bc7faedcb24916581a02a5d3e 100644
+--- a/inc/ui/collection-edit.php
++++ b/inc/ui/collection-edit.php
+@@ -190,7 +190,7 @@ $privilege_xlate = array(
+ * @param dbrow $row The row object we read from the database.
+ * @return string The formatted privileges.
+ */
+-function collection_privilege_format_function( $value, $column, $row ) {
++function collection_privilege_format_function( $value, $column = NULL, $row = NULL ) {
+   global $privilege_xlate;
+   $privs = bits_to_privilege($value, 'calendar');
+diff --git a/inc/ui/principal-edit.php b/inc/ui/principal-edit.php
+index 20dee7fa4ca2235ff2f74be0dfb52cbe937ef822..2e37cd596b597bcce1e59d7c02a1c5fc2a7f88ce 100644
+--- a/inc/ui/principal-edit.php
++++ b/inc/ui/principal-edit.php
+@@ -454,7 +454,7 @@ EOTEMPLATE;
+ * @param dbrow $row The row object we read from the database.
+ * @return string The formatted privileges.
+ */
+-function principal_privilege_format_function( $value, $column, $row ) {
++function principal_privilege_format_function( $value, $column = NULL, $row = NULL ) {
+   global $privilege_xlate;
+   $privs = bits_to_privilege($value,'*');
diff --git a/pkgs/webapps/davical/default.nix b/pkgs/webapps/davical/default.nix
new file mode 100644 (file)
index 0000000..52d8736
--- /dev/null
@@ -0,0 +1,20 @@
+{ davical_config ? "/etc/davical/config.php", stdenv, fetchurl, gettext }:
+stdenv.mkDerivation rec {
+  version = "1.1.7";
+  name = "davical-${version}";
+  src = fetchurl {
+    url = "https://www.davical.org/downloads/davical_${version}.orig.tar.xz";
+    sha256 = "1ar5m2dxr92b204wkdi8z33ir9vz2jbh5k1p74icpv9ywifvjjp9";
+  };
+  unpackCmd = ''
+    tar --one-top-level -xf $curSrc
+  '';
+  makeFlags = "all";
+  patches = [ ./davical_19eb79ebf9250e5f339675319902458c40ed1755.patch ];
+  installPhase = ''
+    mkdir -p $out
+    cp -ra config dba docs htdocs inc locale po scripts testing zonedb $out
+    ln -s ${davical_config} $out/config/config.php
+  '';
+  buildInputs = [ gettext ];
+}
diff --git a/pkgs/webapps/default.nix b/pkgs/webapps/default.nix
new file mode 100644 (file)
index 0000000..8c3eb0e
--- /dev/null
@@ -0,0 +1,114 @@
+{ callPackage, mylibs, composerEnv, lib, private }:
+rec {
+  adminer = callPackage ./adminer {};
+  apache-theme = callPackage ./apache-theme {};
+  awl = callPackage ./awl {};
+  davical = callPackage ./davical {};
+  diaspora = callPackage ./diaspora { inherit mylibs; };
+
+  dokuwiki = callPackage ./dokuwiki { inherit mylibs; };
+  dokuwiki-with-plugins = dokuwiki.withPlugins (builtins.attrValues dokuwiki-plugins);
+  dokuwiki-plugins = let
+    names = [ "farmer" "todo" ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./dokuwiki/plugins + "/${name}.nix") {});
+
+  etherpad-lite = callPackage ./etherpad-lite {};
+  etherpad-lite-with-modules = etherpad-lite.withModules (builtins.attrValues etherpad-lite-modules);
+  etherpad-lite-modules = let
+    nodeEnv = callPackage mylibs.nodeEnv {};
+    names = [
+      "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
+      "ep_clear_formatting" "ep_colors" "ep_copy_paste_select_all"
+      "ep_cursortrace" "ep_embedmedia" "ep_font_family" "ep_font_size"
+      "ep_headings2" "ep_ldapauth" "ep_line_height" "ep_markdown"
+      "ep_previewimages" "ep_ruler" "ep_scrollto" "ep_set_title_on_pad"
+      "ep_subscript_and_superscript" "ep_timesliderdiff"
+    ];
+  in
+    # nix files are built using node2nix -i node-packages.json
+    lib.attrsets.genAttrs names
+    (name: (callPackage (./etherpad-lite/modules + "/${name}/node-packages.nix") { inherit nodeEnv; })
+      .${name}.overrideAttrs(old: { passthru = (old.passthru or {}) // { moduleName = name; }; }));
+
+  infcloud = callPackage ./infcloud {};
+
+  mantisbt_2 = callPackage ./mantisbt_2 {};
+  mantisbt_2-with-plugins = mantisbt_2.withPlugins (builtins.attrValues mantisbt_2-plugins);
+  mantisbt_2-plugins = let
+    names = [ "slack" "source-integration" ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./mantisbt_2/plugins + "/${name}") {});
+
+  mastodon = callPackage ./mastodon { inherit mylibs; };
+
+  mediagoblin = callPackage ./mediagoblin { inherit mylibs; };
+  mediagoblin-with-plugins = mediagoblin.withPlugins (builtins.attrValues mediagoblin-plugins);
+  mediagoblin-plugins = let
+    names = [ "basicsearch" ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./mediagoblin/plugins + "/${name}") {});
+
+  nextcloud = callPackage ./nextcloud {};
+  nextcloud-with-apps = nextcloud.withPlugins (builtins.attrValues nextcloud-apps);
+  nextcloud-apps = let
+      names = [
+        "audioplayer" "bookmarks" "calendar" "contacts" "deck"
+        "files_markdown" "gpxedit" "gpxpod" "keeweb" "music"
+        "notes" "ocsms" "passman" "spreed" "tasks"
+        "flowupload" "carnet"
+        # FIXME: fix passman for NC 16
+      ];
+    in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./nextcloud/apps + "/${name}.nix") { buildApp = nextcloud.buildApp; });
+
+  peertube = callPackage ./peertube { inherit mylibs; };
+  phpldapadmin = callPackage ./phpldapadmin {};
+  rompr = callPackage ./rompr { inherit mylibs; };
+
+  roundcubemail = callPackage ./roundcubemail {};
+  roundcubemail-with-plugins-skins = roundcubemail.withPlugins (builtins.attrValues roundcubemail-plugins) (builtins.attrValues roundcubemail-skins);
+  roundcubemail-skins = let
+    names = [];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./roundcubemail/skins + "/${name}") {});
+  roundcubemail-plugins = let
+    names = [
+      "automatic_addressbook" "carddav" "contextmenu"
+      "contextmenu_folder" "html5_notifier" "ident_switch"
+      "message_highlight" "thunderbird_labels"
+    ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./roundcubemail/plugins + "/${name}") { buildPlugin = roundcubemail.buildPlugin; });
+
+  spip = callPackage ./spip {};
+  taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; };
+
+  ttrss = callPackage ./ttrss { inherit mylibs; };
+  ttrss-with-plugins = ttrss.withPlugins (builtins.attrValues ttrss-plugins);
+  ttrss-plugins = let
+    names = [ "auth_ldap" "af_feedmod" "feediron" "ff_instagram" "tumblr_gdpr_ua" ];
+    patched = [ "af_feedmod" "feediron" ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./ttrss/plugins + "/${name}") (
+        { inherit mylibs; } //
+        (if builtins.elem name patched then { patched = true; } else {})
+        )
+      );
+
+  wallabag = callPackage ./wallabag { inherit composerEnv; };
+  yourls = callPackage ./yourls { inherit mylibs; };
+  yourls-with-plugins = yourls.withPlugins (builtins.attrValues yourls-plugins);
+  yourls-plugins = let
+    names = [ "ldap" ];
+  in
+    lib.attrsets.genAttrs names
+      (name: callPackage (./yourls/plugins + "/${name}") { inherit mylibs; });
+} // private.webapps
diff --git a/pkgs/webapps/diaspora/default.nix b/pkgs/webapps/diaspora/default.nix
new file mode 100644 (file)
index 0000000..eff8d27
--- /dev/null
@@ -0,0 +1,73 @@
+{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
+  mylibs, stdenv, bundlerEnv, writeText,
+  cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
+let
+  diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec {
+    buildPhase = ''
+      ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
+      # FIXME: bundlerEnv below doesn't take postgresql group for some
+      # reason
+      echo 'gem "pg",     "1.1.3"' >> Gemfile
+    '';
+    installPhase = ''
+      cp -a . $out
+    '';
+  });
+  gems = bundlerEnv {
+    name = "diaspora-env";
+    # https://git.immae.eu/mantisbt/view.php?id=131
+    ruby = ruby_2_4.overrideAttrs(old: {
+      postInstall = builtins.replaceStrings [" --destdir $GEM_HOME"] [""] old.postInstall;
+    });
+    gemfile = "${diaspora_src}/Gemfile";
+    lockfile = "${diaspora_src}/Gemfile.lock";
+    gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix;
+    groups = [ "postgresql" "default" "production" ];
+    gemConfig = defaultGemConfig // {
+      kostya-sigar = attrs: {
+        buildInputs = [ perl ];
+      };
+    };
+  };
+  build_config = writeText "diaspora.yml" ''
+    configuration:
+      environment:
+        certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt'
+    ${if podmin_email != null then ''
+    # dummy comment for indentation
+      admins:
+        podmin_email: '${podmin_email}'
+    '' else ""}
+    production:
+      environment:
+    '';
+  dummy_token = writeText "secret_token.rb" ''
+    Diaspora::Application.config.secret_key_base = 'dummy'
+  '';
+in
+stdenv.mkDerivation {
+  name = "diaspora";
+  inherit diaspora_src;
+  builder = writeText "build_diaspora" ''
+    source $stdenv/setup
+    cp -a $diaspora_src $out
+    cd $out
+    chmod -R u+rwX .
+    tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
+    ln -s database.yml.example config/database.yml
+    ln -s ${build_config} config/diaspora.yml
+    ln -s ${dummy_token} config/initializers/secret_token.rb
+    ln -sf ${varDir}/schedule.yml config/schedule.yml
+    ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
+    ln -sf ${varDir}/uploads public/uploads
+    RAILS_ENV=production ${gems}/bin/rake assets:precompile
+    ln -sf ${config_dir}/database.yml config/database.yml
+    ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
+    ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
+    rm -rf tmp log
+    ln -sf ${varDir}/tmp tmp
+    ln -sf ${varDir}/log log
+    '';
+  propagatedBuildInputs = [ gems nodejs which git ];
+  passthru = { inherit gems varDir; };
+}
diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json
new file mode 100644 (file)
index 0000000..e6795aa
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "v0.7.10.0",
+  "meta": {
+    "name": "diaspora",
+    "url": "https://github.com/diaspora/diaspora",
+    "branch": "refs/tags/v0.7.10.0"
+  },
+  "github": {
+    "owner": "diaspora",
+    "repo": "diaspora",
+    "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8",
+    "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/diaspora/gemset.nix b/pkgs/webapps/diaspora/gemset.nix
new file mode 100644 (file)
index 0000000..e47f5b7
--- /dev/null
@@ -0,0 +1,3047 @@
+{
+  actioncable = {
+    dependencies = ["actionpack" "nio4r" "websocket-driver"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07r6hnh05db84yr9419mbhyzp20hr8yy9m50jxc2w91ghm2qnrrf";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionmailer = {
+    dependencies = ["actionpack" "actionview" "activejob" "mail" "rails-dom-testing"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s9xcqfx97q4yva2zc4qzb567mwzhry6v3x3zc318aqhcrz31g7c";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionpack = {
+    dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vz2ms80nqw21c304g3w2vkbs80gadzhi3mcwwym7smxccr37kcd";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionview = {
+    dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kfxlz9v7b47pdyy1whb4zzhvaj8h4sp1ajhbih2ax1hkldyg081";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  active_model_serializers = {
+    dependencies = ["activemodel" "concurrent-ruby"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19zr5pp84q4ya7mfrcanakjv86lv4wfmbcbbd2xnd4bkyprw5w7z";
+      type = "gem";
+    };
+    version = "0.9.7";
+  };
+  activejob = {
+    dependencies = ["activesupport" "globalid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02lssq8ps98mfg20dyhcpd16f9c0v4zzy7gfbb6ksbs06wrrd4d2";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activemodel = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10f8cpv4sl1w3m1qj8hl6sd2f1n7x91h45qaf57qr894ll22jgby";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activerecord = {
+    dependencies = ["activemodel" "activesupport" "arel"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iqkvxzx5bfp8rmlccww0cj1xr6iaxmn3hhbj1dv5j9c8mnm980x";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activerecord-import = {
+    dependencies = ["activerecord"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bxpbrcwc9k6khizwdikvfbhw9pcvs4sp3h4grpcww5k7bgpliz6";
+      type = "gem";
+    };
+    version = "0.27.0";
+  };
+  activesupport = {
+    dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08dm0mgmj31ggk7ib66wfagj4bgbr2jfl500bqb22x0szslz5lll";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  acts-as-taggable-on = {
+    dependencies = ["activerecord"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hl52pjgfzy3acdwnbxfqy08m808vlv9dmsyp03d5x7x0y499kvl";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  acts_as_api = {
+    dependencies = ["activemodel" "activesupport" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06miad13nnfr2gslc203ahsbvj499s9lngxxvfizwp964vglygsc";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  addressable = {
+    dependencies = ["public_suffix"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0viqszpkggqi8hq87pqp0xykhvz60g99nwmkwsb0v45kc2liwxvk";
+      type = "gem";
+    };
+    version = "2.5.2";
+  };
+  aes_key_wrap = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0li86k0g812jkzrppb2fvqngvzp09nygywjpn81nx90s01wxqw07";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  arel = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nw0qbc6ph625p6n3maqq9f527vz3nbl0hk72fbyka8jzsmplxzl";
+      type = "gem";
+    };
+    version = "8.0.0";
+  };
+  asset_sync = {
+    dependencies = ["activemodel" "fog-core" "mime-types" "unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mfz51g8rzk5h5fpdhfkycnm7y4dpfhx46wm7fygna7nd4w9ixdx";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  ast = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "184ssy3w93nkajlz2c70ifm79jp3j737294kbc5fjw69v1w0n9x7";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  attr_required = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g22axmi2rhhy7w8c3x6gppsawxqavbrnxpnmphh22fk7cwi0kh2";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  autoprefixer-rails = {
+    dependencies = ["execjs"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08irrl1mz6skagr1lygq79l34lc0dghgva0v9q7nng76dpiglgj3";
+      type = "gem";
+    };
+    version = "8.6.5";
+  };
+  backports = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hshjxww2h7s0dk57njrygq4zpp0nlqrjfya7zwm27iq3rhc3y8g";
+      type = "gem";
+    };
+    version = "3.11.4";
+  };
+  bcrypt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ysblqxkclmnhrd0kmb5mr8p38mbar633gdsb14b7dhkhgawgzfy";
+      type = "gem";
+    };
+    version = "3.1.12";
+  };
+  bindata = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kz42nvxnk1j9cj0i8lcnhprcgdqsqska92g6l19ziadydfk2gqy";
+      type = "gem";
+    };
+    version = "2.4.4";
+  };
+  bootstrap-sass = {
+    dependencies = ["autoprefixer-rails" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bc9bf6caddqn1rv15b5x56yczmbjzaxzl9lk5zbwrg1bfph4bx9";
+      type = "gem";
+    };
+    version = "3.3.7";
+  };
+  bootstrap-switch-rails = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zkwc1hfmihnm0n9lkva5zk0cmqpfcpnrwnmaniyvgx7rac2r14l";
+      type = "gem";
+    };
+    version = "3.3.3";
+  };
+  buftok = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rzsy1vy50v55x9z0nivf23y0r9jkmq6i130xa75pq9i8qrn1mxs";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  builder = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qibi5s67lpdv1wgcj66wcymcr04q6j4mzws6a479n0mlrmh5wr1";
+      type = "gem";
+    };
+    version = "3.2.3";
+  };
+  byebug = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10znc1hjv8n686hhpl08f3m2g6h08a4b83nxblqwy2kqamkxcqf8";
+      type = "gem";
+    };
+    version = "10.0.2";
+  };
+  capybara = {
+    dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10zj8syak12xd1kqywr35bkr2hkdjq18kij54x1ys8c26h6j4d0m";
+      type = "gem";
+    };
+    version = "3.11.1";
+  };
+  carrierwave = {
+    dependencies = ["activemodel" "activesupport" "mime-types"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1k9kla5ncygm97vn33lsrs7ch5zy4qqhhvc8m3khm986yaqh75qs";
+      type = "gem";
+    };
+    version = "1.2.3";
+  };
+  celluloid = {
+    dependencies = ["celluloid-essentials" "celluloid-extras" "celluloid-fsm" "celluloid-pool" "celluloid-supervision" "timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10i29q7kkdlrhf5rg43xygdfm795a02vp28k2ca3nklmqna57qmg";
+      type = "gem";
+    };
+    version = "0.17.3";
+  };
+  celluloid-essentials = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l4p3p73wjdj07ww124q0db5k1cyzggbndzmcb12xbsf2dnj121k";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-extras = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "078agvnsfp78jv343kn5g1cz50147dk0q46blwh5r8lk6whag7ng";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-fsm = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pmpi6h4abpkczp46rd6llk1mldpx19i9hll8mkxp3kxin9slivc";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-io = {
+    dependencies = ["celluloid" "nio4r" "timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1frcpja7h9vcxsw7w7ff550x54rfx514fpv2n6kawbk1j4zrm314";
+      type = "gem";
+    };
+    version = "0.17.3";
+  };
+  celluloid-pool = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bfr54ijl95bnhqlabhf5p4ff9n0y2sslc91f49jjn33n2zm755c";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-supervision = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b41gg1rsmms0m5mshy6h66y5rydl3nv6x9wf050ixfa1s2c8vzw";
+      type = "gem";
+    };
+    version = "0.20.6";
+  };
+  chunky_png = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05g2xli9wbjylkmblln3bhvjalziwb92q452q8ibjagmb853424w";
+      type = "gem";
+    };
+    version = "1.3.10";
+  };
+  cliver = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7";
+      type = "gem";
+    };
+    version = "0.3.2";
+  };
+  coderay = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15vav4bhcc2x3jmi3izb11l4d9f3xv8hp2fszb7iqmpsccv1pz4y";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  compass = {
+    dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-core = {
+    dependencies = ["multi_json" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-import-once = {
+    dependencies = ["sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq";
+      type = "gem";
+    };
+    version = "1.0.5";
+  };
+  compass-rails = {
+    dependencies = ["compass" "sass-rails" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02ydlbl1qb80myjv5xrpwzhmmj6qd80jf5izvpqhq2bikv84j9wr";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  concurrent-ruby = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18q9skp5pfq4jwbxzmw8q2rn4cpw6mf4561i2hsjcl1nxdag2jvb";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  configurate = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1m6cppb4jf7liwc3f5dvgn2v2nhp2jq8ixb9papaqz24f4s8dnd1";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  connection_pool = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lflx29mlznf1hn0nihkgllzbj8xp5qasn8j7h838465pi399k68";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  coveralls = {
+    dependencies = ["json" "simplecov" "term-ansicolor" "thor" "tins"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "022kc16np6w4mv17hq3m9hhw9l8hjl78ld3fzqqx6337vwvwvwcg";
+      type = "gem";
+    };
+    version = "0.8.22";
+  };
+  crack = {
+    dependencies = ["safe_yaml"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abb0fvgw00akyik1zxnq7yv391va148151qxdghnzngv66bl62k";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  crass = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bpxzy6gjw9ggjynlxschbfsgmx8lv3zw1azkjvnb8b9i895dqfi";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  cucumber = {
+    dependencies = ["builder" "cucumber-core" "cucumber-expressions" "cucumber-wire" "diff-lcs" "gherkin" "multi_json" "multi_test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s2brssrpal8hyhcgg974x3xyhpmvpwps5ypd9p8w2lg01l1pp3j";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  cucumber-api-steps = {
+    dependencies = ["cucumber" "jsonpath"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fij6bgzshda68jp7kac0hs5n6xsmv49g8ynqhy6s3znc9d4qjbw";
+      type = "gem";
+    };
+    version = "0.14.0";
+  };
+  cucumber-core = {
+    dependencies = ["backports" "cucumber-tag_expressions" "gherkin"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iavlh8hqj9lwljbpkw06259gdicbr1bdb6pbj5yy3n8szgr8k3c";
+      type = "gem";
+    };
+    version = "3.2.1";
+  };
+  cucumber-expressions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zwmv6hznyz9vk81f5dhwcr9jhxx2vmbk8yyazayvllvhy0fkpdw";
+      type = "gem";
+    };
+    version = "6.0.1";
+  };
+  cucumber-rails = {
+    dependencies = ["capybara" "cucumber" "mime-types" "nokogiri" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pmlza6r2601k1i7v3z8gj4apdcq6qa830bzwkj1pnfjzn4z12n7";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  cucumber-tag_expressions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cvmbljybws0qzjs1l67fvr9gqr005l8jk1ni5gcsis9pfmqh3vc";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  cucumber-wire = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09ymvqb0sbw2if1nxg8rcj33sf0va88ancq5nmp8g01dfwzwma2f";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  database_cleaner = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05i0nf2aj70m61y3fspypdkc6d1qgibf5kav05a71b5gjz0k7y5x";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  devise = {
+    dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vs8nibl568ghm6a7hbw6xgcv8zbm4gykprcxpnzi7bz5d4gvcjx";
+      type = "gem";
+    };
+    version = "4.5.0";
+  };
+  devise_lastseenable = {
+    dependencies = ["devise" "rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1h83h73qjh8fc7lmr089shky8lc3wm4xn653rjdbb0cddflvrx8y";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  diaspora-prosody-config = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1976ijqjf5jcq1jwr6vi0srjadhbqfa9y3nxyipzcv91pzskl2lp";
+      type = "gem";
+    };
+    version = "0.0.7";
+  };
+  diaspora_federation = {
+    dependencies = ["faraday" "faraday_middleware" "nokogiri" "typhoeus" "valid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xxy6ahlhgyr00qkfmmq0h3nqm6gjkr9i6hsqr0nkb3l6qg0m0yc";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-json_schema = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hfv4cq5wfdg86xmbp5y0h50b11326ymzks1yr9dvr4wa7di00hr";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-rails = {
+    dependencies = ["actionpack" "diaspora_federation"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wrni7d9084v3pqd3sq8j532wx5ym6kmd959bw29bzwxc3zidd9h";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-test = {
+    dependencies = ["diaspora_federation" "fabrication" "uuid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b09y78pyl9kix8slbybnks2cbq0ac9wml31j2s6qwjixranjsm4";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diff-lcs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18w22bjz424gzafv6nzv98h0aqkwz3d9xhm7cbr1wfbyas8zayza";
+      type = "gem";
+    };
+    version = "1.3";
+  };
+  docile = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04d2izkna3ahfn6fwq4xrcafa715d3bbqczxm16fq40fqy87xn17";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  domain_name = {
+    dependencies = ["unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abdlwb64ns7ssmiqhdwgl27ly40x2l27l8hs8hn0z4kb3zd2x3v";
+      type = "gem";
+    };
+    version = "0.5.20180417";
+  };
+  entypo-rails = {
+    dependencies = ["railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "124x0jszg6n0k2lcacd627ndlp1fv7cbgnv4scwy5s3czp0qwip6";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  equalizer = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kjmx3fygx8njxfrwcmn7clfhjhb6bvv3scy2lyyi0wqyi3brra4";
+      type = "gem";
+    };
+    version = "0.0.11";
+  };
+  erubi = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bws86na9k565raiz0kk61yy5pxxp0fmwyzpibdwjkq0xzx8q6q1";
+      type = "gem";
+    };
+    version = "1.7.1";
+  };
+  eslintrb = {
+    dependencies = ["execjs" "multi_json" "rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kx9sbs7pnl436zyczylnqqb1858hffy66fwdqfmcn18q8xdqwkx";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  et-orbi = {
+    dependencies = ["tzinfo"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wk7i0bmsy46la8gcvbmdns0ni8lmdqas838phj97bdwykxw8m4b";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  ethon = {
+    dependencies = ["ffi"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y70szwm2p0b9qfvpqrzjrgm3jz0ig65vlbfr6ppc3z0m1h7kv48";
+      type = "gem";
+    };
+    version = "0.11.0";
+  };
+  excon = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15l9w0938c19nxmrp09n75qpmm64k12xj69h47yvxzcxcpbgnkb2";
+      type = "gem";
+    };
+    version = "0.62.0";
+  };
+  execjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1";
+      type = "gem";
+    };
+    version = "2.7.0";
+  };
+  eye = {
+    dependencies = ["celluloid" "celluloid-io" "kostya-sigar" "state_machines" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gqrrrisy492m6sczq775dyg9sxkl926r8lkr6z33kfb4cnimfzk";
+      type = "gem";
+    };
+    version = "0.10.0";
+  };
+  fabrication = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0an28kjand4mjbkmnwd9fmgq3y5vf717zpmiijavar3sxqj52zri";
+      type = "gem";
+    };
+    version = "2.20.1";
+  };
+  factory_girl = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cc60v28r7w1gp34p4amzdnq7cyip6qhffvxywsj3ypilyf8jqla";
+      type = "gem";
+    };
+    version = "4.8.0";
+  };
+  factory_girl_rails = {
+    dependencies = ["factory_girl" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hw8qqp30vm4yf4a36r1r65wk78ihxmas7jg5fyl6fcf705z9fvv";
+      type = "gem";
+    };
+    version = "4.8.0";
+  };
+  faraday = {
+    dependencies = ["multipart-post"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16hwxc8v0z6gkanckjhx0ffgqmzpc4ywz4dfhxpjlz2mbz8d5m52";
+      type = "gem";
+    };
+    version = "0.15.3";
+  };
+  faraday-cookie_jar = {
+    dependencies = ["faraday" "http-cookie"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  faraday_middleware = {
+    dependencies = ["faraday"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p7icfl28nvl8qqdsngryz1snqic9l8x6bk0dxd7ygn230y0k41d";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  ffi = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jpm2dis1j7zvvy3lg7axz9jml316zrn7s0j59vyq3qr127z0m7q";
+      type = "gem";
+    };
+    version = "1.9.25";
+  };
+  fixture_builder = {
+    dependencies = ["activerecord" "activesupport" "hashdiff"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qlq0nyfhjvz09hm0jankl9bgs9672k31b3lmsfq8p135x3xs627";
+      type = "gem";
+    };
+    version = "0.5.2.rc3";
+  };
+  fog-aws = {
+    dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zprxg0spvkkri1jf40zg3rfr5h2gq6009d7l36lifpvhjn658cs";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  fog-core = {
+    dependencies = ["builder" "excon" "formatador" "mime-types"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fsama04wlxhv537bm4b7rr4zzn0mvisy87m3qzv6f0mhlrq3zp8";
+      type = "gem";
+    };
+    version = "2.1.2";
+  };
+  fog-json = {
+    dependencies = ["fog-core" "multi_json"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  fog-xml = {
+    dependencies = ["fog-core" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  formatador = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  fugit = {
+    dependencies = ["et-orbi" "raabro"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1szijawzdii668z5is9xi849399gy786951dx0l5r2z5mbfqvl9i";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  fuubar = {
+    dependencies = ["rspec-core" "ruby-progressbar"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sqkr1nh49rlm86l3qyrgsdqavgqii4pnrjn7855z6dfavh3spxr";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  get_process_mem = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bvfjdign16r0zwm2rlfrq0sk1licvmlgbnlpnyckniv5r7i080g";
+      type = "gem";
+    };
+    version = "0.2.3";
+  };
+  gherkin = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cgcdchwwdm10rsk44frjwqd4ihprhxjbm799nscqy2q1raqfj5s";
+      type = "gem";
+    };
+    version = "5.1.0";
+  };
+  gitlab = {
+    dependencies = ["httparty" "terminal-table"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nncjmk71ivjxmgkpv100yybry5c7ld6xjgi1b5zsfv4g3mz0v34";
+      type = "gem";
+    };
+    version = "4.7.0";
+  };
+  globalid = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02smrgdi11kziqi9zhnsy9i6yr2fnxrqlv3lllsvdjki3cd4is38";
+      type = "gem";
+    };
+    version = "0.4.1";
+  };
+  gon = {
+    dependencies = ["actionpack" "multi_json" "request_store"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07sm7fd94pfscrbs4lyprs0das8s1yn32cw521ch738jaqb388xl";
+      type = "gem";
+    };
+    version = "6.2.1";
+  };
+  guard = {
+    dependencies = ["formatador" "listen" "lumberjack" "nenv" "notiffany" "pry" "shellany" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h84ja6qvii3hx86w9l4vjpbgl4m8ma8fbawwp7s8l791cgkdcmk";
+      type = "gem";
+    };
+    version = "2.15.0";
+  };
+  guard-compat = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj6sr1k8w59mmi27rsii0v8xyy2rnsi09nqvwpgj1q10yq1mlis";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  guard-rspec = {
+    dependencies = ["guard" "guard-compat" "rspec"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jkm5xp90gm4c5s51pmf92i9hc10gslwwic6mvk72g0yplya0yx4";
+      type = "gem";
+    };
+    version = "4.7.3";
+  };
+  guard-rubocop = {
+    dependencies = ["guard" "rubocop"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p97zkzasghl1md13rh57n3s2rr2kqly8w4vfn6vaj89igjpagdp";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  haml = {
+    dependencies = ["temple" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q0a9fvqh8kn6wm97fcks6qzbjd400bv8bx748w8v87m7p4klhac";
+      type = "gem";
+    };
+    version = "5.0.4";
+  };
+  haml_lint = {
+    dependencies = ["haml" "rainbow" "rake" "rubocop" "sysexits"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "125aj0j84nx5gqm42hfx5d8486higlra423ahgfpsdjwbp399rwv";
+      type = "gem";
+    };
+    version = "0.28.0";
+  };
+  hamlit = {
+    dependencies = ["temple" "thor" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14fsc208qsf46cflk23vs2fdw435dk65fwv55zhziciwn96ld8sf";
+      type = "gem";
+    };
+    version = "2.9.1";
+  };
+  handlebars_assets = {
+    dependencies = ["execjs" "sprockets" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18pyksz4jb0n28acqxv14ahy8mkc9ldqbbn73gcj28m0l9wjzsca";
+      type = "gem";
+    };
+    version = "0.23.2";
+  };
+  hashdiff = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yj5l2rw8i8jc725hbcpc4wks0qlaaimr3dpaqamfjkjkxl0hjp9";
+      type = "gem";
+    };
+    version = "0.3.7";
+  };
+  hashie = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hh5lybf8hm7d7xs4xm8hxvm8xqrs2flc8fnwkrclaj746izw6xb";
+      type = "gem";
+    };
+    version = "3.5.7";
+  };
+  http = {
+    dependencies = ["addressable" "http-cookie" "http-form_data" "http_parser.rb"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jlm5prw437wqpfxcigh88lfap3m7g8mnmj5as7qw6dzqnvrxwmc";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  http-cookie = {
+    dependencies = ["domain_name"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  http-form_data = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15lpn604byf7cyxnw949xz4rvpcknqp7a48q73nm630gqxsa76f3";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  http_accept_language = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  "http_parser.rb" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15nidriy0v5yqfjsgsra51wmknxci2n2grliz78sf9pga3n0l7gi";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  httparty = {
+    dependencies = ["mime-types" "multi_xml"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xmm7pxmz3pblkdr76dg7qm5s60kpp3yvh46c2i0bn1dm0zgl730";
+      type = "gem";
+    };
+    version = "0.16.3";
+  };
+  httpclient = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99";
+      type = "gem";
+    };
+    version = "2.8.3";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gcp1m1p6dpasycfz2sj82ci9ggz7lsskz9c9q6gvfwxrl8y9dx7";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  i18n-inflector = {
+    dependencies = ["i18n"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "081jr7z947aqjfmpbfs10w9jxi205jwgk4mgd8jds1b4m4i8mc7g";
+      type = "gem";
+    };
+    version = "2.6.7";
+  };
+  i18n-inflector-rails = {
+    dependencies = ["actionpack" "i18n-inflector" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c04jm657akp5n14syhcwnn3hnsvx7harvg97768bvf3f9a37hyk";
+      type = "gem";
+    };
+    version = "1.0.7";
+  };
+  ipaddress = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45";
+      type = "gem";
+    };
+    version = "0.8.3";
+  };
+  jaro_winkler = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rr797nqz081bfk30m2apj5h24bg5d1jr1c8p3xwx4hbwsrbclah";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  jasmine = {
+    dependencies = ["jasmine-core" "phantomjs" "rack" "rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xfwf163wi5a9i0vlm564cqi6k30h15wnrwd15ph95jfa5516kv1";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  jasmine-core = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b12bjfrxvb8mwjwlfyngykd80lz956glcpfz7rhhw7n75b2rdlv";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  jasmine-jquery-rails = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cq5zd4ng5dlza45whd6sa7bzd60rlddk9760271mybdqyd96jlv";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  jquery-rails = {
+    dependencies = ["rails-dom-testing" "railties" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17201sb8ddwy4yprizmqabq1kfx3m9c53p0yqngn63m07jjcpnh8";
+      type = "gem";
+    };
+    version = "4.3.3";
+  };
+  js-routes = {
+    dependencies = ["railties" "sprockets-rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14yx3jrd4sgcwgj8yrrqdwl691mci1hcjqyyvp0v15jbzis1bclm";
+      type = "gem";
+    };
+    version = "1.4.4";
+  };
+  js_image_paths = {
+    dependencies = ["rails" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4kq8895i61a338ddk5f2k16l5lvmnkby9cdjwnmm2jddw4q7nf";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  json = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01v6jjpvh3gnq6sgllpfqahlgxzj50ailwhj9b3cd20hi2dx0vxp";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  json-jwt = {
+    dependencies = ["activesupport" "aes_key_wrap" "bindata"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "065k7vffdki73f4nz89lxi6wxmcw5dlf593831pgvlbralll6x3r";
+      type = "gem";
+    };
+    version = "1.9.4";
+  };
+  json-schema = {
+    dependencies = ["addressable"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  json-schema-rspec = {
+    dependencies = ["json-schema" "rspec"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ip30yjzyigqqp9jwkrw9x9vrfpnmwi160zmk2vkrwlv9pby0wr9";
+      type = "gem";
+    };
+    version = "0.0.4";
+  };
+  jsonpath = {
+    dependencies = ["multi_json" "to_regexp"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06i41lwpj0dwvbxcpqrad5pjn2gmcv0srv0zw0ap7irwc21ifd7d";
+      type = "gem";
+    };
+    version = "0.9.6";
+  };
+  jwt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w0kaqrbl71cq9sbnixc20x5lqah3hs2i93xmhlfdg2y3by7yzky";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  kgio = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1528pyj1szzzp3pgj05fzjd36qjrxm9yj2x5radc9p1z7vl67y50";
+      type = "gem";
+    };
+    version = "2.11.2";
+  };
+  kostya-sigar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0z0pcykhjyrb7kq76jfcyxc1qq23gj5zmgy3miy87v85ydrxiqwb";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  leaflet-rails = {
+    dependencies = ["rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dy7vhsjj1fhbbqm2s7pw57vgysd31qqi4y0hm91325hmvq75grb";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  listen = {
+    dependencies = ["rb-fsevent" "rb-inotify" "ruby_dep"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01v5mrnfqm6sgm8xn2v5swxsn1wlmq7rzh2i48d4jzjsc7qvb6mx";
+      type = "gem";
+    };
+    version = "3.1.5";
+  };
+  little-plugger = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1frilv82dyxnlg8k1jhrvyd73l6k17mxc5vwxx080r4x1p04gwym";
+      type = "gem";
+    };
+    version = "1.1.4";
+  };
+  logging = {
+    dependencies = ["little-plugger" "multi_json"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06j6iaj89h9jhkx1x3hlswqrfnqds8br05xb1qra69dpvbdmjcwn";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  logging-rails = {
+    dependencies = ["logging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "022cnj9v177282kadd9ygzjpvlvbq9k5z0xhdbbmgypi05z4i239";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  loofah = {
+    dependencies = ["crass" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ccsid33xjajd0im2xv941aywi58z7ihwkvaf1w2bv89vn5bhsjg";
+      type = "gem";
+    };
+    version = "2.2.3";
+  };
+  lumberjack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06im7gcg42x77yhz2w5da2ly9xz0n0c36y5ks7xs53v0l9g0vf5n";
+      type = "gem";
+    };
+    version = "1.0.13";
+  };
+  macaddr = {
+    dependencies = ["systemu"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1clii8mvhmh5lmnm95ljnjygyiyhdpja85c5vy487rhxn52scn0b";
+      type = "gem";
+    };
+    version = "1.7.1";
+  };
+  mail = {
+    dependencies = ["mini_mime"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  markdown-it-html5-embed = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10n2z6j0whc6makxvcf2jhpwb8xrj4s6vyywijsaaxs0cn490a5c";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  markerb = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08sm3kafc3086l0a9is2cysk7j2k71mxy6ba295pwwzyvy734y76";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  memoizable = {
+    dependencies = ["thread_safe"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v42bvghsvfpzybfazl14qhkrjvx0xlmxz0wwqc960ga1wld5x5c";
+      type = "gem";
+    };
+    version = "0.4.2";
+  };
+  method_source = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pviwzvdqd90gn6y7illcdd9adapw8fczml933p5vl739dkvl3lq";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+  mime-types = {
+    dependencies = ["mime-types-data"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fjxy1jm52ixpnv3vg9ld9pr9f35gy0jp66i1njhqjvmnvq0iwwk";
+      type = "gem";
+    };
+    version = "3.2.2";
+  };
+  mime-types-data = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07wvp0aw2gjm4njibb70as6rh5hi1zzri5vky1q6jx95h8l56idc";
+      type = "gem";
+    };
+    version = "3.2018.0812";
+  };
+  mini_magick = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sisx59mr5kydmxmx5vr8spmrxhrjkfqv35zhsqdlyzmp1z5px9p";
+      type = "gem";
+    };
+    version = "4.9.2";
+  };
+  mini_mime = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q4pshq387lzv9m39jv32vwb8wrq3wc4jwgl4jk209r4l33v09d3";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  mini_portile2 = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13d32jjadpjj6d2wdhkfpsmy68zjx90p49bgf8f7nkpz86r1fr11";
+      type = "gem";
+    };
+    version = "2.3.0";
+  };
+  minitest = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0icglrhghgwdlnzzp4jf76b0mbc71s80njn5afyfjn4wqji8mqbq";
+      type = "gem";
+    };
+    version = "5.11.3";
+  };
+  mobile-fu = {
+    dependencies = ["rack-mobile-detect" "rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lxfcsd7dwwcpa1j2jbl382anmv6kksf5q1wqj14gc6jxxjq9s4i";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  multi_json = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rl0qy4inf1mp8mybfk56dfga0mvx97zwpmq5xmiwl5r770171nv";
+      type = "gem";
+    };
+    version = "1.13.1";
+  };
+  multi_test = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sx356q81plr67hg16jfwz9hcqvnk03bd9n75pmdw8pfxjfy1yxd";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  multi_xml = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  multipart-post = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  mysql2 = {
+    groups = ["mysql"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a2kdjgzwh1p2rkcmxaawy6ibi32b04wbdd5d4wr8i342pq76di4";
+      type = "gem";
+    };
+    version = "0.5.2";
+  };
+  naught = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wwjx35zgbc0nplp8a866iafk4zsrbhwwz4pav5gydr2wm26nksg";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  nenv = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r97jzknll9bhd8yyg2bngnnkj8rjhal667n7d32h8h7ny7nvpnr";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  nio4r = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a41ca1kpdmrypjp9xbgvckpy8g26zxphkja9vk7j5wl4n8yvlyr";
+      type = "gem";
+    };
+    version = "2.3.1";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0byyxrazkfm29ypcx5q4syrv126nvjnf7z6bqi01sqkv4llsi4qz";
+      type = "gem";
+    };
+    version = "1.8.5";
+  };
+  notiffany = {
+    dependencies = ["nenv" "shellany"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0x838fa5il0dd9zbm3lxkpbfxcf5fxv9556mayc2mxsdl5ghv8nx";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  oauth = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zszdg8q1b135z7l7crjj234k4j0m347hywp5kj6zsq7q78pw09y";
+      type = "gem";
+    };
+    version = "0.5.4";
+  };
+  oauth2 = {
+    dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0av6nlb5y2sm6m8fx669ywrqa9858yqaqfqzny75nqp3anag89qh";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  octokit = {
+    dependencies = ["sawyer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yh0yzzqg575ix3y2l2261b9ag82gv2v4f1wczdhcmfbxcz755x6";
+      type = "gem";
+    };
+    version = "4.13.0";
+  };
+  omniauth = {
+    dependencies = ["hashie" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1msqr4qq7mfdvl3rg89529isrv595hvjpj2gi0say4b8nwqfggmg";
+      type = "gem";
+    };
+    version = "1.8.1";
+  };
+  omniauth-oauth = {
+    dependencies = ["oauth" "omniauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n5vk4by7hkyc09d9blrw2argry5awpw4gbw1l4n2s9b3j4qz037";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  omniauth-oauth2 = {
+    dependencies = ["oauth2" "omniauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kscjf1y0lnggsl4z3w5bwllqshqjlsl5kmcya5haydajdnzvdjr";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  omniauth-tumblr = {
+    dependencies = ["multi_json" "omniauth-oauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10ncmfym4l6k6aqp402g7mqxahbggcj5xkpsjxgngs746s82y97w";
+      type = "gem";
+    };
+    version = "1.2";
+  };
+  omniauth-twitter = {
+    dependencies = ["omniauth-oauth" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r5j65hkpgzhvvbs90id3nfsjgsad6ymzggbm7zlaxvnrmvnrk65";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  omniauth-wordpress = {
+    dependencies = ["omniauth-oauth2"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "008zx4zwrbzyvlgv6hy68k1d05zskiwvcgwvxxbxhbl0mvlmh303";
+      type = "gem";
+    };
+    version = "0.2.2";
+  };
+  open_graph_reader = {
+    dependencies = ["faraday" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0af4yldyb0d8zglw73s13pyn0g90gs4m5zf7bwy8r4kym9zbvc21";
+      type = "gem";
+    };
+    version = "0.6.2";
+  };
+  openid_connect = {
+    dependencies = ["activemodel" "attr_required" "json-jwt" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r13bv18nyvw0g1nw3fzffvv2si99zj24w0k5zgawf4q6nn5f7vd";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  orm_adapter = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  parallel = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01hj8v1qnyl5ndrs33g8ld8ibk0rbcqdpkpznr04gkbxd11pqn67";
+      type = "gem";
+    };
+    version = "1.12.1";
+  };
+  parser = {
+    dependencies = ["ast"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zjk0w1kjj3xk8ymy1430aa4gg0k8ckphfj88br6il4pm83f0n1f";
+      type = "gem";
+    };
+    version = "2.5.3.0";
+  };
+  pg = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pnjw3rspdfjssxyf42jnbsdlgri8ylysimp0s28wxb93k6ff2qb";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  phantomjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y8pbbyq9dirxb7igkb2s5limz2895qmr41c09fjhx6k6fxcz4mk";
+      type = "gem";
+    };
+    version = "2.1.1.0";
+  };
+  poltergeist = {
+    dependencies = ["capybara" "cliver" "websocket-driver"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0il80p97psmhs6scl0grq031gv7kws4ylvvd6zyr8xv91qadga95";
+      type = "gem";
+    };
+    version = "1.18.1";
+  };
+  powerpack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r51d67wd467rpdfl6x43y84vwm8f5ql9l9m85ak1s2sp3nc5hyv";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  pronto = {
+    dependencies = ["gitlab" "httparty" "octokit" "rainbow" "rugged" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13xbg1pm3kz5zbzxad5qgqnkzkp3ddajj7wxx16aqbfr7rqggvhz";
+      type = "gem";
+    };
+    version = "0.9.5";
+  };
+  pronto-eslint = {
+    dependencies = ["eslintrb" "pronto"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cxyx6mlcdgv4ykliaizkx9cps68xf7qvy8lzxmv7pcqzkxaq7xc";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pronto-haml = {
+    dependencies = ["haml_lint" "pronto"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "116iln1whwiqy55f86q33lnnic0awnqm415xvxwnhwlagcbwmnkg";
+      type = "gem";
+    };
+    version = "0.9.0";
+  };
+  pronto-rubocop = {
+    dependencies = ["pronto" "rubocop"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bcm34qlpp02wf69why5lpi5p53h5r4fq36f4b1fwi621fwzlgsy";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pronto-scss = {
+    dependencies = ["pronto" "scss_lint"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kgaqd6l2w3brdsp5231fpfr6fwajciz2hdr925l1zhh6ni1y2za";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pry = {
+    dependencies = ["coderay" "method_source"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00rm71x0r1jdycwbs83lf9l6p494m99asakbvqxh8rz7zwnlzg69";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  pry-byebug = {
+    dependencies = ["byebug" "pry"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y2758593i2ij0nhmv0j1pbdfx2cgi52ns6wkij0frgnk2lf650g";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  public_suffix = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08q64b5br692dd3v0a9wq9q5dvycc6kmiqmjbdxkxbfizggsvx6l";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  raabro = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xzdmbn48753f6k0ckirp8ja5p0xn1a92wbwxfyggyhj0hza9ylq";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  rack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pcgv8dv4vkaczzlix8q3j68capwhk420cddzijwqgi2qb4lm1zm";
+      type = "gem";
+    };
+    version = "2.0.6";
+  };
+  rack-cors = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1j27vy1bmhbqcyzhxg8d07qassmax769xjalfwcwz6qfiq8cf013";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  rack-google-analytics = {
+    dependencies = ["actionpack" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09pv0z5dhjjrlhi9qj5qy48hi66f7iix337qrapg7mvwwz6czcvj";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  rack-mobile-detect = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bagli6ldhkpd1yym775sxy7w5n4jds6gbcjm3gmcl37vggvm8a5";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  rack-oauth2 = {
+    dependencies = ["activesupport" "attr_required" "httpclient" "json-jwt" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kmxj9hbjhhcs3yyb433s82hkpmzb536m0mwfadjiaisganx1cii";
+      type = "gem";
+    };
+    version = "1.9.3";
+  };
+  rack-piwik = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0raxrckapqh693lpid0cnx1j1v2i3mz5cyssg7grgrilgrn9318z";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ylx74ravz7nvnyygq0nk3v86qdzrmqxpwpayhppyy50l72rcajq";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  rack-rewrite = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  rack-ssl = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  rails = {
+    dependencies = ["actioncable" "actionmailer" "actionpack" "actionview" "activejob" "activemodel" "activerecord" "activesupport" "railties" "sprockets-rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lb07cbwgm371zyn9i6fyj9q8rmv89lacmyzrfvzxqqx2n3ilc5q";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  rails-assets-autosize = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0hr72mfprb9678lf7dj9lh801lm7p98nzkrnrz764sy9lmbpzcib";
+      type = "gem";
+    };
+    version = "4.0.2";
+  };
+  rails-assets-backbone = {
+    dependencies = ["rails-assets-underscore"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0zjgwhgfmg1jyyds7zfjp6g4bz8vw56qvhlrpj943wcqpdxm93id";
+      type = "gem";
+    };
+    version = "1.3.3";
+  };
+  rails-assets-blueimp-gallery = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "18b7xvvkdnd39xlbkyw46i86w3wzj349s8iv5wdiypa5qdcql8mq";
+      type = "gem";
+    };
+    version = "2.33.0";
+  };
+  rails-assets-bootstrap = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0x4i11132qcmghmqb061iq47yksrr7i0la5hzzdm38dxybh87x5v";
+      type = "gem";
+    };
+    version = "3.3.7";
+  };
+  rails-assets-bootstrap-markdown = {
+    dependencies = ["rails-assets-bootstrap"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1nxirs9wx5jxrjmxjwvsqlf2rsypjn3ajg7fs28c4ib7wwpabwj3";
+      type = "gem";
+    };
+    version = "2.10.0";
+  };
+  rails-assets-corejs-typeahead = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1p5i6afd156rakrin99c2ryaz3zykx21ir6y10l34jnw03rikcfg";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  rails-assets-diaspora_jsxc = {
+    dependencies = ["rails-assets-emojione" "rails-assets-favico.js" "rails-assets-jquery-colorbox" "rails-assets-jquery-fullscreen-plugin" "rails-assets-jquery.slimscroll" "rails-assets-jquery.ui"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "07vqdj0l8fsj4fd2sschba2jgfbimyfad56009ldzlcvb6ml5nhi";
+      type = "gem";
+    };
+    version = "0.1.5.develop.7";
+  };
+  rails-assets-emojione = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1j29vbsf6v9ikiqlmnfgzxys4xsa1glvmfky8id5xfyymnjx2c52";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  "rails-assets-favico.js" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "19yndhljmqlvarf49h5v71zq0p0ngvspjr2v0m6lac0q9ni7r5bv";
+      type = "gem";
+    };
+    version = "0.3.10";
+  };
+  rails-assets-fine-uploader = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1vxj78x2vvlchpapxpaawysc9wn8alzdd3gxhwfwy11xv8ka9mdv";
+      type = "gem";
+    };
+    version = "5.13.0";
+  };
+  rails-assets-highlightjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0spmb0gkfs13fmljjv1n53r53q69fhb6r573ndbxnhgb3izqgnqp";
+      type = "gem";
+    };
+    version = "9.12.0";
+  };
+  rails-assets-jasmine = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1n6yixrl9cgq5kckay75b44p878s1kqi69mhgyw99w8dsq8i2vy5";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  rails-assets-jasmine-ajax = {
+    dependencies = ["rails-assets-jasmine"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0l8z0p75x1yzk1l1ryfvdlvq8yq4w2xngp4icz478axd5jcqx6kg";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  rails-assets-jquery = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1wcaappk12w300733lrqb571cir9nw35d9q6d2i52wwdvhv2fx2y";
+      type = "gem";
+    };
+    version = "3.3.1";
+  };
+  rails-assets-jquery-colorbox = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "19ws3r1zfviwnfr9s0jh6iqss50iwqkf4a78zhrk0p3bb4lvmmsp";
+      type = "gem";
+    };
+    version = "1.6.4";
+  };
+  rails-assets-jquery-fullscreen-plugin = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0ldvq4s15lap9p6w7d1yw6dajn2gh6p75dbkp79p0d8ylzapsd58";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  rails-assets-jquery-placeholder = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0h17gjazc27pj4cm2ig232ww4d4ppq9bcginwzjss95pl63richi";
+      type = "gem";
+    };
+    version = "2.3.1";
+  };
+  rails-assets-jquery-textchange = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0rsw3cn9a5njv80zy53339kmrmv60b8fqcrr7bacapbagb2rd4dj";
+      type = "gem";
+    };
+    version = "0.2.3";
+  };
+  "rails-assets-jquery.are-you-sure" = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0nj04aqh9jpcg57xbjxpm2vn7mkd5clnpma907515a1nxy40bym0";
+      type = "gem";
+    };
+    version = "1.9.0";
+  };
+  "rails-assets-jquery.slimscroll" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1rymmd2rxy1vjjj70v88abmdlfs55276rs3rksj300dgirnnj998";
+      type = "gem";
+    };
+    version = "1.3.8";
+  };
+  "rails-assets-jquery.ui" = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0xc9kfb29hi441irj49b7aawxkddk1dxzy938rpqv9ylpsj7knaa";
+      type = "gem";
+    };
+    version = "1.11.4";
+  };
+  rails-assets-markdown-it = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fxx7ldszsdqr5ry21bnxmv33byz7abpk9lcp100q5cqsjx091r9";
+      type = "gem";
+    };
+    version = "8.4.2";
+  };
+  rails-assets-markdown-it--markdown-it-for-inline = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fznv2x7ndadr3wb4dzhh86bpcpwz8f4d8rfhz4sfbqlai40j3jl";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  rails-assets-markdown-it-diaspora-mention = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0asggm7wgmdll8x94291p2w6icmp2izi914dlh3b7vb7dpjq3jig";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  rails-assets-markdown-it-hashtag = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0dr8fwaxgkfqm7z4rl4jdym0i1ycqw1sgkxshkd9k0849ry12cdk";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  rails-assets-markdown-it-sanitizer = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fkpffh83fc257zkzaia93j4hw2baz90lg10s5yxsxww06q5dn36";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  rails-assets-markdown-it-sub = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "08hjij5fqvhvg7s27n4g8qqsks974g3kc5k7xl2qmh41k7f4hcrk";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  rails-assets-markdown-it-sup = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "17nnnvky7zy0yiwwl6dm8ibbkyvvf63xfp3snch4dzmras05lmig";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  rails-assets-underscore = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1ccnzj7aqrvngcs915y290pijryqmjygimdwlrykpyj8vwzifdnc";
+      type = "gem";
+    };
+    version = "1.9.1";
+  };
+  rails-assets-utatti-perfect-scrollbar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0m8syfv8p5bnwm8nrba6mpjnhrd29ffwzi6awhiw537jqw42b12v";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  rails-controller-testing = {
+    dependencies = ["actionpack" "actionview" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16kdkk73mhhs73iz3i1i0ryjm84dadiyh817b3nh8acdi490jyhy";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  rails-dom-testing = {
+    dependencies = ["activesupport" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  rails-html-sanitizer = {
+    dependencies = ["loofah"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gv7vr5d9g2xmgpjfq4nxsqr70r9pr042r9ycqqnfvw5cz9c7jwr";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  rails-i18n = {
+    dependencies = ["i18n" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05lkhc737a9dw0hd5ljmja0yp4cw39r3200s1r0n4bs7z1g3ka7l";
+      type = "gem";
+    };
+    version = "5.1.2";
+  };
+  rails-timeago = {
+    dependencies = ["actionpack" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01x1vs9hni9wn8dc4fmyqzkrn651chzsi2mhmk0pxdrfx9md0lxv";
+      type = "gem";
+    };
+    version = "2.16.0";
+  };
+  railties = {
+    dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ycy2gdaj0px1vfaghskvl6qkczwaigrli2zxn54w7zn1z29faj8";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  rainbow = {
+    dependencies = ["rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08w2ghc5nv0kcq5b257h7dwjzjz1pqcavajfdx2xjyxqsvh2y34w";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  raindrops = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qpbd9jif40c53fz2r0l8khfl016y8s8bkx37ibcaafclbl3xygp";
+      type = "gem";
+    };
+    version = "0.19.0";
+  };
+  rake = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1idi53jay34ba9j68c3mfr9wwkg3cd9qh0fn9cg42hv72c6q8dyg";
+      type = "gem";
+    };
+    version = "12.3.1";
+  };
+  rb-fsevent = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lm1k7wpz69jx7jrc92w3ggczkjyjbfziq5mg62vjnxmzs383xx8";
+      type = "gem";
+    };
+    version = "0.10.3";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yfsgw5n7pkpyky6a9wkf1g9jafxb0ja7gz0qw0y14fd2jnzfh71";
+      type = "gem";
+    };
+    version = "0.9.10";
+  };
+  redcarpet = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h9qz2hik4s9knpmbwrzb3jcp3vc5vygp9ya8lcpl7f1l9khmcd7";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  redis = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i415x8gi0c5vsiy6ikvx5js6fhc4x80a5lqv8iidy2iymd20irv";
+      type = "gem";
+    };
+    version = "3.3.5";
+  };
+  regexp_parser = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18g5jyg3blsdrz3mc8d87bms6qqn6gcdh1nvdhvgbjdpk9pw21dq";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  request_store = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1963330z03fk382fi8y231ygcbnh86m91dqlp5rh1mwy9ihzzl6d";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  responders = {
+    dependencies = ["actionpack" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rhdyyvvm26f2l3fgwdp6xasfl2y0whwgy766bhdwz697mf78zfn";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rspec = {
+    dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15ppasvb9qrscwlyjz67ppw1lnxiqnkzx5vkx1bd8x5n3dhikxc3";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-core = {
+    dependencies = ["rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p1s5bnbqp3sxk67y0fh0x884jjym527r0vgmhbm81w7aq6b7l4p";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-expectations = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18l21hy1zdc2pgc2yb17k3n2al1khpfr0z6pijlm852iz6vj0dkm";
+      type = "gem";
+    };
+    version = "3.8.2";
+  };
+  rspec-json_expectations = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0l3dhvkb95zwyg72wz33azxigc9cisqgg3z16ksns1sx0b93nnbn";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  rspec-mocks = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06y508cjqycb4yfhxmb3nxn0v9xqf17qbd46l1dh4xhncinr4fyp";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-rails = {
+    dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sqj5da2kc937j5jb18jcf0hrmmzwgj7pk62j0q3qndhc2kvx88p";
+      type = "gem";
+    };
+    version = "3.8.1";
+  };
+  rspec-support = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p3m7drixrlhvj2zpc38b11x145bvm311x6f33jjcxmvcm0wq609";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rubocop = {
+    dependencies = ["jaro_winkler" "parallel" "parser" "powerpack" "rainbow" "ruby-progressbar" "unicode-display_width"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ivk049z3mp12nc6v1wn35bsq1g7nz1i2r4xwzqf0v25hm2v7n1i";
+      type = "gem";
+    };
+    version = "0.60.0";
+  };
+  ruby-oembed = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kw4aplb3m13z3kchhb79wf87qb3prn1m99s6vl5cyp0xqwyymv0";
+      type = "gem";
+    };
+    version = "0.12.0";
+  };
+  ruby-progressbar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cv2ym3rl09svw8940ny67bav7b2db4ms39i4raaqzkf59jmhglk";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  ruby_dep = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1c1bkl97i9mkcvkn1jks346ksnvnnp84cs22gwl0vd7radybrgy5";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  rubyzip = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n1lb2sdwh9h27y244hxzg1lrxxg2m53pk1vq7p33bna003qkyrj";
+      type = "gem";
+    };
+    version = "1.2.2";
+  };
+  rugged = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jv4nw9hvlxp8hhhlllrfcznki82i50fp1sj65zsjllfl2bvz8x6";
+      type = "gem";
+    };
+    version = "0.27.5";
+  };
+  safe_yaml = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hly915584hyi9q9vgd968x2nsi5yag9jyf5kq60lwzi5scr7094";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sass = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw";
+      type = "gem";
+    };
+    version = "3.4.25";
+  };
+  sass-rails = {
+    dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wa63sbsimrsf7nfm8h0m1wbsllkfxvd7naph5d1j6pbc555ma7s";
+      type = "gem";
+    };
+    version = "5.0.7";
+  };
+  sawyer = {
+    dependencies = ["addressable" "faraday"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sv1463r7bqzvx4drqdmd36m7rrv6sf1v3c6vswpnq3k6vdw2dvd";
+      type = "gem";
+    };
+    version = "0.8.1";
+  };
+  scss_lint = {
+    dependencies = ["rake" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11rl8kj32p34mqlkhxvlwfrwl8gdl0iha8q9xsrr3sjxjagzv8yp";
+      type = "gem";
+    };
+    version = "0.55.0";
+  };
+  secure_headers = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17cxci8jyvlgssix0cy7kbm5m2h7s8ym9caj8nilrbd21jis9pc5";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  shellany = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ryyzrj1kxmnpdzhlv4ys3dnl2r5r3d2rs2jwzbnd1v96a8pl4hf";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  shoulda-matchers = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zvv94pqk5b5my3w1shdz7h34xf2ldhg5k4qfdpbwi2iy0j9zw2a";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  sidekiq = {
+    dependencies = ["connection_pool" "rack-protection" "redis"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zyf9y3rvzizbwh68i2g1lzd40lalrdc4iyjmaa74gnfwsf92i26";
+      type = "gem";
+    };
+    version = "5.2.3";
+  };
+  sidekiq-cron = {
+    dependencies = ["fugit" "sidekiq"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1aliswahmpxn1ib2brn4126gk97ac3zdnwr71mn8vzbr3vdd7fl0";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  simple_captcha2 = {
+    dependencies = ["rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vdjydym8sjpa8c1q0n2hanj3n9vzi4ycdw2p6bbm6qqmm1f3fq3";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  simple_oauth = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dw9ii6m7wckml100xhjc6vxpjcry174lbi9jz5v7ibjr3i94y8l";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  simplecov = {
+    dependencies = ["docile" "json" "simplecov-html"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sfyfgf7zrp2n42v7rswkqgk3bbwk1bnsphm24y7laxv3f8z0947";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  simplecov-html = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lihraa4rgxk8wbfl77fy9sf0ypk31iivly8vl3w04srd7i0clzn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  sinon-rails = {
+    dependencies = ["railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b7996hb8vfky29b0zcql90x8i6vhdg2zy9nfzmhh820gjv3kggb";
+      type = "gem";
+    };
+    version = "1.15.0";
+  };
+  spring = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "168yz9c1fv21wc5i8q7n43b9nk33ivg3ws1fn6x0afgryz3ssx75";
+      type = "gem";
+    };
+    version = "2.0.2";
+  };
+  spring-commands-cucumber = {
+    dependencies = ["spring"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mw81gvms2svn4k4pc6ly7smkmf0j9r2xbf0d38vygbyhiwd1c9a";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  spring-commands-rspec = {
+    dependencies = ["spring"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sprockets = {
+    dependencies = ["concurrent-ruby" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
+      type = "gem";
+    };
+    version = "3.7.2";
+  };
+  sprockets-rails = {
+    dependencies = ["actionpack" "activesupport" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ab42pm8p5zxpv3sfraq45b9lj39cz9mrpdirm30vywzrwwkm5p1";
+      type = "gem";
+    };
+    version = "3.2.1";
+  };
+  state_machines = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  string-direction = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iyddwmkj425c6xbn5pmlr2yzwcq4snzlan7rky5b1yp2pvf70jj";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  swd = {
+    dependencies = ["activesupport" "attr_required" "httpclient"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s2vjb6f13za7p1iycl2p73d3p202xa6xny9fjrp8ynwsqix7lyd";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  sysexits = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qjng6pllznmprzx8vb0zg0c86hdrkyjs615q41s9fjpmv2430jr";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  systemu = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gmkbakhfci5wnmbfx5i54f25j9zsvbw858yg3jjhfs5n4ad1xq1";
+      type = "gem";
+    };
+    version = "2.6.5";
+  };
+  temple = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00nxf610nzi4n1i2lkby43nrnarvl89fcl6lg19406msr0k3ycmq";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  term-ansicolor = {
+    dependencies = ["tins"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "079hbagd9mk0839rkajsdrbzkn992gj8ah2n45qd64v25ml27i6d";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  terminal-table = {
+    dependencies = ["unicode-display_width"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  thor = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01n5dv9kql60m6a00zc0r66jvaxx98qhdny3klyj0p3w34pad2ns";
+      type = "gem";
+    };
+    version = "0.19.4";
+  };
+  thread_safe = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy";
+      type = "gem";
+    };
+    version = "0.3.6";
+  };
+  tilt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0020mrgdf11q23hm1ddd6fv691l51vi10af00f137ilcdb2ycfra";
+      type = "gem";
+    };
+    version = "2.0.8";
+  };
+  timecop = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d7mm786180v4kzvn1f77rhfppsg5n0sq2bdx63x9nv114zm8jrp";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  timers = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04zbs9wyzajn7g9xfgg2zqz5kzf0qa7jgh4hgry4pfcxfmlnwdwx";
+      type = "gem";
+    };
+    version = "4.2.0";
+  };
+  tins = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pqj45n216zrz7yckdbdknlmhh187iqzx8fp76y2h0jrgqjfkxmj";
+      type = "gem";
+    };
+    version = "1.20.2";
+  };
+  to_regexp = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rgabfhnql6l4fx09mmj5d0vza924iczqf2blmn82l782b6qqi9v";
+      type = "gem";
+    };
+    version = "0.2.1";
+  };
+  turbo_dev_assets = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08yp7gpishjfj8b7d61hxs677288ycv6yg78a7hfzn631gxczipx";
+      type = "gem";
+    };
+    version = "0.0.2";
+  };
+  twitter = {
+    dependencies = ["addressable" "buftok" "equalizer" "http" "http-form_data" "http_parser.rb" "memoizable" "multipart-post" "naught" "simple_oauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fjyz3viabz3xs5d9aad18zgdbhfwm51jsnzigc8kxk77p1x58n5";
+      type = "gem";
+    };
+    version = "6.2.0";
+  };
+  twitter-text = {
+    dependencies = ["unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1732h7hy1k152w8wfvjsx7b79alk45i5imwd37ia4qcx8hfm3gvg";
+      type = "gem";
+    };
+    version = "1.14.7";
+  };
+  typhoeus = {
+    dependencies = ["ethon"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cni8b1idcp0dk8kybmxydadhfpaj3lbs99w5kjibv8bsmip2zi5";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  tzinfo = {
+    dependencies = ["thread_safe"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fjx9j327xpkkdlxwmkl3a8wqj7i4l4jwlrv3z13mg95z9wl253z";
+      type = "gem";
+    };
+    version = "1.2.5";
+  };
+  uglifier = {
+    dependencies = ["execjs"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g203kly5wp4qlkc7371skyvyin6iinc8i0p5wrpiqgblqxxgcf1";
+      type = "gem";
+    };
+    version = "4.1.19";
+  };
+  unf = {
+    dependencies = ["unf_ext"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  unf_ext = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06p1i6qhy34bpb8q8ms88y6f2kz86azwm098yvcc0nyqk9y729j1";
+      type = "gem";
+    };
+    version = "0.0.7.5";
+  };
+  unicode-display_width = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0040bsdpcmvp8w31lqi2s9s4p4h031zv52401qidmh25cgyh4a57";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  unicorn = {
+    dependencies = ["kgio" "raindrops"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qfhvzs4i6ja1s43j8p1kfbzm10n7a02ngki30a38y5m46a2qrak";
+      type = "gem";
+    };
+    version = "5.4.1";
+  };
+  unicorn-worker-killer = {
+    dependencies = ["get_process_mem" "unicorn"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rrdxpwdsapx47axjin8ymxb4f685qlpx8a26bql4ay1559c3gva";
+      type = "gem";
+    };
+    version = "0.4.4";
+  };
+  uuid = {
+    dependencies = ["macaddr"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mr405vg4ccnndkyf7pb49gp1fha8i6gj7iwq43nxkak41cwzh5f";
+      type = "gem";
+    };
+    version = "2.3.9";
+  };
+  valid = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vxrgik9gxyh5j2w16nz5azjk0cbzmvv883hq9pvxm9anfbbj8d3";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  validate_email = {
+    dependencies = ["activemodel" "mail"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r1fz29l699arka177c9xw7409d1a3ff95bf7a6pmc97slb91zlx";
+      type = "gem";
+    };
+    version = "0.1.6";
+  };
+  validate_url = {
+    dependencies = ["activemodel" "addressable"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1df4gch8dizimpbl185vfgw95yb8ffr6zwj6whzbxfil95c3f2qh";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  versionist = {
+    dependencies = ["activesupport" "railties" "yard"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p8wizg6jml7gz1qiqk7d77hy0w5650g812jhgd0zzkwwdmzm38m";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  warden = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fr9n9i9r82xb6i61fdw4xgc7zjv7fsdrr4k0njchy87iw9fl454";
+      type = "gem";
+    };
+    version = "1.2.8";
+  };
+  webfinger = {
+    dependencies = ["activesupport" "httpclient"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m0jh8k7c0ifh2jhbn7ihqrmn5fi754wflva97zgy70hpdvxyjar";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  webmock = {
+    dependencies = ["addressable" "crack" "hashdiff"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03994dxs4xayvkxqp01dd1ivhg4xxx7z35f7cxw7y2mwj3xn24ib";
+      type = "gem";
+    };
+    version = "3.4.2";
+  };
+  websocket-driver = {
+    dependencies = ["websocket-extensions"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1943442yllhldh9dbp374x2q39cxa49xrm28nb78b7mfbv3y195l";
+      type = "gem";
+    };
+    version = "0.6.5";
+  };
+  websocket-extensions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "034sdr7fd34yag5l6y156rkbhiqgmy395m231dwhlpcswhs6d270";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  will_paginate = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ihf15yaj8883ddhkxq7q60zrg3zfsvqaf5853gybhcg18zq8bn9";
+      type = "gem";
+    };
+    version = "3.1.6";
+  };
+  xpath = {
+    dependencies = ["nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
+      type = "gem";
+    };
+    version = "3.2.0";
+  };
+  yard = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmmr1839qgbb3zxfa7jf5mzy17yjl1yirwlgzdhws4452gqhn67";
+      type = "gem";
+    };
+    version = "0.9.16";
+  };
+}
diff --git a/pkgs/webapps/diaspora/gemset_ldap.nix b/pkgs/webapps/diaspora/gemset_ldap.nix
new file mode 100644 (file)
index 0000000..d7892f8
--- /dev/null
@@ -0,0 +1,3056 @@
+{
+  actioncable = {
+    dependencies = ["actionpack" "nio4r" "websocket-driver"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07r6hnh05db84yr9419mbhyzp20hr8yy9m50jxc2w91ghm2qnrrf";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionmailer = {
+    dependencies = ["actionpack" "actionview" "activejob" "mail" "rails-dom-testing"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s9xcqfx97q4yva2zc4qzb567mwzhry6v3x3zc318aqhcrz31g7c";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionpack = {
+    dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vz2ms80nqw21c304g3w2vkbs80gadzhi3mcwwym7smxccr37kcd";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  actionview = {
+    dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kfxlz9v7b47pdyy1whb4zzhvaj8h4sp1ajhbih2ax1hkldyg081";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  active_model_serializers = {
+    dependencies = ["activemodel" "concurrent-ruby"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19zr5pp84q4ya7mfrcanakjv86lv4wfmbcbbd2xnd4bkyprw5w7z";
+      type = "gem";
+    };
+    version = "0.9.7";
+  };
+  activejob = {
+    dependencies = ["activesupport" "globalid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02lssq8ps98mfg20dyhcpd16f9c0v4zzy7gfbb6ksbs06wrrd4d2";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activemodel = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10f8cpv4sl1w3m1qj8hl6sd2f1n7x91h45qaf57qr894ll22jgby";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activerecord = {
+    dependencies = ["activemodel" "activesupport" "arel"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iqkvxzx5bfp8rmlccww0cj1xr6iaxmn3hhbj1dv5j9c8mnm980x";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  activerecord-import = {
+    dependencies = ["activerecord"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bxpbrcwc9k6khizwdikvfbhw9pcvs4sp3h4grpcww5k7bgpliz6";
+      type = "gem";
+    };
+    version = "0.27.0";
+  };
+  activesupport = {
+    dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08dm0mgmj31ggk7ib66wfagj4bgbr2jfl500bqb22x0szslz5lll";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  acts-as-taggable-on = {
+    dependencies = ["activerecord"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hl52pjgfzy3acdwnbxfqy08m808vlv9dmsyp03d5x7x0y499kvl";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  acts_as_api = {
+    dependencies = ["activemodel" "activesupport" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06miad13nnfr2gslc203ahsbvj499s9lngxxvfizwp964vglygsc";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  addressable = {
+    dependencies = ["public_suffix"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0viqszpkggqi8hq87pqp0xykhvz60g99nwmkwsb0v45kc2liwxvk";
+      type = "gem";
+    };
+    version = "2.5.2";
+  };
+  aes_key_wrap = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0li86k0g812jkzrppb2fvqngvzp09nygywjpn81nx90s01wxqw07";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  arel = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nw0qbc6ph625p6n3maqq9f527vz3nbl0hk72fbyka8jzsmplxzl";
+      type = "gem";
+    };
+    version = "8.0.0";
+  };
+  asset_sync = {
+    dependencies = ["activemodel" "fog-core" "mime-types" "unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mfz51g8rzk5h5fpdhfkycnm7y4dpfhx46wm7fygna7nd4w9ixdx";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  ast = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "184ssy3w93nkajlz2c70ifm79jp3j737294kbc5fjw69v1w0n9x7";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  attr_required = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g22axmi2rhhy7w8c3x6gppsawxqavbrnxpnmphh22fk7cwi0kh2";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  autoprefixer-rails = {
+    dependencies = ["execjs"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08irrl1mz6skagr1lygq79l34lc0dghgva0v9q7nng76dpiglgj3";
+      type = "gem";
+    };
+    version = "8.6.5";
+  };
+  backports = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hshjxww2h7s0dk57njrygq4zpp0nlqrjfya7zwm27iq3rhc3y8g";
+      type = "gem";
+    };
+    version = "3.11.4";
+  };
+  bcrypt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ysblqxkclmnhrd0kmb5mr8p38mbar633gdsb14b7dhkhgawgzfy";
+      type = "gem";
+    };
+    version = "3.1.12";
+  };
+  bindata = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kz42nvxnk1j9cj0i8lcnhprcgdqsqska92g6l19ziadydfk2gqy";
+      type = "gem";
+    };
+    version = "2.4.4";
+  };
+  bootstrap-sass = {
+    dependencies = ["autoprefixer-rails" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bc9bf6caddqn1rv15b5x56yczmbjzaxzl9lk5zbwrg1bfph4bx9";
+      type = "gem";
+    };
+    version = "3.3.7";
+  };
+  bootstrap-switch-rails = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zkwc1hfmihnm0n9lkva5zk0cmqpfcpnrwnmaniyvgx7rac2r14l";
+      type = "gem";
+    };
+    version = "3.3.3";
+  };
+  buftok = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rzsy1vy50v55x9z0nivf23y0r9jkmq6i130xa75pq9i8qrn1mxs";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  builder = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qibi5s67lpdv1wgcj66wcymcr04q6j4mzws6a479n0mlrmh5wr1";
+      type = "gem";
+    };
+    version = "3.2.3";
+  };
+  byebug = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10znc1hjv8n686hhpl08f3m2g6h08a4b83nxblqwy2kqamkxcqf8";
+      type = "gem";
+    };
+    version = "10.0.2";
+  };
+  capybara = {
+    dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10zj8syak12xd1kqywr35bkr2hkdjq18kij54x1ys8c26h6j4d0m";
+      type = "gem";
+    };
+    version = "3.11.1";
+  };
+  carrierwave = {
+    dependencies = ["activemodel" "activesupport" "mime-types"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1k9kla5ncygm97vn33lsrs7ch5zy4qqhhvc8m3khm986yaqh75qs";
+      type = "gem";
+    };
+    version = "1.2.3";
+  };
+  celluloid = {
+    dependencies = ["celluloid-essentials" "celluloid-extras" "celluloid-fsm" "celluloid-pool" "celluloid-supervision" "timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10i29q7kkdlrhf5rg43xygdfm795a02vp28k2ca3nklmqna57qmg";
+      type = "gem";
+    };
+    version = "0.17.3";
+  };
+  celluloid-essentials = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l4p3p73wjdj07ww124q0db5k1cyzggbndzmcb12xbsf2dnj121k";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-extras = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "078agvnsfp78jv343kn5g1cz50147dk0q46blwh5r8lk6whag7ng";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-fsm = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pmpi6h4abpkczp46rd6llk1mldpx19i9hll8mkxp3kxin9slivc";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-io = {
+    dependencies = ["celluloid" "nio4r" "timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1frcpja7h9vcxsw7w7ff550x54rfx514fpv2n6kawbk1j4zrm314";
+      type = "gem";
+    };
+    version = "0.17.3";
+  };
+  celluloid-pool = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bfr54ijl95bnhqlabhf5p4ff9n0y2sslc91f49jjn33n2zm755c";
+      type = "gem";
+    };
+    version = "0.20.5";
+  };
+  celluloid-supervision = {
+    dependencies = ["timers"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b41gg1rsmms0m5mshy6h66y5rydl3nv6x9wf050ixfa1s2c8vzw";
+      type = "gem";
+    };
+    version = "0.20.6";
+  };
+  chunky_png = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05g2xli9wbjylkmblln3bhvjalziwb92q452q8ibjagmb853424w";
+      type = "gem";
+    };
+    version = "1.3.10";
+  };
+  cliver = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7";
+      type = "gem";
+    };
+    version = "0.3.2";
+  };
+  coderay = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15vav4bhcc2x3jmi3izb11l4d9f3xv8hp2fszb7iqmpsccv1pz4y";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  compass = {
+    dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-core = {
+    dependencies = ["multi_json" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-import-once = {
+    dependencies = ["sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq";
+      type = "gem";
+    };
+    version = "1.0.5";
+  };
+  compass-rails = {
+    dependencies = ["compass" "sass-rails" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02ydlbl1qb80myjv5xrpwzhmmj6qd80jf5izvpqhq2bikv84j9wr";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  concurrent-ruby = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18q9skp5pfq4jwbxzmw8q2rn4cpw6mf4561i2hsjcl1nxdag2jvb";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  configurate = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1m6cppb4jf7liwc3f5dvgn2v2nhp2jq8ixb9papaqz24f4s8dnd1";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  connection_pool = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lflx29mlznf1hn0nihkgllzbj8xp5qasn8j7h838465pi399k68";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  coveralls = {
+    dependencies = ["json" "simplecov" "term-ansicolor" "thor" "tins"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "022kc16np6w4mv17hq3m9hhw9l8hjl78ld3fzqqx6337vwvwvwcg";
+      type = "gem";
+    };
+    version = "0.8.22";
+  };
+  crack = {
+    dependencies = ["safe_yaml"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abb0fvgw00akyik1zxnq7yv391va148151qxdghnzngv66bl62k";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  crass = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bpxzy6gjw9ggjynlxschbfsgmx8lv3zw1azkjvnb8b9i895dqfi";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  cucumber = {
+    dependencies = ["builder" "cucumber-core" "cucumber-expressions" "cucumber-wire" "diff-lcs" "gherkin" "multi_json" "multi_test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s2brssrpal8hyhcgg974x3xyhpmvpwps5ypd9p8w2lg01l1pp3j";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  cucumber-api-steps = {
+    dependencies = ["cucumber" "jsonpath"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fij6bgzshda68jp7kac0hs5n6xsmv49g8ynqhy6s3znc9d4qjbw";
+      type = "gem";
+    };
+    version = "0.14.0";
+  };
+  cucumber-core = {
+    dependencies = ["backports" "cucumber-tag_expressions" "gherkin"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iavlh8hqj9lwljbpkw06259gdicbr1bdb6pbj5yy3n8szgr8k3c";
+      type = "gem";
+    };
+    version = "3.2.1";
+  };
+  cucumber-expressions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zwmv6hznyz9vk81f5dhwcr9jhxx2vmbk8yyazayvllvhy0fkpdw";
+      type = "gem";
+    };
+    version = "6.0.1";
+  };
+  cucumber-rails = {
+    dependencies = ["capybara" "cucumber" "mime-types" "nokogiri" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pmlza6r2601k1i7v3z8gj4apdcq6qa830bzwkj1pnfjzn4z12n7";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  cucumber-tag_expressions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cvmbljybws0qzjs1l67fvr9gqr005l8jk1ni5gcsis9pfmqh3vc";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  cucumber-wire = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09ymvqb0sbw2if1nxg8rcj33sf0va88ancq5nmp8g01dfwzwma2f";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  database_cleaner = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05i0nf2aj70m61y3fspypdkc6d1qgibf5kav05a71b5gjz0k7y5x";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  devise = {
+    dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vs8nibl568ghm6a7hbw6xgcv8zbm4gykprcxpnzi7bz5d4gvcjx";
+      type = "gem";
+    };
+    version = "4.5.0";
+  };
+  devise_lastseenable = {
+    dependencies = ["devise" "rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1h83h73qjh8fc7lmr089shky8lc3wm4xn653rjdbb0cddflvrx8y";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  diaspora-prosody-config = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1976ijqjf5jcq1jwr6vi0srjadhbqfa9y3nxyipzcv91pzskl2lp";
+      type = "gem";
+    };
+    version = "0.0.7";
+  };
+  diaspora_federation = {
+    dependencies = ["faraday" "faraday_middleware" "nokogiri" "typhoeus" "valid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xxy6ahlhgyr00qkfmmq0h3nqm6gjkr9i6hsqr0nkb3l6qg0m0yc";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-json_schema = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hfv4cq5wfdg86xmbp5y0h50b11326ymzks1yr9dvr4wa7di00hr";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-rails = {
+    dependencies = ["actionpack" "diaspora_federation"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wrni7d9084v3pqd3sq8j532wx5ym6kmd959bw29bzwxc3zidd9h";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diaspora_federation-test = {
+    dependencies = ["diaspora_federation" "fabrication" "uuid"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b09y78pyl9kix8slbybnks2cbq0ac9wml31j2s6qwjixranjsm4";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  diff-lcs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18w22bjz424gzafv6nzv98h0aqkwz3d9xhm7cbr1wfbyas8zayza";
+      type = "gem";
+    };
+    version = "1.3";
+  };
+  docile = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04d2izkna3ahfn6fwq4xrcafa715d3bbqczxm16fq40fqy87xn17";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  domain_name = {
+    dependencies = ["unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abdlwb64ns7ssmiqhdwgl27ly40x2l27l8hs8hn0z4kb3zd2x3v";
+      type = "gem";
+    };
+    version = "0.5.20180417";
+  };
+  entypo-rails = {
+    dependencies = ["railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "124x0jszg6n0k2lcacd627ndlp1fv7cbgnv4scwy5s3czp0qwip6";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  equalizer = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kjmx3fygx8njxfrwcmn7clfhjhb6bvv3scy2lyyi0wqyi3brra4";
+      type = "gem";
+    };
+    version = "0.0.11";
+  };
+  erubi = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bws86na9k565raiz0kk61yy5pxxp0fmwyzpibdwjkq0xzx8q6q1";
+      type = "gem";
+    };
+    version = "1.7.1";
+  };
+  eslintrb = {
+    dependencies = ["execjs" "multi_json" "rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kx9sbs7pnl436zyczylnqqb1858hffy66fwdqfmcn18q8xdqwkx";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  et-orbi = {
+    dependencies = ["tzinfo"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wk7i0bmsy46la8gcvbmdns0ni8lmdqas838phj97bdwykxw8m4b";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  ethon = {
+    dependencies = ["ffi"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y70szwm2p0b9qfvpqrzjrgm3jz0ig65vlbfr6ppc3z0m1h7kv48";
+      type = "gem";
+    };
+    version = "0.11.0";
+  };
+  excon = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15l9w0938c19nxmrp09n75qpmm64k12xj69h47yvxzcxcpbgnkb2";
+      type = "gem";
+    };
+    version = "0.62.0";
+  };
+  execjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1";
+      type = "gem";
+    };
+    version = "2.7.0";
+  };
+  eye = {
+    dependencies = ["celluloid" "celluloid-io" "kostya-sigar" "state_machines" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gqrrrisy492m6sczq775dyg9sxkl926r8lkr6z33kfb4cnimfzk";
+      type = "gem";
+    };
+    version = "0.10.0";
+  };
+  fabrication = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0an28kjand4mjbkmnwd9fmgq3y5vf717zpmiijavar3sxqj52zri";
+      type = "gem";
+    };
+    version = "2.20.1";
+  };
+  factory_girl = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cc60v28r7w1gp34p4amzdnq7cyip6qhffvxywsj3ypilyf8jqla";
+      type = "gem";
+    };
+    version = "4.8.0";
+  };
+  factory_girl_rails = {
+    dependencies = ["factory_girl" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hw8qqp30vm4yf4a36r1r65wk78ihxmas7jg5fyl6fcf705z9fvv";
+      type = "gem";
+    };
+    version = "4.8.0";
+  };
+  faraday = {
+    dependencies = ["multipart-post"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16hwxc8v0z6gkanckjhx0ffgqmzpc4ywz4dfhxpjlz2mbz8d5m52";
+      type = "gem";
+    };
+    version = "0.15.3";
+  };
+  faraday-cookie_jar = {
+    dependencies = ["faraday" "http-cookie"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  faraday_middleware = {
+    dependencies = ["faraday"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p7icfl28nvl8qqdsngryz1snqic9l8x6bk0dxd7ygn230y0k41d";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  ffi = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jpm2dis1j7zvvy3lg7axz9jml316zrn7s0j59vyq3qr127z0m7q";
+      type = "gem";
+    };
+    version = "1.9.25";
+  };
+  fixture_builder = {
+    dependencies = ["activerecord" "activesupport" "hashdiff"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qlq0nyfhjvz09hm0jankl9bgs9672k31b3lmsfq8p135x3xs627";
+      type = "gem";
+    };
+    version = "0.5.2.rc3";
+  };
+  fog-aws = {
+    dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zprxg0spvkkri1jf40zg3rfr5h2gq6009d7l36lifpvhjn658cs";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  fog-core = {
+    dependencies = ["builder" "excon" "formatador" "mime-types"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fsama04wlxhv537bm4b7rr4zzn0mvisy87m3qzv6f0mhlrq3zp8";
+      type = "gem";
+    };
+    version = "2.1.2";
+  };
+  fog-json = {
+    dependencies = ["fog-core" "multi_json"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  fog-xml = {
+    dependencies = ["fog-core" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  formatador = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  fugit = {
+    dependencies = ["et-orbi" "raabro"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1szijawzdii668z5is9xi849399gy786951dx0l5r2z5mbfqvl9i";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  fuubar = {
+    dependencies = ["rspec-core" "ruby-progressbar"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sqkr1nh49rlm86l3qyrgsdqavgqii4pnrjn7855z6dfavh3spxr";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  get_process_mem = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bvfjdign16r0zwm2rlfrq0sk1licvmlgbnlpnyckniv5r7i080g";
+      type = "gem";
+    };
+    version = "0.2.3";
+  };
+  gherkin = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cgcdchwwdm10rsk44frjwqd4ihprhxjbm799nscqy2q1raqfj5s";
+      type = "gem";
+    };
+    version = "5.1.0";
+  };
+  gitlab = {
+    dependencies = ["httparty" "terminal-table"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nncjmk71ivjxmgkpv100yybry5c7ld6xjgi1b5zsfv4g3mz0v34";
+      type = "gem";
+    };
+    version = "4.7.0";
+  };
+  globalid = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02smrgdi11kziqi9zhnsy9i6yr2fnxrqlv3lllsvdjki3cd4is38";
+      type = "gem";
+    };
+    version = "0.4.1";
+  };
+  gon = {
+    dependencies = ["actionpack" "multi_json" "request_store"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07sm7fd94pfscrbs4lyprs0das8s1yn32cw521ch738jaqb388xl";
+      type = "gem";
+    };
+    version = "6.2.1";
+  };
+  guard = {
+    dependencies = ["formatador" "listen" "lumberjack" "nenv" "notiffany" "pry" "shellany" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h84ja6qvii3hx86w9l4vjpbgl4m8ma8fbawwp7s8l791cgkdcmk";
+      type = "gem";
+    };
+    version = "2.15.0";
+  };
+  guard-compat = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj6sr1k8w59mmi27rsii0v8xyy2rnsi09nqvwpgj1q10yq1mlis";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  guard-rspec = {
+    dependencies = ["guard" "guard-compat" "rspec"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jkm5xp90gm4c5s51pmf92i9hc10gslwwic6mvk72g0yplya0yx4";
+      type = "gem";
+    };
+    version = "4.7.3";
+  };
+  guard-rubocop = {
+    dependencies = ["guard" "rubocop"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p97zkzasghl1md13rh57n3s2rr2kqly8w4vfn6vaj89igjpagdp";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  haml = {
+    dependencies = ["temple" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q0a9fvqh8kn6wm97fcks6qzbjd400bv8bx748w8v87m7p4klhac";
+      type = "gem";
+    };
+    version = "5.0.4";
+  };
+  haml_lint = {
+    dependencies = ["haml" "rainbow" "rake" "rubocop" "sysexits"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "125aj0j84nx5gqm42hfx5d8486higlra423ahgfpsdjwbp399rwv";
+      type = "gem";
+    };
+    version = "0.28.0";
+  };
+  hamlit = {
+    dependencies = ["temple" "thor" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14fsc208qsf46cflk23vs2fdw435dk65fwv55zhziciwn96ld8sf";
+      type = "gem";
+    };
+    version = "2.9.1";
+  };
+  handlebars_assets = {
+    dependencies = ["execjs" "sprockets" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18pyksz4jb0n28acqxv14ahy8mkc9ldqbbn73gcj28m0l9wjzsca";
+      type = "gem";
+    };
+    version = "0.23.2";
+  };
+  hashdiff = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yj5l2rw8i8jc725hbcpc4wks0qlaaimr3dpaqamfjkjkxl0hjp9";
+      type = "gem";
+    };
+    version = "0.3.7";
+  };
+  hashie = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hh5lybf8hm7d7xs4xm8hxvm8xqrs2flc8fnwkrclaj746izw6xb";
+      type = "gem";
+    };
+    version = "3.5.7";
+  };
+  http = {
+    dependencies = ["addressable" "http-cookie" "http-form_data" "http_parser.rb"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jlm5prw437wqpfxcigh88lfap3m7g8mnmj5as7qw6dzqnvrxwmc";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  http-cookie = {
+    dependencies = ["domain_name"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  http-form_data = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15lpn604byf7cyxnw949xz4rvpcknqp7a48q73nm630gqxsa76f3";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  http_accept_language = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  "http_parser.rb" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15nidriy0v5yqfjsgsra51wmknxci2n2grliz78sf9pga3n0l7gi";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  httparty = {
+    dependencies = ["mime-types" "multi_xml"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xmm7pxmz3pblkdr76dg7qm5s60kpp3yvh46c2i0bn1dm0zgl730";
+      type = "gem";
+    };
+    version = "0.16.3";
+  };
+  httpclient = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99";
+      type = "gem";
+    };
+    version = "2.8.3";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gcp1m1p6dpasycfz2sj82ci9ggz7lsskz9c9q6gvfwxrl8y9dx7";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  i18n-inflector = {
+    dependencies = ["i18n"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "081jr7z947aqjfmpbfs10w9jxi205jwgk4mgd8jds1b4m4i8mc7g";
+      type = "gem";
+    };
+    version = "2.6.7";
+  };
+  i18n-inflector-rails = {
+    dependencies = ["actionpack" "i18n-inflector" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c04jm657akp5n14syhcwnn3hnsvx7harvg97768bvf3f9a37hyk";
+      type = "gem";
+    };
+    version = "1.0.7";
+  };
+  ipaddress = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45";
+      type = "gem";
+    };
+    version = "0.8.3";
+  };
+  jaro_winkler = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rr797nqz081bfk30m2apj5h24bg5d1jr1c8p3xwx4hbwsrbclah";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  jasmine = {
+    dependencies = ["jasmine-core" "phantomjs" "rack" "rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xfwf163wi5a9i0vlm564cqi6k30h15wnrwd15ph95jfa5516kv1";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  jasmine-core = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b12bjfrxvb8mwjwlfyngykd80lz956glcpfz7rhhw7n75b2rdlv";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  jasmine-jquery-rails = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cq5zd4ng5dlza45whd6sa7bzd60rlddk9760271mybdqyd96jlv";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  jquery-rails = {
+    dependencies = ["rails-dom-testing" "railties" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17201sb8ddwy4yprizmqabq1kfx3m9c53p0yqngn63m07jjcpnh8";
+      type = "gem";
+    };
+    version = "4.3.3";
+  };
+  js-routes = {
+    dependencies = ["railties" "sprockets-rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14yx3jrd4sgcwgj8yrrqdwl691mci1hcjqyyvp0v15jbzis1bclm";
+      type = "gem";
+    };
+    version = "1.4.4";
+  };
+  js_image_paths = {
+    dependencies = ["rails" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4kq8895i61a338ddk5f2k16l5lvmnkby9cdjwnmm2jddw4q7nf";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  json = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01v6jjpvh3gnq6sgllpfqahlgxzj50ailwhj9b3cd20hi2dx0vxp";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  json-jwt = {
+    dependencies = ["activesupport" "aes_key_wrap" "bindata"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "065k7vffdki73f4nz89lxi6wxmcw5dlf593831pgvlbralll6x3r";
+      type = "gem";
+    };
+    version = "1.9.4";
+  };
+  json-schema = {
+    dependencies = ["addressable"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  json-schema-rspec = {
+    dependencies = ["json-schema" "rspec"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ip30yjzyigqqp9jwkrw9x9vrfpnmwi160zmk2vkrwlv9pby0wr9";
+      type = "gem";
+    };
+    version = "0.0.4";
+  };
+  jsonpath = {
+    dependencies = ["multi_json" "to_regexp"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06i41lwpj0dwvbxcpqrad5pjn2gmcv0srv0zw0ap7irwc21ifd7d";
+      type = "gem";
+    };
+    version = "0.9.6";
+  };
+  jwt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w0kaqrbl71cq9sbnixc20x5lqah3hs2i93xmhlfdg2y3by7yzky";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  kgio = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1528pyj1szzzp3pgj05fzjd36qjrxm9yj2x5radc9p1z7vl67y50";
+      type = "gem";
+    };
+    version = "2.11.2";
+  };
+  kostya-sigar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0z0pcykhjyrb7kq76jfcyxc1qq23gj5zmgy3miy87v85ydrxiqwb";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  leaflet-rails = {
+    dependencies = ["rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dy7vhsjj1fhbbqm2s7pw57vgysd31qqi4y0hm91325hmvq75grb";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  listen = {
+    dependencies = ["rb-fsevent" "rb-inotify" "ruby_dep"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01v5mrnfqm6sgm8xn2v5swxsn1wlmq7rzh2i48d4jzjsc7qvb6mx";
+      type = "gem";
+    };
+    version = "3.1.5";
+  };
+  little-plugger = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1frilv82dyxnlg8k1jhrvyd73l6k17mxc5vwxx080r4x1p04gwym";
+      type = "gem";
+    };
+    version = "1.1.4";
+  };
+  logging = {
+    dependencies = ["little-plugger" "multi_json"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06j6iaj89h9jhkx1x3hlswqrfnqds8br05xb1qra69dpvbdmjcwn";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  logging-rails = {
+    dependencies = ["logging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "022cnj9v177282kadd9ygzjpvlvbq9k5z0xhdbbmgypi05z4i239";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  loofah = {
+    dependencies = ["crass" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ccsid33xjajd0im2xv941aywi58z7ihwkvaf1w2bv89vn5bhsjg";
+      type = "gem";
+    };
+    version = "2.2.3";
+  };
+  lumberjack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06im7gcg42x77yhz2w5da2ly9xz0n0c36y5ks7xs53v0l9g0vf5n";
+      type = "gem";
+    };
+    version = "1.0.13";
+  };
+  macaddr = {
+    dependencies = ["systemu"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1clii8mvhmh5lmnm95ljnjygyiyhdpja85c5vy487rhxn52scn0b";
+      type = "gem";
+    };
+    version = "1.7.1";
+  };
+  mail = {
+    dependencies = ["mini_mime"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  markdown-it-html5-embed = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10n2z6j0whc6makxvcf2jhpwb8xrj4s6vyywijsaaxs0cn490a5c";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  markerb = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08sm3kafc3086l0a9is2cysk7j2k71mxy6ba295pwwzyvy734y76";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  memoizable = {
+    dependencies = ["thread_safe"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v42bvghsvfpzybfazl14qhkrjvx0xlmxz0wwqc960ga1wld5x5c";
+      type = "gem";
+    };
+    version = "0.4.2";
+  };
+  method_source = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pviwzvdqd90gn6y7illcdd9adapw8fczml933p5vl739dkvl3lq";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+  mime-types = {
+    dependencies = ["mime-types-data"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fjxy1jm52ixpnv3vg9ld9pr9f35gy0jp66i1njhqjvmnvq0iwwk";
+      type = "gem";
+    };
+    version = "3.2.2";
+  };
+  mime-types-data = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07wvp0aw2gjm4njibb70as6rh5hi1zzri5vky1q6jx95h8l56idc";
+      type = "gem";
+    };
+    version = "3.2018.0812";
+  };
+  mini_magick = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sisx59mr5kydmxmx5vr8spmrxhrjkfqv35zhsqdlyzmp1z5px9p";
+      type = "gem";
+    };
+    version = "4.9.2";
+  };
+  mini_mime = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q4pshq387lzv9m39jv32vwb8wrq3wc4jwgl4jk209r4l33v09d3";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  mini_portile2 = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13d32jjadpjj6d2wdhkfpsmy68zjx90p49bgf8f7nkpz86r1fr11";
+      type = "gem";
+    };
+    version = "2.3.0";
+  };
+  minitest = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0icglrhghgwdlnzzp4jf76b0mbc71s80njn5afyfjn4wqji8mqbq";
+      type = "gem";
+    };
+    version = "5.11.3";
+  };
+  mobile-fu = {
+    dependencies = ["rack-mobile-detect" "rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lxfcsd7dwwcpa1j2jbl382anmv6kksf5q1wqj14gc6jxxjq9s4i";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  multi_json = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rl0qy4inf1mp8mybfk56dfga0mvx97zwpmq5xmiwl5r770171nv";
+      type = "gem";
+    };
+    version = "1.13.1";
+  };
+  multi_test = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sx356q81plr67hg16jfwz9hcqvnk03bd9n75pmdw8pfxjfy1yxd";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  multi_xml = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  multipart-post = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  mysql2 = {
+    groups = ["mysql"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a2kdjgzwh1p2rkcmxaawy6ibi32b04wbdd5d4wr8i342pq76di4";
+      type = "gem";
+    };
+    version = "0.5.2";
+  };
+  naught = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wwjx35zgbc0nplp8a866iafk4zsrbhwwz4pav5gydr2wm26nksg";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  nenv = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r97jzknll9bhd8yyg2bngnnkj8rjhal667n7d32h8h7ny7nvpnr";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  net-ldap = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "016igqz81a8zcwqzp5bbhryqmb2skmyf57ij3nb5z8sxwhw22jgh";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  nio4r = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a41ca1kpdmrypjp9xbgvckpy8g26zxphkja9vk7j5wl4n8yvlyr";
+      type = "gem";
+    };
+    version = "2.3.1";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0byyxrazkfm29ypcx5q4syrv126nvjnf7z6bqi01sqkv4llsi4qz";
+      type = "gem";
+    };
+    version = "1.8.5";
+  };
+  notiffany = {
+    dependencies = ["nenv" "shellany"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0x838fa5il0dd9zbm3lxkpbfxcf5fxv9556mayc2mxsdl5ghv8nx";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  oauth = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zszdg8q1b135z7l7crjj234k4j0m347hywp5kj6zsq7q78pw09y";
+      type = "gem";
+    };
+    version = "0.5.4";
+  };
+  oauth2 = {
+    dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0av6nlb5y2sm6m8fx669ywrqa9858yqaqfqzny75nqp3anag89qh";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  octokit = {
+    dependencies = ["sawyer"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yh0yzzqg575ix3y2l2261b9ag82gv2v4f1wczdhcmfbxcz755x6";
+      type = "gem";
+    };
+    version = "4.13.0";
+  };
+  omniauth = {
+    dependencies = ["hashie" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1msqr4qq7mfdvl3rg89529isrv595hvjpj2gi0say4b8nwqfggmg";
+      type = "gem";
+    };
+    version = "1.8.1";
+  };
+  omniauth-oauth = {
+    dependencies = ["oauth" "omniauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n5vk4by7hkyc09d9blrw2argry5awpw4gbw1l4n2s9b3j4qz037";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  omniauth-oauth2 = {
+    dependencies = ["oauth2" "omniauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kscjf1y0lnggsl4z3w5bwllqshqjlsl5kmcya5haydajdnzvdjr";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  omniauth-tumblr = {
+    dependencies = ["multi_json" "omniauth-oauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10ncmfym4l6k6aqp402g7mqxahbggcj5xkpsjxgngs746s82y97w";
+      type = "gem";
+    };
+    version = "1.2";
+  };
+  omniauth-twitter = {
+    dependencies = ["omniauth-oauth" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r5j65hkpgzhvvbs90id3nfsjgsad6ymzggbm7zlaxvnrmvnrk65";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  omniauth-wordpress = {
+    dependencies = ["omniauth-oauth2"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "008zx4zwrbzyvlgv6hy68k1d05zskiwvcgwvxxbxhbl0mvlmh303";
+      type = "gem";
+    };
+    version = "0.2.2";
+  };
+  open_graph_reader = {
+    dependencies = ["faraday" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0af4yldyb0d8zglw73s13pyn0g90gs4m5zf7bwy8r4kym9zbvc21";
+      type = "gem";
+    };
+    version = "0.6.2";
+  };
+  openid_connect = {
+    dependencies = ["activemodel" "attr_required" "json-jwt" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r13bv18nyvw0g1nw3fzffvv2si99zj24w0k5zgawf4q6nn5f7vd";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  orm_adapter = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  parallel = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01hj8v1qnyl5ndrs33g8ld8ibk0rbcqdpkpznr04gkbxd11pqn67";
+      type = "gem";
+    };
+    version = "1.12.1";
+  };
+  parser = {
+    dependencies = ["ast"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zjk0w1kjj3xk8ymy1430aa4gg0k8ckphfj88br6il4pm83f0n1f";
+      type = "gem";
+    };
+    version = "2.5.3.0";
+  };
+  pg = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pnjw3rspdfjssxyf42jnbsdlgri8ylysimp0s28wxb93k6ff2qb";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  phantomjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y8pbbyq9dirxb7igkb2s5limz2895qmr41c09fjhx6k6fxcz4mk";
+      type = "gem";
+    };
+    version = "2.1.1.0";
+  };
+  poltergeist = {
+    dependencies = ["capybara" "cliver" "websocket-driver"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0il80p97psmhs6scl0grq031gv7kws4ylvvd6zyr8xv91qadga95";
+      type = "gem";
+    };
+    version = "1.18.1";
+  };
+  powerpack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r51d67wd467rpdfl6x43y84vwm8f5ql9l9m85ak1s2sp3nc5hyv";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  pronto = {
+    dependencies = ["gitlab" "httparty" "octokit" "rainbow" "rugged" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13xbg1pm3kz5zbzxad5qgqnkzkp3ddajj7wxx16aqbfr7rqggvhz";
+      type = "gem";
+    };
+    version = "0.9.5";
+  };
+  pronto-eslint = {
+    dependencies = ["eslintrb" "pronto"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cxyx6mlcdgv4ykliaizkx9cps68xf7qvy8lzxmv7pcqzkxaq7xc";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pronto-haml = {
+    dependencies = ["haml_lint" "pronto"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "116iln1whwiqy55f86q33lnnic0awnqm415xvxwnhwlagcbwmnkg";
+      type = "gem";
+    };
+    version = "0.9.0";
+  };
+  pronto-rubocop = {
+    dependencies = ["pronto" "rubocop"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bcm34qlpp02wf69why5lpi5p53h5r4fq36f4b1fwi621fwzlgsy";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pronto-scss = {
+    dependencies = ["pronto" "scss_lint"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kgaqd6l2w3brdsp5231fpfr6fwajciz2hdr925l1zhh6ni1y2za";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  pry = {
+    dependencies = ["coderay" "method_source"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00rm71x0r1jdycwbs83lf9l6p494m99asakbvqxh8rz7zwnlzg69";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  pry-byebug = {
+    dependencies = ["byebug" "pry"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y2758593i2ij0nhmv0j1pbdfx2cgi52ns6wkij0frgnk2lf650g";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  public_suffix = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08q64b5br692dd3v0a9wq9q5dvycc6kmiqmjbdxkxbfizggsvx6l";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  raabro = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xzdmbn48753f6k0ckirp8ja5p0xn1a92wbwxfyggyhj0hza9ylq";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  rack = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pcgv8dv4vkaczzlix8q3j68capwhk420cddzijwqgi2qb4lm1zm";
+      type = "gem";
+    };
+    version = "2.0.6";
+  };
+  rack-cors = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1j27vy1bmhbqcyzhxg8d07qassmax769xjalfwcwz6qfiq8cf013";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  rack-google-analytics = {
+    dependencies = ["actionpack" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09pv0z5dhjjrlhi9qj5qy48hi66f7iix337qrapg7mvwwz6czcvj";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  rack-mobile-detect = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bagli6ldhkpd1yym775sxy7w5n4jds6gbcjm3gmcl37vggvm8a5";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  rack-oauth2 = {
+    dependencies = ["activesupport" "attr_required" "httpclient" "json-jwt" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kmxj9hbjhhcs3yyb433s82hkpmzb536m0mwfadjiaisganx1cii";
+      type = "gem";
+    };
+    version = "1.9.3";
+  };
+  rack-piwik = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0raxrckapqh693lpid0cnx1j1v2i3mz5cyssg7grgrilgrn9318z";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ylx74ravz7nvnyygq0nk3v86qdzrmqxpwpayhppyy50l72rcajq";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  rack-rewrite = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  rack-ssl = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  rails = {
+    dependencies = ["actioncable" "actionmailer" "actionpack" "actionview" "activejob" "activemodel" "activerecord" "activesupport" "railties" "sprockets-rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lb07cbwgm371zyn9i6fyj9q8rmv89lacmyzrfvzxqqx2n3ilc5q";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  rails-assets-autosize = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0hr72mfprb9678lf7dj9lh801lm7p98nzkrnrz764sy9lmbpzcib";
+      type = "gem";
+    };
+    version = "4.0.2";
+  };
+  rails-assets-backbone = {
+    dependencies = ["rails-assets-underscore"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0zjgwhgfmg1jyyds7zfjp6g4bz8vw56qvhlrpj943wcqpdxm93id";
+      type = "gem";
+    };
+    version = "1.3.3";
+  };
+  rails-assets-blueimp-gallery = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "18b7xvvkdnd39xlbkyw46i86w3wzj349s8iv5wdiypa5qdcql8mq";
+      type = "gem";
+    };
+    version = "2.33.0";
+  };
+  rails-assets-bootstrap = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0x4i11132qcmghmqb061iq47yksrr7i0la5hzzdm38dxybh87x5v";
+      type = "gem";
+    };
+    version = "3.3.7";
+  };
+  rails-assets-bootstrap-markdown = {
+    dependencies = ["rails-assets-bootstrap"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1nxirs9wx5jxrjmxjwvsqlf2rsypjn3ajg7fs28c4ib7wwpabwj3";
+      type = "gem";
+    };
+    version = "2.10.0";
+  };
+  rails-assets-corejs-typeahead = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1p5i6afd156rakrin99c2ryaz3zykx21ir6y10l34jnw03rikcfg";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  rails-assets-diaspora_jsxc = {
+    dependencies = ["rails-assets-emojione" "rails-assets-favico.js" "rails-assets-jquery-colorbox" "rails-assets-jquery-fullscreen-plugin" "rails-assets-jquery.slimscroll" "rails-assets-jquery.ui"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "07vqdj0l8fsj4fd2sschba2jgfbimyfad56009ldzlcvb6ml5nhi";
+      type = "gem";
+    };
+    version = "0.1.5.develop.7";
+  };
+  rails-assets-emojione = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1j29vbsf6v9ikiqlmnfgzxys4xsa1glvmfky8id5xfyymnjx2c52";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  "rails-assets-favico.js" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "19yndhljmqlvarf49h5v71zq0p0ngvspjr2v0m6lac0q9ni7r5bv";
+      type = "gem";
+    };
+    version = "0.3.10";
+  };
+  rails-assets-fine-uploader = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1vxj78x2vvlchpapxpaawysc9wn8alzdd3gxhwfwy11xv8ka9mdv";
+      type = "gem";
+    };
+    version = "5.13.0";
+  };
+  rails-assets-highlightjs = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0spmb0gkfs13fmljjv1n53r53q69fhb6r573ndbxnhgb3izqgnqp";
+      type = "gem";
+    };
+    version = "9.12.0";
+  };
+  rails-assets-jasmine = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1n6yixrl9cgq5kckay75b44p878s1kqi69mhgyw99w8dsq8i2vy5";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  rails-assets-jasmine-ajax = {
+    dependencies = ["rails-assets-jasmine"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0l8z0p75x1yzk1l1ryfvdlvq8yq4w2xngp4icz478axd5jcqx6kg";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  rails-assets-jquery = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1wcaappk12w300733lrqb571cir9nw35d9q6d2i52wwdvhv2fx2y";
+      type = "gem";
+    };
+    version = "3.3.1";
+  };
+  rails-assets-jquery-colorbox = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "19ws3r1zfviwnfr9s0jh6iqss50iwqkf4a78zhrk0p3bb4lvmmsp";
+      type = "gem";
+    };
+    version = "1.6.4";
+  };
+  rails-assets-jquery-fullscreen-plugin = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0ldvq4s15lap9p6w7d1yw6dajn2gh6p75dbkp79p0d8ylzapsd58";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  rails-assets-jquery-placeholder = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0h17gjazc27pj4cm2ig232ww4d4ppq9bcginwzjss95pl63richi";
+      type = "gem";
+    };
+    version = "2.3.1";
+  };
+  rails-assets-jquery-textchange = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0rsw3cn9a5njv80zy53339kmrmv60b8fqcrr7bacapbagb2rd4dj";
+      type = "gem";
+    };
+    version = "0.2.3";
+  };
+  "rails-assets-jquery.are-you-sure" = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0nj04aqh9jpcg57xbjxpm2vn7mkd5clnpma907515a1nxy40bym0";
+      type = "gem";
+    };
+    version = "1.9.0";
+  };
+  "rails-assets-jquery.slimscroll" = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1rymmd2rxy1vjjj70v88abmdlfs55276rs3rksj300dgirnnj998";
+      type = "gem";
+    };
+    version = "1.3.8";
+  };
+  "rails-assets-jquery.ui" = {
+    dependencies = ["rails-assets-jquery"];
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0xc9kfb29hi441irj49b7aawxkddk1dxzy938rpqv9ylpsj7knaa";
+      type = "gem";
+    };
+    version = "1.11.4";
+  };
+  rails-assets-markdown-it = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fxx7ldszsdqr5ry21bnxmv33byz7abpk9lcp100q5cqsjx091r9";
+      type = "gem";
+    };
+    version = "8.4.2";
+  };
+  rails-assets-markdown-it--markdown-it-for-inline = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fznv2x7ndadr3wb4dzhh86bpcpwz8f4d8rfhz4sfbqlai40j3jl";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  rails-assets-markdown-it-diaspora-mention = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0asggm7wgmdll8x94291p2w6icmp2izi914dlh3b7vb7dpjq3jig";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  rails-assets-markdown-it-hashtag = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0dr8fwaxgkfqm7z4rl4jdym0i1ycqw1sgkxshkd9k0849ry12cdk";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  rails-assets-markdown-it-sanitizer = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0fkpffh83fc257zkzaia93j4hw2baz90lg10s5yxsxww06q5dn36";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  rails-assets-markdown-it-sub = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "08hjij5fqvhvg7s27n4g8qqsks974g3kc5k7xl2qmh41k7f4hcrk";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  rails-assets-markdown-it-sup = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "17nnnvky7zy0yiwwl6dm8ibbkyvvf63xfp3snch4dzmras05lmig";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  rails-assets-underscore = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "1ccnzj7aqrvngcs915y290pijryqmjygimdwlrykpyj8vwzifdnc";
+      type = "gem";
+    };
+    version = "1.9.1";
+  };
+  rails-assets-utatti-perfect-scrollbar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rails-assets.org"];
+      sha256 = "0m8syfv8p5bnwm8nrba6mpjnhrd29ffwzi6awhiw537jqw42b12v";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  rails-controller-testing = {
+    dependencies = ["actionpack" "actionview" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16kdkk73mhhs73iz3i1i0ryjm84dadiyh817b3nh8acdi490jyhy";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  rails-dom-testing = {
+    dependencies = ["activesupport" "nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  rails-html-sanitizer = {
+    dependencies = ["loofah"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gv7vr5d9g2xmgpjfq4nxsqr70r9pr042r9ycqqnfvw5cz9c7jwr";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  rails-i18n = {
+    dependencies = ["i18n" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05lkhc737a9dw0hd5ljmja0yp4cw39r3200s1r0n4bs7z1g3ka7l";
+      type = "gem";
+    };
+    version = "5.1.2";
+  };
+  rails-timeago = {
+    dependencies = ["actionpack" "activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01x1vs9hni9wn8dc4fmyqzkrn651chzsi2mhmk0pxdrfx9md0lxv";
+      type = "gem";
+    };
+    version = "2.16.0";
+  };
+  railties = {
+    dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ycy2gdaj0px1vfaghskvl6qkczwaigrli2zxn54w7zn1z29faj8";
+      type = "gem";
+    };
+    version = "5.1.6";
+  };
+  rainbow = {
+    dependencies = ["rake"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08w2ghc5nv0kcq5b257h7dwjzjz1pqcavajfdx2xjyxqsvh2y34w";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  raindrops = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qpbd9jif40c53fz2r0l8khfl016y8s8bkx37ibcaafclbl3xygp";
+      type = "gem";
+    };
+    version = "0.19.0";
+  };
+  rake = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1idi53jay34ba9j68c3mfr9wwkg3cd9qh0fn9cg42hv72c6q8dyg";
+      type = "gem";
+    };
+    version = "12.3.1";
+  };
+  rb-fsevent = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lm1k7wpz69jx7jrc92w3ggczkjyjbfziq5mg62vjnxmzs383xx8";
+      type = "gem";
+    };
+    version = "0.10.3";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yfsgw5n7pkpyky6a9wkf1g9jafxb0ja7gz0qw0y14fd2jnzfh71";
+      type = "gem";
+    };
+    version = "0.9.10";
+  };
+  redcarpet = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h9qz2hik4s9knpmbwrzb3jcp3vc5vygp9ya8lcpl7f1l9khmcd7";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  redis = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i415x8gi0c5vsiy6ikvx5js6fhc4x80a5lqv8iidy2iymd20irv";
+      type = "gem";
+    };
+    version = "3.3.5";
+  };
+  regexp_parser = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18g5jyg3blsdrz3mc8d87bms6qqn6gcdh1nvdhvgbjdpk9pw21dq";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  request_store = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1963330z03fk382fi8y231ygcbnh86m91dqlp5rh1mwy9ihzzl6d";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  responders = {
+    dependencies = ["actionpack" "railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rhdyyvvm26f2l3fgwdp6xasfl2y0whwgy766bhdwz697mf78zfn";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rspec = {
+    dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15ppasvb9qrscwlyjz67ppw1lnxiqnkzx5vkx1bd8x5n3dhikxc3";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-core = {
+    dependencies = ["rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p1s5bnbqp3sxk67y0fh0x884jjym527r0vgmhbm81w7aq6b7l4p";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-expectations = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18l21hy1zdc2pgc2yb17k3n2al1khpfr0z6pijlm852iz6vj0dkm";
+      type = "gem";
+    };
+    version = "3.8.2";
+  };
+  rspec-json_expectations = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0l3dhvkb95zwyg72wz33azxigc9cisqgg3z16ksns1sx0b93nnbn";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  rspec-mocks = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06y508cjqycb4yfhxmb3nxn0v9xqf17qbd46l1dh4xhncinr4fyp";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-rails = {
+    dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sqj5da2kc937j5jb18jcf0hrmmzwgj7pk62j0q3qndhc2kvx88p";
+      type = "gem";
+    };
+    version = "3.8.1";
+  };
+  rspec-support = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p3m7drixrlhvj2zpc38b11x145bvm311x6f33jjcxmvcm0wq609";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rubocop = {
+    dependencies = ["jaro_winkler" "parallel" "parser" "powerpack" "rainbow" "ruby-progressbar" "unicode-display_width"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ivk049z3mp12nc6v1wn35bsq1g7nz1i2r4xwzqf0v25hm2v7n1i";
+      type = "gem";
+    };
+    version = "0.60.0";
+  };
+  ruby-oembed = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kw4aplb3m13z3kchhb79wf87qb3prn1m99s6vl5cyp0xqwyymv0";
+      type = "gem";
+    };
+    version = "0.12.0";
+  };
+  ruby-progressbar = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cv2ym3rl09svw8940ny67bav7b2db4ms39i4raaqzkf59jmhglk";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  ruby_dep = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1c1bkl97i9mkcvkn1jks346ksnvnnp84cs22gwl0vd7radybrgy5";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  rubyzip = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n1lb2sdwh9h27y244hxzg1lrxxg2m53pk1vq7p33bna003qkyrj";
+      type = "gem";
+    };
+    version = "1.2.2";
+  };
+  rugged = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jv4nw9hvlxp8hhhlllrfcznki82i50fp1sj65zsjllfl2bvz8x6";
+      type = "gem";
+    };
+    version = "0.27.5";
+  };
+  safe_yaml = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hly915584hyi9q9vgd968x2nsi5yag9jyf5kq60lwzi5scr7094";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sass = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw";
+      type = "gem";
+    };
+    version = "3.4.25";
+  };
+  sass-rails = {
+    dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wa63sbsimrsf7nfm8h0m1wbsllkfxvd7naph5d1j6pbc555ma7s";
+      type = "gem";
+    };
+    version = "5.0.7";
+  };
+  sawyer = {
+    dependencies = ["addressable" "faraday"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sv1463r7bqzvx4drqdmd36m7rrv6sf1v3c6vswpnq3k6vdw2dvd";
+      type = "gem";
+    };
+    version = "0.8.1";
+  };
+  scss_lint = {
+    dependencies = ["rake" "sass"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11rl8kj32p34mqlkhxvlwfrwl8gdl0iha8q9xsrr3sjxjagzv8yp";
+      type = "gem";
+    };
+    version = "0.55.0";
+  };
+  secure_headers = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17cxci8jyvlgssix0cy7kbm5m2h7s8ym9caj8nilrbd21jis9pc5";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  shellany = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ryyzrj1kxmnpdzhlv4ys3dnl2r5r3d2rs2jwzbnd1v96a8pl4hf";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  shoulda-matchers = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zvv94pqk5b5my3w1shdz7h34xf2ldhg5k4qfdpbwi2iy0j9zw2a";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  sidekiq = {
+    dependencies = ["connection_pool" "rack-protection" "redis"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zyf9y3rvzizbwh68i2g1lzd40lalrdc4iyjmaa74gnfwsf92i26";
+      type = "gem";
+    };
+    version = "5.2.3";
+  };
+  sidekiq-cron = {
+    dependencies = ["fugit" "sidekiq"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1aliswahmpxn1ib2brn4126gk97ac3zdnwr71mn8vzbr3vdd7fl0";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  simple_captcha2 = {
+    dependencies = ["rails"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vdjydym8sjpa8c1q0n2hanj3n9vzi4ycdw2p6bbm6qqmm1f3fq3";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  simple_oauth = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dw9ii6m7wckml100xhjc6vxpjcry174lbi9jz5v7ibjr3i94y8l";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  simplecov = {
+    dependencies = ["docile" "json" "simplecov-html"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sfyfgf7zrp2n42v7rswkqgk3bbwk1bnsphm24y7laxv3f8z0947";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  simplecov-html = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lihraa4rgxk8wbfl77fy9sf0ypk31iivly8vl3w04srd7i0clzn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  sinon-rails = {
+    dependencies = ["railties"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b7996hb8vfky29b0zcql90x8i6vhdg2zy9nfzmhh820gjv3kggb";
+      type = "gem";
+    };
+    version = "1.15.0";
+  };
+  spring = {
+    dependencies = ["activesupport"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "168yz9c1fv21wc5i8q7n43b9nk33ivg3ws1fn6x0afgryz3ssx75";
+      type = "gem";
+    };
+    version = "2.0.2";
+  };
+  spring-commands-cucumber = {
+    dependencies = ["spring"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mw81gvms2svn4k4pc6ly7smkmf0j9r2xbf0d38vygbyhiwd1c9a";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  spring-commands-rspec = {
+    dependencies = ["spring"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sprockets = {
+    dependencies = ["concurrent-ruby" "rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
+      type = "gem";
+    };
+    version = "3.7.2";
+  };
+  sprockets-rails = {
+    dependencies = ["actionpack" "activesupport" "sprockets"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ab42pm8p5zxpv3sfraq45b9lj39cz9mrpdirm30vywzrwwkm5p1";
+      type = "gem";
+    };
+    version = "3.2.1";
+  };
+  state_machines = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  string-direction = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iyddwmkj425c6xbn5pmlr2yzwcq4snzlan7rky5b1yp2pvf70jj";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  swd = {
+    dependencies = ["activesupport" "attr_required" "httpclient"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s2vjb6f13za7p1iycl2p73d3p202xa6xny9fjrp8ynwsqix7lyd";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  sysexits = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qjng6pllznmprzx8vb0zg0c86hdrkyjs615q41s9fjpmv2430jr";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  systemu = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gmkbakhfci5wnmbfx5i54f25j9zsvbw858yg3jjhfs5n4ad1xq1";
+      type = "gem";
+    };
+    version = "2.6.5";
+  };
+  temple = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00nxf610nzi4n1i2lkby43nrnarvl89fcl6lg19406msr0k3ycmq";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  term-ansicolor = {
+    dependencies = ["tins"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "079hbagd9mk0839rkajsdrbzkn992gj8ah2n45qd64v25ml27i6d";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  terminal-table = {
+    dependencies = ["unicode-display_width"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  thor = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01n5dv9kql60m6a00zc0r66jvaxx98qhdny3klyj0p3w34pad2ns";
+      type = "gem";
+    };
+    version = "0.19.4";
+  };
+  thread_safe = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy";
+      type = "gem";
+    };
+    version = "0.3.6";
+  };
+  tilt = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0020mrgdf11q23hm1ddd6fv691l51vi10af00f137ilcdb2ycfra";
+      type = "gem";
+    };
+    version = "2.0.8";
+  };
+  timecop = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d7mm786180v4kzvn1f77rhfppsg5n0sq2bdx63x9nv114zm8jrp";
+      type = "gem";
+    };
+    version = "0.9.1";
+  };
+  timers = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04zbs9wyzajn7g9xfgg2zqz5kzf0qa7jgh4hgry4pfcxfmlnwdwx";
+      type = "gem";
+    };
+    version = "4.2.0";
+  };
+  tins = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pqj45n216zrz7yckdbdknlmhh187iqzx8fp76y2h0jrgqjfkxmj";
+      type = "gem";
+    };
+    version = "1.20.2";
+  };
+  to_regexp = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rgabfhnql6l4fx09mmj5d0vza924iczqf2blmn82l782b6qqi9v";
+      type = "gem";
+    };
+    version = "0.2.1";
+  };
+  turbo_dev_assets = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08yp7gpishjfj8b7d61hxs677288ycv6yg78a7hfzn631gxczipx";
+      type = "gem";
+    };
+    version = "0.0.2";
+  };
+  twitter = {
+    dependencies = ["addressable" "buftok" "equalizer" "http" "http-form_data" "http_parser.rb" "memoizable" "multipart-post" "naught" "simple_oauth"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fjyz3viabz3xs5d9aad18zgdbhfwm51jsnzigc8kxk77p1x58n5";
+      type = "gem";
+    };
+    version = "6.2.0";
+  };
+  twitter-text = {
+    dependencies = ["unf"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1732h7hy1k152w8wfvjsx7b79alk45i5imwd37ia4qcx8hfm3gvg";
+      type = "gem";
+    };
+    version = "1.14.7";
+  };
+  typhoeus = {
+    dependencies = ["ethon"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cni8b1idcp0dk8kybmxydadhfpaj3lbs99w5kjibv8bsmip2zi5";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  tzinfo = {
+    dependencies = ["thread_safe"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fjx9j327xpkkdlxwmkl3a8wqj7i4l4jwlrv3z13mg95z9wl253z";
+      type = "gem";
+    };
+    version = "1.2.5";
+  };
+  uglifier = {
+    dependencies = ["execjs"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g203kly5wp4qlkc7371skyvyin6iinc8i0p5wrpiqgblqxxgcf1";
+      type = "gem";
+    };
+    version = "4.1.19";
+  };
+  unf = {
+    dependencies = ["unf_ext"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  unf_ext = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06p1i6qhy34bpb8q8ms88y6f2kz86azwm098yvcc0nyqk9y729j1";
+      type = "gem";
+    };
+    version = "0.0.7.5";
+  };
+  unicode-display_width = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0040bsdpcmvp8w31lqi2s9s4p4h031zv52401qidmh25cgyh4a57";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  unicorn = {
+    dependencies = ["kgio" "raindrops"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qfhvzs4i6ja1s43j8p1kfbzm10n7a02ngki30a38y5m46a2qrak";
+      type = "gem";
+    };
+    version = "5.4.1";
+  };
+  unicorn-worker-killer = {
+    dependencies = ["get_process_mem" "unicorn"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rrdxpwdsapx47axjin8ymxb4f685qlpx8a26bql4ay1559c3gva";
+      type = "gem";
+    };
+    version = "0.4.4";
+  };
+  uuid = {
+    dependencies = ["macaddr"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mr405vg4ccnndkyf7pb49gp1fha8i6gj7iwq43nxkak41cwzh5f";
+      type = "gem";
+    };
+    version = "2.3.9";
+  };
+  valid = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vxrgik9gxyh5j2w16nz5azjk0cbzmvv883hq9pvxm9anfbbj8d3";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  validate_email = {
+    dependencies = ["activemodel" "mail"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r1fz29l699arka177c9xw7409d1a3ff95bf7a6pmc97slb91zlx";
+      type = "gem";
+    };
+    version = "0.1.6";
+  };
+  validate_url = {
+    dependencies = ["activemodel" "addressable"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1df4gch8dizimpbl185vfgw95yb8ffr6zwj6whzbxfil95c3f2qh";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  versionist = {
+    dependencies = ["activesupport" "railties" "yard"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p8wizg6jml7gz1qiqk7d77hy0w5650g812jhgd0zzkwwdmzm38m";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  warden = {
+    dependencies = ["rack"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fr9n9i9r82xb6i61fdw4xgc7zjv7fsdrr4k0njchy87iw9fl454";
+      type = "gem";
+    };
+    version = "1.2.8";
+  };
+  webfinger = {
+    dependencies = ["activesupport" "httpclient"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m0jh8k7c0ifh2jhbn7ihqrmn5fi754wflva97zgy70hpdvxyjar";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  webmock = {
+    dependencies = ["addressable" "crack" "hashdiff"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03994dxs4xayvkxqp01dd1ivhg4xxx7z35f7cxw7y2mwj3xn24ib";
+      type = "gem";
+    };
+    version = "3.4.2";
+  };
+  websocket-driver = {
+    dependencies = ["websocket-extensions"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1943442yllhldh9dbp374x2q39cxa49xrm28nb78b7mfbv3y195l";
+      type = "gem";
+    };
+    version = "0.6.5";
+  };
+  websocket-extensions = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "034sdr7fd34yag5l6y156rkbhiqgmy395m231dwhlpcswhs6d270";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  will_paginate = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ihf15yaj8883ddhkxq7q60zrg3zfsvqaf5853gybhcg18zq8bn9";
+      type = "gem";
+    };
+    version = "3.1.6";
+  };
+  xpath = {
+    dependencies = ["nokogiri"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
+      type = "gem";
+    };
+    version = "3.2.0";
+  };
+  yard = {
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmmr1839qgbb3zxfa7jf5mzy17yjl1yirwlgzdhws4452gqhn67";
+      type = "gem";
+    };
+    version = "0.9.16";
+  };
+}
diff --git a/pkgs/webapps/diaspora/ldap.patch b/pkgs/webapps/diaspora/ldap.patch
new file mode 100644 (file)
index 0000000..3d4f785
--- /dev/null
@@ -0,0 +1,256 @@
+commit 936a14e225037aca4cdeac11c843c7985e636c88
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Mon Jul 24 19:58:24 2017 +0200
+
+    Add LDAP to diaspora
+
+diff --git a/Gemfile b/Gemfile
+index 414b0138d..2a934e9c9 100644
+--- a/Gemfile
++++ b/Gemfile
+@@ -217,6 +217,9 @@ gem "thor", "0.19.1"
+ # gem "therubyracer", :platform => :ruby
++# LDAP
++gem 'net-ldap', '~> 0.16'
++
+ group :production do # we don"t install these on travis to speed up test runs
+   # Analytics
+diff --git a/Gemfile.lock b/Gemfile.lock
+index 84f8172e4..cdbf19fcd 100644
+--- a/Gemfile.lock     2019-01-13 19:55:52.538561762 +0100
++++ b/Gemfile.lock     2019-01-13 19:58:11.087099067 +0100
+@@ -398,6 +398,7 @@
+     mysql2 (0.5.2)
+     naught (1.1.0)
+     nenv (0.3.0)
++    net-ldap (0.16.1)
+     nio4r (2.3.1)
+     nokogiri (1.8.5)
+       mini_portile2 (~> 2.3.0)
+@@ -820,6 +821,7 @@
+   minitest
+   mobile-fu (= 1.4.0)
+   mysql2 (= 0.5.2)
++  net-ldap (~> 0.16)
+   nokogiri (= 1.8.5)
+   omniauth (= 1.8.1)
+   omniauth-tumblr (= 1.2)
+diff --git a/app/models/user.rb b/app/models/user.rb
+index 940a48f25..d1e2beeee 100644
+--- a/app/models/user.rb
++++ b/app/models/user.rb
+@@ -337,6 +337,12 @@ class User < ActiveRecord::Base
+   end
+   def send_confirm_email
++    if skip_email_confirmation?
++      self.email = unconfirmed_email
++      self.unconfirmed_email = nil
++      save
++    end
++
+     return if unconfirmed_email.blank?
+     Workers::Mail::ConfirmEmail.perform_async(id)
+   end
+@@ -554,6 +560,14 @@ class User < ActiveRecord::Base
+     end
+   end
++  def ldap_user?
++    AppConfig.ldap.enable? && ldap_dn.present?
++  end
++
++  def skip_email_confirmation?
++    ldap_user? && AppConfig.ldap.skip_email_confirmation?
++  end
++
+   private
+   def clearable_fields
+diff --git a/config/defaults.yml b/config/defaults.yml
+index c046aff07..66e9afa13 100644
+--- a/config/defaults.yml
++++ b/config/defaults.yml
+@@ -202,6 +202,20 @@ defaults:
+       scope: tags
+       include_user_tags: false
+       pod_tags:
++  ldap:
++    enable: false
++    host: localhost
++    port: 389
++    only_ldap: true
++    mail_attribute: mail
++    skip_email_confirmation: true
++    use_bind_dn: true
++    bind_dn: "cn=diaspora,dc=example,dc=com"
++    bind_pw: "password"
++    search_base: "dc=example,dc=com"
++    search_filter: "uid=%{username}"
++    bind_template: "uid=%{username},dc=example,dc=com"
++
+ development:
+   environment:
+diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example
+index b2573625d..c357c8651 100644
+--- a/config/diaspora.yml.example
++++ b/config/diaspora.yml.example
+@@ -710,6 +710,36 @@ configuration: ## Section
+       ## If scope is 'tags', a comma separated list of tags here can be set.
+       ## For example "linux,diaspora", to receive posts related to these tags
+       #pod_tags:
++  ldap:
++      # Uncomment next line if you want to use LDAP on your instance
++      enable: true
++      host: localhost
++      port: 389
++      # Use only LDAP authentication (don't try other means)
++      only_ldap: true
++      # LDAP attribute to find the user's e-mail. Necessary to create accounts
++      # for not existing users
++      mail_attribute: mail
++      # Skip e-mail confirmation when creating an account via LDAP.
++      skip_email_confirmation: true
++      # ----- Using bind_dn and bind_pw
++      # bind_dn and bind_pw may be used if the diaspora instance
++      # should be able to connect to LDAP to find and search for users.
++
++      use_bind_dn: true
++      bind_dn: "cn=diaspora,dc=example,dc=com"
++      bind_pw: "password"
++      search_base: "dc=example,dc=com"
++      # This is the filter with which to search for the user. %{username} will
++      # be replaced by the given login.
++      search_filter: "uid=%{username}"
++      #
++      # ----- Using template
++      # This setting doesn't require a diaspora LDAP user. Use a template, and
++      # diaspora will try to login with the templated dn and password
++      #
++      # bind_template: "uid=%{username},dc=example,dc=com"
++
+ ## Here you can override settings defined above if you need
+ ## to have them different in different environments.
+diff --git a/config/initializers/0_ldap_authenticatable.rb b/config/initializers/0_ldap_authenticatable.rb
+new file mode 100644
+index 000000000..49846502f
+--- /dev/null
++++ b/config/initializers/0_ldap_authenticatable.rb
+@@ -0,0 +1,82 @@
++require 'net/ldap'
++require 'devise/strategies/authenticatable'
++
++module Devise
++  module Strategies
++    class LdapAuthenticatable < Authenticatable
++      def valid?
++        AppConfig.ldap.enable? && params[:user].present?
++      end
++
++      def authenticate!
++        ldap = Net::LDAP.new(
++          host: AppConfig.ldap.host,
++          port: AppConfig.ldap.port,
++          encryption: :simple_tls,
++        )
++
++        if AppConfig.ldap.use_bind_dn?
++          ldap.auth AppConfig.ldap.bind_dn, AppConfig.ldap.bind_pw
++
++          if !ldap.bind
++            return fail(:ldap_configuration_error)
++          end
++
++          search_filter = AppConfig.ldap.search_filter % { username: params[:user][:username] }
++
++          result = ldap.search(base: AppConfig.ldap.search_base, filter: search_filter, result_set: true)
++
++          if result.count != 1
++            return login_fail
++          end
++
++          user_dn    = result.first.dn
++          user_email = result.first[AppConfig.ldap.mail_attribute].first
++        else
++          user_dn = AppConfig.ldap.bind_template % { username: params[:user][:username] }
++        end
++
++        ldap.auth user_dn, params[:user][:password]
++
++        if ldap.bind
++          user = User.find_by(ldap_dn: user_dn)
++
++          # We don't want to trust too much the email attribute from
++          # LDAP: if the user can edit it himself, he may login as
++          # anyone
++          if user.nil?
++            if !AppConfig.ldap.use_bind_dn?
++              result = ldap.search(base: user_dn, scope: Net::LDAP::SearchScope_BaseObject, filter: "(objectClass=*)", result_set: true)
++              user_email = result.first[AppConfig.ldap.mail_attribute].first
++            end
++
++            if user_email.present? && User.find_by(email: user_email).nil?
++              # Password is used for remember_me token
++              user = User.build(email: user_email, ldap_dn: user_dn, password: SecureRandom.hex, username: params[:user][:username])
++              user.save
++              user.seed_aspects
++            elsif User.find_by(email: user_email).present?
++              return fail(:ldap_existing_email)
++            else
++              return fail(:ldap_cannot_create_account_without_email)
++            end
++          end
++
++          success!(user)
++        else
++          return login_fail
++        end
++      end
++
++      def login_fail
++        if AppConfig.ldap.only_ldap?
++          return fail(:ldap_invalid_login)
++        else
++          return pass
++        end
++      end
++    end
++  end
++end
++
++Warden::Strategies.add(:ldap_authenticatable, Devise::Strategies::LdapAuthenticatable)
+diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
+index 3698e2373..14e88063e 100644
+--- a/config/initializers/devise.rb
++++ b/config/initializers/devise.rb
+@@ -250,10 +250,9 @@ Devise.setup do |config|
+   # If you want to use other strategies, that are not supported by Devise, or
+   # change the failure app, you can configure them inside the config.warden block.
+   #
+-  # config.warden do |manager|
+-  #   manager.intercept_401 = false
+-  #   manager.default_strategies(:scope => :user).unshift :some_external_strategy
+-  # end
++  config.warden do |manager|
++    manager.default_strategies(scope: :user).unshift :ldap_authenticatable
++  end
+   # ==> Mountable engine configurations
+   # When using Devise inside an engine, let's call it `MyEngine`, and this engine
+diff --git a/db/migrate/20170724182100_add_ldap_dn_to_users.rb b/db/migrate/20170724182100_add_ldap_dn_to_users.rb
+new file mode 100644
+index 000000000..f5cc84d11
+--- /dev/null
++++ b/db/migrate/20170724182100_add_ldap_dn_to_users.rb
+@@ -0,0 +1,6 @@
++class AddLdapDnToUsers < ActiveRecord::Migration
++  def change
++    add_column :users, :ldap_dn, :text, null: true, default: nil
++    add_index :users, ['ldap_dn'], :length => { "ldap_dn" => 191 }
++  end
++end
diff --git a/pkgs/webapps/dokuwiki/default.nix b/pkgs/webapps/dokuwiki/default.nix
new file mode 100644 (file)
index 0000000..9df88c6
--- /dev/null
@@ -0,0 +1,43 @@
+{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, stdenv, mylibs, writeText }:
+let
+  preloadFile = plugins: let preloads = [preload]
+      ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins;
+    in writeText "preload.php" (''
+      <?php
+      '' + builtins.concatStringsSep "\n" preloads
+    );
+  withPlugins = plugins: package.overrideAttrs(old: {
+    name = "${old.name}-with-plugins";
+    installPhase = old.installPhase + (
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -sf ${value} $out/lib/plugins/${value.pluginName}") plugins
+        )
+      );
+    installPreloadPhase = ''
+      cp ${preloadFile plugins} $out/inc/preload.php
+      '';
+    passthru = old.passthru // {
+      inherit plugins;
+      withPlugins = morePlugins: old.withPlugins (morePlugins ++ plugins);
+    };
+  });
+  package = stdenv.mkDerivation (mylibs.fetchedGithub ./dokuwiki.json // rec {
+    phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase";
+    buildPhase = ''
+      mv conf conf.dist
+      mv data data.dist
+    '';
+    installPhase = ''
+      cp -a . $out
+      ln -sf ${varDir}/{conf,data} $out/
+      ln -sf ${varDir}/conf/.htaccess $out/
+    '';
+    installPreloadPhase = ''
+      cp ${preloadFile []} $out/inc/preload.php
+      '';
+    passthru = {
+      plugins = [];
+      inherit withPlugins varDir;
+    };
+  });
+in package
diff --git a/pkgs/webapps/dokuwiki/dokuwiki.json b/pkgs/webapps/dokuwiki/dokuwiki.json
new file mode 100644 (file)
index 0000000..fc03252
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "release_stable_2018-04-22b",
+  "meta": {
+    "name": "dokuwiki",
+    "url": "https://github.com/splitbrain/dokuwiki",
+    "branch": "refs/tags/release_stable_2018-04-22b"
+  },
+  "github": {
+    "owner": "splitbrain",
+    "repo": "dokuwiki",
+    "rev": "871dae1320b40211626c7ec665f5e6d5290aca95",
+    "sha256": "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/dokuwiki/plugins/farmer.nix b/pkgs/webapps/dokuwiki/plugins/farmer.nix
new file mode 100644 (file)
index 0000000..b737b2d
--- /dev/null
@@ -0,0 +1,25 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "72b8577-master";
+  name = "dokuwiki-plugin-farmer-${version}";
+  src = fetchFromGitHub {
+    owner = "cosmocode";
+    repo = "dokuwiki-plugin-farmer";
+    rev = "72b857734fd164bf79cc6e17abe56491d55c1072";
+    sha256 = "1c9vc1z7yvzjz4p054kshb9yd00a4bb52s43k9zav0lvwvjij9l0";
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a * $out
+    '';
+  passthru = {
+    pluginName = "farmer";
+    preload = out: ''
+      # farm setup by farmer plugin
+      if (file_exists('${out}/DokuWikiFarmCore.php'))
+      {
+        include('${out}/DokuWikiFarmCore.php');
+      }
+    '';
+  };
+}
diff --git a/pkgs/webapps/dokuwiki/plugins/todo.nix b/pkgs/webapps/dokuwiki/plugins/todo.nix
new file mode 100644 (file)
index 0000000..a3e03fb
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "49068ec-master";
+  name = "dokuwiki-plugin-todo-${version}";
+  src = fetchFromGitHub {
+    owner = "leibler";
+    repo = "dokuwiki-plugin-todo";
+    rev = "49068ecea455ea997d1e4a7adab171ccaf8228e8";
+    sha256 = "1jaq623kp14fyhamsas5mk9ryqlk4q6x6znijrb5xhcdg3r83gmq";
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a * $out
+    '';
+  passthru = {
+    pluginName = "todo";
+  };
+}
diff --git a/pkgs/webapps/etherpad-lite/default.nix b/pkgs/webapps/etherpad-lite/default.nix
new file mode 100644 (file)
index 0000000..ab8e84c
--- /dev/null
@@ -0,0 +1,61 @@
+{ varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
+, stdenv, callPackage, mylibs, fetchurl }:
+let
+  jquery = fetchurl {
+    url = https://code.jquery.com/jquery-1.9.1.js;
+    sha256 = "0h4dk67yc9d0kadqxb6b33585f3x3559p6qmp70l00qwq030vn3v";
+  };
+  withModules = modules: package.overrideAttrs(old: {
+    installPhase = let
+      modInst = n:
+      let n' = n.override {
+        postInstall = ''
+          if [ ! -f $out/lib/node_modules/${n.moduleName}/.ep_initialized ]; then
+            ln -s ${varDir}/ep_initialized/${n.moduleName} $out/lib/node_modules/${n.moduleName}/.ep_initialized
+          fi
+        '';
+      };
+        in "cp -a ${n'}/lib/node_modules/${n.moduleName} $out/node_modules";
+    in old.installPhase + builtins.concatStringsSep "\n" (map modInst modules);
+    passthru = old.passthru // {
+      inherit modules;
+      withModules = moreModules: old.withModules (moreModules ++ modules);
+    };
+  });
+  # built using node2nix -l package-lock.json
+  # and changing "./." to "src"
+  node-environment = (callPackage ./node-packages.nix {
+    nodeEnv = callPackage mylibs.nodeEnv {};
+    src = stdenv.mkDerivation (mylibs.fetchedGithub ./etherpad-lite.json // rec {
+      patches = [ ./libreoffice_patch.diff ];
+      buildPhase = ''
+        touch src/.ep_initialized
+        cp -v src/static/custom/js.template src/static/custom/index.js
+        cp -v src/static/custom/js.template src/static/custom/pad.js
+        cp -v src/static/custom/js.template src/static/custom/timeslider.js
+        cp -v src/static/custom/css.template src/static/custom/index.css
+        cp -v src/static/custom/css.template src/static/custom/pad.css
+        cp -v src/static/custom/css.template src/static/custom/timeslider.css
+        '';
+      installPhase = ''
+        cp -a src/ $out
+        '';
+    });
+  }).package;
+  package = stdenv.mkDerivation rec {
+    name = (mylibs.fetchedGithub ./etherpad-lite.json).name;
+    src = node-environment;
+    installPhase = ''
+      mkdir -p $out
+      mkdir $out/node_modules
+      cp -a lib/node_modules/ep_etherpad-lite $out/src
+      chmod u+w $out/src/static/js/
+      cp ${jquery} $out/src/static/js/jquery.js
+      ln -s ../src $out/node_modules/ep_etherpad-lite
+      '';
+    passthru = {
+      modules = [];
+      inherit varDir withModules;
+    };
+  };
+in package
diff --git a/pkgs/webapps/etherpad-lite/etherpad-lite.json b/pkgs/webapps/etherpad-lite/etherpad-lite.json
new file mode 100644 (file)
index 0000000..81369c4
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "1.7.0",
+  "meta": {
+    "name": "etherpad-lite",
+    "url": "https://github.com/ether/etherpad-lite",
+    "branch": "refs/tags/1.7.0"
+  },
+  "github": {
+    "owner": "ether",
+    "repo": "etherpad-lite",
+    "rev": "96ac381afb9ea731dad48968f15d77dc6488bd0d",
+    "sha256": "03k6bwlm9ch9kssy9jipfg8ij7rpbzd89xq4mvg4grg1q6ivnzk9",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/etherpad-lite/libreoffice_patch.diff b/pkgs/webapps/etherpad-lite/libreoffice_patch.diff
new file mode 100644 (file)
index 0000000..d9e3dfc
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/src/node/utils/LibreOffice.js      2018-06-18 09:54:15.087161212 +0200
++++ b/src/node/utils/LibreOffice.js    2018-06-18 10:33:27.534055021 +0200
+@@ -63,6 +63,7 @@
+         '--invisible',
+         '--nologo',
+         '--nolockcheck',
++        '-env:UserInstallation=file:///tmp/',
+         '--convert-to', task.type,
+         task.srcFile,
+         '--outdir', tmpDir
+
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json
new file mode 100644 (file)
index 0000000..9b0f681
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_aa_file_menu_toolbar" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix
new file mode 100644 (file)
index 0000000..ddaf6fe
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_aa_file_menu_toolbar = nodeEnv.buildNodePackage {
+    name = "ep_aa_file_menu_toolbar";
+    packageName = "ep_aa_file_menu_toolbar";
+    version = "0.1.6";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_aa_file_menu_toolbar/-/ep_aa_file_menu_toolbar-0.1.6.tgz";
+      sha1 = "aaa374d9429c9b2382311fab69e0ff819b53b7b0";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "File / Menu style toolbar";
+      homepage = https://github.com/JohnMcLear/ep_file_menu_toolbar;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json
new file mode 100644 (file)
index 0000000..7643607
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_adminpads" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix
new file mode 100644 (file)
index 0000000..562953d
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_adminpads = nodeEnv.buildNodePackage {
+    name = "ep_adminpads";
+    packageName = "ep_adminpads";
+    version = "0.0.12";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_adminpads/-/ep_adminpads-0.0.12.tgz";
+      sha1 = "e8a04b6c77f76d9d8703c9b40e656950f2f5c125";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Gives the ability to list and administrate all pads on admin page";
+      homepage = "https://github.com/spcsser/ep_adminpads#readme";
+      license = "MIT";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json
new file mode 100644 (file)
index 0000000..9405dd2
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_align" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix
new file mode 100644 (file)
index 0000000..9d045f2
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_align = nodeEnv.buildNodePackage {
+    name = "ep_align";
+    packageName = "ep_align";
+    version = "0.0.24";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_align/-/ep_align-0.0.24.tgz";
+      sha512 = "hQwIerjWtcY3qWfqCsm+MIk/eo/hfpOl7mkGS+YZFJvljv4xuDk8QK8gnYY7RLtiKGo8jN8fKlht2w6DCLosjg==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add Left/Center/Right/Justify to lines of text in a pad";
+      homepage = "https://github.com/johnmclear/ep_align#readme";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json
new file mode 100644 (file)
index 0000000..80745ca
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_bookmark" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix
new file mode 100644 (file)
index 0000000..9b3c2cd
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_bookmark = nodeEnv.buildNodePackage {
+    name = "ep_bookmark";
+    packageName = "ep_bookmark";
+    version = "1.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_bookmark/-/ep_bookmark-1.0.2.tgz";
+      sha1 = "14ef41ab3eccc3c387f40a0093683fc6497cb560";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Etherpad plugin for users to save a list of bookmarks of their visited pads locally in the browser's local storage";
+      homepage = "https://github.com/Gared/ep_bookmark#readme";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json
new file mode 100644 (file)
index 0000000..07c0662
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_clear_formatting" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix
new file mode 100644 (file)
index 0000000..03d364a
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_clear_formatting = nodeEnv.buildNodePackage {
+    name = "ep_clear_formatting";
+    packageName = "ep_clear_formatting";
+    version = "0.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_clear_formatting/-/ep_clear_formatting-0.0.2.tgz";
+      sha1 = "b16970b9c6be01246d23cb5a81777aa220d06fc4";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Clear formatting on a selection, this plugin requires the file menu";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json
new file mode 100644 (file)
index 0000000..b513f5c
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_colors" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix
new file mode 100644 (file)
index 0000000..8840d0d
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_colors = nodeEnv.buildNodePackage {
+    name = "ep_colors";
+    packageName = "ep_colors";
+    version = "0.0.3";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_colors/-/ep_colors-0.0.3.tgz";
+      sha1 = "aa95e1b12e009ed6b05d0ccb188ca4829e799780";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "add colors to the etherpad";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json
new file mode 100644 (file)
index 0000000..f6da8df
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_copy_paste_select_all" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix
new file mode 100644 (file)
index 0000000..82b7b91
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_copy_paste_select_all = nodeEnv.buildNodePackage {
+    name = "ep_copy_paste_select_all";
+    packageName = "ep_copy_paste_select_all";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_copy_paste_select_all/-/ep_copy_paste_select_all-0.0.4.tgz";
+      sha1 = "41b89ece9da8e549a7ca4b11cdfa0a27344f21c8";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support to do Copy, Paste, Select All and Find and Replace, this plugin requires the file menu";
+      homepage = https://github.com/ether/ep_copy_paste_select_all;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json
new file mode 100644 (file)
index 0000000..b409581
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_cursortrace" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix
new file mode 100644 (file)
index 0000000..40d0eec
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_cursortrace = nodeEnv.buildNodePackage {
+    name = "ep_cursortrace";
+    packageName = "ep_cursortrace";
+    version = "2.0.15";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_cursortrace/-/ep_cursortrace-2.0.15.tgz";
+      sha1 = "fa374f2d4be2708af998fbb407633c55d9031326";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Show cursor/caret movements of other users in real time";
+      homepage = https://github.com/redhog/ep_cursortrace;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json
new file mode 100644 (file)
index 0000000..e4961d3
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_embedmedia" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix
new file mode 100644 (file)
index 0000000..caa7982
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_embedmedia = nodeEnv.buildNodePackage {
+    name = "ep_embedmedia";
+    packageName = "ep_embedmedia";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_embedmedia/-/ep_embedmedia-0.0.4.tgz";
+      sha1 = "b24bf0fe9702d21aa73079890e93183efc6a0975";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Embed media (youtube, vimeo etc)";
+      homepage = https://github.com/JohnMcLear/ep_embedmedia;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json
new file mode 100644 (file)
index 0000000..a719a45
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_font_family" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix
new file mode 100644 (file)
index 0000000..9465a9f
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_font_family = nodeEnv.buildNodePackage {
+    name = "ep_font_family";
+    packageName = "ep_font_family";
+    version = "0.2.7";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_font_family/-/ep_font_family-0.2.7.tgz";
+      sha1 = "a31c06b1684c7fd65c1d5bf96bcf99b6faa79893";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for different Fonts";
+      homepage = https://github.com/JohnMcLear/ep_font_family;
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json
new file mode 100644 (file)
index 0000000..472df3b
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_font_size" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix
new file mode 100644 (file)
index 0000000..03061ad
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_font_size = nodeEnv.buildNodePackage {
+    name = "ep_font_size";
+    packageName = "ep_font_size";
+    version = "0.1.11";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_font_size/-/ep_font_size-0.1.11.tgz";
+      sha1 = "997c079bab97e04196c9db43b3bb238c804d8126";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for Font Sizes";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json
new file mode 100644 (file)
index 0000000..adbc268
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_headings2" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix
new file mode 100644 (file)
index 0000000..17af4c6
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_headings2 = nodeEnv.buildNodePackage {
+    name = "ep_headings2";
+    packageName = "ep_headings2";
+    version = "0.0.9";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_headings2/-/ep_headings2-0.0.9.tgz";
+      sha1 = "115f4162a2e49808a0cee50e04aff26c591db0d4";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds heading support to Etherpad Lite.  Includes improved suppot for export, i18n etc.";
+      homepage = https://github.com/johnmclear/ep_headings2;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json
new file mode 100644 (file)
index 0000000..cacc12a
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_ldapauth" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix
new file mode 100644 (file)
index 0000000..d294a8f
--- /dev/null
@@ -0,0 +1,388 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "asn1-0.2.3" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
+        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
+      };
+    };
+    "assert-plus-0.1.5" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz";
+        sha1 = "ee74009413002d84cec7219c6ac811812e723160";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "async-stacktrace-0.0.2" = {
+      name = "async-stacktrace";
+      packageName = "async-stacktrace";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.2.tgz";
+        sha1 = "8bbb9787e3b38c836c729a7e9d7c08630db5d1ef";
+      };
+    };
+    "backoff-2.5.0" = {
+      name = "backoff";
+      packageName = "backoff";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz";
+        sha1 = "f616eda9d3e4b66b8ca7fca79f695722c5f8e26f";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "brace-expansion-1.1.11" = {
+      name = "brace-expansion";
+      packageName = "brace-expansion";
+      version = "1.1.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
+      };
+    };
+    "bunyan-1.8.12" = {
+      name = "bunyan";
+      packageName = "bunyan";
+      version = "1.8.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz";
+        sha1 = "f150f0f6748abdd72aeae84f04403be2ef113797";
+      };
+    };
+    "concat-map-0.0.1" = {
+      name = "concat-map";
+      packageName = "concat-map";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "dtrace-provider-0.7.1" = {
+      name = "dtrace-provider";
+      packageName = "dtrace-provider";
+      version = "0.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.7.1.tgz";
+        sha1 = "c06b308f2f10d5d5838aec9c571e5d588dc71d04";
+      };
+    };
+    "dtrace-provider-0.8.7" = {
+      name = "dtrace-provider";
+      packageName = "dtrace-provider";
+      version = "0.8.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz";
+        sha1 = "dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04";
+      };
+    };
+    "extsprintf-1.2.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz";
+        sha1 = "5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529";
+      };
+    };
+    "glob-6.0.4" = {
+      name = "glob";
+      packageName = "glob";
+      version = "6.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz";
+        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
+      };
+    };
+    "inflight-1.0.6" = {
+      name = "inflight";
+      packageName = "inflight";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "ldap-filter-0.2.2" = {
+      name = "ldap-filter";
+      packageName = "ldap-filter";
+      version = "0.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz";
+        sha1 = "f2b842be0b86da3352798505b31ebcae590d77d0";
+      };
+    };
+    "ldapjs-1.0.1" = {
+      name = "ldapjs";
+      packageName = "ldapjs";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.1.tgz";
+        sha1 = "352b812ae74b0a8e96549a4b896060eee1b9a546";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-0.0.8" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "0.0.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    };
+    "mkdirp-0.5.1" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    };
+    "moment-2.24.0" = {
+      name = "moment";
+      packageName = "moment";
+      version = "2.24.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz";
+        sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
+      };
+    };
+    "mv-2.1.1" = {
+      name = "mv";
+      packageName = "mv";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz";
+        sha1 = "ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2";
+      };
+    };
+    "nan-2.13.2" = {
+      name = "nan";
+      packageName = "nan";
+      version = "2.13.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz";
+        sha512 = "TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==";
+      };
+    };
+    "ncp-2.0.0" = {
+      name = "ncp";
+      packageName = "ncp";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz";
+        sha1 = "195a21d6c46e361d2fb1281ba38b91e9df7bdbb3";
+      };
+    };
+    "once-1.4.0" = {
+      name = "once";
+      packageName = "once";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "path-is-absolute-1.0.1" = {
+      name = "path-is-absolute";
+      packageName = "path-is-absolute";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "precond-0.2.3" = {
+      name = "precond";
+      packageName = "precond";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz";
+        sha1 = "aa9591bcaa24923f1e0f4849d240f47efc1075ac";
+      };
+    };
+    "rimraf-2.4.5" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz";
+        sha1 = "ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da";
+      };
+    };
+    "safe-json-stringify-1.2.0" = {
+      name = "safe-json-stringify";
+      packageName = "safe-json-stringify";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz";
+        sha512 = "gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==";
+      };
+    };
+    "vasync-1.6.4" = {
+      name = "vasync";
+      packageName = "vasync";
+      version = "1.6.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz";
+        sha1 = "dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "verror-1.6.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz";
+        sha1 = "7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5";
+      };
+    };
+    "wrappy-1.0.2" = {
+      name = "wrappy";
+      packageName = "wrappy";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+  };
+in
+{
+  ep_ldapauth = nodeEnv.buildNodePackage {
+    name = "ep_ldapauth";
+    packageName = "ep_ldapauth";
+    version = "0.3.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_ldapauth/-/ep_ldapauth-0.3.0.tgz";
+      sha1 = "8b34ea34b20ae97d53d753cc7d1f6f191800e3b0";
+    };
+    dependencies = [
+      sources."asn1-0.2.3"
+      sources."assert-plus-1.0.0"
+      sources."async-stacktrace-0.0.2"
+      sources."backoff-2.5.0"
+      sources."balanced-match-1.0.0"
+      sources."brace-expansion-1.1.11"
+      (sources."bunyan-1.8.12" // {
+        dependencies = [
+          sources."dtrace-provider-0.8.7"
+        ];
+      })
+      sources."concat-map-0.0.1"
+      sources."core-util-is-1.0.2"
+      sources."dashdash-1.14.1"
+      sources."dtrace-provider-0.7.1"
+      sources."extsprintf-1.2.0"
+      sources."glob-6.0.4"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.3"
+      (sources."ldap-filter-0.2.2" // {
+        dependencies = [
+          sources."assert-plus-0.1.5"
+        ];
+      })
+      sources."ldapjs-1.0.1"
+      sources."minimatch-3.0.4"
+      sources."minimist-0.0.8"
+      sources."mkdirp-0.5.1"
+      sources."moment-2.24.0"
+      sources."mv-2.1.1"
+      sources."nan-2.13.2"
+      sources."ncp-2.0.0"
+      sources."once-1.4.0"
+      sources."path-is-absolute-1.0.1"
+      sources."precond-0.2.3"
+      sources."rimraf-2.4.5"
+      sources."safe-json-stringify-1.2.0"
+      (sources."vasync-1.6.4" // {
+        dependencies = [
+          sources."verror-1.6.0"
+        ];
+      })
+      sources."verror-1.10.0"
+      sources."wrappy-1.0.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Hooks into etherpad lite auth to provide LDAP authentication.";
+      homepage = "https://github.com/tykeal/ep_ldapauth#readme";
+      license = "GPL-2.0";
+    };
+    production = true;
+    bypassCache = true;
+  };
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json
new file mode 100644 (file)
index 0000000..307c2e7
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_line_height" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix
new file mode 100644 (file)
index 0000000..bfea115
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_line_height = nodeEnv.buildNodePackage {
+    name = "ep_line_height";
+    packageName = "ep_line_height";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_line_height/-/ep_line_height-0.0.4.tgz";
+      sha1 = "8afbb441e6d65db97d2335887f9352b10b5d22d2";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Change the line height";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json
new file mode 100644 (file)
index 0000000..1c5526c
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_markdown" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix
new file mode 100644 (file)
index 0000000..7b165d8
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_markdown = nodeEnv.buildNodePackage {
+    name = "ep_markdown";
+    packageName = "ep_markdown";
+    version = "0.0.10";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_markdown/-/ep_markdown-0.0.10.tgz";
+      sha1 = "d3f624f7bba64d350ff028ed2413ad3cd5eeb91e";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Edit and Export as Markdown in Etherpad";
+      homepage = https://github.com/johnmclear/ep_markdown;
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json
new file mode 100644 (file)
index 0000000..cc14ec4
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_previewimages" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix
new file mode 100644 (file)
index 0000000..4790d43
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_previewimages = nodeEnv.buildNodePackage {
+    name = "ep_previewimages";
+    packageName = "ep_previewimages";
+    version = "0.0.9";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_previewimages/-/ep_previewimages-0.0.9.tgz";
+      sha1 = "417d96249c50f8a59a1ef6c640e4ac98c26a106b";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Image previewer, paste the URL of an image or upload an image using ep_fileupload";
+      homepage = https://github.com/JohnMcLear/ep_previewimages;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json
new file mode 100644 (file)
index 0000000..d31b236
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_ruler" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix
new file mode 100644 (file)
index 0000000..c8697d4
--- /dev/null
@@ -0,0 +1,27 @@
+{stdenv, nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_ruler = nodeEnv.buildNodePackage {
+    name = "ep_ruler";
+    packageName = "ep_ruler";
+    version = "0.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_ruler/-/ep_ruler-0.0.2.tgz";
+      sha1 = "5af10dfe0b5f33459566ce649cc483c680ed7811";
+    };
+    preRebuild = ''
+      sed -i -e 's/"dependencies"/"peerDependencies"/' package.json
+      '';
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds a ruler to Etherpad lite";
+      homepage = https://github.com/iquidus/ep_ruler;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
+
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json
new file mode 100644 (file)
index 0000000..6d068d0
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_scrollto" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix
new file mode 100644 (file)
index 0000000..ba50b56
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_scrollto = nodeEnv.buildNodePackage {
+    name = "ep_scrollto";
+    packageName = "ep_scrollto";
+    version = "0.0.6";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_scrollto/-/ep_scrollto-0.0.6.tgz";
+      sha1 = "6b57e2243cb8477e1437c348a94cb6bcc162f91d";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Scroll to a specific line number based on a parameter of lineNumber in the URL IE http://test.com/p/foo#lineNumber=10 -- Users can click on the line number to get a link";
+      homepage = https://github.com/johnmclear/ep_scrollto;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json
new file mode 100644 (file)
index 0000000..8755cd2
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_set_title_on_pad" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix
new file mode 100644 (file)
index 0000000..b03b555
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_set_title_on_pad = nodeEnv.buildNodePackage {
+    name = "ep_set_title_on_pad";
+    packageName = "ep_set_title_on_pad";
+    version = "0.1.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_set_title_on_pad/-/ep_set_title_on_pad-0.1.4.tgz";
+      sha1 = "b89b354242509c0cc825b7532de505a883bab2b3";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Set the title on a pad in Etherpad, also includes real time updates to the UI";
+      homepage = https://github.com/JohnMcLear/ep_set_title_on_pad;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json
new file mode 100644 (file)
index 0000000..aa1cf21
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_subscript_and_superscript" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix
new file mode 100644 (file)
index 0000000..89664e5
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_subscript_and_superscript = nodeEnv.buildNodePackage {
+    name = "ep_subscript_and_superscript";
+    packageName = "ep_subscript_and_superscript";
+    version = "0.0.3";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_subscript_and_superscript/-/ep_subscript_and_superscript-0.0.3.tgz";
+      sha1 = "47f74a242fe8be5911391943f718eab81c390620";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for Subscript and Superscript";
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json
new file mode 100644 (file)
index 0000000..d50e856
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_timesliderdiff" ]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix
new file mode 100644 (file)
index 0000000..b40c971
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_timesliderdiff = nodeEnv.buildNodePackage {
+    name = "ep_timesliderdiff";
+    packageName = "ep_timesliderdiff";
+    version = "0.0.5";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_timesliderdiff/-/ep_timesliderdiff-0.0.5.tgz";
+      sha1 = "f8e0543677f7ac643936a2afce9f370d08a43310";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "See a diff view showing the changes between the latest pad and a revision";
+      homepage = https://github.com/JohnMcLear/ep_timesliderdiff;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/node-packages.nix b/pkgs/webapps/etherpad-lite/node-packages.nix
new file mode 100644 (file)
index 0000000..25f2d2d
--- /dev/null
@@ -0,0 +1,3288 @@
+# This file has been generated by node2nix 1.6.0. Do not edit!
+
+{src, nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "abab-1.0.4" = {
+      name = "abab";
+      packageName = "abab";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz";
+        sha1 = "5faad9c2c07f60dd76770f71cf025b62a63cfd4e";
+      };
+    };
+    "accepts-1.3.3" = {
+      name = "accepts";
+      packageName = "accepts";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz";
+        sha1 = "c3ca7434938648c3e0d9c1e328dd68b622c284ca";
+      };
+    };
+    "accepts-1.3.7" = {
+      name = "accepts";
+      packageName = "accepts";
+      version = "1.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz";
+        sha512 = "Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==";
+      };
+    };
+    "acorn-2.7.0" = {
+      name = "acorn";
+      packageName = "acorn";
+      version = "2.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz";
+        sha1 = "ab6e7d9d886aaca8b085bc3312b79a198433f0e7";
+      };
+    };
+    "acorn-globals-1.0.9" = {
+      name = "acorn-globals";
+      packageName = "acorn-globals";
+      version = "1.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz";
+        sha1 = "55bb5e98691507b74579d0513413217c380c54cf";
+      };
+    };
+    "after-0.8.2" = {
+      name = "after";
+      packageName = "after";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    };
+    "agentkeepalive-3.5.2" = {
+      name = "agentkeepalive";
+      packageName = "agentkeepalive";
+      version = "3.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz";
+        sha512 = "e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==";
+      };
+    };
+    "ajv-5.5.2" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "5.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz";
+        sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965";
+      };
+    };
+    "ajv-6.10.0" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "6.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz";
+        sha512 = "nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==";
+      };
+    };
+    "align-text-0.1.4" = {
+      name = "align-text";
+      packageName = "align-text";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz";
+        sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
+      };
+    };
+    "amdefine-1.0.1" = {
+      name = "amdefine";
+      packageName = "amdefine";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz";
+        sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "ansi-styles-2.2.1" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    };
+    "array-flatten-1.1.1" = {
+      name = "array-flatten";
+      packageName = "array-flatten";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    };
+    "arraybuffer.slice-0.0.6" = {
+      name = "arraybuffer.slice";
+      packageName = "arraybuffer.slice";
+      version = "0.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz";
+        sha1 = "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca";
+      };
+    };
+    "asn1-0.2.4" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
+        sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "async-0.1.15" = {
+      name = "async";
+      packageName = "async";
+      version = "0.1.15";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.1.15.tgz";
+        sha1 = "2180eaca2cf2a6ca5280d41c0585bec9b3e49bd3";
+      };
+    };
+    "async-0.2.10" = {
+      name = "async";
+      packageName = "async";
+      version = "0.2.10";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.2.10.tgz";
+        sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
+      };
+    };
+    "async-0.9.0" = {
+      name = "async";
+      packageName = "async";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.9.0.tgz";
+        sha1 = "ac3613b1da9bed1b47510bb4651b8931e47146c7";
+      };
+    };
+    "async-stacktrace-0.0.2" = {
+      name = "async-stacktrace";
+      packageName = "async-stacktrace";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.2.tgz";
+        sha1 = "8bbb9787e3b38c836c729a7e9d7c08630db5d1ef";
+      };
+    };
+    "asynckit-0.4.0" = {
+      name = "asynckit";
+      packageName = "asynckit";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    };
+    "aws-sign2-0.7.0" = {
+      name = "aws-sign2";
+      packageName = "aws-sign2";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    };
+    "aws4-1.8.0" = {
+      name = "aws4";
+      packageName = "aws4";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
+        sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
+      };
+    };
+    "backo2-1.0.2" = {
+      name = "backo2";
+      packageName = "backo2";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    };
+    "base64-arraybuffer-0.1.5" = {
+      name = "base64-arraybuffer";
+      packageName = "base64-arraybuffer";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    };
+    "base64id-1.0.0" = {
+      name = "base64id";
+      packageName = "base64id";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz";
+        sha1 = "47688cb99bb6804f0e06d3e763b1c32e57d8e6b6";
+      };
+    };
+    "bcrypt-pbkdf-1.0.2" = {
+      name = "bcrypt-pbkdf";
+      packageName = "bcrypt-pbkdf";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    };
+    "better-assert-1.0.2" = {
+      name = "better-assert";
+      packageName = "better-assert";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    };
+    "bignumber.js-4.0.4" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "4.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz";
+        sha512 = "LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==";
+      };
+    };
+    "binary-search-1.3.5" = {
+      name = "binary-search";
+      packageName = "binary-search";
+      version = "1.3.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/binary-search/-/binary-search-1.3.5.tgz";
+        sha512 = "RHFP0AdU6KAB0CCZsRMU2CJTk2EpL8GLURT+4gilpjr1f/7M91FgUMnXuQLmf3OKLet34gjuNFwO7e4agdX5pw==";
+      };
+    };
+    "blob-0.0.4" = {
+      name = "blob";
+      packageName = "blob";
+      version = "0.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz";
+        sha1 = "bcf13052ca54463f30f9fc7e95b9a47630a94921";
+      };
+    };
+    "bluebird-2.11.0" = {
+      name = "bluebird";
+      packageName = "bluebird";
+      version = "2.11.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz";
+        sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
+      };
+    };
+    "body-parser-1.18.2" = {
+      name = "body-parser";
+      packageName = "body-parser";
+      version = "1.18.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz";
+        sha1 = "87678a19d84b47d859b83199bd59bce222b10454";
+      };
+    };
+    "boolbase-1.0.0" = {
+      name = "boolbase";
+      packageName = "boolbase";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
+        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+      };
+    };
+    "boom-4.3.1" = {
+      name = "boom";
+      packageName = "boom";
+      version = "4.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz";
+        sha1 = "4f8a3005cb4a7e3889f749030fd25b96e01d2e31";
+      };
+    };
+    "boom-5.2.0" = {
+      name = "boom";
+      packageName = "boom";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz";
+        sha512 = "Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==";
+      };
+    };
+    "browser-request-0.3.3" = {
+      name = "browser-request";
+      packageName = "browser-request";
+      version = "0.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz";
+        sha1 = "9ece5b5aca89a29932242e18bf933def9876cc17";
+      };
+    };
+    "buffer-writer-1.0.1" = {
+      name = "buffer-writer";
+      packageName = "buffer-writer";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz";
+        sha1 = "22a936901e3029afcd7547eb4487ceb697a3bf08";
+      };
+    };
+    "bytes-3.0.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
+      };
+    };
+    "callsite-1.0.0" = {
+      name = "callsite";
+      packageName = "callsite";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    };
+    "camelcase-1.2.1" = {
+      name = "camelcase";
+      packageName = "camelcase";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz";
+        sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
+      };
+    };
+    "caseless-0.12.0" = {
+      name = "caseless";
+      packageName = "caseless";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    };
+    "cassandra-driver-2.0.1" = {
+      name = "cassandra-driver";
+      packageName = "cassandra-driver";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-2.0.1.tgz";
+        sha1 = "072759ab837628dcbcb5bc678283dcc922c767e2";
+      };
+    };
+    "center-align-0.1.3" = {
+      name = "center-align";
+      packageName = "center-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz";
+        sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
+      };
+    };
+    "chalk-1.1.3" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    };
+    "channels-0.0.4" = {
+      name = "channels";
+      packageName = "channels";
+      version = "0.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/channels/-/channels-0.0.4.tgz";
+        sha1 = "1bee323edea152bb9ef04f41bc6e6b0f5948a941";
+      };
+    };
+    "cheerio-0.20.0" = {
+      name = "cheerio";
+      packageName = "cheerio";
+      version = "0.20.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz";
+        sha1 = "5c710f2bab95653272842ba01c6ea61b3545ec35";
+      };
+    };
+    "clean-css-3.4.19" = {
+      name = "clean-css";
+      packageName = "clean-css";
+      version = "3.4.19";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/clean-css/-/clean-css-3.4.19.tgz";
+        sha1 = "c32a8a13ca3b824609b14306a5da76d8793c7874";
+      };
+    };
+    "cliui-2.1.0" = {
+      name = "cliui";
+      packageName = "cliui";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz";
+        sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
+      };
+    };
+    "cloudant-follow-0.17.0" = {
+      name = "cloudant-follow";
+      packageName = "cloudant-follow";
+      version = "0.17.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cloudant-follow/-/cloudant-follow-0.17.0.tgz";
+        sha512 = "JQ1xvKAHh8rsnSVBjATLCjz/vQw1sWBGadxr2H69yFMwD7hShUGDwwEefdypaxroUJ/w6t1cSwilp/hRUxEW8w==";
+      };
+    };
+    "co-4.6.0" = {
+      name = "co";
+      packageName = "co";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    };
+    "combined-stream-1.0.7" = {
+      name = "combined-stream";
+      packageName = "combined-stream";
+      version = "1.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";
+        sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==";
+      };
+    };
+    "commander-2.8.1" = {
+      name = "commander";
+      packageName = "commander";
+      version = "2.8.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz";
+        sha1 = "06be367febfda0c330aa1e2a072d3dc9762425d4";
+      };
+    };
+    "component-bind-1.0.0" = {
+      name = "component-bind";
+      packageName = "component-bind";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    };
+    "component-emitter-1.1.2" = {
+      name = "component-emitter";
+      packageName = "component-emitter";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz";
+        sha1 = "296594f2753daa63996d2af08d15a95116c9aec3";
+      };
+    };
+    "component-emitter-1.2.1" = {
+      name = "component-emitter";
+      packageName = "component-emitter";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    };
+    "component-inherit-0.0.3" = {
+      name = "component-inherit";
+      packageName = "component-inherit";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    };
+    "content-disposition-0.5.2" = {
+      name = "content-disposition";
+      packageName = "content-disposition";
+      version = "0.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz";
+        sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
+      };
+    };
+    "content-type-1.0.4" = {
+      name = "content-type";
+      packageName = "content-type";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz";
+        sha512 = "hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==";
+      };
+    };
+    "cookie-0.1.2" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz";
+        sha1 = "72fec3d24e48a3432073d90c12642005061004b1";
+      };
+    };
+    "cookie-0.3.1" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    };
+    "cookie-parser-1.3.4" = {
+      name = "cookie-parser";
+      packageName = "cookie-parser";
+      version = "1.3.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.4.tgz";
+        sha1 = "193035a5be97117a21709b3aa737f6132717bda6";
+      };
+    };
+    "cookie-signature-1.0.6" = {
+      name = "cookie-signature";
+      packageName = "cookie-signature";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "crc-3.4.4" = {
+      name = "crc";
+      packageName = "crc";
+      version = "3.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz";
+        sha1 = "9da1e980e3bd44fc5c93bf5ab3da3378d85e466b";
+      };
+    };
+    "cryptiles-3.1.4" = {
+      name = "cryptiles";
+      packageName = "cryptiles";
+      version = "3.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz";
+        sha512 = "8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw==";
+      };
+    };
+    "css-select-1.2.0" = {
+      name = "css-select";
+      packageName = "css-select";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz";
+        sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
+      };
+    };
+    "css-what-2.1.3" = {
+      name = "css-what";
+      packageName = "css-what";
+      version = "2.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz";
+        sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==";
+      };
+    };
+    "cssom-0.3.6" = {
+      name = "cssom";
+      packageName = "cssom";
+      version = "0.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz";
+        sha512 = "DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==";
+      };
+    };
+    "cssstyle-0.2.37" = {
+      name = "cssstyle";
+      packageName = "cssstyle";
+      version = "0.2.37";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz";
+        sha1 = "541097234cb2513c83ceed3acddc27ff27987d54";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "debug-2.2.0" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz";
+        sha1 = "f87057e995b1a1f6ae6a4960664137bc56f039da";
+      };
+    };
+    "debug-2.3.3" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz";
+        sha1 = "40c453e67e6e13c901ddec317af8986cda9eff8c";
+      };
+    };
+    "debug-2.6.9" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.6.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
+        sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
+      };
+    };
+    "debug-3.2.6" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.2.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz";
+        sha512 = "mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==";
+      };
+    };
+    "decamelize-1.2.0" = {
+      name = "decamelize";
+      packageName = "decamelize";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    };
+    "deep-is-0.1.3" = {
+      name = "deep-is";
+      packageName = "deep-is";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    };
+    "define-properties-1.1.3" = {
+      name = "define-properties";
+      packageName = "define-properties";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
+        sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
+      };
+    };
+    "delayed-stream-1.0.0" = {
+      name = "delayed-stream";
+      packageName = "delayed-stream";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    };
+    "depd-1.1.1" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz";
+        sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359";
+      };
+    };
+    "depd-1.1.2" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    };
+    "destroy-1.0.4" = {
+      name = "destroy";
+      packageName = "destroy";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    };
+    "dirty-0.9.9" = {
+      name = "dirty";
+      packageName = "dirty";
+      version = "0.9.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dirty/-/dirty-0.9.9.tgz";
+        sha1 = "f785804c4cf7907220cb10fa576b22329feda545";
+      };
+    };
+    "dom-serializer-0.1.1" = {
+      name = "dom-serializer";
+      packageName = "dom-serializer";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz";
+        sha512 = "l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==";
+      };
+    };
+    "domelementtype-1.3.1" = {
+      name = "domelementtype";
+      packageName = "domelementtype";
+      version = "1.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz";
+        sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==";
+      };
+    };
+    "domhandler-2.3.0" = {
+      name = "domhandler";
+      packageName = "domhandler";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz";
+        sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
+      };
+    };
+    "domutils-1.5.1" = {
+      name = "domutils";
+      packageName = "domutils";
+      version = "1.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz";
+        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
+      };
+    };
+    "double-ended-queue-2.1.0-0" = {
+      name = "double-ended-queue";
+      packageName = "double-ended-queue";
+      version = "2.1.0-0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz";
+        sha1 = "103d3527fd31528f40188130c841efdd78264e5c";
+      };
+    };
+    "ecc-jsbn-0.1.2" = {
+      name = "ecc-jsbn";
+      packageName = "ecc-jsbn";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    };
+    "ee-first-1.1.1" = {
+      name = "ee-first";
+      packageName = "ee-first";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    };
+    "ejs-2.5.7" = {
+      name = "ejs";
+      packageName = "ejs";
+      version = "2.5.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz";
+        sha1 = "cc872c168880ae3c7189762fd5ffc00896c9518a";
+      };
+    };
+    "elasticsearch-15.1.1" = {
+      name = "elasticsearch";
+      packageName = "elasticsearch";
+      version = "15.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/elasticsearch/-/elasticsearch-15.1.1.tgz";
+        sha512 = "Yr9xy10rUMjDty7qCys7X9AIW5+PX4Gtv2NksZqXIc+AZiWna/y2QwZdiSLtb5LTOKDp7PbegfuokhIjMHUpKw==";
+      };
+    };
+    "encodeurl-1.0.2" = {
+      name = "encodeurl";
+      packageName = "encodeurl";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    };
+    "engine.io-1.8.3" = {
+      name = "engine.io";
+      packageName = "engine.io";
+      version = "1.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz";
+        sha1 = "8de7f97895d20d39b85f88eeee777b2bd42b13d4";
+      };
+    };
+    "engine.io-client-1.8.3" = {
+      name = "engine.io-client";
+      packageName = "engine.io-client";
+      version = "1.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz";
+        sha1 = "1798ed93451246453d4c6f635d7a201fe940d5ab";
+      };
+    };
+    "engine.io-parser-1.3.2" = {
+      name = "engine.io-parser";
+      packageName = "engine.io-parser";
+      version = "1.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz";
+        sha1 = "937b079f0007d0893ec56d46cb220b8cb435220a";
+      };
+    };
+    "entities-1.0.0" = {
+      name = "entities";
+      packageName = "entities";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz";
+        sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
+      };
+    };
+    "entities-1.1.2" = {
+      name = "entities";
+      packageName = "entities";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
+        sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
+      };
+    };
+    "errs-0.3.2" = {
+      name = "errs";
+      packageName = "errs";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz";
+        sha1 = "798099b2dbd37ca2bc749e538a7c1307d0b50499";
+      };
+    };
+    "es-abstract-1.13.0" = {
+      name = "es-abstract";
+      packageName = "es-abstract";
+      version = "1.13.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz";
+        sha512 = "vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==";
+      };
+    };
+    "es-to-primitive-1.2.0" = {
+      name = "es-to-primitive";
+      packageName = "es-to-primitive";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
+        sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==";
+      };
+    };
+    "escape-html-1.0.3" = {
+      name = "escape-html";
+      packageName = "escape-html";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    };
+    "escape-string-regexp-1.0.5" = {
+      name = "escape-string-regexp";
+      packageName = "escape-string-regexp";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    };
+    "escodegen-1.11.1" = {
+      name = "escodegen";
+      packageName = "escodegen";
+      version = "1.11.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz";
+        sha512 = "JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==";
+      };
+    };
+    "esprima-3.1.3" = {
+      name = "esprima";
+      packageName = "esprima";
+      version = "3.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
+        sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
+      };
+    };
+    "estraverse-4.2.0" = {
+      name = "estraverse";
+      packageName = "estraverse";
+      version = "4.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz";
+        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
+      };
+    };
+    "esutils-2.0.2" = {
+      name = "esutils";
+      packageName = "esutils";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    };
+    "etag-1.8.1" = {
+      name = "etag";
+      packageName = "etag";
+      version = "1.8.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    };
+    "etherpad-require-kernel-1.0.9" = {
+      name = "etherpad-require-kernel";
+      packageName = "etherpad-require-kernel";
+      version = "1.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-require-kernel/-/etherpad-require-kernel-1.0.9.tgz";
+        sha1 = "ed8f04e9fd2ccec3a0055bb6d2dfe9d99912e7e2";
+      };
+    };
+    "etherpad-yajsml-0.0.2" = {
+      name = "etherpad-yajsml";
+      packageName = "etherpad-yajsml";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-yajsml/-/etherpad-yajsml-0.0.2.tgz";
+        sha1 = "1c24d268b09476e637d049cddb1c6df8c729b46e";
+      };
+    };
+    "express-4.16.3" = {
+      name = "express";
+      packageName = "express";
+      version = "4.16.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express/-/express-4.16.3.tgz";
+        sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53";
+      };
+    };
+    "express-session-1.15.6" = {
+      name = "express-session";
+      packageName = "express-session";
+      version = "1.15.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz";
+        sha512 = "r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==";
+      };
+    };
+    "extend-3.0.2" = {
+      name = "extend";
+      packageName = "extend";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
+        sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
+      };
+    };
+    "extsprintf-1.3.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    };
+    "fast-deep-equal-1.1.0" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz";
+        sha1 = "c053477817c86b51daa853c81e059b733d023614";
+      };
+    };
+    "fast-deep-equal-2.0.1" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
+        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
+      };
+    };
+    "fast-json-stable-stringify-2.0.0" = {
+      name = "fast-json-stable-stringify";
+      packageName = "fast-json-stable-stringify";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
+        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
+      };
+    };
+    "fast-levenshtein-2.0.6" = {
+      name = "fast-levenshtein";
+      packageName = "fast-levenshtein";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    };
+    "finalhandler-1.1.1" = {
+      name = "finalhandler";
+      packageName = "finalhandler";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz";
+        sha512 = "Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==";
+      };
+    };
+    "forever-agent-0.6.1" = {
+      name = "forever-agent";
+      packageName = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    };
+    "form-data-2.3.3" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
+        sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
+      };
+    };
+    "formidable-1.2.1" = {
+      name = "formidable";
+      packageName = "formidable";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz";
+        sha512 = "Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==";
+      };
+    };
+    "forwarded-0.1.2" = {
+      name = "forwarded";
+      packageName = "forwarded";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    };
+    "fresh-0.5.2" = {
+      name = "fresh";
+      packageName = "fresh";
+      version = "0.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    };
+    "function-bind-1.1.1" = {
+      name = "function-bind";
+      packageName = "function-bind";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
+        sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
+      };
+    };
+    "generic-pool-2.4.3" = {
+      name = "generic-pool";
+      packageName = "generic-pool";
+      version = "2.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.3.tgz";
+        sha1 = "780c36f69dfad05a5a045dd37be7adca11a4f6ff";
+      };
+    };
+    "getpass-0.1.7" = {
+      name = "getpass";
+      packageName = "getpass";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    };
+    "graceful-fs-4.1.3" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz";
+        sha1 = "92033ce11113c41e2628d61fdfa40bc10dc0155c";
+      };
+    };
+    "graceful-readlink-1.0.1" = {
+      name = "graceful-readlink";
+      packageName = "graceful-readlink";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz";
+        sha1 = "4cafad76bc62f02fa039b2f94e9a3dd3a391a725";
+      };
+    };
+    "har-schema-2.0.0" = {
+      name = "har-schema";
+      packageName = "har-schema";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    };
+    "har-validator-5.0.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz";
+        sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd";
+      };
+    };
+    "har-validator-5.1.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
+        sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
+      };
+    };
+    "has-1.0.3" = {
+      name = "has";
+      packageName = "has";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
+        sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
+      };
+    };
+    "has-ansi-2.0.0" = {
+      name = "has-ansi";
+      packageName = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    };
+    "has-binary-0.1.7" = {
+      name = "has-binary";
+      packageName = "has-binary";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz";
+        sha1 = "68e61eb16210c9545a0a5cce06a873912fe1e68c";
+      };
+    };
+    "has-cors-1.1.0" = {
+      name = "has-cors";
+      packageName = "has-cors";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    };
+    "has-symbols-1.0.0" = {
+      name = "has-symbols";
+      packageName = "has-symbols";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";
+        sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
+      };
+    };
+    "hawk-6.0.2" = {
+      name = "hawk";
+      packageName = "hawk";
+      version = "6.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz";
+        sha512 = "miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==";
+      };
+    };
+    "hoek-4.2.1" = {
+      name = "hoek";
+      packageName = "hoek";
+      version = "4.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz";
+        sha512 = "QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==";
+      };
+    };
+    "htmlparser2-3.8.3" = {
+      name = "htmlparser2";
+      packageName = "htmlparser2";
+      version = "3.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz";
+        sha1 = "996c28b191516a8be86501a7d79757e5c70c1068";
+      };
+    };
+    "http-errors-1.6.2" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz";
+        sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736";
+      };
+    };
+    "http-errors-1.6.3" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.6.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz";
+        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
+      };
+    };
+    "http-signature-1.2.0" = {
+      name = "http-signature";
+      packageName = "http-signature";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    };
+    "humanize-ms-1.2.1" = {
+      name = "humanize-ms";
+      packageName = "humanize-ms";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz";
+        sha1 = "c46e3159a293f6b896da29316d8b6fe8bb79bbed";
+      };
+    };
+    "iconv-lite-0.4.19" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.4.19";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz";
+        sha512 = "oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==";
+      };
+    };
+    "indexof-0.0.1" = {
+      name = "indexof";
+      packageName = "indexof";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "ipaddr.js-1.9.0" = {
+      name = "ipaddr.js";
+      packageName = "ipaddr.js";
+      version = "1.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz";
+        sha512 = "M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==";
+      };
+    };
+    "is-buffer-1.1.6" = {
+      name = "is-buffer";
+      packageName = "is-buffer";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
+      };
+    };
+    "is-callable-1.1.4" = {
+      name = "is-callable";
+      packageName = "is-callable";
+      version = "1.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz";
+        sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==";
+      };
+    };
+    "is-date-object-1.0.1" = {
+      name = "is-date-object";
+      packageName = "is-date-object";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz";
+        sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
+      };
+    };
+    "is-regex-1.0.4" = {
+      name = "is-regex";
+      packageName = "is-regex";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";
+        sha1 = "5517489b547091b0930e095654ced25ee97e9491";
+      };
+    };
+    "is-symbol-1.0.2" = {
+      name = "is-symbol";
+      packageName = "is-symbol";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz";
+        sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==";
+      };
+    };
+    "is-typedarray-1.0.0" = {
+      name = "is-typedarray";
+      packageName = "is-typedarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    };
+    "isarray-0.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    };
+    "isstream-0.1.2" = {
+      name = "isstream";
+      packageName = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    };
+    "js-string-escape-1.0.1" = {
+      name = "js-string-escape";
+      packageName = "js-string-escape";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz";
+        sha1 = "e2625badbc0d67c7533e9edc1068c587ae4137ef";
+      };
+    };
+    "jsbn-0.1.1" = {
+      name = "jsbn";
+      packageName = "jsbn";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    };
+    "jsdom-7.2.2" = {
+      name = "jsdom";
+      packageName = "jsdom";
+      version = "7.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz";
+        sha1 = "40b402770c2bda23469096bee91ab675e3b1fc6e";
+      };
+    };
+    "json-schema-0.2.3" = {
+      name = "json-schema";
+      packageName = "json-schema";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    };
+    "json-schema-traverse-0.3.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz";
+        sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340";
+      };
+    };
+    "json-schema-traverse-0.4.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
+      };
+    };
+    "json-stringify-safe-5.0.1" = {
+      name = "json-stringify-safe";
+      packageName = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    };
+    "json3-3.3.2" = {
+      name = "json3";
+      packageName = "json3";
+      version = "3.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz";
+        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+      };
+    };
+    "jsonminify-0.4.1" = {
+      name = "jsonminify";
+      packageName = "jsonminify";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonminify/-/jsonminify-0.4.1.tgz";
+        sha1 = "805dafbb39395188cee9ab582c81ef959d7e710c";
+      };
+    };
+    "jsprim-1.4.1" = {
+      name = "jsprim";
+      packageName = "jsprim";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    };
+    "kind-of-3.2.2" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "3.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    };
+    "languages4translatewiki-0.1.3" = {
+      name = "languages4translatewiki";
+      packageName = "languages4translatewiki";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/languages4translatewiki/-/languages4translatewiki-0.1.3.tgz";
+        sha1 = "c436206e052d21490b11017a44d5118f9221e5db";
+      };
+    };
+    "lazy-cache-1.0.4" = {
+      name = "lazy-cache";
+      packageName = "lazy-cache";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";
+        sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
+      };
+    };
+    "levn-0.3.0" = {
+      name = "levn";
+      packageName = "levn";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    };
+    "lodash-1.3.1" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "1.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz";
+        sha1 = "a4663b53686b895ff074e2ba504dfb76a8e2b770";
+      };
+    };
+    "lodash-4.17.11" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "4.17.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz";
+        sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==";
+      };
+    };
+    "lodash.isempty-4.4.0" = {
+      name = "lodash.isempty";
+      packageName = "lodash.isempty";
+      version = "4.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz";
+        sha1 = "6f86cbedd8be4ec987be9aaf33c9684db1b31e7e";
+      };
+    };
+    "log4js-0.6.35" = {
+      name = "log4js";
+      packageName = "log4js";
+      version = "0.6.35";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/log4js/-/log4js-0.6.35.tgz";
+        sha1 = "3ab1da7cb14823b74ed3865c48593acdf11f1b59";
+      };
+    };
+    "long-2.4.0" = {
+      name = "long";
+      packageName = "long";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/long/-/long-2.4.0.tgz";
+        sha1 = "9fa180bb1d9500cdc29c4156766a1995e1f4524f";
+      };
+    };
+    "longest-1.0.1" = {
+      name = "longest";
+      packageName = "longest";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz";
+        sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
+      };
+    };
+    "measured-core-1.11.2" = {
+      name = "measured-core";
+      packageName = "measured-core";
+      version = "1.11.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/measured-core/-/measured-core-1.11.2.tgz";
+        sha1 = "9dbea6d20741b56f61abd866e496eb8b85e69349";
+      };
+    };
+    "media-typer-0.3.0" = {
+      name = "media-typer";
+      packageName = "media-typer";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    };
+    "merge-descriptors-1.0.1" = {
+      name = "merge-descriptors";
+      packageName = "merge-descriptors";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    };
+    "methods-1.1.2" = {
+      name = "methods";
+      packageName = "methods";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    };
+    "mime-1.4.1" = {
+      name = "mime";
+      packageName = "mime";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz";
+        sha512 = "KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==";
+      };
+    };
+    "mime-db-1.40.0" = {
+      name = "mime-db";
+      packageName = "mime-db";
+      version = "1.40.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz";
+        sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==";
+      };
+    };
+    "mime-types-2.1.24" = {
+      name = "mime-types";
+      packageName = "mime-types";
+      version = "2.1.24";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz";
+        sha512 = "WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==";
+      };
+    };
+    "ms-0.7.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "0.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz";
+        sha1 = "9cd13c03adbff25b65effde7ce864ee952017098";
+      };
+    };
+    "ms-0.7.2" = {
+      name = "ms";
+      packageName = "ms";
+      version = "0.7.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz";
+        sha1 = "ae25cf2512b3885a1d95d7f037868d8431124765";
+      };
+    };
+    "ms-2.0.0" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "ms-2.1.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
+        sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
+      };
+    };
+    "mysql-2.15.0" = {
+      name = "mysql";
+      packageName = "mysql";
+      version = "2.15.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mysql/-/mysql-2.15.0.tgz";
+        sha512 = "C7tjzWtbN5nzkLIV+E8Crnl9bFyc7d3XJcBAvHKEVkjrYjogz3llo22q6s/hw+UcsE4/844pDob9ac+3dVjQSA==";
+      };
+    };
+    "nano-6.4.4" = {
+      name = "nano";
+      packageName = "nano";
+      version = "6.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nano/-/nano-6.4.4.tgz";
+        sha512 = "7sldMrZI1ZH8QE29PnzohxLfR67WNVzMKLa7EMl3x9Hr+0G+YpOUCq50qZ9G66APrjcb0Of2BTOZLNBCutZGag==";
+      };
+    };
+    "negotiator-0.6.1" = {
+      name = "negotiator";
+      packageName = "negotiator";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz";
+        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
+      };
+    };
+    "negotiator-0.6.2" = {
+      name = "negotiator";
+      packageName = "negotiator";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz";
+        sha512 = "hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==";
+      };
+    };
+    "npm-6.4.0" = {
+      name = "npm";
+      packageName = "npm";
+      version = "6.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npm/-/npm-6.4.0.tgz";
+        sha512 = "k0VteQaxRuI1mREBxCtLUksesD2ZmX5gxjXNEjTmTrxQ3SHW22InkCKyX4NzoeGAYtgmDg5MuE7rcXYod7xgug==";
+      };
+    };
+    "nth-check-1.0.2" = {
+      name = "nth-check";
+      packageName = "nth-check";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
+        sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
+      };
+    };
+    "nwmatcher-1.4.4" = {
+      name = "nwmatcher";
+      packageName = "nwmatcher";
+      version = "1.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz";
+        sha512 = "3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==";
+      };
+    };
+    "oauth-sign-0.8.2" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz";
+        sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
+      };
+    };
+    "oauth-sign-0.9.0" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
+      };
+    };
+    "object-assign-4.1.0" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz";
+        sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
+      };
+    };
+    "object-component-0.0.3" = {
+      name = "object-component";
+      packageName = "object-component";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    };
+    "object-keys-1.1.1" = {
+      name = "object-keys";
+      packageName = "object-keys";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz";
+        sha512 = "NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==";
+      };
+    };
+    "object.values-1.1.0" = {
+      name = "object.values";
+      packageName = "object.values";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz";
+        sha512 = "8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==";
+      };
+    };
+    "on-finished-2.3.0" = {
+      name = "on-finished";
+      packageName = "on-finished";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    };
+    "on-headers-1.0.2" = {
+      name = "on-headers";
+      packageName = "on-headers";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz";
+        sha512 = "pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==";
+      };
+    };
+    "optional-js-2.1.1" = {
+      name = "optional-js";
+      packageName = "optional-js";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optional-js/-/optional-js-2.1.1.tgz";
+        sha512 = "mUS4bDngcD5kKzzRUd1HVQkr9Lzzby3fSrrPR9wOHhQiyYo+hDS5NVli5YQzGjQRQ15k5Sno4xH9pfykJdeEUA==";
+      };
+    };
+    "optionator-0.8.2" = {
+      name = "optionator";
+      packageName = "optionator";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
+        sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
+      };
+    };
+    "options-0.0.6" = {
+      name = "options";
+      packageName = "options";
+      version = "0.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/options/-/options-0.0.6.tgz";
+        sha1 = "ec22d312806bb53e731773e7cdaefcf1c643128f";
+      };
+    };
+    "packet-reader-0.2.0" = {
+      name = "packet-reader";
+      packageName = "packet-reader";
+      version = "0.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/packet-reader/-/packet-reader-0.2.0.tgz";
+        sha1 = "819df4d010b82d5ea5671f8a1a3acf039bcd7700";
+      };
+    };
+    "parse5-1.5.1" = {
+      name = "parse5";
+      packageName = "parse5";
+      version = "1.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
+        sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
+      };
+    };
+    "parsejson-0.0.3" = {
+      name = "parsejson";
+      packageName = "parsejson";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz";
+        sha1 = "ab7e3759f209ece99437973f7d0f1f64ae0e64ab";
+      };
+    };
+    "parseqs-0.0.5" = {
+      name = "parseqs";
+      packageName = "parseqs";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    };
+    "parseuri-0.0.5" = {
+      name = "parseuri";
+      packageName = "parseuri";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    };
+    "parseurl-1.3.3" = {
+      name = "parseurl";
+      packageName = "parseurl";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz";
+        sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==";
+      };
+    };
+    "path-to-regexp-0.1.7" = {
+      name = "path-to-regexp";
+      packageName = "path-to-regexp";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    };
+    "performance-now-2.1.0" = {
+      name = "performance-now";
+      packageName = "performance-now";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    };
+    "pg-6.1.6" = {
+      name = "pg";
+      packageName = "pg";
+      version = "6.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg/-/pg-6.1.6.tgz";
+        sha1 = "dd22758250d5ad6eef5a2bf88d96f276d1e95b0d";
+      };
+    };
+    "pg-connection-string-0.1.3" = {
+      name = "pg-connection-string";
+      packageName = "pg-connection-string";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz";
+        sha1 = "da1847b20940e42ee1492beaf65d49d91b245df7";
+      };
+    };
+    "pg-int8-1.0.1" = {
+      name = "pg-int8";
+      packageName = "pg-int8";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz";
+        sha512 = "WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==";
+      };
+    };
+    "pg-pool-1.8.0" = {
+      name = "pg-pool";
+      packageName = "pg-pool";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-pool/-/pg-pool-1.8.0.tgz";
+        sha1 = "f7ec73824c37a03f076f51bfdf70e340147c4f37";
+      };
+    };
+    "pg-types-1.13.0" = {
+      name = "pg-types";
+      packageName = "pg-types";
+      version = "1.13.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-types/-/pg-types-1.13.0.tgz";
+        sha512 = "lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==";
+      };
+    };
+    "pgpass-1.0.2" = {
+      name = "pgpass";
+      packageName = "pgpass";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz";
+        sha1 = "2a7bb41b6065b67907e91da1b07c1847c877b306";
+      };
+    };
+    "postgres-array-1.0.3" = {
+      name = "postgres-array";
+      packageName = "postgres-array";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz";
+        sha512 = "5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==";
+      };
+    };
+    "postgres-bytea-1.0.0" = {
+      name = "postgres-bytea";
+      packageName = "postgres-bytea";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz";
+        sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
+      };
+    };
+    "postgres-date-1.0.4" = {
+      name = "postgres-date";
+      packageName = "postgres-date";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz";
+        sha512 = "bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==";
+      };
+    };
+    "postgres-interval-1.2.0" = {
+      name = "postgres-interval";
+      packageName = "postgres-interval";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz";
+        sha512 = "9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==";
+      };
+    };
+    "prelude-ls-1.1.2" = {
+      name = "prelude-ls";
+      packageName = "prelude-ls";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
+      };
+    };
+    "process-nextick-args-1.0.7" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "1.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz";
+        sha1 = "150e20b756590ad3f91093f25a4f2ad8bff30ba3";
+      };
+    };
+    "proxy-addr-2.0.5" = {
+      name = "proxy-addr";
+      packageName = "proxy-addr";
+      version = "2.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz";
+        sha512 = "t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==";
+      };
+    };
+    "psl-1.1.31" = {
+      name = "psl";
+      packageName = "psl";
+      version = "1.1.31";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz";
+        sha512 = "/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==";
+      };
+    };
+    "punycode-1.4.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    };
+    "punycode-2.1.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
+        sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
+      };
+    };
+    "qs-6.5.1" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz";
+        sha512 = "eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==";
+      };
+    };
+    "qs-6.5.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
+        sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
+      };
+    };
+    "random-bytes-1.0.0" = {
+      name = "random-bytes";
+      packageName = "random-bytes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz";
+        sha1 = "4f68a1dc0ae58bd3fb95848c30324db75d64360b";
+      };
+    };
+    "range-parser-1.2.0" = {
+      name = "range-parser";
+      packageName = "range-parser";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz";
+        sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
+      };
+    };
+    "raw-body-2.3.2" = {
+      name = "raw-body";
+      packageName = "raw-body";
+      version = "2.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz";
+        sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89";
+      };
+    };
+    "readable-stream-1.0.34" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "1.0.34";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz";
+        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
+      };
+    };
+    "readable-stream-1.1.14" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "1.1.14";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz";
+        sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
+      };
+    };
+    "readable-stream-2.3.3" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz";
+        sha512 = "m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==";
+      };
+    };
+    "redis-2.8.0" = {
+      name = "redis";
+      packageName = "redis";
+      version = "2.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz";
+        sha512 = "M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==";
+      };
+    };
+    "redis-commands-1.4.0" = {
+      name = "redis-commands";
+      packageName = "redis-commands";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz";
+        sha512 = "cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==";
+      };
+    };
+    "redis-parser-2.6.0" = {
+      name = "redis-parser";
+      packageName = "redis-parser";
+      version = "2.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz";
+        sha1 = "52ed09dacac108f1a631c07e9b69941e7a19504b";
+      };
+    };
+    "repeat-string-1.6.1" = {
+      name = "repeat-string";
+      packageName = "repeat-string";
+      version = "1.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    };
+    "request-2.83.0" = {
+      name = "request";
+      packageName = "request";
+      version = "2.83.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.83.0.tgz";
+        sha512 = "lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==";
+      };
+    };
+    "request-2.88.0" = {
+      name = "request";
+      packageName = "request";
+      version = "2.88.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.88.0.tgz";
+        sha512 = "NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==";
+      };
+    };
+    "resolve-1.1.7" = {
+      name = "resolve";
+      packageName = "resolve";
+      version = "1.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz";
+        sha1 = "203114d82ad2c5ed9e8e0411b3932875e889e97b";
+      };
+    };
+    "rethinkdb-2.3.3" = {
+      name = "rethinkdb";
+      packageName = "rethinkdb";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.3.3.tgz";
+        sha1 = "3dc6586e22fa1dabee0d254e64bd0e379fad2f72";
+      };
+    };
+    "right-align-0.1.3" = {
+      name = "right-align";
+      packageName = "right-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz";
+        sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
+      };
+    };
+    "safe-buffer-5.1.1" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz";
+        sha512 = "kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==";
+      };
+    };
+    "safe-buffer-5.1.2" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
+      };
+    };
+    "safer-buffer-2.1.2" = {
+      name = "safer-buffer";
+      packageName = "safer-buffer";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
+      };
+    };
+    "sax-1.2.4" = {
+      name = "sax";
+      packageName = "sax";
+      version = "1.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
+        sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
+      };
+    };
+    "security-1.0.0" = {
+      name = "security";
+      packageName = "security";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/security/-/security-1.0.0.tgz";
+        sha1 = "811c300313686133ef0007125e3b0ed700978815";
+      };
+    };
+    "semver-4.3.2" = {
+      name = "semver";
+      packageName = "semver";
+      version = "4.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz";
+        sha1 = "c7a07158a80bedd052355b770d82d6640f803be7";
+      };
+    };
+    "semver-4.3.6" = {
+      name = "semver";
+      packageName = "semver";
+      version = "4.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
+        sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
+      };
+    };
+    "semver-5.1.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz";
+        sha1 = "85f2cf8550465c4df000cf7d86f6b054106ab9e5";
+      };
+    };
+    "send-0.16.2" = {
+      name = "send";
+      packageName = "send";
+      version = "0.16.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/send/-/send-0.16.2.tgz";
+        sha512 = "E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==";
+      };
+    };
+    "serve-static-1.13.2" = {
+      name = "serve-static";
+      packageName = "serve-static";
+      version = "1.13.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz";
+        sha512 = "p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==";
+      };
+    };
+    "setprototypeof-1.0.3" = {
+      name = "setprototypeof";
+      packageName = "setprototypeof";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz";
+        sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04";
+      };
+    };
+    "setprototypeof-1.1.0" = {
+      name = "setprototypeof";
+      packageName = "setprototypeof";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz";
+        sha512 = "BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==";
+      };
+    };
+    "slide-1.1.6" = {
+      name = "slide";
+      packageName = "slide";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
+        sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
+      };
+    };
+    "sntp-2.1.0" = {
+      name = "sntp";
+      packageName = "sntp";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz";
+        sha512 = "FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==";
+      };
+    };
+    "socket.io-1.7.3" = {
+      name = "socket.io";
+      packageName = "socket.io";
+      version = "1.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz";
+        sha1 = "b8af9caba00949e568e369f1327ea9be9ea2461b";
+      };
+    };
+    "socket.io-adapter-0.5.0" = {
+      name = "socket.io-adapter";
+      packageName = "socket.io-adapter";
+      version = "0.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz";
+        sha1 = "cb6d4bb8bec81e1078b99677f9ced0046066bb8b";
+      };
+    };
+    "socket.io-client-1.7.3" = {
+      name = "socket.io-client";
+      packageName = "socket.io-client";
+      version = "1.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz";
+        sha1 = "b30e86aa10d5ef3546601c09cde4765e381da377";
+      };
+    };
+    "socket.io-parser-2.3.1" = {
+      name = "socket.io-parser";
+      packageName = "socket.io-parser";
+      version = "2.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz";
+        sha1 = "dd532025103ce429697326befd64005fcfe5b4a0";
+      };
+    };
+    "source-map-0.4.4" = {
+      name = "source-map";
+      packageName = "source-map";
+      version = "0.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz";
+        sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
+      };
+    };
+    "source-map-0.5.7" = {
+      name = "source-map";
+      packageName = "source-map";
+      version = "0.5.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    };
+    "source-map-0.6.1" = {
+      name = "source-map";
+      packageName = "source-map";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
+        sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
+      };
+    };
+    "split-1.0.1" = {
+      name = "split";
+      packageName = "split";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
+        sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
+      };
+    };
+    "sqlstring-2.3.0" = {
+      name = "sqlstring";
+      packageName = "sqlstring";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.0.tgz";
+        sha1 = "525b8a4fd26d6f71aa61e822a6caf976d31ad2a8";
+      };
+    };
+    "sshpk-1.16.1" = {
+      name = "sshpk";
+      packageName = "sshpk";
+      version = "1.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
+        sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
+      };
+    };
+    "statuses-1.4.0" = {
+      name = "statuses";
+      packageName = "statuses";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz";
+        sha512 = "zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==";
+      };
+    };
+    "string_decoder-0.10.31" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "0.10.31";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    };
+    "string_decoder-1.0.3" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz";
+        sha512 = "4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==";
+      };
+    };
+    "stringstream-0.0.6" = {
+      name = "stringstream";
+      packageName = "stringstream";
+      version = "0.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz";
+        sha512 = "87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "supports-color-2.0.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    };
+    "swagger-node-express-2.1.3" = {
+      name = "swagger-node-express";
+      packageName = "swagger-node-express";
+      version = "2.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/swagger-node-express/-/swagger-node-express-2.1.3.tgz";
+        sha1 = "4b1fee976e11284d276575911980b2258e379dab";
+      };
+    };
+    "symbol-tree-3.2.2" = {
+      name = "symbol-tree";
+      packageName = "symbol-tree";
+      version = "3.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz";
+        sha1 = "ae27db38f660a7ae2e1c3b7d1bc290819b8519e6";
+      };
+    };
+    "through-2.3.8" = {
+      name = "through";
+      packageName = "through";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    };
+    "tinycon-0.0.1" = {
+      name = "tinycon";
+      packageName = "tinycon";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tinycon/-/tinycon-0.0.1.tgz";
+        sha1 = "6de10cd5219a1f121d9a0a24b2c11b3fb24dffed";
+      };
+    };
+    "to-array-0.1.4" = {
+      name = "to-array";
+      packageName = "to-array";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    };
+    "tough-cookie-2.3.4" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.3.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz";
+        sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
+      };
+    };
+    "tough-cookie-2.4.3" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz";
+        sha512 = "Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==";
+      };
+    };
+    "tough-cookie-2.5.0" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
+        sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
+      };
+    };
+    "tr46-0.0.3" = {
+      name = "tr46";
+      packageName = "tr46";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz";
+        sha1 = "8184fd347dac9cdc185992f3a6622e14b9d9ab6a";
+      };
+    };
+    "tunnel-agent-0.6.0" = {
+      name = "tunnel-agent";
+      packageName = "tunnel-agent";
+      version = "0.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    };
+    "tweetnacl-0.14.5" = {
+      name = "tweetnacl";
+      packageName = "tweetnacl";
+      version = "0.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    };
+    "type-check-0.3.2" = {
+      name = "type-check";
+      packageName = "type-check";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    };
+    "type-is-1.6.18" = {
+      name = "type-is";
+      packageName = "type-is";
+      version = "1.6.18";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz";
+        sha512 = "TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==";
+      };
+    };
+    "ueberdb2-0.4.0" = {
+      name = "ueberdb2";
+      packageName = "ueberdb2";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ueberdb2/-/ueberdb2-0.4.0.tgz";
+        sha512 = "iY4+J8D+S5OP6dP9bSomJfN7zIZMcsO8h7J+EsxXod+iUpnQXmIIYsb9+Ui1Fz4KFiGbMDSaDP6Ipqz/l/1hmA==";
+      };
+    };
+    "uglify-js-2.6.2" = {
+      name = "uglify-js";
+      packageName = "uglify-js";
+      version = "2.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz";
+        sha1 = "f50be88a42cd396a6251dc52ab372f71cc12fef0";
+      };
+    };
+    "uglify-to-browserify-1.0.2" = {
+      name = "uglify-to-browserify";
+      packageName = "uglify-to-browserify";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
+        sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
+      };
+    };
+    "uid-safe-2.1.5" = {
+      name = "uid-safe";
+      packageName = "uid-safe";
+      version = "2.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz";
+        sha512 = "KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==";
+      };
+    };
+    "ultron-1.0.2" = {
+      name = "ultron";
+      packageName = "ultron";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz";
+        sha1 = "ace116ab557cd197386a4e88f4685378c8b2e4fa";
+      };
+    };
+    "underscore-1.8.3" = {
+      name = "underscore";
+      packageName = "underscore";
+      version = "1.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz";
+        sha1 = "4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022";
+      };
+    };
+    "unorm-1.4.1" = {
+      name = "unorm";
+      packageName = "unorm";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz";
+        sha1 = "364200d5f13646ca8bcd44490271335614792300";
+      };
+    };
+    "unpipe-1.0.0" = {
+      name = "unpipe";
+      packageName = "unpipe";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    };
+    "uri-js-4.2.2" = {
+      name = "uri-js";
+      packageName = "uri-js";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
+        sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
+      };
+    };
+    "util-deprecate-1.0.2" = {
+      name = "util-deprecate";
+      packageName = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    };
+    "utils-merge-1.0.1" = {
+      name = "utils-merge";
+      packageName = "utils-merge";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    };
+    "uuid-3.3.2" = {
+      name = "uuid";
+      packageName = "uuid";
+      version = "3.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";
+        sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
+      };
+    };
+    "vary-1.1.2" = {
+      name = "vary";
+      packageName = "vary";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "webidl-conversions-2.0.1" = {
+      name = "webidl-conversions";
+      packageName = "webidl-conversions";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz";
+        sha1 = "3bf8258f7d318c7443c36f2e169402a1a6703506";
+      };
+    };
+    "whatwg-url-compat-0.6.5" = {
+      name = "whatwg-url-compat";
+      packageName = "whatwg-url-compat";
+      version = "0.6.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz";
+        sha1 = "00898111af689bb097541cd5a45ca6c8798445bf";
+      };
+    };
+    "window-size-0.1.0" = {
+      name = "window-size";
+      packageName = "window-size";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz";
+        sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
+      };
+    };
+    "wordwrap-0.0.2" = {
+      name = "wordwrap";
+      packageName = "wordwrap";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz";
+        sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
+      };
+    };
+    "wordwrap-1.0.0" = {
+      name = "wordwrap";
+      packageName = "wordwrap";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
+        sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
+      };
+    };
+    "ws-1.1.2" = {
+      name = "ws";
+      packageName = "ws";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz";
+        sha1 = "8a244fa052401e08c9886cf44a85189e1fd4067f";
+      };
+    };
+    "wtf-8-1.0.0" = {
+      name = "wtf-8";
+      packageName = "wtf-8";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz";
+        sha1 = "392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
+      };
+    };
+    "xml-name-validator-2.0.1" = {
+      name = "xml-name-validator";
+      packageName = "xml-name-validator";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz";
+        sha1 = "4d8b8f1eccd3419aa362061becef515e1e559635";
+      };
+    };
+    "xmlhttprequest-ssl-1.5.3" = {
+      name = "xmlhttprequest-ssl";
+      packageName = "xmlhttprequest-ssl";
+      version = "1.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz";
+        sha1 = "185a888c04eca46c3e4070d99f7b49de3528992d";
+      };
+    };
+    "xtend-4.0.1" = {
+      name = "xtend";
+      packageName = "xtend";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    };
+    "yargs-3.10.0" = {
+      name = "yargs";
+      packageName = "yargs";
+      version = "3.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz";
+        sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
+      };
+    };
+    "yeast-0.1.2" = {
+      name = "yeast";
+      packageName = "yeast";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    };
+  };
+  args = {
+    name = "ep_etherpad-lite";
+    packageName = "ep_etherpad-lite";
+    version = "1.7.0";
+    inherit src;
+    dependencies = [
+      sources."abab-1.0.4"
+      sources."accepts-1.3.7"
+      sources."acorn-2.7.0"
+      sources."acorn-globals-1.0.9"
+      sources."after-0.8.2"
+      sources."agentkeepalive-3.5.2"
+      sources."ajv-5.5.2"
+      sources."align-text-0.1.4"
+      sources."amdefine-1.0.1"
+      sources."ansi-regex-2.1.1"
+      sources."ansi-styles-2.2.1"
+      sources."array-flatten-1.1.1"
+      sources."arraybuffer.slice-0.0.6"
+      sources."asn1-0.2.4"
+      sources."assert-plus-1.0.0"
+      sources."async-0.9.0"
+      sources."async-stacktrace-0.0.2"
+      sources."asynckit-0.4.0"
+      sources."aws-sign2-0.7.0"
+      sources."aws4-1.8.0"
+      sources."backo2-1.0.2"
+      sources."base64-arraybuffer-0.1.5"
+      sources."base64id-1.0.0"
+      sources."bcrypt-pbkdf-1.0.2"
+      sources."better-assert-1.0.2"
+      sources."bignumber.js-4.0.4"
+      sources."binary-search-1.3.5"
+      sources."blob-0.0.4"
+      sources."bluebird-2.11.0"
+      (sources."body-parser-1.18.2" // {
+        dependencies = [
+          sources."qs-6.5.1"
+        ];
+      })
+      sources."boolbase-1.0.0"
+      sources."boom-4.3.1"
+      sources."browser-request-0.3.3"
+      sources."buffer-writer-1.0.1"
+      sources."bytes-3.0.0"
+      sources."callsite-1.0.0"
+      sources."camelcase-1.2.1"
+      sources."caseless-0.12.0"
+      sources."cassandra-driver-2.0.1"
+      sources."center-align-0.1.3"
+      sources."chalk-1.1.3"
+      sources."channels-0.0.4"
+      sources."cheerio-0.20.0"
+      (sources."clean-css-3.4.19" // {
+        dependencies = [
+          sources."source-map-0.4.4"
+        ];
+      })
+      (sources."cliui-2.1.0" // {
+        dependencies = [
+          sources."wordwrap-0.0.2"
+        ];
+      })
+      (sources."cloudant-follow-0.17.0" // {
+        dependencies = [
+          sources."debug-3.2.6"
+          sources."ms-2.1.1"
+        ];
+      })
+      sources."co-4.6.0"
+      sources."combined-stream-1.0.7"
+      sources."commander-2.8.1"
+      sources."component-bind-1.0.0"
+      sources."component-emitter-1.1.2"
+      sources."component-inherit-0.0.3"
+      sources."content-disposition-0.5.2"
+      sources."content-type-1.0.4"
+      sources."cookie-0.1.2"
+      sources."cookie-parser-1.3.4"
+      sources."cookie-signature-1.0.6"
+      sources."core-util-is-1.0.2"
+      sources."crc-3.4.4"
+      (sources."cryptiles-3.1.4" // {
+        dependencies = [
+          sources."boom-5.2.0"
+        ];
+      })
+      sources."css-select-1.2.0"
+      sources."css-what-2.1.3"
+      sources."cssom-0.3.6"
+      sources."cssstyle-0.2.37"
+      sources."dashdash-1.14.1"
+      sources."debug-2.6.9"
+      sources."decamelize-1.2.0"
+      sources."deep-is-0.1.3"
+      sources."define-properties-1.1.3"
+      sources."delayed-stream-1.0.0"
+      sources."depd-1.1.2"
+      sources."destroy-1.0.4"
+      sources."dirty-0.9.9"
+      sources."dom-serializer-0.1.1"
+      sources."domelementtype-1.3.1"
+      sources."domhandler-2.3.0"
+      sources."domutils-1.5.1"
+      sources."double-ended-queue-2.1.0-0"
+      sources."ecc-jsbn-0.1.2"
+      sources."ee-first-1.1.1"
+      sources."ejs-2.5.7"
+      sources."elasticsearch-15.1.1"
+      sources."encodeurl-1.0.2"
+      (sources."engine.io-1.8.3" // {
+        dependencies = [
+          sources."accepts-1.3.3"
+          sources."cookie-0.3.1"
+          sources."debug-2.3.3"
+          sources."ms-0.7.2"
+          sources."negotiator-0.6.1"
+        ];
+      })
+      (sources."engine.io-client-1.8.3" // {
+        dependencies = [
+          sources."component-emitter-1.2.1"
+          sources."debug-2.3.3"
+          sources."ms-0.7.2"
+        ];
+      })
+      sources."engine.io-parser-1.3.2"
+      sources."entities-1.1.2"
+      sources."errs-0.3.2"
+      sources."es-abstract-1.13.0"
+      sources."es-to-primitive-1.2.0"
+      sources."escape-html-1.0.3"
+      sources."escape-string-regexp-1.0.5"
+      sources."escodegen-1.11.1"
+      sources."esprima-3.1.3"
+      sources."estraverse-4.2.0"
+      sources."esutils-2.0.2"
+      sources."etag-1.8.1"
+      sources."etherpad-require-kernel-1.0.9"
+      sources."etherpad-yajsml-0.0.2"
+      (sources."express-4.16.3" // {
+        dependencies = [
+          sources."cookie-0.3.1"
+          sources."qs-6.5.1"
+          sources."safe-buffer-5.1.1"
+        ];
+      })
+      (sources."express-session-1.15.6" // {
+        dependencies = [
+          sources."cookie-0.3.1"
+        ];
+      })
+      sources."extend-3.0.2"
+      sources."extsprintf-1.3.0"
+      sources."fast-deep-equal-1.1.0"
+      sources."fast-json-stable-stringify-2.0.0"
+      sources."fast-levenshtein-2.0.6"
+      sources."finalhandler-1.1.1"
+      sources."forever-agent-0.6.1"
+      sources."form-data-2.3.3"
+      sources."formidable-1.2.1"
+      sources."forwarded-0.1.2"
+      sources."fresh-0.5.2"
+      sources."function-bind-1.1.1"
+      sources."generic-pool-2.4.3"
+      sources."getpass-0.1.7"
+      sources."graceful-fs-4.1.3"
+      sources."graceful-readlink-1.0.1"
+      sources."har-schema-2.0.0"
+      sources."har-validator-5.0.3"
+      sources."has-1.0.3"
+      sources."has-ansi-2.0.0"
+      sources."has-binary-0.1.7"
+      sources."has-cors-1.1.0"
+      sources."has-symbols-1.0.0"
+      sources."hawk-6.0.2"
+      sources."hoek-4.2.1"
+      (sources."htmlparser2-3.8.3" // {
+        dependencies = [
+          sources."entities-1.0.0"
+        ];
+      })
+      sources."http-errors-1.6.3"
+      sources."http-signature-1.2.0"
+      sources."humanize-ms-1.2.1"
+      sources."iconv-lite-0.4.19"
+      sources."indexof-0.0.1"
+      sources."inherits-2.0.3"
+      sources."ipaddr.js-1.9.0"
+      sources."is-buffer-1.1.6"
+      sources."is-callable-1.1.4"
+      sources."is-date-object-1.0.1"
+      sources."is-regex-1.0.4"
+      sources."is-symbol-1.0.2"
+      sources."is-typedarray-1.0.0"
+      sources."isarray-0.0.1"
+      sources."isstream-0.1.2"
+      sources."js-string-escape-1.0.1"
+      sources."jsbn-0.1.1"
+      sources."jsdom-7.2.2"
+      sources."json-schema-0.2.3"
+      sources."json-schema-traverse-0.3.1"
+      sources."json-stringify-safe-5.0.1"
+      sources."json3-3.3.2"
+      sources."jsonminify-0.4.1"
+      sources."jsprim-1.4.1"
+      sources."kind-of-3.2.2"
+      sources."languages4translatewiki-0.1.3"
+      sources."lazy-cache-1.0.4"
+      sources."levn-0.3.0"
+      sources."lodash-4.17.11"
+      sources."lodash.isempty-4.4.0"
+      (sources."log4js-0.6.35" // {
+        dependencies = [
+          sources."readable-stream-1.0.34"
+          sources."semver-4.3.6"
+        ];
+      })
+      sources."long-2.4.0"
+      sources."longest-1.0.1"
+      sources."measured-core-1.11.2"
+      sources."media-typer-0.3.0"
+      sources."merge-descriptors-1.0.1"
+      sources."methods-1.1.2"
+      sources."mime-1.4.1"
+      sources."mime-db-1.40.0"
+      sources."mime-types-2.1.24"
+      sources."ms-2.0.0"
+      (sources."mysql-2.15.0" // {
+        dependencies = [
+          sources."isarray-1.0.0"
+          sources."readable-stream-2.3.3"
+          sources."safe-buffer-5.1.1"
+          sources."string_decoder-1.0.3"
+        ];
+      })
+      (sources."nano-6.4.4" // {
+        dependencies = [
+          sources."ajv-6.10.0"
+          sources."fast-deep-equal-2.0.1"
+          sources."har-validator-5.1.3"
+          sources."json-schema-traverse-0.4.1"
+          sources."oauth-sign-0.9.0"
+          sources."request-2.88.0"
+          sources."tough-cookie-2.4.3"
+        ];
+      })
+      sources."negotiator-0.6.2"
+      sources."npm-6.4.0"
+      sources."nth-check-1.0.2"
+      sources."nwmatcher-1.4.4"
+      sources."oauth-sign-0.8.2"
+      sources."object-assign-4.1.0"
+      sources."object-component-0.0.3"
+      sources."object-keys-1.1.1"
+      sources."object.values-1.1.0"
+      sources."on-finished-2.3.0"
+      sources."on-headers-1.0.2"
+      sources."optional-js-2.1.1"
+      sources."optionator-0.8.2"
+      sources."options-0.0.6"
+      sources."packet-reader-0.2.0"
+      sources."parse5-1.5.1"
+      sources."parsejson-0.0.3"
+      sources."parseqs-0.0.5"
+      sources."parseuri-0.0.5"
+      sources."parseurl-1.3.3"
+      sources."path-to-regexp-0.1.7"
+      sources."performance-now-2.1.0"
+      (sources."pg-6.1.6" // {
+        dependencies = [
+          sources."semver-4.3.2"
+        ];
+      })
+      sources."pg-connection-string-0.1.3"
+      sources."pg-int8-1.0.1"
+      sources."pg-pool-1.8.0"
+      sources."pg-types-1.13.0"
+      sources."pgpass-1.0.2"
+      sources."postgres-array-1.0.3"
+      sources."postgres-bytea-1.0.0"
+      sources."postgres-date-1.0.4"
+      sources."postgres-interval-1.2.0"
+      sources."prelude-ls-1.1.2"
+      sources."process-nextick-args-1.0.7"
+      sources."proxy-addr-2.0.5"
+      sources."psl-1.1.31"
+      sources."punycode-1.4.1"
+      sources."qs-6.5.2"
+      sources."random-bytes-1.0.0"
+      sources."range-parser-1.2.0"
+      (sources."raw-body-2.3.2" // {
+        dependencies = [
+          sources."depd-1.1.1"
+          sources."http-errors-1.6.2"
+          sources."setprototypeof-1.0.3"
+        ];
+      })
+      sources."readable-stream-1.1.14"
+      sources."redis-2.8.0"
+      sources."redis-commands-1.4.0"
+      sources."redis-parser-2.6.0"
+      sources."repeat-string-1.6.1"
+      (sources."request-2.83.0" // {
+        dependencies = [
+          sources."tough-cookie-2.3.4"
+        ];
+      })
+      sources."resolve-1.1.7"
+      sources."rethinkdb-2.3.3"
+      sources."right-align-0.1.3"
+      sources."safe-buffer-5.1.2"
+      sources."safer-buffer-2.1.2"
+      sources."sax-1.2.4"
+      sources."security-1.0.0"
+      sources."semver-5.1.0"
+      sources."send-0.16.2"
+      sources."serve-static-1.13.2"
+      sources."setprototypeof-1.1.0"
+      sources."slide-1.1.6"
+      sources."sntp-2.1.0"
+      (sources."socket.io-1.7.3" // {
+        dependencies = [
+          sources."debug-2.3.3"
+          sources."ms-0.7.2"
+        ];
+      })
+      (sources."socket.io-adapter-0.5.0" // {
+        dependencies = [
+          sources."debug-2.3.3"
+          sources."ms-0.7.2"
+        ];
+      })
+      (sources."socket.io-client-1.7.3" // {
+        dependencies = [
+          sources."component-emitter-1.2.1"
+          sources."debug-2.3.3"
+          sources."ms-0.7.2"
+        ];
+      })
+      (sources."socket.io-parser-2.3.1" // {
+        dependencies = [
+          sources."debug-2.2.0"
+          sources."ms-0.7.1"
+        ];
+      })
+      sources."source-map-0.6.1"
+      sources."split-1.0.1"
+      sources."sqlstring-2.3.0"
+      sources."sshpk-1.16.1"
+      sources."statuses-1.4.0"
+      sources."string_decoder-0.10.31"
+      sources."stringstream-0.0.6"
+      sources."strip-ansi-3.0.1"
+      sources."supports-color-2.0.0"
+      (sources."swagger-node-express-2.1.3" // {
+        dependencies = [
+          sources."lodash-1.3.1"
+        ];
+      })
+      sources."symbol-tree-3.2.2"
+      sources."through-2.3.8"
+      sources."tinycon-0.0.1"
+      sources."to-array-0.1.4"
+      (sources."tough-cookie-2.5.0" // {
+        dependencies = [
+          sources."punycode-2.1.1"
+        ];
+      })
+      sources."tr46-0.0.3"
+      sources."tunnel-agent-0.6.0"
+      sources."tweetnacl-0.14.5"
+      sources."type-check-0.3.2"
+      sources."type-is-1.6.18"
+      (sources."ueberdb2-0.4.0" // {
+        dependencies = [
+          sources."async-0.1.15"
+        ];
+      })
+      (sources."uglify-js-2.6.2" // {
+        dependencies = [
+          sources."async-0.2.10"
+          sources."source-map-0.5.7"
+        ];
+      })
+      sources."uglify-to-browserify-1.0.2"
+      sources."uid-safe-2.1.5"
+      sources."ultron-1.0.2"
+      sources."underscore-1.8.3"
+      sources."unorm-1.4.1"
+      sources."unpipe-1.0.0"
+      (sources."uri-js-4.2.2" // {
+        dependencies = [
+          sources."punycode-2.1.1"
+        ];
+      })
+      sources."util-deprecate-1.0.2"
+      sources."utils-merge-1.0.1"
+      sources."uuid-3.3.2"
+      sources."vary-1.1.2"
+      sources."verror-1.10.0"
+      sources."webidl-conversions-2.0.1"
+      sources."whatwg-url-compat-0.6.5"
+      sources."window-size-0.1.0"
+      sources."wordwrap-1.0.0"
+      sources."ws-1.1.2"
+      sources."wtf-8-1.0.0"
+      sources."xml-name-validator-2.0.1"
+      sources."xmlhttprequest-ssl-1.5.3"
+      sources."xtend-4.0.1"
+      sources."yargs-3.10.0"
+      sources."yeast-0.1.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "A Etherpad based on node.js";
+      homepage = http://etherpad.org/;
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+  };
+in
+{
+  tarball = nodeEnv.buildNodeSourceDist args;
+  package = nodeEnv.buildNodePackage args;
+  shell = nodeEnv.buildNodeShell args;
+}
diff --git a/pkgs/webapps/infcloud/default.nix b/pkgs/webapps/infcloud/default.nix
new file mode 100644 (file)
index 0000000..0d73f52
--- /dev/null
@@ -0,0 +1,18 @@
+{ infcloud_config ? ./infcloud_config.js, stdenv, fetchzip, ed }:
+stdenv.mkDerivation rec {
+  version = "0.13.1";
+  name = "InfCloud-${version}";
+  src = fetchzip {
+    url = "https://www.inf-it.com/InfCloud_${version}.zip";
+    sha256 = "1fjhs0cj0b9fhf5ysfz281mknmmg1z551bas143sxfcqlpa5aiiq";
+  };
+  buildPhase = ''
+    ./cache_update.sh
+    rm config.js
+    '';
+  installPhase = ''
+    cp -a . $out
+    ln -s ${infcloud_config} $out/config.js
+    '';
+  buildInputs = [ ed ];
+}
diff --git a/pkgs/webapps/infcloud/infcloud_config.js b/pkgs/webapps/infcloud/infcloud_config.js
new file mode 100644 (file)
index 0000000..ba73860
--- /dev/null
@@ -0,0 +1,1446 @@
+/*
+InfCloud - the open source CalDAV/CardDAV Web Client
+Copyright (C) 2011-2015
+    Jan Mate <jan.mate@inf-it.com>
+    Andrej Lezo <andrej.lezo@inf-it.com>
+    Matej Mihalik <matej.mihalik@inf-it.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+// NOTE: see readme.txt before you start to configure this client!
+
+
+// NOTE: do not forget to execute the cache_update.sh script every time you
+// update this configuration file or any other files (otherwise your browser
+// will use the previous version of files stored in HTML5 cache). Alternatively
+// you can update the cache.manifest manually - edit the second line beginning
+// with "#V 20" to anything else (this file simple needs "some" change)
+
+
+// Supported setup types (use ONE of them):
+//   a.) globalAccountSettings => username and password is hardcoded
+//       in config.js, automatic login without the login screen
+//       - advantages: fast login process = no username/password is required
+//       - disadvantages: username/password is visible in your config.js, so
+//         this type of setup is recommended ONLY for intranet/home users
+//   b.) globalNetworkCheckSettings => standard setup with login screen
+//       - advantages: username/password is required (no visible
+//         username/password in config.js)
+//       - disadvantages: if a user enters wrong username/password then
+//         the browser will show authentication popup window (it is NOT
+//         possible to disable it in JavaScript; see the next option)
+//   c.) globalNetworkAccountSettings => advanced setup with login screen
+//       - advantages: no authentication popup if you enter wrong username/
+//         password, dynamic XML configuration generator (you can generate
+//         different configurations for your users /by modifying the "auth"
+//         module configuration or the PHP code itself/)
+//       - disadvantages: requires PHP >= 5.3 and additional configuration,
+//         only basic http authentication is supported => always use https!
+//
+//
+// What is a "principal URL"? => Check you server documentation!
+//   - "principal URL" is NOT "collection URL"
+//   - this client automatically detects collections for "principal URL"
+//   - PROPER "principal URL" looks like:
+//     https://server.com:8443/principals/users/USER/
+//     https://server.com:8443/caldav.php/USER/
+//   - INVALID principal URL looks like:
+//     https://server.com:8443/principals/users/USER/collection/
+//       => this is a collection URL
+//     https://server.com:8443/caldav.php/USER/collection/
+//       => this is a collection URL
+//     https://server.com:8443/principals/users/USER
+//       => missing trailing '/'
+//     https://server.com:8443/caldav.php/USER
+//       => missing trailing '/'
+//     /caldav.php/USER/
+//       => relative URL instead of full URL
+//
+//
+// List of properties used in globalAccountSettings, globalNetworkCheckSettings
+// and globalNetworkAccountSettings variables (+ in the "auth" module):
+// - href
+//   Depending on the setup type set the value to:
+//   a.) globalAccountSettings: full "principal URL"
+//   b.) globalNetworkCheckSettings: "principal URL" WITHOUT the "USER/" part
+//   c.) globalNetworkAccountSettings: "full URL" to the "auth" directory
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings
+// - userAuth
+//   - userName
+//     Set the username you want to login.
+//   - userPassword
+//     Set the password for the given username.
+//   This property is supported in:
+//     globalAccountSettings
+// - timeOut
+//   This option sets the timeout for jQuery .ajax call (in miliseconds).
+//   Example:
+//     timeOut: 90000
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings
+// - lockTimeOut 
+//   NOTE: used only if server supports LOCK requests
+//   This option sets the LOCK timeout value if resource locking
+//   is used (in miliseconds).
+//   Example:
+//     lockTimeOut: 10000
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only)
+// - checkContentType
+//   This option enables a content-type checking for server response.
+//   If enabled then only objects with proper content-type are inserted
+//   into the interface.
+//   If you cannot see data in the interface you may try to disable it (useful
+//   if your server returns wrong value in "propstat/prop/getcontenttype").
+//   If undefined then content-type checking is enabled.
+//   Examples:
+//     checkContentType: true
+//     checkContentType: false
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only)
+// - settingsAccount
+//   NOTE: server support for custom DAV properties is REQUIRED!
+//   This option sets the account where the client properties such as:
+//   loaded collections, enabled collections, ... are saved during
+//   the logout and resource/collection synchronisation
+//   NOTE: set it to true ONLY for ONE account!
+//   Examples:
+//     settingsAccount: true
+//     settingsAccount: false
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only)
+// - delegation
+//   NOTE: server support for this functionality is REQUIRED!
+//   This option allows you to load delegated (shared) collections.
+//   If set to true (default) then delegation functionality is enabled,
+//   and the interface allows you to load delegated collections.
+//   If false then delegation functionality is completely disabled.
+//   Examples:
+//     delegation: true
+//     delegation: false
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only)
+// - additionalResources
+//   This options sets the list of additional resources (e.g. shared resources
+//   accessible by all users). If the server supports delegation (see
+//   the delegation option above) there is no reason to use this option!
+//   Supported values:
+//   - array of URL encoded resource names (not collections), such as:
+//     'company'
+//     'shared_resource'
+//   If empty (default) or undefined then shared resources are not loaded
+//   using this option, but may be loaded using the delegation option.
+//   Examples:
+//     additionalResources=[]
+//     additionalResources=['public', 'shared_resource']
+//   This property is supported in:
+//     globalNetworkCheckSettings
+// - hrefLabel
+//   This option sets the server name in the resource header (useful if
+//   you want to see custom resource header above the collections).
+//   You can use the following variables in the value:
+//     %H = full hostname (including the port number)
+//     %h = full hostname (without the port number)
+//     %D = full domain name
+//     %d = only the first and second level domain
+//     %P = principal name
+//     %p = principal name without the @domain.com part (if present)
+//     %U = logged user name
+//     %u = logged user name without the @domain.com part (if present)
+//   If undefined, empty or or null then '%d/%p [%u]' is used.
+//   Examples: 
+//     hrefLabel: '%d/%p [%u]'
+//     hrefLabel: '%D/%u'
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only)
+// - forceReadOnly
+//   This option sets the list of collections as "read-only".
+//   Supported values:
+//   - true
+//     all collections will be "read-only"
+//   - array of URL encoded
+//     - collections, such as: 
+//       '/caldav.php/user/calendar/'
+//       '/caldav.php/user%40domain.com/calendar/'
+//     - regexes, such as:
+//       new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
+//     specifies the list of collections marked as "read-only"
+//   If null (default) or undefined then server detected privileges are used.
+//   Examples:
+//     forceReadOnly: null
+//     forceReadOnly: true
+//     forceReadOnly: ['/caldav.php/user/calendar/', 
+//                     '/caldav.php/user/calendar2/']
+//     forceReadOnly: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only, with
+//       different syntax for regexes)
+// - ignoreAlarms
+//   This option sets list of calendar collections with disabled
+//   alarm functionality.
+//   Supported values:
+//   - true
+//     alarm functionality is disabled for all collections
+//   - array of URL encoded
+//     - collections, such as: 
+//       '/caldav.php/user/calendar/'
+//       '/caldav.php/user%40domain.com/calendar/'
+//     - regexes, such as:
+//       new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
+//     specifies the list of collections with disabled alarm functionality.
+//   If false (default) or undefined then alarm functionality is enabled
+//   for all collections.
+//   Examples:
+//     ignoreAlarms: true
+//     ignoreAlarms: ['/caldav.php/user/calendar/', 
+//                    '/caldav.php/user/calendar2/']
+//     ignoreAlarms: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only, with
+//       different syntax for regexes)
+// - backgroundCalendars
+//   This options defines a list of background calendars. If there is
+//   at least one event defined for the given day in a background calendar,
+//   the background color for that day will be pink/light-red.
+//   Supported values:
+//   - array of URL encoded
+//     - collections, such as: 
+//       '/caldav.php/user/calendar/'
+//       '/caldav.php/user%40domain.com/calendar/'
+//     - regexes, such as:
+//       new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
+//     specifies the list of background calendar collections.
+//   Examples:
+//     backgroundCalendars: ['/caldav.php/user/calendar/', 
+//                           '/caldav.php/user/calendar2/']
+//     backgroundCalendars: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
+//   This property is supported in:
+//     globalAccountSettings
+//     globalNetworkCheckSettings
+//     globalNetworkAccountSettings (available in auth module only, with
+//       different syntax for regexes)
+// Special options not present in configuration examples:
+// NOTE: use ONLY if you know what are you doing!
+// - crossDomain
+//   This option sets the crossDomain for jQuery .ajax call. If null (default)
+//   then the value is autodetected /and the result is shown in the console/
+// - withCredentials
+//   This option sets the withCredentials for jQuery .ajax call. The default
+//   value is false and there is NO REASON to change it to true!
+//   NOTE: if true, Access-Control-Allow-Origin "*" (CORS header) not works!
+
+
+// globalAccountSettings
+// Use this option if you want to use automatic login (without a login
+// screen) with hardcoded username/password in config.js. Otherwise use
+// globalNetworkCheckSettings or globalNetworkAccountSettings (see below).
+// NOTE: if this option is used the value must be an array of object(s).
+// List of properties used in globalAccountSettings variable:
+// - href
+//   Set this option to the full "principal URL".
+//   NOTE: the last character in the value must be '/'
+// - userAuth
+//   - userName
+//     Set the username you want to login.
+//   - userPassword
+//     Set the password for the given username.
+// NOTE: for description of other properties see comments at the beginning
+// of this file.
+// NOTE: for minimal/fast setup you need to set only the href and userAuth
+// options. It is safe/recommended to keep the remaining options unchanged!
+// Example:
+//var globalAccountSettings=[
+//     {
+//             href: 'https://server1.com:8443/caldav.php/USERNAME1/',
+//             userAuth:
+//             {
+//                     userName: 'USERNAME1',
+//                     userPassword: 'PASSWORD1'
+//             },
+//             timeOut: 90000,
+//             lockTimeOut: 10000,
+//             checkContentType: true,
+//             settingsAccount: true,
+//             delegation: true,
+//             hrefLabel: null,
+//             forceReadOnly: null,
+//             ignoreAlarms: false,
+//             backgroundCalendars: []
+//     },
+//     {
+//             href: 'https://server2.com:8443/caldav.php/USERNAME2/',
+//             ...
+//             ...
+//     }
+//];
+
+
+// globalNetworkCheckSettings
+// Use this option if you want to use standard login screen without
+// hardcoded username/password in config.js (used by globalAccountSettings).
+// NOTE: if this option is used the value must be an object.
+// List of properties used in globalAccountSettings variable:
+// - href
+//   Set this option to the "principal URL" WITHOUT the "USERNAME/"
+//   part (this options uses the username from the login screen).
+//   NOTE: the last character in the value must be '/'
+// NOTE: for description of other properties see comments at the beginning
+// of this file.
+// NOTE: for minimal/fast setup you need to set only the href option. It is
+// safe/recommended to keep the remaining options unchanged!
+// Example href values:
+// OS X server http example (see misc/readme_osx.txt for server setup):
+//   href: 'http://osx.server.com:8008/principals/users/'
+// OS X server https example (see misc/readme_osx.txt for server setup):
+//   href: 'https://osx.server.com:8443/principals/users/'
+// Cyrus server https example:
+//   href: 'https://cyrus.server.com/dav/principals/user/'
+// Example:
+// Davical example which automatically detects the protocol, server name,
+// port, ... (client installed into Davical "htdocs" subdirectory;
+// works "out of the box", no additional setup required):
+var globalNetworkCheckSettings={
+       href: location.protocol+'//'+location.hostname+
+               (location.port ? ':'+location.port: '')+
+               location.pathname.replace(RegExp('/+[^/]+/*(index\.html)?$'),'')+
+               '/caldav.php/',
+       timeOut: 90000,
+       lockTimeOut: 10000,
+       checkContentType: true,
+       settingsAccount: true,
+       delegation: true,
+       additionalResources: [],
+       hrefLabel: null,
+       forceReadOnly: null,
+       ignoreAlarms: false,
+       backgroundCalendars: []
+}
+
+
+// globalNetworkAccountSettings
+// Try this option ONLY if you have working setup using
+// globalNetworkCheckSettings and want to fix the authentication popup
+// window problem (if invalid username/password is entered)!
+// If you use this option then your browser sends username/password to the PHP
+// "auth" module ("auth" directory) instead of the DAV server itself.
+// The "auth" module then validates your username/password against your server,
+// and if the authentication is successful, then it sends back a configuration
+// XML (requires additional configuration). The resulting XML is handled
+// IDENTICALLY as the globalAccountSettings configuration option.
+// NOTE: for the "auth" module configuration see readme.txt!
+// NOTE: this option invokes a login screen and disallows access until
+// the client gets correct XML configuration file from the server!
+// List of properties used in globalNetworkAccountSettings variable:
+// - href
+//   Set this option to the "full URL" of the "auth" directory
+//   NOTE: the last character in the value must be '/'
+// NOTE: for description of other properties see comments at the beginning
+// of this file.
+// Example href values:
+//   href: 'https://server.com/client/auth/'
+// Example:
+// Use this configuration if the "auth" module is located in the client
+// installation subdirectory (default):
+//var globalNetworkAccountSettings={
+//     href: location.protocol+'//'+location.hostname+
+//             (location.port ? ':'+location.port : '')+
+//             location.pathname.replace(RegExp('index\.html$'),'')+
+//             'auth/',
+//     timeOut: 30000
+//};
+
+
+// globalUseJqueryAuth
+// Use jQuery .ajax() auth or custom header for HTTP basic auth (default).
+// Set this option to true if your server uses digest auth (note: you may
+// experience auth popups on some browsers).
+// If undefined (or empty), custom header for HTTP basic auth is used.
+// Example:
+//var globalUseJqueryAuth=false;
+
+
+// globalBackgroundSync
+// Enable background synchronization even if the browser window/tab has no
+// focus.
+// If false, synchronization is performed only if the browser window/tab
+// is focused. If undefined or not false, then background sync is enabled.
+// Example:
+var globalBackgroundSync=true;
+
+
+// globalSyncResourcesInterval
+// This option defines how often (in miliseconds) are resources/collections
+// asynchronously synchronized.
+// Example:
+var globalSyncResourcesInterval=120000;
+
+
+// globalEnableRefresh
+// This option enables or disables the manual synchronization button in
+// the interface. If this option is enabled then users can perform server
+// synchronization manually. Enabling this option may cause high server
+// load (even DDOS) if users will try to manually synchronize data too
+// often (instead of waiting for the automatic synchronization).
+// If undefined or false, the synchronization button is disabled.
+// NOTE: enable this option only if you really know what are you doing!
+// Example:
+var globalEnableRefresh=false;
+
+
+// globalEnableKbNavigation
+// Enable basic keyboard navigation using arrow keys?
+// If undefined or not false, keyboard navigation is enabled.
+// Example:
+var globalEnableKbNavigation=true;
+
+
+// globalSettingsType
+// Where to store user settings such as: active view, enabled/selected
+// collections, ... (the client store them into DAV property on the server).
+// NOTE: not all servers support storing DAV properties (some servers support
+// only subset /or none/ of these URLs).
+// Supported values:
+// - 'principal-URL', '', null or undefined (default) => settings are stored
+//   to principal-URL (recommended for most servers)
+// - 'addressbook-home-set' => settings are are stored to addressbook-home-set
+// - 'calendar-home-set' => settings are stored to calendar-home-set
+// Example:
+//var globalSettingsType='';
+
+
+// globalCrossServerSettingsURL
+// Settings such as enabled/selected collections are stored on the server
+// (see the previous option) in form of full URL
+// (e.g.: https://user@server:port/principal/collection/), but even if this
+// approach is "correct" (you can use the same principal URL with multiple
+// different logins, ...) it causes a problem if your server is accessible
+// from multiple URLs (e.g. http://server/ and https://server/). If you want
+// to store only the "principal/collection/" part of the URL (instead of the
+// full URL) then enable this option.
+// Example:
+//var globalCrossServerSettingsURL=false;
+
+
+// globalInterfaceLanguage
+// Default interface language (note: this option is case sensitive):
+//   cs_CZ (Čeština [Czech])
+//   da_DK (Dansk [Danish]; thanks Niels Bo Andersen)
+//   de_DE (Deutsch [German]; thanks Marten Gajda and Thomas Scheel)
+//   en_US (English [English/US])
+//   es_ES (Español [Spanish]; thanks Damián Vila)
+//   fr_FR (Français [French]; thanks John Fischer)
+//   it_IT (Italiano [Italian]; thanks Luca Ferrario)
+//   ja_JP (日本語 [Japan]; thanks Muimu Nakayama)
+//   hu_HU (Magyar [Hungarian])
+//   nl_NL (Nederlands [Dutch]; thanks Johan Vromans)
+//   sk_SK (Slovenčina [Slovak])
+//   tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar)
+//   ru_RU (Русский [Russian]; thanks Александр Симонов)
+//   uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck)
+//   zh_CN (中国 [Chinese]; thanks Fandy)
+// Example:
+var globalInterfaceLanguage='fr_FR';
+
+
+// globalInterfaceCustomLanguages
+// If defined and not empty then only languages listed here are shown
+// at the login screen, otherwise (default) all languages are shown
+// NOTE: values in the array must refer to an existing localization
+// (see the option above)
+// Example:
+//   globalInterfaceCustomLanguages=['en_US', 'sk_SK'];
+var globalInterfaceCustomLanguages=[];
+
+
+// globalSortAlphabet
+// Use JavaScript localeCompare() or custom alphabet for data sorting.
+// Custom alphabet is used by default because JavaScript localeCompare()
+// not supports collation and often returns "wrong" result. If set to null
+// then localeCompare() is used.
+// Example:
+//   var globalSortAlphabet=null;
+var globalSortAlphabet=' 0123456789'+
+       'AÀÁÂÄÆÃÅĀBCÇĆČDĎEÈÉÊËĒĖĘĚFGĞHIÌÍÎİÏĪĮJKLŁĹĽMNŃÑŇOÒÓÔÖŐŒØÕŌ'+
+       'PQRŔŘSŚŠȘșŞşẞTŤȚțŢţUÙÚÛÜŰŮŪVWXYÝŸZŹŻŽ'+
+       'aàáâäæãåābcçćčdďeèéêëēėęěfgğhiìíîïīįıjklłĺľmnńñňoòóôöőœøõō'+
+       'pqrŕřsśšßtťuùúûüűůūvwxyýÿzźżžАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЮЯ'+
+       'Ьабвгґдеєжзиіїйклмнопрстуфхцчшщюяь';
+
+
+// globalSearchTransformAlphabet
+// To support search without diacritics (e.g. search for 'd' will find: 'Ď', 'ď')
+// it is required to define something like "character equivalence".
+// key = regex text, value = search character
+// Example:
+var globalSearchTransformAlphabet={
+       '[ÀàÁáÂâÄäÆæÃãÅåĀā]': 'a', '[ÇçĆćČč]': 'c', '[Ďď]': 'd',
+       '[ÈèÉéÊêËëĒēĖėĘęĚě]': 'e', '[Ğğ]': 'g', '[ÌìÍíÎîİıÏïĪīĮį]': 'i',
+       '[ŁłĹ弾]': 'l', '[ŃńÑñŇň]': 'n', '[ÒòÓóÔôÖöŐőŒœØøÕõŌō]': 'o',
+       '[ŔŕŘř]': 'r', '[ŚśŠšȘșŞşẞß]': 's', '[ŤťȚțŢţ]': 't',
+       '[ÙùÚúÛûÜüŰűŮůŪū]': 'u', '[ÝýŸÿ]': 'y', '[ŹźŻżŽž]': 'z'
+};
+
+// globalResourceAlphabetSorting
+// If more than one resource (server account) is configured, sort the
+// resources alphabetically?
+// Example:
+var globalResourceAlphabetSorting=true;
+
+
+// globalNewVersionNotifyUsers
+// Update notification will be shown only to users with login names defined
+// in this array.
+// If undefined (or empty), update notifications will be shown to all users.
+// Example:
+//   globalNewVersionNotifyUsers=['admin', 'peter'];
+var globalNewVersionNotifyUsers=[];
+
+
+// globalDatepickerFormat
+// Set the datepicker format (see 
+// http://docs.jquery.com/UI/Datepicker/formatDate for valid values).
+// NOTE: date format is predefined for each localization - use this option
+// ONLY if you want to use custom date format (instead of the localization
+// predefined one).
+// Example:
+//var globalDatepickerFormat='dd.mm.yy';
+var globalDatepickerFormat='yy-mm-dd';
+
+
+// globalDatepickerFirstDayOfWeek
+// Set the datepicker first day of the week: Sunday is 0, Monday is 1, etc.
+// Example:
+var globalDatepickerFirstDayOfWeek=1;
+
+
+// globalHideInfoMessageAfter
+// How long are information messages (such as: success, error) displayed
+// (in miliseconds).
+// Example:
+var globalHideInfoMessageAfter=1800;
+
+
+// globalEditorFadeAnimation
+// Set the editor fade in/out animation duration when editing or saving data
+// (in miliseconds).
+// Example:
+var globalEditorFadeAnimation=666;
+
+
+
+
+// ******* CalDAV (CalDavZAP) related settings ******* //
+
+// globalEventStartPastLimit, globalEventStartFutureLimit, globalTodoPastLimit
+// Number of months pre-loaded from past/future in advance for calendars
+// and todo lists (if null then date range synchronization is disabled).
+// NOTE: interval synchronization is used only if your server supports
+// sync-collection REPORT (e.g. DAViCal).
+// NOTE: if you experience problems with data loading and your server has
+// no time-range filtering support set these variables to null.
+// Example:
+var globalEventStartPastLimit=3;
+var globalEventStartFutureLimit=3;
+var globalTodoPastLimit=1;
+
+
+// globalLoadedCalendarCollections
+// This option sets the list of calendar collections (down)loaded after login.
+// If empty then all calendar collections for the currently logged user are
+// loaded.
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalLoadedCalendarCollections=[];
+
+
+// globalLoadedTodoCollections
+// This option sets the list of todo collections (down)loaded after login.
+// If empty then all todo collections for the currently logged user are loaded.
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalLoadedTodoCollections=[];
+
+
+// globalActiveCalendarCollections
+// This options sets the list of calendar collections checked (enabled
+// checkbox => data visible in the interface) by default after login.
+// If empty then all loaded calendar collections for the currently logged
+// user are checked.
+// NOTE: only already (down)loaded collections can be checked (see 
+// the globalLoadedCalendarCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalActiveCalendarCollections=[];
+
+
+// globalActiveTodoCollections
+// This options sets the list of todo collections checked (enabled
+// checkbox => data visible in the interface) by default after login.
+// If empty then all loaded todo collections for the currently logged
+// user are checked.
+// NOTE: only already (down)loaded collections can be checked (see 
+// the globalLoadedTodoCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalActiveTodoCollections=[];
+
+
+// globalCalendarSelected
+// This option sets which calendar collection will be pre-selected
+// (if you create a new event) by default after login.
+// The value must be URL encoded path to a calendar collection,
+// for example: 'USER/calendar/'
+// If empty or undefined then the first available calendar collection
+// is selected automatically.
+// NOTE: only already (down)loaded collections can be pre-selected (see
+// the globalLoadedCalendarCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+//var globalCalendarSelected='';
+
+
+// globalTodoCalendarSelected
+// This option sets which todo collection will be pre-selected
+// (if you create a new todo) by default after login.
+// The value must be URL encoded path to a todo collection,
+// for example: 'USER/todo_calendar/'
+// If empty or undefined then the first available todo collection
+// is selected automatically.
+// NOTE: only already (down)loaded collections can be pre-selected (see 
+// the globalLoadedTodoCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+//var globalTodoCalendarSelected='';
+
+
+// globalActiveView
+// This options sets the default fullcalendar view option (the default calendar
+// view after the first login).
+// Supported values:
+// - 'month'
+// - 'multiWeek'
+// - 'agendaWeek'
+// - 'agendaDay'
+// NOTE: we use custom and enhanced version of fullcalendar!
+// Example:
+var globalActiveView='multiWeek';
+
+
+// globalOpenFormMode
+// Open new event form on 'single' or 'double' click.
+// If undefined or not 'double', then 'single' is used.
+// Example:
+var globalOpenFormMode='double';
+
+
+// globalTodoListFilterSelected
+// This options sets the list of filters in todo list that are selected
+// after login.
+// Supported options:
+// - 'filterAction'
+// - 'filterProgress' (available only if globalAppleRemindersMode is disabled)
+// - 'filterCompleted'
+// - 'filterCanceled' (available only if globalAppleRemindersMode is disabled)
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalTodoListFilterSelected=['filterAction', 'filterProgress'];
+
+
+// globalCalendarStartOfBusiness, globalCalendarEndOfBusiness
+// These options set the start and end of business hours with 0.5 hour
+// precision. Non-business hours are faded out in the calendar interface.
+// If both variables are set to the same value then no fade out occurs.
+// Example:
+var globalCalendarStartOfBusiness=8;
+var globalCalendarEndOfBusiness=17;
+
+
+// globalDefaultEventDuration
+// This option sets the default duration (in minutes) for newly created events.
+// If undefined or null, globalCalendarEndOfBusiness value will be taken as
+// a default end time instead.
+// Example:
+var globalDefaultEventDuration=120;
+
+
+// globalAMPMFormat
+// This option enables to use 12 hours format (AM/PM) for displaying time.
+// NOTE: time format is predefined for each localization - use this option
+// ONLY if you want to use custom time format (instead of the localization
+// predefined one).
+// Example:
+//var globalAMPMFormat=false;
+
+
+// globalTimeFormatBasic
+// This option defines the time format information for events in month and
+// multiweek views. If undefined or null then default value is used.
+// If defined as empty string no time information is shown in these views.
+// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
+// formating rules.
+// Example:
+//var globalTimeFormatBasic='';
+
+
+// globalTimeFormatAgenda
+// This option defines the time format information for events in day and
+// week views. If undefined or null then default value is used.
+// If defined as empty string no time information is shown in these views.
+// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
+// formating rules.
+// Example:
+//var globalTimeFormatAgenda='';
+
+
+// globalDisplayHiddenEvents
+// This option defined whether events from unechecked calendars are displayed
+// with certain transparency (true) or completely hidden (false).
+// Example:
+var globalDisplayHiddenEvents=false;
+
+
+// globalTimeZoneSupport
+// This option enables timezone support in the client.
+// NOTE: timezone cannot be specified for all-day events because these don't
+// have start and end time.
+// If this option is disabled then local time is used.
+// Example:
+var globalTimeZoneSupport=true;
+
+
+// globalTimeZone
+// If timezone support is enabled, this option sets the default timezone.
+// See timezones.js or use the following command to get the list of supported
+// timezones (defined in timezones.js):
+// grep "'[^']\+': {" timezones.js | sed -Ee "s#(\s*'|':\s*\{)##g"
+// Example:
+var globalTimeZone='Europe/Paris';
+
+
+// globalTimeZonesEnabled
+// This option sets the list of available timezones in the interface (for the 
+// list of supported timezones see the comment for the previous configuration
+// option).
+// NOTE: if there is at least one event/todo with a certain timezone defined,
+// that timezone is enabled (even if it is not present in this list).
+// Example:
+//   var globalTimeZonesEnabled=['America/New_York', 'Europe/Berlin']; 
+var globalTimeZonesEnabled=[];
+
+
+// globalRewriteTimezoneComponent
+// This options sets whether the client will enhance/replace (if you edit an
+// event or todo) the timezone information using the official IANA timezone
+// database information (recommended).
+// Example:
+var globalRewriteTimezoneComponent=true;
+
+
+// globalRemoveUnknownTimezone
+// This options sets whether the client will remove all non-standard timezone
+// names from events and todos (if you edit an event or todo)
+// (e.g.: /freeassociation.sourceforge.net/Tzfile/Europe/Vienna)
+// Example:
+var globalRemoveUnknownTimezone=false;
+
+
+// globalShowHiddenAlarms
+// This option sets whether the client will show alarm notifications for
+// unchecked calendars. If this option is enabled and you uncheck a calendar
+// in the calendar list, alarm notifications will be temporary disabled for
+// unchecked calendar(s).
+// Example:
+var globalShowHiddenAlarms=false;
+
+
+// globalIgnoreCompletedOrCancelledAlarms
+// This options sets whether the client will show alarm notifications for
+// already completed or cancelled todos. If enabled then alarm notification
+// for completed and cancelled todos are disabled.
+// Example:
+var globalIgnoreCompletedOrCancelledAlarms=true;
+
+
+// globalMozillaSupport
+// Mozilla automatically treats custom repeating event calculations as if
+// the start day of the week is Monday, despite what day is chosen in settings.
+// Set this variable to true to use the same approach, ensuring compatible
+// event rendering in special cases.
+// Example:
+var globalMozillaSupport=false;
+
+
+// globalCalendarColorPropertyXmlns
+// This options sets the namespace used for storing the "calendar-color"
+// property by the client.
+// If true, undefined (or empty) "http://apple.com/ns/ical/" is used (Apple
+// compatible). If false, then the calendar color modification functionality
+// is completely disabled.
+// Example:
+//var globalCalendarColorPropertyXmlns=true;
+
+
+// globalWeekendDays
+// This option sets the list of days considered as weekend days (these
+// are faded out in the calendar interface). Non-weekend days are automatically
+// considered as business days.
+// Sunday is 0, Monday is 1, etc.
+// Example:
+var globalWeekendDays=[0, 6];
+
+
+// globalAppleRemindersMode
+// If this option is enabled then then client will use the same approach
+// for handling repeating reminders (todos) as Apple. It is STRONGLY
+// recommended to enabled this option if you use any Apple clients for
+// reminders (todos).
+// Supported options:
+// - 'iOS6'
+// - 'iOS7'
+// - true (support of the latest iOS version - 'iOS8')
+// - false
+// If this option is enabled:
+// - RFC todo support is SEVERELY limited and the client mimics the behaviour
+//   of Apple Reminders.app (to ensure maximum compatibility)
+// - when a single instance of repeating todo is edited, it becomes an
+//   autonomous non-repeating todo with NO relation to the original repeating
+//   todo
+// - capabilities of repeating todos are limited - only the first instance
+//   is ever visible in the interface
+// - support for todo DTSTART attribute is disabled
+// - support for todo STATUS attribute other than COMPLETED and NEEDS-ACTION
+//   is disabled
+// - [iOS6 only] support for LOCATION and URL attributes is disabled
+// Example:
+var globalAppleRemindersMode=true;
+
+
+// globalSubscribedCalendars
+// This option specifies a list of remote URLs to ics files (e.g.: used
+// for distributing holidays information). Subscribed calendars are
+// ALWAYS read-only. Remote servers where ics files are hosted MUST
+// return proper CORS headers (see readme.txt) otherwise this functionality
+// will not work!
+// NOTE: subsribed calendars are NOT "shared" calendars. For "shared"
+// calendars see the delegation option in globalAccountSettings,
+// globalNetworkCheckSettings and globalNetworkAccountSettings.
+// List of properties used in globalSubscribedCalendars variable:
+// - hrefLabel
+//   This options defines the header string above the subcsribed calendars.
+// - calendars
+//   This option specifies an array of remote calendar objects with the
+//   following properties:
+//   - href
+//     Set this option to the "full URL" of the remote calendar
+//   - userAuth
+//     NOTE: keep empty if remote authentication is not required!
+//     - userName
+//       Set the username you want to login.
+//     - userPassword
+//       Set the password for the given username.
+//   - typeList
+//     Set the list of objects you want to process from remote calendars;
+//     two options are available:
+//     - 'vevent' (show remote events in the interface) 
+//     - 'vtodo' (show remote todos in the interface) 
+//   - ignoreAlarm
+//     Set this option to true if you want to disable alarm notifications
+//     from the remote calendar.
+//   - displayName
+//     Set this option to the name of the calendar you want to see
+//     in the interface.
+//   - color
+//     Set the calendar color you want to see in the interface.
+// Example:
+//var globalSubscribedCalendars={
+//     hrefLabel: 'Subscribed',
+//     calendars: [
+//             {
+//                     href: 'http://something.com/calendar.ics',
+//                     userAuth: {
+//                             userName: '',
+//                             userPassword: ''
+//                     },
+//                     typeList: ['vevent', 'vtodo'],
+//                     ignoreAlarm: true,
+//                     displayName: 'Remote Calendar 1',
+//                     color: '#ff0000'
+//             },
+//             {
+//                     href: 'http://calendar.com/calendar2.ics',
+//                     ...
+//                     ...
+//             }
+//     ]
+//};
+
+
+
+// ******* CardDAV (CardDavMATE) related settings ******* //
+
+
+// globalLoadedAddressbookCollections
+// This option sets the list of addressbook collections (down)loaded after
+// login. If empty then all addressbook collections for the currently logged
+// user are loaded.
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalLoadedAddressbookCollections=[];
+
+
+// globalActiveAddressbookCollections
+// This options sets the list of addressbook collections checked (enabled
+// checkbox => data visible in the interface) by default after login.
+// If empty then all loaded addressbook collections for the currently logged
+// user are checked.
+// NOTE: only already (down)loaded collections can be checked (see
+// the globalLoadedAddressbookCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+var globalActiveAddressbookCollections=[];
+
+
+// globalAddressbookSelected
+// This option sets which addressbook collection will be pre-selected
+// (if you create a new contact) by default after login.
+// The value must be URL encoded path to an addressbook collection,
+// for example: 'USER/addressbook/'
+// If empty or undefined then the first available addressbook collection
+// is selected automatically.
+// NOTE: only already (down)loaded collections can be pre-selected (see
+// the globalLoadedAddressbookCollections option).
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
+// option.
+// Example:
+//var globalAddressbookSelected='';
+
+
+// globalCompatibility
+// This options is reserved for various compatibility settings.
+// NOTE: if this option is used the value must be an object.
+// Currently there is only one supported option:
+// - anniversaryOutputFormat
+//   Different clients use different (and incompatible) approach
+//   to store anniversary date in vCards. Apple stores this attribute as:
+//     itemX.X-ABDATE;TYPE=pref:2000-01-01\r\n
+//     itemX.X-ABLabel:_$!<Anniversary>!$_\r\n'
+//   other clients store this attribute as:
+//     X-ANNIVERSARY:2000-01-01\r\n
+//   Choose 'apple' or 'other' (lower case) for your 3rd party client
+//   compatibility. You can chose both: ['apple', 'other'], but it may
+//   cause many problems in the future, for example: duplicate anniversary
+//   dates, invalid/old anniversary date in your clients, ...)
+//   Examples:
+//     anniversaryOutputFormat: ['other']
+//     anniversaryOutputFormat: ['apple', 'other']
+// Example:
+var globalCompatibility={anniversaryOutputFormat: ['apple']};
+
+
+// globalUriHandler{Tel,Email,Url,Profile}
+// These options set the URI handlers for TEL, EMAIL, URL and X-SOCIALPROFILE
+// vCard attributes. Set them to null (or comment out) to disable.
+// NOTE: for globalUriHandlerTel is recommended to use 'tel:', 'callto:'
+// or 'skype:'. The globalUriHandlerUrl value is used only if no URI handler
+// is defined in the URL.
+// NOTE: it is safe to keep these values unchanged!
+// Example:
+var globalUriHandlerTel='tel:';
+var globalUriHandlerEmail='mailto:';
+var globalUriHandlerUrl='http://';
+var globalUriHandlerProfile={
+       'twitter': 'http://twitter.com/%u',
+       'facebook': 'http://www.facebook.com/%u',
+       'flickr': 'http://www.flickr.com/photos/%u',
+       'linkedin': 'http://www.linkedin.com/in/%u',
+       'myspace': 'http://www.myspace.com/%u',
+       'sinaweibo': 'http://weibo.com/n/%u'
+};
+
+
+// globalDefaultAddressCountry
+// This option sets the default country for new address fields.
+// See common.js or use the following command to get the list of
+// all supported country codes (defined in common.js):
+// grep -E "'[a-z]{2}':\s+\[" common.js | sed -Ee 's#^\s+|\s+\[\s+# #g'
+// Example:
+var globalDefaultAddressCountry='fr';
+
+
+// globalAddressCountryEquivalence
+// This option sets the processing of the country field specified
+// in the vCard ADR attribute.
+// By default the address field in vCard looks like:
+//   ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n
+// what cause a problem, because the country field is a plain
+// text and can contain any value, e.g.:
+//   USA
+//   United States of America
+//   US
+// and because the address format can be completely different for
+// each country, e.g.:
+//   China address example:
+//     [China]
+//     [Province] [City]
+//     [Street]
+//     [Postal]
+//   Japan address example:
+//     [Postal]
+//     [Prefecture] [County/City]
+//     [Further Divisions]
+//     [Japan]
+// the client needs to correctly detect the country from the ADR
+// attribute. Apple solved this problem by using:
+//   item1.ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n
+//   item1.X-ABADR:us\r\n
+// where the second "related" attribute defines the country code
+// for the ADR attribute. This client uses the same approach, but
+// if the vCard is created by 3rd party clients and the X-ABADR
+// is missing, it is possible to define additional "rules" for
+// country matching. These rules are specied by the country code
+// (for full list of country codes see the comment for pre previous
+// option) and a case insensitive regular expression (which matches
+// the plain text value in the country field).
+// NOTE: if X-ABADR is not present and the country not matches any
+// country defined in this option, then globalDefaultAddressCountry
+// is used by default.
+// Example:
+var globalAddressCountryEquivalence=[
+       {country: 'de', regex: '^\\W*Deutschland\\W*$'},
+       {country: 'sk', regex: '^\\W*Slovensko\\W*$'}
+];
+
+
+// globalAddressCountryFavorites
+// This option defines the list of countries which are shown at the top
+// of the country list in the interface (for full list of country codes
+// see the comment for pre globalDefaultAddressCountry option).
+// Example:
+//   var globalAddressCountryFavorites=['de','sk'];
+var globalAddressCountryFavorites=[];
+
+
+// globalAddrColorPropertyXmlns
+// This options sets the namespace used for storing the "addressbook-color"
+// property by the client.
+// If true, undefined (or empty) "http://inf-it.com/ns/ab/" is used.
+// If false, then the addressbook color modification functionality
+// is completely disabled, and addressbook colors in the interface are
+// generated automatically.
+// Example:
+//var globalAddrColorPropertyXmlns=true;
+
+
+// globalContactStoreFN
+// This option specifies how the FN (formatted name) is stored into vCard.
+// The value for this options must be an array of strings, that can contain
+// the following variables:
+//   prefix
+//   last
+//   middle
+//   first
+//   suffix
+// The string element of the array can contain any other characters (usually
+// space or colon). Elements are added into FN only if the there is
+// a variable match, for example if:
+//     last='Lastname'
+//     first='Firstname'
+//     middle='' (empty)
+//   and this option is set to:
+//     ['last', ' middle', ' first'] (space in the second and third element)
+//   the resulting value for FN will be: 'Lastname Firstname' and not
+//   'Lastname  Firstname' (two spaces), because the middle name is empty (so
+//   the second element is completely ignored /not added into FN/).
+// NOTE: this attribute is NOT used by this client, and it is also NOT
+// possible to directly edit it in the interface.
+// Examples:
+//   var globalContactStoreFN=[' last', ' middle', ' first'];
+//   var globalContactStoreFN=['last', ', middle', ' ,first'];
+var globalContactStoreFN=['prefix',' last',' middle',' first',' suffix'];
+
+
+// globalGroupContactsByCompanies
+// This options specifies how contacts are grouped in the interface.
+// By default the interface looks like (very simple example):
+//   A
+//    Adams Adam
+//    Anderson Peter
+//   B
+//    Brown John
+//    Baker Josh
+// if grouped by company/deparment the result is:
+//   Company A [Department X]
+//    Adams Adam
+//    Brown John
+//   Company B [Department Y]
+//    Anderson Peter
+//    Baker Josh
+// If this option is set to true contacts are grouped by company/department,
+// otherwise (default) contacts are grouped by letters of the alphabet.
+// If undefined or not true, grouping by alphabet letters is used.
+// NOTE: see also the globalCollectionDisplay option below.
+var globalGroupContactsByCompanies=false;
+
+
+// globalCollectionDisplay
+// This options specifies how data columns in the contact list are displayed.
+//
+// NOTE: columns are displayed ONLY if there is enought horizontal place in
+// the browser window (e.g. if you define 5 columns here, but your browser
+// window is not wide enough, you will see only first 3 columns instead of 5).
+//
+// NOTE: see the globalContactDataMinVisiblePercentage option which defines the
+// width for columns.
+//
+// The value must be an array of columns, where each column is represented by
+// an object with the following properties:
+//   label => the value of this option is a string used as column header
+//     You can use the following localized variables in the label string:
+//     - {Name}
+//     - {FirstName}
+//     - {LastName}
+//     - {MiddleName}
+//     - {NickName}
+//     - {Prefix}
+//     - {Suffix}
+//     - {BirthDay}
+//     - {PhoneticLastName}
+//     - {PhoneticFirstName}
+//     - {JobTitle}
+//     - {Company}
+//     - {Department}
+//     - {Categories}
+//     - {NoteText}
+//     - {Address}, {AddressWork}, {AddressHome}, {AddressOther}
+//     - {Phone}, {PhoneWork}, {PhoneHome}, {PhoneCell}, {PhoneMain},
+//       {PhonePager}, {PhoneFax}, {PhoneIphone}, {PhoneOther}
+//     - {Email}, {EmailWork}, {EmailHome}, {EmailMobileme}, {EmailOther}
+//     - {URL}, {URLWork}, {URLHome}, {URLHomepage}, {URLOther}
+//     - {Dates}, {DatesAnniversary}, {DatesOther}
+//     - {Related}, {RelatedManager}, {RelatedAssistant}, {RelatedFather},
+//       {RelatedMother}, {RelatedParent}, {RelatedBrother}, {RelatedSister},
+//       {RelatedChild}, {RelatedFriend}, {RelatedSpouse}, {RelatedPartner},
+//       {RelatedOther}
+//     - {Profile}, {ProfileTwitter}, {ProfileFacebook}, {ProfileFlickr},
+//       {ProfileLinkedin}, {ProfileMyspace}, {ProfileSinaweibo}
+//     - {IM}, {IMWork}, {IMHome}, {IMMobileme}, {IMOther}, {IMAim}, {IMIcq},
+//       {IMIrc}, {IMJabber}, {IMMsn}, {IMYahoo}, {IMFacebook}, {IMGadugadu},
+//       {IMGoogletalk}, {IMQq}, {IMSkype}
+//   value => the value of this option is an array of format strings, or
+//     an object with the following properties:
+//     - company (used for company contacts)
+//     - personal (used for user contacts)
+//     where the value of these properties is an array of format strings used
+//     for company or user contacts (you can have different values in the same
+//     column for personal and company contacts).
+//     You can use the following simple variables in the format string:
+//     - {FirstName}
+//     - {LastName}
+//     - {MiddleName}
+//     - {NickName}
+//     - {Prefix}
+//     - {Suffix}
+//     - {BirthDay}
+//     - {PhoneticLastName}
+//     - {PhoneticFirstName}
+//     - {JobTitle}
+//     - {Company}
+//     - {Department}
+//     - {Categories}
+//     - {NoteText}
+//     You can also use parametrized variables, where the parameter is enclosed
+//     in square bracket. Paramatrized variables are useful to extract data
+//     such as home phone {Phone[type=home]}, extract the second phone number
+//     {Phone[:1]} (zero based indexing) or extract the third home phone number
+//     {Phone[type=home][:2]} from the vCard.
+//     NOTE: if the parametrized variable matches multiple items, e.g.:
+//     {Phone[type=work]} (if the contact has multiple work phones) then the
+//     first one is used!
+//
+//     The following parametrized variables are supported (note: you can use
+//     all of them also without parameters /the first one will be used/):
+//     - {Address[type=XXX]} or {Address[:NUM]} or {Address[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - work
+//       - home
+//       - other
+//       - any other custom value
+//     - {Phone[type=XXX]} or {Phone[:NUM]} or {Phone[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - work
+//       - home
+//       - cell
+//       - main
+//       - pager
+//       - fax
+//       - iphone
+//       - other
+//       - any other custom value
+//     - {Email[type=XXX]} or {Email[:NUM]} or {Email[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - work
+//       - home
+//       - mobileme
+//       - other
+//       - any other custom value
+//     - {URL[type=XXX]} or {URL[:NUM]} or {URL[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - work
+//       - home
+//       - homepage
+//       - other
+//       - any other custom value
+//     - {Dates[type=XXX]} or {Dates[:NUM]} or {Dates[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - anniversary
+//       - other
+//       - any other custom value
+//     - {Related[type=XXX]} or {Related[:NUM]} or {Related[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - manager
+//       - assistant
+//       - father
+//       - mother
+//       - parent
+//       - brother
+//       - sister
+//       - child
+//       - friend
+//       - spouse
+//       - partner
+//       - other
+//       - any other custom value
+//     - {Profile[type=XXX]} or {Profile[:NUM]} or {Profile[type=XXX][:NUM]}
+//       where supported values for XXX are:
+//       - twitter
+//       - facebook
+//       - flickr
+//       - linkedin
+//       - myspace
+//       - sinaweibo
+//       - any other custom value
+//     - {IM[type=XXX]} or {IM[service-type=YYY]} or {IM[:NUM]}
+//       where supported values for XXX are:
+//       - work
+//       - home
+//       - mobileme
+//       - other
+//       - any other custom value
+//       and supported values for YYY are:
+//       - aim
+//       - icq
+//       - irc
+//       - jabber
+//       - msn
+//       - yahoo
+//       - facebook
+//       - gadugadu
+//       - googletalk
+//       - qq
+//       - skype
+//       - any other custom value
+//
+//   NOTE: if you want to use the "any other custom value" option (for XXX
+//   or YYY above) you MUST double escape the following characters:
+//     =[]{}\
+//   for example:
+//   - for profile type "=XXX=" use: '{Profile[type=\\=XXX\\=]}'
+//   - for profile type "\XXX\" use: '{Profile[type=\\\\XXX\\\\]}'
+//
+//   NOTE: if you want to use curly brackets in the format string you must
+//   double escape it, e.g.: ['{Company}', '\\{{Department}\\}']
+//
+//   The format string (for the value option) is an array to allow full
+//   customization of the interface. For example if:
+//     value: ['{LastName} {MiddleName} {FirstName}']
+//   and the person has no middle name, then the result in the column
+//   will be (without quotes):
+//     "Parker  Peter" (note: two space characters)
+//   but if you use:
+//     value: ['{LastName}', ' {MiddleName}', ' {FirstName}']
+//   then the result will be (without quotes):
+//     "Parker Peter" (note: only one space character)
+//   The reason is that only those elements of the array are appended
+//   into the result where non-empty substitution was performed (so the
+//   ' {MiddleName}' element in this case is ignored, because the person
+//   in the example above has no /more precisely has empty/ middle name).
+//
+// Examples:
+// To specify two columns (named "Company" and "Department / LastName"),
+// where the first will display the company name, and the second will display
+// department for company contacts (with "Dep -" prefix), and lastname for
+// personal contacts (with "Name -" prefix) use:
+// var globalCollectionDisplay=[
+//     {
+//             label: 'Company',
+//             value: ['{Company}']
+//     },
+//     {
+//             label: 'Department / LastName',
+//             value: {
+//                     company: ['Dep - {Department}'],
+//                     personal: ['Name - {LastName}']
+//             }
+//     }
+// ];
+// To specify 3 columns (named "Categories", "URL" and "IM"), where the first
+// will display categories, second will display the third work URL, and third
+// will display ICQ IM use:
+// var globalCollectionDisplay=[
+//     {
+//             label: 'Categories',
+//             value: ['{Categories}']
+//     },
+//     {
+//             label: 'URL',
+//             value: ['{URL[type=WORK][:2]}']
+//     },
+//     {
+//             label: 'IM',
+//             value: ['{IM[service-type=ICQ]}']
+//     }
+// ];
+//
+// Recommended settings if globalGroupContactsByCompanies
+// is set to false:
+// var globalCollectionDisplay=[
+//     {
+//             label: '{Name}',
+//             value: ['{LastName}', ' {MiddleName}', ' {FirstName}']
+//     },
+//     {
+//             label: '{Company} [{Department}]',
+//             value: ['{Company}', ' [{Department}]']
+//     },
+//     {
+//             label: '{JobTitle}',
+//             value: ['{JobTitle}']
+//     },
+//     {
+//             label: '{Email}',
+//             value: ['{Email[:0]}']
+//     },
+//     {
+//             label: '{Phone} 1',
+//             value: ['{Phone[:0]}']
+//     },
+//     {
+//             label: '{Phone} 2',
+//             value: ['{Phone[:1]}']
+//     },
+//     {
+//             label: '{NoteText}',
+//             value: ['{NoteText}']
+//     }
+// ];
+//
+// Recommended settings if globalGroupContactsByCompanies
+// is set to true:
+// var globalCollectionDisplay=[
+//     {
+//             label: '{Name}',
+//             value: {
+//                     personal: ['{LastName}', ' {MiddleName}', ' {FirstName}'],
+//                     company: ['{Company}', ' [{Department}]']
+//             }
+//     },
+//     {
+//             label: '{JobTitle}',
+//             value: ['{JobTitle}']
+//     },
+//     {
+//             label: '{Email}',
+//             value: ['{Email[:0]}']
+//     },
+//     {
+//             label: '{Phone} 1',
+//             value: ['{Phone[:0]}']
+//     },
+//     {
+//             label: '{Phone} 2',
+//             value: ['{Phone[:1]}']
+//     },
+//     {
+//             label: '{NoteText}',
+//             value: ['{NoteText}']
+//     }
+// ];
+//
+// NOTE: if left undefined, the recommended settings will be used.
+
+
+// globalCollectionSort
+// This options sets the ordering of contacts in the interface. In general
+// contacts are ordered alphabetically by an internal "sort string" which
+// is created for each contact. Here you can specify how this internal string
+// is created. The value is a simple array holding only the values from the
+// value property defined in the globalCollectionDisplay option.
+// If undefined, the definition from globalCollectionDisplay is used.
+// Example:
+// var globalCollectionSort = [
+//     ['{LastName}'],
+//     ['{FirstName}'],
+//     ['{MiddleName}'],
+//     {
+//             company: ['{Categories}'],
+//             personal: ['{Company}']
+//     }
+// ];
+var globalCollectionSort=[
+  ['{LastName}'],
+  ['{FirstName}'],
+  ['{MiddleName}']
+];
+
+
+// globalContactDataMinVisiblePercentage
+// This option defines how the width for columns are computed. If you set
+// it to 1 then 100% of all data in the column will be visible (the column
+// width is determined by the longest string in the column). If you set it
+// to 0.95 then 95% of data will fit into the column width, and the remaining
+// 5% will be truncated (" ...").
+// Example:
+var globalContactDataMinVisiblePercentage=0.95;
+
+
diff --git a/pkgs/webapps/mantisbt_2/bug_report.php.diff b/pkgs/webapps/mantisbt_2/bug_report.php.diff
new file mode 100644 (file)
index 0000000..2924252
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/bug_report.php   2019-05-06 12:06:44.265508011 +0200
++++ b/bug_report.php   2019-05-06 12:09:40.106952738 +0200
+@@ -67,6 +67,17 @@
+       'copy_files' => $f_copy_attachments_from_parent
+ );
++# begin captcha check for anon user
++if ( current_user_is_anonymous() && get_gd_version() > 0 ) {
++  $f_captcha = gpc_get_string( 'captcha', '' );
++  $f_captcha = utf8_strtolower( trim( $f_captcha ) );
++
++  $t_securimage = new Securimage();
++  if( $t_securimage->check( $f_captcha ) == false ) {
++    trigger_error( ERROR_SIGNUP_NOT_MATCHING_CAPTCHA, ERROR );
++  }
++}
++
+ if( $f_master_bug_id > 0 ) {
+       bug_ensure_exists( $f_master_bug_id );
diff --git a/pkgs/webapps/mantisbt_2/bug_report_page.php.diff b/pkgs/webapps/mantisbt_2/bug_report_page.php.diff
new file mode 100644 (file)
index 0000000..80dea91
--- /dev/null
@@ -0,0 +1,53 @@
+--- a/bug_report_page.php      2018-02-10 21:29:27.000000000 +0100
++++ b/bug_report_page.php      2018-03-03 15:04:19.622499678 +0100
+@@ -708,7 +708,50 @@
+                               <span class="lbl padding-6"><?php echo lang_get( 'check_report_more_bugs' ) ?></span>
+                       </label>
+               </td>
+       </tr>
++<?php
++      # captcha image requires GD library and related option to ON
++      if( current_user_is_anonymous() && get_gd_version() > 0 ) {
++              $t_securimage_path = 'vendor/dapphp/securimage';
++              $t_securimage_show = $t_securimage_path . '/securimage_show.php';
++              $t_securimage_play = $t_securimage_path . '/securimage_play.swf?'
++                      . http_build_query( array(
++                              'audio_file' => $t_securimage_path . '/securimage_play.php',
++                              'bgColor1=' => '#fff',
++                              'bgColor2=' => '#fff',
++                              'iconColor=' => '#777',
++                              'borderWidth=' => 1,
++                              'borderColor=' => '#000',
++                      ) );
++?>
++      <tr>
++              <th class="category">CAPTCHA</th>
++              <td>
++
++                              <label for="captcha-field" class="block clearfix">
++                                      <strong><?php echo lang_get( 'signup_captcha_request_label' ); ?></strong>
++                              </label>
++                              <span id="captcha-input" class="input">
++                                      <?php print_captcha_input( 'captcha' ); ?>
++
++                                      <span id="captcha-image" class="captcha-image" style="padding-right:3px;">
++                                              <img src="<?php echo $t_securimage_show; ?>" alt="visual captcha" />
++                                              <ul id="captcha-refresh"><li><a href="#"><?php
++                                                      echo lang_get( 'signup_captcha_refresh' );
++                                              ?></a></li></ul>
++                                      </span>
++
++                                      <object type="application/x-shockwave-flash" width="19" height="19"
++                                              data="<?php echo $t_securimage_play; ?>">
++                                              <param name="movie" value="<?php echo $t_securimage_play; ?>" />
++                                      </object>
++                              </span>
++                </td>
++        </tr>
++<?php
++                      }
++?>
++
+ </table>
+ </div>
+ </div>
diff --git a/pkgs/webapps/mantisbt_2/bugnote_add.php.diff b/pkgs/webapps/mantisbt_2/bugnote_add.php.diff
new file mode 100644 (file)
index 0000000..4509f0a
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/bugnote_add.php  2018-02-10 21:29:27.000000000 +0100
++++ b/bugnote_add.php  2018-03-03 15:13:12.439919511 +0100
+@@ -44,6 +44,17 @@
+ $t_query = array( 'issue_id' => $f_bug_id );
++# begin captcha check for anon user
++if ( current_user_is_anonymous() && get_gd_version() > 0 ) {
++  $f_captcha = gpc_get_string( 'captcha', '' );
++  $f_captcha = utf8_strtolower( trim( $f_captcha ) );
++
++  $t_securimage = new Securimage();
++  if( $t_securimage->check( $f_captcha ) == false ) {
++    trigger_error( ERROR_SIGNUP_NOT_MATCHING_CAPTCHA, ERROR );
++  }
++}
++
+ if( count( $f_files ) > 0 && is_blank( $f_text ) && helper_duration_to_minutes( $f_duration ) == 0 ) {
+       $t_payload = array(
+               'files' => helper_array_transpose( $f_files )
diff --git a/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff b/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff
new file mode 100644 (file)
index 0000000..a8589c7
--- /dev/null
@@ -0,0 +1,52 @@
+--- a/bugnote_add_inc.php      2018-02-10 21:29:27.000000000 +0100
++++ b/bugnote_add_inc.php      2018-03-03 15:14:27.332428557 +0100
+@@ -119,6 +119,49 @@
+                                       <textarea name="bugnote_text" id="bugnote_text" class="<?php echo $t_bugnote_class ?>" rows="7"></textarea>
+                               </td>
+                       </tr>
++<?php
++      # captcha image requires GD library and related option to ON
++      if( current_user_is_anonymous() && get_gd_version() > 0 ) {
++              $t_securimage_path = 'vendor/dapphp/securimage';
++              $t_securimage_show = $t_securimage_path . '/securimage_show.php';
++              $t_securimage_play = $t_securimage_path . '/securimage_play.swf?'
++                      . http_build_query( array(
++                              'audio_file' => $t_securimage_path . '/securimage_play.php',
++                              'bgColor1=' => '#fff',
++                              'bgColor2=' => '#fff',
++                              'iconColor=' => '#777',
++                              'borderWidth=' => 1,
++                              'borderColor=' => '#000',
++                      ) );
++?>
++      <tr>
++              <th class="category">CAPTCHA</th>
++              <td>
++
++                              <label for="captcha-field" class="block clearfix">
++                                      <strong><?php echo lang_get( 'signup_captcha_request_label' ); ?></strong>
++                              </label>
++                              <span id="captcha-input" class="input">
++                                      <?php print_captcha_input( 'captcha' ); ?>
++
++                                      <span id="captcha-image" class="captcha-image" style="padding-right:3px;">
++                                              <img src="<?php echo $t_securimage_show; ?>" alt="visual captcha" />
++                                              <ul id="captcha-refresh"><li><a href="#"><?php
++                                                      echo lang_get( 'signup_captcha_refresh' );
++                                              ?></a></li></ul>
++                                      </span>
++
++                                      <object type="application/x-shockwave-flash" width="19" height="19"
++                                              data="<?php echo $t_securimage_play; ?>">
++                                              <param name="movie" value="<?php echo $t_securimage_play; ?>" />
++                                      </object>
++                              </span>
++                </td>
++        </tr>
++<?php
++                      }
++?>
++
+ <?php
+       if( config_get( 'time_tracking_enabled' ) ) {
diff --git a/pkgs/webapps/mantisbt_2/default.nix b/pkgs/webapps/mantisbt_2/default.nix
new file mode 100644 (file)
index 0000000..bb2aad3
--- /dev/null
@@ -0,0 +1,41 @@
+{ mantis_config ? "/etc/mantisbt/config_inc.php", stdenv, fetchurl }:
+let
+  withPlugins = plugins: package.overrideAttrs(old: {
+    name = "${old.name}-with-plugins";
+    installPhase = old.installPhase + (
+      builtins.concatStringsSep "\n" (
+        map (value: if builtins.hasAttr "selector" value then
+            "ln -sf ${value}/${value.selector} $out/plugins/"
+          else
+            "ln -sf ${value} $out/plugins/${value.pluginName}"
+        ) plugins
+      ));
+    passthru = old.passthru // {
+      inherit plugins;
+      withPlugins = morePlugins: old.withPlugins (morePlugins ++ plugins);
+    };
+  });
+  package = stdenv.mkDerivation rec {
+    name = "mantisbt-${version}";
+    version = "2.21.0";
+    src = fetchurl {
+      url = "https://downloads.sourceforge.net/project/mantisbt/mantis-stable/${version}/${name}.tar.gz";
+      sha256 = "13lx569dp1gibq5daqp7dj6gsqic85rrix1s7xkp60gwpzk8wiw5";
+    };
+    patches = [
+      ./bug_report.php.diff
+      ./bug_report_page.php.diff
+      ./bugnote_add.php.diff
+      ./bugnote_add_inc.php.diff
+    ];
+    installPhase = ''
+    cp -a . $out
+    ln -s ${mantis_config} $out/config/config_inc.php
+    '';
+
+    passthru = {
+      plugins = [];
+      inherit withPlugins;
+    };
+  };
+in package
diff --git a/pkgs/webapps/mantisbt_2/plugins/slack/default.nix b/pkgs/webapps/mantisbt_2/plugins/slack/default.nix
new file mode 100644 (file)
index 0000000..61ed15f
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  passthru = {
+    pluginName = "Slack";
+  };
+  version = "9286d2e-master";
+  name = "mantisbt-plugin-slack-${version}";
+  src = fetchFromGitHub {
+    owner = "mantisbt-plugins";
+    repo = "Slack";
+    rev = "9286d2eeeb8a986ed949e378711fef5f0bf182dc";
+    sha256 = "0nn0v4jc967giilkzrppi5svd04m2hnals75xxp0iabcdjnih0mn";
+  };
+  installPhase = ''
+          sed -i -e "s/return '@' . \\\$username;/return \\\$username;/" Slack.php
+          cp -a . $out
+  '';
+}
diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff b/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff
new file mode 100644 (file)
index 0000000..c355144
--- /dev/null
@@ -0,0 +1,12 @@
+--- b/Source/Source.API.php    2017-09-18 00:50:32.000000000 +0200
++++ a/Source/Source.API.php    2018-03-04 19:00:25.578889039 +0100
+@@ -452,6 +452,9 @@
+       # Allow other plugins to post-process commit data
+       event_signal( 'EVENT_SOURCE_COMMITS', array( $p_changesets ) );
+       event_signal( 'EVENT_SOURCE_FIXED', array( $t_fixed_bugs ) );
++      foreach( $t_fixed_bugs as $t_bug_id => $t_changeset ) {
++          event_signal( 'EVENT_BUG_ACTION', array('RESOLVE', $t_bug_id) );
++        }
+ }
+ /**
diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix b/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
new file mode 100644 (file)
index 0000000..dc6c7de
--- /dev/null
@@ -0,0 +1,21 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  version = "v2.2.0";
+  name = "mantisbt-plugin-source-integration-${version}";
+  src = fetchFromGitHub {
+    owner = "mantisbt-plugins";
+    repo = "source-integration";
+    rev = "44fc9e2e770aff4f40f56833f26a86ce0e2deb76";
+    sha256 = "0gcm6kqqijnv303sk59zn27adwx5vkr545mwzyaq2nrpxnkwdy5b";
+  };
+  patches = [
+    ./Source.API.php.diff
+  ];
+  installPhase = ''
+    mkdir $out
+    cp -a Source* $out/
+    '';
+  passthru = {
+    selector = "Source*";
+  };
+}
diff --git a/pkgs/webapps/mastodon/default.nix b/pkgs/webapps/mastodon/default.nix
new file mode 100644 (file)
index 0000000..12e4c2c
--- /dev/null
@@ -0,0 +1,86 @@
+{ varDir ? "/var/lib/mastodon", mylibs,
+  stdenv, writeText, runCommand,
+  ruby_2_6, bundlerEnv, defaultGemConfig,
+  jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn }:
+let
+  gems = bundlerEnv {
+    name = "mastodon-env";
+    ruby = ruby_2_6;
+    gemset = ./gemset.nix;
+    gemdir = (mylibs.fetchedGithub ./mastodon.json).src;
+    groups = [ "default" "production" "test" "development" ];
+    gemConfig = defaultGemConfig // {
+      redis-rack = attrs: {
+        preBuild = ''
+          sed -i 's!s\.files.*!!' redis-rack.gemspec
+          '';
+      };
+      tzinfo = attrs: {
+        preBuild = ''
+          sed -i 's!s\.files.*!!' tzinfo.gemspec
+          '';
+      };
+      cld3 = attrs: {
+        buildInputs = [ protobuf protobufc pkgconfig ];
+      };
+      idn-ruby = attrs: {
+        buildInputs = [ libidn ];
+      };
+      rpam2 = attrs: {
+        buildInputs = [ pam ];
+      };
+    };
+  };
+  yarnModules = let
+    info = mylibs.fetchedGithub ./mastodon.json;
+    packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
+      cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out
+      '';
+  in
+    mylibs.yarn2nixPackage.mkYarnModules rec {
+      name = "mastodon-yarn";
+      pname = name;
+      version = info.version;
+      packageJSON = packagejson;
+      yarnLock = "${info.src}/yarn.lock";
+      yarnNix = ./yarn-packages.nix;
+      pkgConfig = {
+        all = {
+          buildInputs = [ mylibs.yarn2nixPackage.src ];
+        };
+        uws = {
+          postInstall = ''
+            npx node-gyp rebuild > build_log.txt 2>&1 || true
+            '';
+        };
+      };
+    };
+  mastodon_with_yarn = stdenv.mkDerivation (mylibs.fetchedGithub ./mastodon.json // rec {
+    installPhase = ''
+      cp -a . $out
+      cp -a ${yarnModules}/node_modules $out
+    '';
+    buildInputs = [ yarnModules ];
+  });
+in
+stdenv.mkDerivation {
+  name = "mastodon";
+  inherit mastodon_with_yarn;
+  builder = writeText "build_mastodon" ''
+      source $stdenv/setup
+      set -a
+      SECRET_KEY_BASE=Dummy
+      OTP_SECRET=Dummy
+      set +a
+      cp -a $mastodon_with_yarn $out
+      cd $out
+      chmod u+rwX . public
+      chmod -R u+rwX config/
+      sed -i -e 's@^end$@  config.action_mailer.sendmail_settings = { location: ENV.fetch("SENDMAIL_LOCATION", "/usr/sbin/sendmail") }\nend@' config/environments/production.rb
+      RAILS_ENV=production ${gems}/bin/rails assets:precompile
+      rm -rf tmp/cache
+      ln -sf ${varDir}/tmp/cache tmp
+  '';
+  buildInputs = [ gems gems.ruby nodejs yarn ];
+  passthru = { inherit gems varDir; };
+}
diff --git a/pkgs/webapps/mastodon/gemset.nix b/pkgs/webapps/mastodon/gemset.nix
new file mode 100644 (file)
index 0000000..9bd2cd3
--- /dev/null
@@ -0,0 +1,2867 @@
+{
+  actioncable = {
+    dependencies = ["actionpack" "nio4r" "websocket-driver"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0826k5ch0l03f9yrkxy69aiv039z4qi00lnahw2rzywd2iz6r68x";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  actionmailer = {
+    dependencies = ["actionpack" "actionview" "activejob" "mail" "rails-dom-testing"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sfpb8s95cmkpp9ybyp2c88r55r5llscmmnkfwcwgasz9ncjiq5n";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  actionpack = {
+    dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iwhbqqn0cm39dq040iwq8cfyclqk3kyzwlp5k3j5cz8k2668wws";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  actionview = {
+    dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lz04drbi1z0xhvb8jnr14pbf505lilr02arahxq7y3mxiz0rs8z";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  active_model_serializers = {
+    dependencies = ["actionpack" "activemodel" "case_transform" "jsonapi-renderer"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02snasjwg3q2ar0m6c53ilc5lamx796hm37apk7jf6cx0x3kwzx9";
+      type = "gem";
+    };
+    version = "0.10.8";
+  };
+  active_record_query_trace = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1aharmy1fcd0plv9k0i2dk5icvnlww8n43ia8xahfkcask0cpidh";
+      type = "gem";
+    };
+    version = "1.5.4";
+  };
+  activejob = {
+    dependencies = ["activesupport" "globalid"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jjkl62x2aprg55x9rpm0h2c82vr2qr989hg3l9r21l01q4822ir";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  activemodel = {
+    dependencies = ["activesupport"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xmwi3mw8g4shbjvkhk72ra3r5jccbdsd4piphqka2y1h8s7sxvi";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  activerecord = {
+    dependencies = ["activemodel" "activesupport" "arel"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19a0sns6a5wz2wym25lb1dv4lbrrl5sd1n15s5ky2636znmhz30y";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  activestorage = {
+    dependencies = ["actionpack" "activerecord" "marcel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c72837098sw384vk6dmrb2p7q3wx4swnibk6sw9dp4hn1vc4p31";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  activesupport = {
+    dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iya7vxqwxysr74s7b4z1x19gmnx5advimzip3cbmsd5bd43wfgz";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  addressable = {
+    dependencies = ["public_suffix"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bcm2hchn897xjhqj9zzsxf3n9xhddymj4lsclz508f4vw3av46l";
+      type = "gem";
+    };
+    version = "2.6.0";
+  };
+  airbrussh = {
+    dependencies = ["sshkit"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yp1sl5n94ksxpwmaajflbdls45s81hw4spgz01h19xs2zrvv8wl";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  annotate = {
+    dependencies = ["activerecord" "rake"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l69l2kn06nkrnyq6gb1x322x5raxs8ms60shpf0v5dsi8lfig16";
+      type = "gem";
+    };
+    version = "2.7.4";
+  };
+  arel = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jk7wlmkr61f6g36w9s2sn46nmdg6wn2jfssrhbhirv5x9n95nk0";
+      type = "gem";
+    };
+    version = "9.0.0";
+  };
+  ast = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "184ssy3w93nkajlz2c70ifm79jp3j737294kbc5fjw69v1w0n9x7";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  attr_encrypted = {
+    dependencies = ["encryptor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ncv2az1zlj33bsllr6q1qdvbw42gv91lxq0ryclbv8l8xh841jg";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  av = {
+    dependencies = ["cocaine"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1swakpybf6g0nzfdn6q4s9c97ysc3i4ffk84dw8v2321fpvc8gqq";
+      type = "gem";
+    };
+    version = "0.9.0";
+  };
+  aws-eventstream = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gdiwkg24jpx5f3bkw6vchgliicn6v9bpm09j0dldaxsca66q0wy";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  aws-partitions = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v6ksvawcmi5m0sc3qpcvziidzhkxlcaqs851yvvq2s2r5hgdfgb";
+      type = "gem";
+    };
+    version = "1.131.0";
+  };
+  aws-sdk-core = {
+    dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xaaqsy4lpgydg8drjnax62azjmnfpvfz9jk3ca333mdri6c6bvm";
+      type = "gem";
+    };
+    version = "3.45.0";
+  };
+  aws-sdk-kms = {
+    dependencies = ["aws-sdk-core" "aws-sigv4"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "195f12iygwlxj720gyikggdlxgfh4j371qa8dn7x4kwgq732b1fn";
+      type = "gem";
+    };
+    version = "1.13.0";
+  };
+  aws-sdk-s3 = {
+    dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mpf7v5n19ymq585xr0s47d9hcjc6crx5vi99s2ivcl79k1xj87d";
+      type = "gem";
+    };
+    version = "1.30.1";
+  };
+  aws-sigv4 = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hzndv113i6bgy2n72i5l3mwn8vjnb6hhjxfkpn9mm2p5ra77yk7";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  bcrypt = {
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ysblqxkclmnhrd0kmb5mr8p38mbar633gdsb14b7dhkhgawgzfy";
+      type = "gem";
+    };
+    version = "3.1.12";
+  };
+  benchmark-ips = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w59c4qnwkjqwn7zyp9hshslbshna77vknmz43h0va5lxisd6ai2";
+      type = "gem";
+    };
+    version = "2.7.2";
+  };
+  better_errors = {
+    dependencies = ["coderay" "erubi" "rack"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pqnxxsqqs7vnqvamk5bzs84dv584g9s0qaf2vqb1v2aj5dabcg7";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  binding_of_caller = {
+    dependencies = ["debug_inspector"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05syqlks7463zsy1jdfbbdravdhj9hpj5pv2m74blqpv8bq4vv5g";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  bootsnap = {
+    dependencies = ["msgpack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0g6r784lmjfhwi046w82phsk244byq9wkj1q3lddwxg9z559bmhy";
+      type = "gem";
+    };
+    version = "1.3.2";
+  };
+  brakeman = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fg37qknz1f10v4fgbn1s98gks0iimsgs1c8xra2jy16kpz4q86k";
+      type = "gem";
+    };
+    version = "4.4.0";
+  };
+  browser = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sdx0ny34i6vqxdsc7sy9g0nafdbrw8kvvb5xh9m18x1bzpqk92f";
+      type = "gem";
+    };
+    version = "2.5.3";
+  };
+  builder = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qibi5s67lpdv1wgcj66wcymcr04q6j4mzws6a479n0mlrmh5wr1";
+      type = "gem";
+    };
+    version = "3.2.3";
+  };
+  bullet = {
+    dependencies = ["activesupport" "uniform_notifier"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fhsq5r9xc3cb32zr21hnsb2zmwbkck7xjvds9ny4inhykrjg47m";
+      type = "gem";
+    };
+    version = "5.9.0";
+  };
+  bundler-audit = {
+    dependencies = ["thor"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pm22xpn3xyymsainixnrk8v3l3xi9bzwkjkspx00cfzp84xvxbq";
+      type = "gem";
+    };
+    version = "0.6.1";
+  };
+  byebug = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10znc1hjv8n686hhpl08f3m2g6h08a4b83nxblqwy2kqamkxcqf8";
+      type = "gem";
+    };
+    version = "10.0.2";
+  };
+  capistrano = {
+    dependencies = ["airbrussh" "i18n" "rake" "sshkit"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p1hj8hpmplxl41y6phsvkw2k8x3yxmkngs8yl8gkr7c1ma870p4";
+      type = "gem";
+    };
+    version = "3.11.0";
+  };
+  capistrano-bundler = {
+    dependencies = ["capistrano" "sshkit"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p00rw2886v77kfjnh0mslyrv4lij5fa9niflz1lhynzlivgrmdr";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  capistrano-rails = {
+    dependencies = ["capistrano" "capistrano-bundler"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19j82kiarrph1ilw2xfhfj62z0b53w0gph7613b21iccb2gn3dqy";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  capistrano-rbenv = {
+    dependencies = ["capistrano" "sshkit"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "182dmsliny87b74m9mxi7farmp03ycqh30yf58b2kcx7m2js2s92";
+      type = "gem";
+    };
+    version = "2.1.4";
+  };
+  capistrano-yarn = {
+    dependencies = ["capistrano"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zdg2s061vl5b8114n909mrjb2hc1qx0i4wqx9nacsrcjgyp07l9";
+      type = "gem";
+    };
+    version = "2.0.2";
+  };
+  capybara = {
+    dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lhif97mh6wlqf14lwgvyjipm7ip6dz3svwgs52kgd5p3qb6hy2b";
+      type = "gem";
+    };
+    version = "3.12.0";
+  };
+  case_transform = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fzyws6spn5arqf6q604dh9mrj84a36k5hsc8z7jgcpfvhc49bg2";
+      type = "gem";
+    };
+    version = "0.2";
+  };
+  charlock_holmes = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nf1l31n10yaark2rrg5qzyzcx9w80681449s3j09qmnipsl8rl5";
+      type = "gem";
+    };
+    version = "0.7.6";
+  };
+  chewy = {
+    dependencies = ["activesupport" "elasticsearch" "elasticsearch-dsl"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m1n98fww2is9v4h73qnxjzs0l9ixx2szby5rip26g9l7mjwmm7v";
+      type = "gem";
+    };
+    version = "5.0.0";
+  };
+  chunky_png = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05g2xli9wbjylkmblln3bhvjalziwb92q452q8ibjagmb853424w";
+      type = "gem";
+    };
+    version = "1.3.10";
+  };
+  cld3 = {
+    dependencies = ["ffi"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a3q025jqfwf8id1g40cv7s5pn7mdwzjpgqyzhdxdci1ps5ycgmn";
+      type = "gem";
+    };
+    version = "3.2.3";
+  };
+  climate_control = {
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  cocaine = {
+    dependencies = ["climate_control"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01kk5xd7lspbkdvn6nyj0y51zhvia3z6r4nalbdcqw5fbsywwi7d";
+      type = "gem";
+    };
+    version = "0.5.8";
+  };
+  coderay = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15vav4bhcc2x3jmi3izb11l4d9f3xv8hp2fszb7iqmpsccv1pz4y";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  concurrent-ruby = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ixcx9pfissxrga53jbdpza85qd5f6b5nq1sfqa9rnfq82qnlbp1";
+      type = "gem";
+    };
+    version = "1.1.4";
+  };
+  connection_pool = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lflx29mlznf1hn0nihkgllzbj8xp5qasn8j7h838465pi399k68";
+      type = "gem";
+    };
+    version = "2.2.2";
+  };
+  crack = {
+    dependencies = ["safe_yaml"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abb0fvgw00akyik1zxnq7yv391va148151qxdghnzngv66bl62k";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  crass = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bpxzy6gjw9ggjynlxschbfsgmx8lv3zw1azkjvnb8b9i895dqfi";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  css_parser = {
+    dependencies = ["addressable"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gwvf8mc8gnz4aizfijplv3594998h2j44ydakpzsdmkivs07v61";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  debug_inspector = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vxr0xa1mfbkfcrn71n7c4f2dj7la5hvphn904vh20j3x4j5lrx0";
+      type = "gem";
+    };
+    version = "0.0.3";
+  };
+  derailed_benchmarks = {
+    dependencies = ["benchmark-ips" "get_process_mem" "heapy" "memory_profiler" "rack" "rake" "thor"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1c9djg1r2w461h97zmmdsdgnsrxqm4qfyp7gry9qxbav9skrplb8";
+      type = "gem";
+    };
+    version = "1.3.5";
+  };
+  devise = {
+    dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"];
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vs8nibl568ghm6a7hbw6xgcv8zbm4gykprcxpnzi7bz5d4gvcjx";
+      type = "gem";
+    };
+    version = "4.5.0";
+  };
+  devise-two-factor = {
+    dependencies = ["activesupport" "attr_encrypted" "devise" "railties" "rotp"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b61s5y1ch205lgf3xv8hcvyi27ddd0d4qbbcpnnakhn2bx16lmc";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  devise_pam_authenticatable2 = {
+    dependencies = ["devise" "rpam2"];
+    groups = ["pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13ipl52pkhc6vxp8ca31viwv01237bi2bfk3b1fixq1x46nf87p2";
+      type = "gem";
+    };
+    version = "9.2.0";
+  };
+  diff-lcs = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18w22bjz424gzafv6nzv98h0aqkwz3d9xhm7cbr1wfbyas8zayza";
+      type = "gem";
+    };
+    version = "1.3";
+  };
+  docile = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yyh4lr03q2vafzsfqy1xax7vr8zn7mbddz3ax3vnlm5fg0px6pn";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  domain_name = {
+    dependencies = ["unf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0abdlwb64ns7ssmiqhdwgl27ly40x2l27l8hs8hn0z4kb3zd2x3v";
+      type = "gem";
+    };
+    version = "0.5.20180417";
+  };
+  doorkeeper = {
+    dependencies = ["railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0488m6nwp31mxrhayj60gsb7jgyw1lzh73r2kldx00a9bw3634d4";
+      type = "gem";
+    };
+    version = "5.0.2";
+  };
+  dotenv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rgl2kqhnxqbjvi9brbvb52iaq1z8yi0pl0bawk4fm6kl9igxr8f";
+      type = "gem";
+    };
+    version = "2.6.0";
+  };
+  dotenv-rails = {
+    dependencies = ["dotenv" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1knzdflmy06bjwvi00kndcmh2bhzqna9ccmz9mbyc3xc0v5jr9h8";
+      type = "gem";
+    };
+    version = "2.6.0";
+  };
+  elasticsearch = {
+    dependencies = ["elasticsearch-api" "elasticsearch-transport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0a08ynvxz5clfm2ndqpgjrv4aiga9m2y1ab34s3qkihdfdzdzhj8";
+      type = "gem";
+    };
+    version = "6.0.2";
+  };
+  elasticsearch-api = {
+    dependencies = ["multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vkahknqn85vvwr1gzh8jf3pvdial0c0d524icg8x06vibqgzd5h";
+      type = "gem";
+    };
+    version = "6.0.2";
+  };
+  elasticsearch-dsl = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mwn6hvkki560p7sfc841q15zzgldsk9lzm2mlvc2bra7x1yk2q8";
+      type = "gem";
+    };
+    version = "0.1.5";
+  };
+  elasticsearch-transport = {
+    dependencies = ["faraday" "multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gpwbw70qisx681j1bw8xq6shg5kdxmcdzg6425af0b5881jg7iy";
+      type = "gem";
+    };
+    version = "6.0.2";
+  };
+  encryptor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0s8rvfl0vn8w7k1sgkc234060jh468s3zd45xa64p1jdmfa3zwmb";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  equatable = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sjm9zjakyixyvsqziikdrsqfzis6j3fq23crgjkp6fwkfgndj7x";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  erubi = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kagnf6ziahj0d781s6ryy6fwqwa3ad4xbzzj84p9m4nv4c2jir1";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  et-orbi = {
+    dependencies = ["tzinfo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wk7i0bmsy46la8gcvbmdns0ni8lmdqas838phj97bdwykxw8m4b";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  excon = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15l9w0938c19nxmrp09n75qpmm64k12xj69h47yvxzcxcpbgnkb2";
+      type = "gem";
+    };
+    version = "0.62.0";
+  };
+  fabrication = {
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0an28kjand4mjbkmnwd9fmgq3y5vf717zpmiijavar3sxqj52zri";
+      type = "gem";
+    };
+    version = "2.20.1";
+  };
+  faker = {
+    dependencies = ["i18n"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01q7wrk5bl0c0qrvg2my3kl0mbfnj1jpd89mqm3fzy4ggbkdhh7i";
+      type = "gem";
+    };
+    version = "1.9.1";
+  };
+  faraday = {
+    dependencies = ["multipart-post"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dv1vcxxyw4vy0r2diiml0r8zqk1csrksfxv8nkrw61xlf2daaaa";
+      type = "gem";
+    };
+    version = "0.15.0";
+  };
+  fast_blank = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16s1ilyvwzmkcgmklbrn0c2pch5n02vf921njx0bld4crgdr6z56";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  fastimage = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iy9jm13r2r4yz41xaivhxs8mvqn57fjwihxvazbip002mq6rxfz";
+      type = "gem";
+    };
+    version = "2.1.5";
+  };
+  ffi = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jpm2dis1j7zvvy3lg7axz9jml316zrn7s0j59vyq3qr127z0m7q";
+      type = "gem";
+    };
+    version = "1.9.25";
+  };
+  fog-core = {
+    dependencies = ["builder" "excon" "formatador" "mime-types"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1agd6xgzk0rxrsjdpn94v4hy89s0nm2cs4zg2p880w2dan9xgrak";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  fog-json = {
+    dependencies = ["fog-core" "multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  fog-openstack = {
+    dependencies = ["fog-core" "fog-json" "ipaddress"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0aphjrvmchmqbyxqq82yj0qngyvkmwdci9iqs8722fi23bk83gdl";
+      type = "gem";
+    };
+    version = "0.3.7";
+  };
+  formatador = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  fugit = {
+    dependencies = ["et-orbi" "raabro"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1szijawzdii668z5is9xi849399gy786951dx0l5r2z5mbfqvl9i";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  fuubar = {
+    dependencies = ["rspec-core" "ruby-progressbar"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sqkr1nh49rlm86l3qyrgsdqavgqii4pnrjn7855z6dfavh3spxr";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  get_process_mem = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bvfjdign16r0zwm2rlfrq0sk1licvmlgbnlpnyckniv5r7i080g";
+      type = "gem";
+    };
+    version = "0.2.3";
+  };
+  globalid = {
+    dependencies = ["activesupport"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02smrgdi11kziqi9zhnsy9i6yr2fnxrqlv3lllsvdjki3cd4is38";
+      type = "gem";
+    };
+    version = "0.4.1";
+  };
+  goldfinger = {
+    dependencies = ["addressable" "http" "nokogiri" "oj"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0n142035jhyqwczi52zjr07c8kygp9b9f158miaby3z5hygzjyzh";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  hamlit = {
+    dependencies = ["temple" "thor" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hk338vkzmwszxdh0q02iw88rbr3bj3fd7fzn4psm8wy80zcgl9i";
+      type = "gem";
+    };
+    version = "2.8.8";
+  };
+  hamlit-rails = {
+    dependencies = ["actionpack" "activesupport" "hamlit" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14gzlp6w1j3b5fb4bhbjjh24skx031vnfc2shym9bkmq3r0p8dws";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  hamster = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n1lsh96vnyc1pnzyd30f9prcsclmvmkdb3nm5aahnyizyiy6lar";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  hashdiff = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yj5l2rw8i8jc725hbcpc4wks0qlaaimr3dpaqamfjkjkxl0hjp9";
+      type = "gem";
+    };
+    version = "0.3.7";
+  };
+  hashie = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13bdzfp25c8k51ayzxqkbzag3wj5gc1jd8h7d985nsq6pn57g5xh";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  heapy = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r9f38fpgjgaxskkwvsliijj6vfmgsff9pnranvvvzkdl67hk1hw";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  highline = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "069sz5qmjpmv3x7kr5r3rwl20m9vqg97p15scmjdagglra34clkl";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  hiredis = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz";
+      type = "gem";
+    };
+    version = "0.6.3";
+  };
+  hkdf = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04fixg0a51n4vy0j6c1hvisa2yl33m3jrrpxpb5sq6j511vjriil";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  htmlentities = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj";
+      type = "gem";
+    };
+    version = "4.3.4";
+  };
+  http = {
+    dependencies = ["addressable" "http-cookie" "http-form_data" "http_parser.rb"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jlm5prw437wqpfxcigh88lfap3m7g8mnmj5as7qw6dzqnvrxwmc";
+      type = "gem";
+    };
+    version = "3.3.0";
+  };
+  http-cookie = {
+    dependencies = ["domain_name"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  http-form_data = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15lpn604byf7cyxnw949xz4rvpcknqp7a48q73nm630gqxsa76f3";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  http_accept_language = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  "http_parser.rb" = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = true;
+      rev = "54b17ba8c7d8d20a16dfc65d1775241833219cf2";
+      sha256 = "079nwjsmg9jp33afc4f5bhjdbhcnfykdw4rd7ahhz8cbdkbhlzcp";
+      type = "git";
+      url = "https://github.com/tmm1/http_parser.rb";
+    };
+    version = "0.6.1";
+  };
+  httplog = {
+    dependencies = ["rack" "rainbow"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0grdjxfdbc4cffablh64iwyszskmv5sjpjz3zkp6xjxckdr7l7jj";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "088xnnpi7hq243n44fmgqvjr0m86ivk8r87k9b3ddq3b7nl6nyf9";
+      type = "gem";
+    };
+    version = "1.5.2";
+  };
+  i18n-tasks = {
+    dependencies = ["activesupport" "ast" "erubi" "highline" "i18n" "parser" "rails-i18n" "rainbow" "terminal-table"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16592471ylgigmjx98pmbqibjwhavr4wb670kya9qh3nbgf7s1ym";
+      type = "gem";
+    };
+    version = "0.9.28";
+  };
+  idn-ruby = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07vblcyk3g72sbq12xz7xj28snpxnh3sbcnxy8bglqbfqqhvmawr";
+      type = "gem";
+    };
+    version = "0.1.0";
+  };
+  ipaddress = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45";
+      type = "gem";
+    };
+    version = "0.8.3";
+  };
+  iso-639 = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10k1gpkkbxbasgjzh4hd32ygxzjb5312rphipm46ryxkpx556zzz";
+      type = "gem";
+    };
+    version = "0.2.8";
+  };
+  jaro_winkler = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zz27z88qznix4r65gd9h56gl177snlfpgv10b0s69vi8qpl909l";
+      type = "gem";
+    };
+    version = "1.5.2";
+  };
+  jmespath = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  json = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01v6jjpvh3gnq6sgllpfqahlgxzj50ailwhj9b3cd20hi2dx0vxp";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  json-ld = {
+    dependencies = ["multi_json" "rdf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yk4gnxzwlif9d0dy7csdb9ix60h69alk139aaip6304nx2yhdsk";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  json-ld-preloaded = {
+    dependencies = ["json-ld" "multi_json" "rdf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1c3yh5ayxvz33znbmzinigc5wivicib7nnykqjf00j2f9qag18pv";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  jsonapi-renderer = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00ysmcv3nrccyimi334ida4axlfgir6cc2ryjxrf4xb97m1bfk5j";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  jwt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w0kaqrbl71cq9sbnixc20x5lqah3hs2i93xmhlfdg2y3by7yzky";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  kaminari = {
+    dependencies = ["activesupport" "kaminari-actionview" "kaminari-activerecord" "kaminari-core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1j27y5phifwpggspglmg8pmlf6n4jblxwziix9am42661c770jlm";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  kaminari-actionview = {
+    dependencies = ["actionview" "kaminari-core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1386wshpy1ygbris0s7rv7lyzbs0v8dfqkzdwsrsgm9fd1ira640";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  kaminari-activerecord = {
+    dependencies = ["activerecord" "kaminari-core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0q31ik5648xi2hpy61knnjd0m7rvs17i93gzwcbh3ccj1y24gv2x";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  kaminari-core = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cfjrhvidvgdwp9ffsm9d4c2s18k2zp3gnya3f41qb3fc6bc2q2w";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  launchy = {
+    dependencies = ["addressable"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "190lfbiy1vwxhbgn4nl4dcbzxvm049jwc158r2x7kq3g5khjrxa2";
+      type = "gem";
+    };
+    version = "2.4.3";
+  };
+  letter_opener = {
+    dependencies = ["launchy"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  letter_opener_web = {
+    dependencies = ["actionmailer" "letter_opener" "railties"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17qhwrkncrrp1bi2f7fbkm5lpnkdsiwy8jcvgr2wa97ck8y4x2bb";
+      type = "gem";
+    };
+    version = "1.3.4";
+  };
+  link_header = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yamrdq4rywmnpdhbygnkkl9fdy249fg5r851nrkkxr97gj5rihm";
+      type = "gem";
+    };
+    version = "0.0.8";
+  };
+  lograge = {
+    dependencies = ["actionpack" "activesupport" "railties" "request_store"];
+    groups = ["production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00lcn7s3slfn32di4qwlx2yj5f9r2pcnd0naxrvqqwypcg1z2sdd";
+      type = "gem";
+    };
+    version = "0.10.0";
+  };
+  loofah = {
+    dependencies = ["crass" "nokogiri"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ccsid33xjajd0im2xv941aywi58z7ihwkvaf1w2bv89vn5bhsjg";
+      type = "gem";
+    };
+    version = "2.2.3";
+  };
+  mail = {
+    dependencies = ["mini_mime"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  makara = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ri6r558nylaclqhfq1zhapfsyhryggln7gw69qb9i4c1rkfnyd2";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  marcel = {
+    dependencies = ["mimemagic"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nxbjmcyg8vlw6zwagf17l9y2mwkagmmkg95xybpn4bmf3rfnksx";
+      type = "gem";
+    };
+    version = "0.3.3";
+  };
+  mario-redis-lock = {
+    dependencies = ["redis"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1v9wdjcjqzpns2migxp4a5b4w82mipi0fwihbqz3q2qj2qm7wc17";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  memory_profiler = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qir6bc2rw6lac6fsjhnspqyr01sh12d75dkd630qknjwvrrq8kj";
+      type = "gem";
+    };
+    version = "0.9.12";
+  };
+  method_source = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pviwzvdqd90gn6y7illcdd9adapw8fczml933p5vl739dkvl3lq";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+  microformats = {
+    dependencies = ["json" "nokogiri"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14az36ax3n81fmwqjb5giixvxsnmxpnlfrsz012pl78x1bkrvfki";
+      type = "gem";
+    };
+    version = "4.0.7";
+  };
+  mime-types = {
+    dependencies = ["mime-types-data"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fjxy1jm52ixpnv3vg9ld9pr9f35gy0jp66i1njhqjvmnvq0iwwk";
+      type = "gem";
+    };
+    version = "3.2.2";
+  };
+  mime-types-data = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07wvp0aw2gjm4njibb70as6rh5hi1zzri5vky1q6jx95h8l56idc";
+      type = "gem";
+    };
+    version = "3.2018.0812";
+  };
+  mimemagic = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00ibc1mhvdfyfyl103xwb45621nwyqxf124cni5hyfhag0fn1c3q";
+      type = "gem";
+    };
+    version = "0.3.2";
+  };
+  mini_mime = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q4pshq387lzv9m39jv32vwb8wrq3wc4jwgl4jk209r4l33v09d3";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  mini_portile2 = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  minitest = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0icglrhghgwdlnzzp4jf76b0mbc71s80njn5afyfjn4wqji8mqbq";
+      type = "gem";
+    };
+    version = "5.11.3";
+  };
+  msgpack = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09xy1wc4wfbd1jdrzgxwmqjzfdfxbz0cqdszq2gv6rmc3gv1c864";
+      type = "gem";
+    };
+    version = "1.2.4";
+  };
+  multi_json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rl0qy4inf1mp8mybfk56dfga0mvx97zwpmq5xmiwl5r770171nv";
+      type = "gem";
+    };
+    version = "1.13.1";
+  };
+  multipart-post = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  necromancer = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v9nhdkv6zrp7cn48xv7n2vjhsbslpvs0ha36mfkcd56cp27pavz";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  net-ldap = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "016igqz81a8zcwqzp5bbhryqmb2skmyf57ij3nb5z8sxwhw22jgh";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  net-scp = {
+    dependencies = ["net-ssh"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b0jqrcsp4bbi4n4mzyf70cp2ysyp6x07j8k8cqgxnvb4i3a134j";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  net-ssh = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qfanf71yv8w7yl9l9wqcy68i2x1ghvnf8m581yy4pl0anfdhqw8";
+      type = "gem";
+    };
+    version = "5.0.2";
+  };
+  nio4r = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a41ca1kpdmrypjp9xbgvckpy8g26zxphkja9vk7j5wl4n8yvlyr";
+      type = "gem";
+    };
+    version = "2.3.1";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09zll7c6j7xr6wyvh5mm5ncj6pkryp70ybcsxdbw1nyphx5dh184";
+      type = "gem";
+    };
+    version = "1.10.1";
+  };
+  nokogumbo = {
+    dependencies = ["nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qr7r2ysbp8b5q78yr8l5qpaxfqdw1i2yz6nsrbavdki8mqjgj24";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  nsa = {
+    dependencies = ["activesupport" "concurrent-ruby" "sidekiq" "statsd-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1i1bhmvs49yv70pgl41lx1lr8x6whg52szb8ic1jb6wmmxr2ylcz";
+      type = "gem";
+    };
+    version = "0.2.7";
+  };
+  oj = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0swv2ryjgbcyrisb2arf88rz0pf8d8f8g7iihc2fhz96a1h985n0";
+      type = "gem";
+    };
+    version = "3.7.8";
+  };
+  omniauth = {
+    dependencies = ["hashie" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p16h1rp8by05k8gfw17xjhgwp60dk8qmj1xalv1n23kmxfsxb1x";
+      type = "gem";
+    };
+    version = "1.9.0";
+  };
+  omniauth-cas = {
+    dependencies = ["addressable" "nokogiri" "omniauth"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nnk7cr45aj7hj19zpky58yysvjg8mn5f45sj9knpn5f9kgld7p4";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  omniauth-saml = {
+    dependencies = ["omniauth" "ruby-saml"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pg3pw4yjd9w1rn3lkycllrvd767pydbhldgdcqbbcck01asfcfz";
+      type = "gem";
+    };
+    version = "1.10.1";
+  };
+  orm_adapter = {
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  ostatus2 = {
+    dependencies = ["addressable" "http" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fj27nr38g5y52s755pmg5zifwc6n88bw2zmkc22kg4vrhs64k19";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  ox = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15vkq18fp58504ld9vfakisxdmp68pk5y1bmmm5g7b0q25p8z5pq";
+      type = "gem";
+    };
+    version = "2.10.0";
+  };
+  paperclip = {
+    dependencies = ["activemodel" "activesupport" "mime-types" "mimemagic" "terrapin"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04mlw7aqj20ry0fy92gxnxg99hy5xczff7rhywfzz4mqlhc2wgg7";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  paperclip-av-transcoder = {
+    dependencies = ["av" "paperclip"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gcnp3fpdb5lqilcij4yqga6397nb7zyyf9lzxnqpbp7cvc18lhf";
+      type = "gem";
+    };
+    version = "0.6.4";
+  };
+  parallel = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "005shcy8dabc7lwydpkbhd3fx8bfqzvsj6g04r90mx0wky10lz84";
+      type = "gem";
+    };
+    version = "1.13.0";
+  };
+  parallel_tests = {
+    dependencies = ["parallel"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13qgd5ajq1vm3ks8fl9vs4w4lx4s7ilm74w6vbyzi952mp6h4n2x";
+      type = "gem";
+    };
+    version = "2.27.1";
+  };
+  parser = {
+    dependencies = ["ast"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hhz2k5417vr2k1llwqgjdnmyrhlpqicy0y2arr6r1gp04fg9wlm";
+      type = "gem";
+    };
+    version = "2.6.0.0";
+  };
+  pastel = {
+    dependencies = ["equatable" "tty-color"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yf30d9kzpm96gw9kwbv31p0qigwfykn8qdis5950plnzgc1vlp1";
+      type = "gem";
+    };
+    version = "0.7.2";
+  };
+  pg = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fmnyxcyrvgdbgq7m09whgn9i8rwfybk0w8aii1nc4g5kqw0k2jy";
+      type = "gem";
+    };
+    version = "1.1.4";
+  };
+  pghero = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nvg9jwynnw3brignq6raka0abrcjmm8mr8yxhvybjpmr6lyyjrd";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  pkg-config = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hhzz9q3c90bjh5ncq2rvw1gszkw6kq3zxjy5pdbha23p01v6fv8";
+      type = "gem";
+    };
+    version = "1.3.2";
+  };
+  posix-spawn = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = false;
+      rev = "58465d2e213991f8afb13b984854a49fcdcc980c";
+      sha256 = "1mq284bps0y4yfwkhvj2j27g6lpzfhzw1bypim1a0n1js7j54vhk";
+      type = "git";
+      url = "https://github.com/rtomayko/posix-spawn";
+    };
+    version = "0.3.13";
+  };
+  powerpack = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r51d67wd467rpdfl6x43y84vwm8f5ql9l9m85ak1s2sp3nc5hyv";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  premailer = {
+    dependencies = ["addressable" "css_parser" "htmlentities"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xrhmialxn5vlp1nmf40a4db9gji4h2wbzd7f43sz64z8lvrjj6h";
+      type = "gem";
+    };
+    version = "1.11.1";
+  };
+  premailer-rails = {
+    dependencies = ["actionmailer" "premailer"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1avh2bkhabicf1zxla8z6ig5192h3vdzli4d2y9wmxfwgh549lmx";
+      type = "gem";
+    };
+    version = "1.10.2";
+  };
+  private_address_check = {
+    groups = ["production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05phz0vscfh9chv90yc9091pifw3cpwkh76flnhrmvja1q3na4cy";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  pry = {
+    dependencies = ["coderay" "method_source"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00rm71x0r1jdycwbs83lf9l6p494m99asakbvqxh8rz7zwnlzg69";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  pry-byebug = {
+    dependencies = ["byebug" "pry"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y2758593i2ij0nhmv0j1pbdfx2cgi52ns6wkij0frgnk2lf650g";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  pry-rails = {
+    dependencies = ["pry"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cf4ii53w2hdh7fn8vhqpzkymmchjbwij4l3m7s6fsxvb9bn51j6";
+      type = "gem";
+    };
+    version = "0.3.9";
+  };
+  public_suffix = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08q64b5br692dd3v0a9wq9q5dvycc6kmiqmjbdxkxbfizggsvx6l";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  puma = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1k7dqxnq0dnf5rxkgs9rknclkn3ah7lsdrk6nrqxla8qzy31wliq";
+      type = "gem";
+    };
+    version = "3.12.0";
+  };
+  pundit = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rqnll033ya64qvknbmnq076q9mxaibvcd7q70jhkpjda1xi4703";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  raabro = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xzdmbn48753f6k0ckirp8ja5p0xn1a92wbwxfyggyhj0hza9ylq";
+      type = "gem";
+    };
+    version = "1.1.6";
+  };
+  rack = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pcgv8dv4vkaczzlix8q3j68capwhk420cddzijwqgi2qb4lm1zm";
+      type = "gem";
+    };
+    version = "2.0.6";
+  };
+  rack-attack = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11y6kw7hj2z25ba67www6qap7shj2bp6s43h57cn4yrid9kbsibs";
+      type = "gem";
+    };
+    version = "5.4.2";
+  };
+  rack-cors = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1j27vy1bmhbqcyzhxg8d07qassmax769xjalfwcwz6qfiq8cf013";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15167q25rmxipqwi6hjqj3i1byi9iwl3xq9b7mdar7qiz39pmjsk";
+      type = "gem";
+    };
+    version = "2.0.5";
+  };
+  rack-proxy = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1igdsim4ifyx9rfcjbxcwmf2vnxca3f8wmr2sj9j118a21g455pp";
+      type = "gem";
+    };
+    version = "0.6.4";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  rails = {
+    dependencies = ["actioncable" "actionmailer" "actionpack" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1m9cszds68dsiycciiayd3c9g90s2yzn1izkr3gpgqkfw6dmvzyr";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  rails-controller-testing = {
+    dependencies = ["actionpack" "actionview" "activesupport"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1m1rklj6pvzi4fydxcmcv4q0xd7913hhhw1hw530nfz1wkl7vjlf";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  rails-dom-testing = {
+    dependencies = ["activesupport" "nokogiri"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  rails-html-sanitizer = {
+    dependencies = ["loofah"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gv7vr5d9g2xmgpjfq4nxsqr70r9pr042r9ycqqnfvw5cz9c7jwr";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  rails-i18n = {
+    dependencies = ["i18n" "railties"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05lkhc737a9dw0hd5ljmja0yp4cw39r3200s1r0n4bs7z1g3ka7l";
+      type = "gem";
+    };
+    version = "5.1.2";
+  };
+  rails-settings-cached = {
+    dependencies = ["rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wyhyls0aqb1iw7mnaldg39w3mnbi3anmpbvb52rjwkpj2mchhnc";
+      type = "gem";
+    };
+    version = "0.6.6";
+  };
+  railties = {
+    dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00pnylmbz4c46mxw5lhxi8h39lndfg6fs1hpd0qd6swnjhkqsr1l";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  rainbow = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  rake = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sy5a7nh6xjdc9yhcw31jji7ssrf9v5806hn95gbrzr998a2ydjn";
+      type = "gem";
+    };
+    version = "12.3.2";
+  };
+  rb-fsevent = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lm1k7wpz69jx7jrc92w3ggczkjyjbfziq5mg62vjnxmzs383xx8";
+      type = "gem";
+    };
+    version = "0.10.3";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yfsgw5n7pkpyky6a9wkf1g9jafxb0ja7gz0qw0y14fd2jnzfh71";
+      type = "gem";
+    };
+    version = "0.9.10";
+  };
+  rdf = {
+    dependencies = ["hamster" "link_header"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ylgsspdj2g0af0pgfi1ry50x8ng5069223238vg8kz0p7b24q79";
+      type = "gem";
+    };
+    version = "3.0.9";
+  };
+  rdf-normalize = {
+    dependencies = ["rdf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h8qk3x5frqbgb4gj9ga75ddls47x8qhghscgz82gfq76m4r45g0";
+      type = "gem";
+    };
+    version = "0.3.3";
+  };
+  redis = {
+    groups = ["default" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rk6mmy3y2jd34llrf591ribl1p54ghkw7m96wrbamy8fwva5zqv";
+      type = "gem";
+    };
+    version = "4.1.0";
+  };
+  redis-actionpack = {
+    dependencies = ["actionpack" "redis-rack" "redis-store"];
+    groups = ["default" "production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15k41gz7nygd4yydk2yd25gghya1j7q6zifk4mdrra6bwnwjbm63";
+      type = "gem";
+    };
+    version = "5.0.2";
+  };
+  redis-activesupport = {
+    dependencies = ["activesupport" "redis-store"];
+    groups = ["default" "production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rq5dhrzc1l8c7f5gx9r7mvnsk5206dfwih3yv5si5rf42nx2ay5";
+      type = "gem";
+    };
+    version = "5.0.4";
+  };
+  redis-namespace = {
+    dependencies = ["redis"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r7daagrjjribn098dxwbv9zivrbq2rsffbkj2ccxyn9lmjjbgah";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  redis-rack = {
+    dependencies = ["rack" "redis-store"];
+    groups = ["default" "production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0px0wv8zripc6lrn3k0k61j6nlxda145q8sz50yvnig17wlk36gb";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  redis-rails = {
+    dependencies = ["redis-actionpack" "redis-activesupport" "redis-store"];
+    groups = ["production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hjvkyaw5hgz7v6fgwdk8pb966z44h1gv8jarmb0gwhkqmjnsh40";
+      type = "gem";
+    };
+    version = "5.0.2";
+  };
+  redis-store = {
+    dependencies = ["redis"];
+    groups = ["default" "production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cpg4fmqcyl8mm77l852xsidp8384a7s1mgbpki999swvq97svi4";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  regexp_parser = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18g5jyg3blsdrz3mc8d87bms6qqn6gcdh1nvdhvgbjdpk9pw21dq";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  request_store = {
+    dependencies = ["rack"];
+    groups = ["default" "production"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1963330z03fk382fi8y231ygcbnh86m91dqlp5rh1mwy9ihzzl6d";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  responders = {
+    dependencies = ["actionpack" "railties"];
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rhdyyvvm26f2l3fgwdp6xasfl2y0whwgy766bhdwz697mf78zfn";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rotp = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w8d6svhq3y9y952r8cqirxvdx12zlkb7zxjb44bcbidb2sisy4d";
+      type = "gem";
+    };
+    version = "2.1.2";
+  };
+  rpam2 = {
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zvli3s4z1hf2l7gyfickm5i3afjrnycc3ihbiax6ji6arpbyf33";
+      type = "gem";
+    };
+    version = "4.0.2";
+  };
+  rqrcode = {
+    dependencies = ["chunky_png"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h1pnnydgs032psakvg3l779w3ghbn08ajhhhw19hpmnfhrs8k0a";
+      type = "gem";
+    };
+    version = "0.10.1";
+  };
+  rspec-core = {
+    dependencies = ["rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p1s5bnbqp3sxk67y0fh0x884jjym527r0vgmhbm81w7aq6b7l4p";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-expectations = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18l21hy1zdc2pgc2yb17k3n2al1khpfr0z6pijlm852iz6vj0dkm";
+      type = "gem";
+    };
+    version = "3.8.2";
+  };
+  rspec-mocks = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06y508cjqycb4yfhxmb3nxn0v9xqf17qbd46l1dh4xhncinr4fyp";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rspec-rails = {
+    dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pf6n9l4sw1arlax1bdbm1znsvl8cgna2n6k6yk1bi8vz2n73ls1";
+      type = "gem";
+    };
+    version = "3.8.2";
+  };
+  rspec-sidekiq = {
+    dependencies = ["rspec-core" "sidekiq"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y7pbqrbc8rjszc45vg4vz9qbn8aymgcc4ribrhvm76wrfz3ksfq";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  rspec-support = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p3m7drixrlhvj2zpc38b11x145bvm311x6f33jjcxmvcm0wq609";
+      type = "gem";
+    };
+    version = "3.8.0";
+  };
+  rubocop = {
+    dependencies = ["jaro_winkler" "parallel" "parser" "powerpack" "rainbow" "ruby-progressbar" "unicode-display_width"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pq00qwlmcv52dbhgbk534ggwn1ny9k3sq3vfb1zk3r4psnqz2jy";
+      type = "gem";
+    };
+    version = "0.63.1";
+  };
+  ruby-progressbar = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cv2ym3rl09svw8940ny67bav7b2db4ms39i4raaqzkf59jmhglk";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  ruby-saml = {
+    dependencies = ["nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12f3mmyds4y8f7535p79xzx0wnp7rj02h1fp2x3j2hy5vrkmz2k4";
+      type = "gem";
+    };
+    version = "1.9.0";
+  };
+  rufus-scheduler = {
+    dependencies = ["fugit"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "074w41a88343cbv8ydkpl3firhvh3kbh8ppldhdmpvv2g569m32i";
+      type = "gem";
+    };
+    version = "3.5.2";
+  };
+  safe_yaml = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hly915584hyi9q9vgd968x2nsi5yag9jyf5kq60lwzi5scr7094";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sanitize = {
+    dependencies = ["crass" "nokogiri" "nokogumbo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rsb2gvqdh41miq7xjckidmgnjh3slvfqbp1hh4s6xfhc32r8g3s";
+      type = "gem";
+    };
+    version = "5.0.0";
+  };
+  sass = {
+    dependencies = ["sass-listen"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18c6prbw9wl8bqhb2435pd9s0lzarl3g7xf8pmyla28zblvwxmyh";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  sass-listen = {
+    dependencies = ["rb-fsevent" "rb-inotify"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xw3q46cmahkgyldid5hwyiwacp590zj2vmswlll68ryvmvcp7df";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  scss_lint = {
+    dependencies = ["rake" "sass"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dv4ff1lqbgqdx99nwg059c983dhw67kvvjd21f6vf62cjx09lpn";
+      type = "gem";
+    };
+    version = "0.57.1";
+  };
+  sidekiq = {
+    dependencies = ["connection_pool" "rack" "rack-protection" "redis"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1caiq5f5z5vzfria554n04pcbwc8zixf1fpavaksly9zywr3pc29";
+      type = "gem";
+    };
+    version = "5.2.5";
+  };
+  sidekiq-bulk = {
+    dependencies = ["sidekiq"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08nyxzmgf742irafy3l4fj09d4s5pyvsh0dzlh8y4hl51rgkh4xv";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  sidekiq-scheduler = {
+    dependencies = ["redis" "rufus-scheduler" "sidekiq" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n38p1ig8rx4ndqxcsc2gyzbaaax6r16b1xkn9mgcwwfx8qd5dbw";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  sidekiq-unique-jobs = {
+    dependencies = ["concurrent-ruby" "sidekiq" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13d58w83jx03w033mm77c42cd409by4idqca3nfbgq0bjx4hqwik";
+      type = "gem";
+    };
+    version = "6.0.8";
+  };
+  simple-navigation = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08a2s18an3br3xj5j86r33q0hrkai0y157xg67h1khdskb08yylk";
+      type = "gem";
+    };
+    version = "4.0.5";
+  };
+  simple_form = {
+    dependencies = ["actionpack" "activemodel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1221bf6glwinknrnp3pa2676ayg1yxyfa6l6lbajc72950v5mzm6";
+      type = "gem";
+    };
+    version = "4.1.0";
+  };
+  simplecov = {
+    dependencies = ["docile" "json" "simplecov-html"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sfyfgf7zrp2n42v7rswkqgk3bbwk1bnsphm24y7laxv3f8z0947";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  simplecov-html = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lihraa4rgxk8wbfl77fy9sf0ypk31iivly8vl3w04srd7i0clzn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  sprockets = {
+    dependencies = ["concurrent-ruby" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
+      type = "gem";
+    };
+    version = "3.7.2";
+  };
+  sprockets-rails = {
+    dependencies = ["actionpack" "activesupport" "sprockets"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ab42pm8p5zxpv3sfraq45b9lj39cz9mrpdirm30vywzrwwkm5p1";
+      type = "gem";
+    };
+    version = "3.2.1";
+  };
+  sshkit = {
+    dependencies = ["net-scp" "net-ssh"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1982pcckxy811gm6z9h8brkds13mrgrx8sgmdz8dq5rg1h91y0yw";
+      type = "gem";
+    };
+    version = "1.17.0";
+  };
+  stackprof = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1v7mkl4ng2is5h0glivhcjjkkj2shq1qzx9sg9shw9nn8xvg7i4w";
+      type = "gem";
+    };
+    version = "0.2.12";
+  };
+  statsd-ruby = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0djig5dnqjgww6wrw3f1mvnnjllznahlchvk4lvs4wx9qjsqpysr";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  stoplight = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1c55ar2chyivz8n6xkhyq36hgpb0b7cfqfjrcyyv9sjiyrbqyhic";
+      type = "gem";
+    };
+    version = "2.1.3";
+  };
+  streamio-ffmpeg = {
+    dependencies = ["multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nnxizc0371vwh0k6gqjj1b7fjszydpqfz549n6qn2q1pza3894z";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  strong_migrations = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0scrffkhjx14rrk5cn01vg20y3vvhzzb47a7c9wa864aq8j8kw7z";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  temple = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00nxf610nzi4n1i2lkby43nrnarvl89fcl6lg19406msr0k3ycmq";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  terminal-table = {
+    dependencies = ["unicode-display_width"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  terrapin = {
+    dependencies = ["climate_control"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p18f05r0c5s70571gqig3z2ym74wx79s6rd45sprp207bqskzn9";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  thor = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yhrnp9x8qcy5vc7g438amd5j9sw83ih7c30dr6g6slgw9zj3g29";
+      type = "gem";
+    };
+    version = "0.20.3";
+  };
+  thread_safe = {
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy";
+      type = "gem";
+    };
+    version = "0.3.6";
+  };
+  tilt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0020mrgdf11q23hm1ddd6fv691l51vi10af00f137ilcdb2ycfra";
+      type = "gem";
+    };
+    version = "2.0.8";
+  };
+  timers = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04zbs9wyzajn7g9xfgg2zqz5kzf0qa7jgh4hgry4pfcxfmlnwdwx";
+      type = "gem";
+    };
+    version = "4.2.0";
+  };
+  tty-color = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zz5xa6xbrj69h334d8nx7z732fz80s1a0b02b53mim95p80s7bk";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  tty-command = {
+    dependencies = ["pastel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d1fghdvnlc8m5i36h7gswn21232k2f9z5ls73fhs9p5ryfs4vz7";
+      type = "gem";
+    };
+    version = "0.8.2";
+  };
+  tty-cursor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1f4rsapf4apaxn11xnqrq7axgrlvn6pdlqxqb2g34jnpfh5yrk1i";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  tty-prompt = {
+    dependencies = ["necromancer" "pastel" "timers" "tty-cursor" "tty-reader"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wjlsrzky7n7fr4psy2jbi4qpcixkq3196g0bbnmmjy6f26vrjcm";
+      type = "gem";
+    };
+    version = "0.18.1";
+  };
+  tty-reader = {
+    dependencies = ["tty-cursor" "tty-screen" "wisper"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r1cbfmkprp2m8jbf5f59jqn2zda7xqxj3gzdsgpz8v7arp9m3wn";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  tty-screen = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0azpjgyhdm8ycblnx9crq3dgb2x8yg454a13n60zfpsc0n138sw1";
+      type = "gem";
+    };
+    version = "0.6.5";
+  };
+  twitter-text = {
+    dependencies = ["unf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1732h7hy1k152w8wfvjsx7b79alk45i5imwd37ia4qcx8hfm3gvg";
+      type = "gem";
+    };
+    version = "1.14.7";
+  };
+  tzinfo = {
+    dependencies = ["thread_safe"];
+    groups = ["default" "development" "pam_authentication" "production" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fjx9j327xpkkdlxwmkl3a8wqj7i4l4jwlrv3z13mg95z9wl253z";
+      type = "gem";
+    };
+    version = "1.2.5";
+  };
+  tzinfo-data = {
+    dependencies = ["tzinfo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jzl5cv7b5h24lh8s42s3j1ls0p27b5wmc4zdjs2j7hajgbdp19q";
+      type = "gem";
+    };
+    version = "1.2018.9";
+  };
+  unf = {
+    dependencies = ["unf_ext"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  unf_ext = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06p1i6qhy34bpb8q8ms88y6f2kz86azwm098yvcc0nyqk9y729j1";
+      type = "gem";
+    };
+    version = "0.0.7.5";
+  };
+  unicode-display_width = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bq528fibi8s0jmxz0xzlgzggdq0x4fx46wfqz49478pv8gb2diq";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  uniform_notifier = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mb0pq99zm17qnz2czmad5b3z0ivzkf6493afj3n550kd56z18s3";
+      type = "gem";
+    };
+    version = "1.12.1";
+  };
+  warden = {
+    dependencies = ["rack"];
+    groups = ["default" "pam_authentication"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0va966lhpylcwbqb9n151kkihx30agh0a57mwjwdxyanll4s1q12";
+      type = "gem";
+    };
+    version = "1.2.7";
+  };
+  webmock = {
+    dependencies = ["addressable" "crack" "hashdiff"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gg0c2sxq7rni0b93w47h7p7cn590xdhf5va7ska48inpipwlgxp";
+      type = "gem";
+    };
+    version = "3.5.1";
+  };
+  webpacker = {
+    dependencies = ["activesupport" "rack-proxy" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bw01ihvxpy05xzz3wq6p9d3lw7n4x10ivfrh70hlrjyixmapws6";
+      type = "gem";
+    };
+    version = "3.5.5";
+  };
+  webpush = {
+    dependencies = ["hkdf" "jwt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1id7i4gdqck8wj6x22q8dljynvznvwn9f0pgi8h8jiy5dm7m0cf2";
+      type = "gem";
+    };
+    version = "0.3.6";
+  };
+  websocket-driver = {
+    dependencies = ["websocket-extensions"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1551k3fs3kkb3ghqfj3n5lps0ikb9pyrdnzmvgfdxy8574n4g1dn";
+      type = "gem";
+    };
+    version = "0.7.0";
+  };
+  websocket-extensions = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "034sdr7fd34yag5l6y156rkbhiqgmy395m231dwhlpcswhs6d270";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  wisper = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ar2wn3pxnffyzcmf67y67b8lnhgn9zayqhqp26jwqa3d73j71kd";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  xpath = {
+    dependencies = ["nokogiri"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
+      type = "gem";
+    };
+    version = "3.2.0";
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json
new file mode 100644 (file)
index 0000000..df73e8f
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "v2.7.4",
+  "meta": {
+    "name": "mastodon",
+    "url": "https://github.com/tootsuite/mastodon",
+    "branch": "refs/tags/v2.7.4"
+  },
+  "github": {
+    "owner": "tootsuite",
+    "repo": "mastodon",
+    "rev": "a91349d45da18d3c85f68ae9be762dad6301c3cf",
+    "sha256": "0x16c2m8d9nszr9hjw6j1i8gicvpgxzli5afaqd0z144y0ar62qa",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/mastodon/yarn-packages.nix b/pkgs/webapps/mastodon/yarn-packages.nix
new file mode 100644 (file)
index 0000000..feca668
--- /dev/null
@@ -0,0 +1,11876 @@
+{fetchurl, linkFarm}: rec {
+  offline_cache = linkFarm "offline" packages;
+  packages = [
+
+    {
+      name = "_babel_code_frame___code_frame_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_code_frame___code_frame_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz";
+        sha1 = "06e2ab19bdb535385559aabb5ba59729482800f8";
+      };
+    }
+
+    {
+      name = "_babel_core___core_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_core___core_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz";
+        sha1 = "07adba6dde27bb5ad8d8672f15fde3e08184a687";
+      };
+    }
+
+    {
+      name = "_babel_generator___generator_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_generator___generator_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz";
+        sha1 = "18c816c70962640eab42fe8cae5f3947a5c65ccc";
+      };
+    }
+
+    {
+      name = "_babel_helper_annotate_as_pure___helper_annotate_as_pure_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_annotate_as_pure___helper_annotate_as_pure_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz";
+        sha1 = "323d39dd0b50e10c7c06ca7d7638e6864d8c5c32";
+      };
+    }
+
+    {
+      name = "_babel_helper_builder_binary_assignment_operator_visitor___helper_builder_binary_assignment_operator_visitor_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_builder_binary_assignment_operator_visitor___helper_builder_binary_assignment_operator_visitor_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz";
+        sha1 = "6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f";
+      };
+    }
+
+    {
+      name = "_babel_helper_builder_react_jsx___helper_builder_react_jsx_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_builder_react_jsx___helper_builder_react_jsx_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz";
+        sha1 = "fa154cb53eb918cf2a9a7ce928e29eb649c5acdb";
+      };
+    }
+
+    {
+      name = "_babel_helper_call_delegate___helper_call_delegate_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_call_delegate___helper_call_delegate_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz";
+        sha1 = "6a957f105f37755e8645343d3038a22e1449cc4a";
+      };
+    }
+
+    {
+      name = "_babel_helper_create_class_features_plugin___helper_create_class_features_plugin_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_helper_create_class_features_plugin___helper_create_class_features_plugin_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.3.tgz";
+        sha1 = "f6e719abb90cb7f4a69591e35fd5eb89047c4a7c";
+      };
+    }
+
+    {
+      name = "_babel_helper_define_map___helper_define_map_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_define_map___helper_define_map_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz";
+        sha1 = "3b74caec329b3c80c116290887c0dd9ae468c20c";
+      };
+    }
+
+    {
+      name = "_babel_helper_explode_assignable_expression___helper_explode_assignable_expression_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_explode_assignable_expression___helper_explode_assignable_expression_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz";
+        sha1 = "537fa13f6f1674df745b0c00ec8fe4e99681c8f6";
+      };
+    }
+
+    {
+      name = "_babel_helper_function_name___helper_function_name_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_function_name___helper_function_name_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz";
+        sha1 = "a0ceb01685f73355d4360c1247f582bfafc8ff53";
+      };
+    }
+
+    {
+      name = "_babel_helper_get_function_arity___helper_get_function_arity_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_get_function_arity___helper_get_function_arity_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz";
+        sha1 = "83572d4320e2a4657263734113c42868b64e49c3";
+      };
+    }
+
+    {
+      name = "_babel_helper_hoist_variables___helper_hoist_variables_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_hoist_variables___helper_hoist_variables_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz";
+        sha1 = "46adc4c5e758645ae7a45deb92bab0918c23bb88";
+      };
+    }
+
+    {
+      name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz";
+        sha1 = "8cd14b0a0df7ff00f009e7d7a436945f47c7a16f";
+      };
+    }
+
+    {
+      name = "_babel_helper_module_imports___helper_module_imports_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_module_imports___helper_module_imports_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz";
+        sha1 = "96081b7111e486da4d2cd971ad1a4fe216cc2e3d";
+      };
+    }
+
+    {
+      name = "_babel_helper_module_transforms___helper_module_transforms_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_helper_module_transforms___helper_module_transforms_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz";
+        sha1 = "ab2f8e8d231409f8370c883d20c335190284b963";
+      };
+    }
+
+    {
+      name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz";
+        sha1 = "a2920c5702b073c15de51106200aa8cad20497d5";
+      };
+    }
+
+    {
+      name = "_babel_helper_plugin_utils___helper_plugin_utils_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_plugin_utils___helper_plugin_utils_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz";
+        sha1 = "bbb3fbee98661c569034237cc03967ba99b4f250";
+      };
+    }
+
+    {
+      name = "_babel_helper_regex___helper_regex_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_regex___helper_regex_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz";
+        sha1 = "2c1718923b57f9bbe64705ffe5640ac64d9bdb27";
+      };
+    }
+
+    {
+      name = "_babel_helper_remap_async_to_generator___helper_remap_async_to_generator_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_remap_async_to_generator___helper_remap_async_to_generator_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz";
+        sha1 = "361d80821b6f38da75bd3f0785ece20a88c5fe7f";
+      };
+    }
+
+    {
+      name = "_babel_helper_replace_supers___helper_replace_supers_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_helper_replace_supers___helper_replace_supers_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz";
+        sha1 = "19970020cf22677d62b3a689561dbd9644d8c5e5";
+      };
+    }
+
+    {
+      name = "_babel_helper_simple_access___helper_simple_access_7.1.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_simple_access___helper_simple_access_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz";
+        sha1 = "65eeb954c8c245beaa4e859da6188f39d71e585c";
+      };
+    }
+
+    {
+      name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz";
+        sha1 = "3aae285c0311c2ab095d997b8c9a94cad547d813";
+      };
+    }
+
+    {
+      name = "_babel_helper_wrap_function___helper_wrap_function_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_wrap_function___helper_wrap_function_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz";
+        sha1 = "c4e0012445769e2815b55296ead43a958549f6fa";
+      };
+    }
+
+    {
+      name = "_babel_helpers___helpers_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_helpers___helpers_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz";
+        sha1 = "8335f3140f3144270dc63c4732a4f8b0a50b7a21";
+      };
+    }
+
+    {
+      name = "_babel_highlight___highlight_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_highlight___highlight_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz";
+        sha1 = "f710c38c8d458e6dd9a201afb637fcb781ce99e4";
+      };
+    }
+
+    {
+      name = "_babel_parser___parser_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_parser___parser_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz";
+        sha1 = "32f5df65744b70888d17872ec106b02434ba1489";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_async_generator_functions___plugin_proposal_async_generator_functions_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_async_generator_functions___plugin_proposal_async_generator_functions_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz";
+        sha1 = "b289b306669dce4ad20b0252889a15768c9d417e";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_class_properties___plugin_proposal_class_properties_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_class_properties___plugin_proposal_class_properties_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.3.tgz";
+        sha1 = "c9e1294363b346cff333007a92080f3203698461";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_decorators___plugin_proposal_decorators_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_decorators___plugin_proposal_decorators_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.2.3.tgz";
+        sha1 = "1fe5b0d22ce0c4418f225474ebd40267430364c0";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_json_strings___plugin_proposal_json_strings_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_json_strings___plugin_proposal_json_strings_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz";
+        sha1 = "568ecc446c6148ae6b267f02551130891e29f317";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_object_rest_spread___plugin_proposal_object_rest_spread_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_object_rest_spread___plugin_proposal_object_rest_spread_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz";
+        sha1 = "88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_optional_catch_binding___plugin_proposal_optional_catch_binding_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_optional_catch_binding___plugin_proposal_optional_catch_binding_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz";
+        sha1 = "135d81edb68a081e55e56ec48541ece8065c38f5";
+      };
+    }
+
+    {
+      name = "_babel_plugin_proposal_unicode_property_regex___plugin_proposal_unicode_property_regex_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_proposal_unicode_property_regex___plugin_proposal_unicode_property_regex_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz";
+        sha1 = "abe7281fe46c95ddc143a65e5358647792039520";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_async_generators___plugin_syntax_async_generators_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_async_generators___plugin_syntax_async_generators_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz";
+        sha1 = "69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_decorators___plugin_syntax_decorators_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_decorators___plugin_syntax_decorators_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz";
+        sha1 = "c50b1b957dcc69e4b1127b65e1c33eef61570c1b";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_dynamic_import___plugin_syntax_dynamic_import_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_dynamic_import___plugin_syntax_dynamic_import_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz";
+        sha1 = "69c159ffaf4998122161ad8ebc5e6d1f55df8612";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_json_strings___plugin_syntax_json_strings_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_json_strings___plugin_syntax_json_strings_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz";
+        sha1 = "72bd13f6ffe1d25938129d2a186b11fd62951470";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_jsx___plugin_syntax_jsx_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_jsx___plugin_syntax_jsx_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz";
+        sha1 = "0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_object_rest_spread___plugin_syntax_object_rest_spread_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_object_rest_spread___plugin_syntax_object_rest_spread_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz";
+        sha1 = "3b7a3e733510c57e820b9142a6579ac8b0dfad2e";
+      };
+    }
+
+    {
+      name = "_babel_plugin_syntax_optional_catch_binding___plugin_syntax_optional_catch_binding_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_syntax_optional_catch_binding___plugin_syntax_optional_catch_binding_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz";
+        sha1 = "a94013d6eda8908dfe6a477e7f9eda85656ecf5c";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_arrow_functions___plugin_transform_arrow_functions_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_arrow_functions___plugin_transform_arrow_functions_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz";
+        sha1 = "9aeafbe4d6ffc6563bf8f8372091628f00779550";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_async_to_generator___plugin_transform_async_to_generator_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_async_to_generator___plugin_transform_async_to_generator_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz";
+        sha1 = "68b8a438663e88519e65b776f8938f3445b1a2ff";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_block_scoped_functions___plugin_transform_block_scoped_functions_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_block_scoped_functions___plugin_transform_block_scoped_functions_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz";
+        sha1 = "5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_block_scoping___plugin_transform_block_scoping_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_block_scoping___plugin_transform_block_scoping_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz";
+        sha1 = "f17c49d91eedbcdf5dd50597d16f5f2f770132d4";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_classes___plugin_transform_classes_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_classes___plugin_transform_classes_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz";
+        sha1 = "6c90542f210ee975aa2aa8c8b5af7fa73a126953";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_computed_properties___plugin_transform_computed_properties_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_computed_properties___plugin_transform_computed_properties_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz";
+        sha1 = "83a7df6a658865b1c8f641d510c6f3af220216da";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_destructuring___plugin_transform_destructuring_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_destructuring___plugin_transform_destructuring_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz";
+        sha1 = "e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_dotall_regex___plugin_transform_dotall_regex_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_dotall_regex___plugin_transform_dotall_regex_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz";
+        sha1 = "f0aabb93d120a8ac61e925ea0ba440812dbe0e49";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_duplicate_keys___plugin_transform_duplicate_keys_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_duplicate_keys___plugin_transform_duplicate_keys_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz";
+        sha1 = "d952c4930f312a4dbfff18f0b2914e60c35530b3";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_exponentiation_operator___plugin_transform_exponentiation_operator_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_exponentiation_operator___plugin_transform_exponentiation_operator_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz";
+        sha1 = "a63868289e5b4007f7054d46491af51435766008";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_for_of___plugin_transform_for_of_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_for_of___plugin_transform_for_of_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz";
+        sha1 = "ab7468befa80f764bb03d3cb5eef8cc998e1cad9";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_function_name___plugin_transform_function_name_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_function_name___plugin_transform_function_name_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz";
+        sha1 = "f7930362829ff99a3174c39f0afcc024ef59731a";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_literals___plugin_transform_literals_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_literals___plugin_transform_literals_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz";
+        sha1 = "690353e81f9267dad4fd8cfd77eafa86aba53ea1";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_modules_amd___plugin_transform_modules_amd_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_modules_amd___plugin_transform_modules_amd_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz";
+        sha1 = "82a9bce45b95441f617a24011dc89d12da7f4ee6";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_modules_commonjs___plugin_transform_modules_commonjs_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_modules_commonjs___plugin_transform_modules_commonjs_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz";
+        sha1 = "c4f1933f5991d5145e9cfad1dfd848ea1727f404";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_modules_systemjs___plugin_transform_modules_systemjs_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_modules_systemjs___plugin_transform_modules_systemjs_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz";
+        sha1 = "912bfe9e5ff982924c81d0937c92d24994bb9068";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_modules_umd___plugin_transform_modules_umd_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_modules_umd___plugin_transform_modules_umd_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz";
+        sha1 = "7678ce75169f0877b8eb2235538c074268dd01ae";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_new_target___plugin_transform_new_target_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_new_target___plugin_transform_new_target_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz";
+        sha1 = "ae8fbd89517fa7892d20e6564e641e8770c3aa4a";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_object_super___plugin_transform_object_super_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_object_super___plugin_transform_object_super_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz";
+        sha1 = "b35d4c10f56bab5d650047dad0f1d8e8814b6598";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_parameters___plugin_transform_parameters_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_parameters___plugin_transform_parameters_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz";
+        sha1 = "0d5ad15dc805e2ea866df4dd6682bfe76d1408c2";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_react_display_name___plugin_transform_react_display_name_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_react_display_name___plugin_transform_react_display_name_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz";
+        sha1 = "ebfaed87834ce8dc4279609a4f0c324c156e3eb0";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_react_inline_elements___plugin_transform_react_inline_elements_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_react_inline_elements___plugin_transform_react_inline_elements_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.2.0.tgz";
+        sha1 = "3e36e7c47f1c21f52b2b0090d5cd83ceb19a4770";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_react_jsx_self___plugin_transform_react_jsx_self_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_react_jsx_self___plugin_transform_react_jsx_self_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz";
+        sha1 = "461e21ad9478f1031dd5e276108d027f1b5240ba";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_react_jsx_source___plugin_transform_react_jsx_source_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_react_jsx_source___plugin_transform_react_jsx_source_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz";
+        sha1 = "20c8c60f0140f5dd3cd63418d452801cf3f7180f";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_react_jsx___plugin_transform_react_jsx_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_react_jsx___plugin_transform_react_jsx_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz";
+        sha1 = "ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_regenerator___plugin_transform_regenerator_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_regenerator___plugin_transform_regenerator_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz";
+        sha1 = "5b41686b4ed40bef874d7ed6a84bdd849c13e0c1";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_runtime___plugin_transform_runtime_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_runtime___plugin_transform_runtime_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz";
+        sha1 = "566bc43f7d0aedc880eaddbd29168d0f248966ea";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_shorthand_properties___plugin_transform_shorthand_properties_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_shorthand_properties___plugin_transform_shorthand_properties_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz";
+        sha1 = "6333aee2f8d6ee7e28615457298934a3b46198f0";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_spread___plugin_transform_spread_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_spread___plugin_transform_spread_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz";
+        sha1 = "3103a9abe22f742b6d406ecd3cd49b774919b406";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_sticky_regex___plugin_transform_sticky_regex_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_sticky_regex___plugin_transform_sticky_regex_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz";
+        sha1 = "a1e454b5995560a9c1e0d537dfc15061fd2687e1";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_template_literals___plugin_transform_template_literals_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_template_literals___plugin_transform_template_literals_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz";
+        sha1 = "d87ed01b8eaac7a92473f608c97c089de2ba1e5b";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_typeof_symbol___plugin_transform_typeof_symbol_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_typeof_symbol___plugin_transform_typeof_symbol_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz";
+        sha1 = "117d2bcec2fbf64b4b59d1f9819894682d29f2b2";
+      };
+    }
+
+    {
+      name = "_babel_plugin_transform_unicode_regex___plugin_transform_unicode_regex_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_plugin_transform_unicode_regex___plugin_transform_unicode_regex_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz";
+        sha1 = "4eb8db16f972f8abb5062c161b8b115546ade08b";
+      };
+    }
+
+    {
+      name = "_babel_preset_env___preset_env_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_preset_env___preset_env_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz";
+        sha1 = "948c8df4d4609c99c7e0130169f052ea6a7a8933";
+      };
+    }
+
+    {
+      name = "_babel_preset_react___preset_react_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_preset_react___preset_react_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz";
+        sha1 = "e86b4b3d99433c7b3e9e91747e2653958bc6b3c0";
+      };
+    }
+
+    {
+      name = "_babel_runtime___runtime_7.0.0.tgz";
+      path = fetchurl {
+        name = "_babel_runtime___runtime_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz";
+        sha1 = "adeb78fedfc855aa05bc041640f3f6f98e85424c";
+      };
+    }
+
+    {
+      name = "_babel_runtime___runtime_7.2.0.tgz";
+      path = fetchurl {
+        name = "_babel_runtime___runtime_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz";
+        sha1 = "b03e42eeddf5898e00646e4c840fa07ba8dcad7f";
+      };
+    }
+
+    {
+      name = "_babel_template___template_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_template___template_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz";
+        sha1 = "005b3fdf0ed96e88041330379e0da9a708eb2907";
+      };
+    }
+
+    {
+      name = "_babel_traverse___traverse_7.2.3.tgz";
+      path = fetchurl {
+        name = "_babel_traverse___traverse_7.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz";
+        sha1 = "7ff50cefa9c7c0bd2d81231fdac122f3957748d8";
+      };
+    }
+
+    {
+      name = "_babel_types___types_7.2.2.tgz";
+      path = fetchurl {
+        name = "_babel_types___types_7.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz";
+        sha1 = "44e10fc24e33af524488b716cdaee5360ea8ed1e";
+      };
+    }
+
+    {
+      name = "_emotion_cache___cache_10.0.0.tgz";
+      path = fetchurl {
+        name = "_emotion_cache___cache_10.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.0.tgz";
+        sha1 = "e22eadcb770de4131ec707c84207e9e1ce210413";
+      };
+    }
+
+    {
+      name = "_emotion_hash___hash_0.7.1.tgz";
+      path = fetchurl {
+        name = "_emotion_hash___hash_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.1.tgz";
+        sha1 = "9833722341379fb7d67f06a4b00ab3c37913da53";
+      };
+    }
+
+    {
+      name = "_emotion_memoize___memoize_0.7.1.tgz";
+      path = fetchurl {
+        name = "_emotion_memoize___memoize_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz";
+        sha1 = "e93c13942592cf5ef01aa8297444dc192beee52f";
+      };
+    }
+
+    {
+      name = "_emotion_serialize___serialize_0.11.3.tgz";
+      path = fetchurl {
+        name = "_emotion_serialize___serialize_0.11.3.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.3.tgz";
+        sha1 = "c4af2d96e3ddb9a749b7b567daa7556bcae45af2";
+      };
+    }
+
+    {
+      name = "_emotion_sheet___sheet_0.9.2.tgz";
+      path = fetchurl {
+        name = "_emotion_sheet___sheet_0.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.2.tgz";
+        sha1 = "74e5c6b5e489a1ba30ab246ab5eedd96916487c4";
+      };
+    }
+
+    {
+      name = "_emotion_stylis___stylis_0.8.3.tgz";
+      path = fetchurl {
+        name = "_emotion_stylis___stylis_0.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.3.tgz";
+        sha1 = "3ca7e9bcb31b3cb4afbaeb66156d86ee85e23246";
+      };
+    }
+
+    {
+      name = "_emotion_unitless___unitless_0.7.3.tgz";
+      path = fetchurl {
+        name = "_emotion_unitless___unitless_0.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.3.tgz";
+        sha1 = "6310a047f12d21a1036fb031317219892440416f";
+      };
+    }
+
+    {
+      name = "_emotion_utils___utils_0.11.1.tgz";
+      path = fetchurl {
+        name = "_emotion_utils___utils_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.1.tgz";
+        sha1 = "8529b7412a6eb4b48bdf6e720cc1b8e6e1e17628";
+      };
+    }
+
+    {
+      name = "_emotion_weak_memoize___weak_memoize_0.2.2.tgz";
+      path = fetchurl {
+        name = "_emotion_weak_memoize___weak_memoize_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz";
+        sha1 = "63985d3d8b02530e0869962f4da09142ee8e200e";
+      };
+    }
+
+    {
+      name = "_gfx_zopfli___zopfli_1.0.10.tgz";
+      path = fetchurl {
+        name = "_gfx_zopfli___zopfli_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/@gfx/zopfli/-/zopfli-1.0.10.tgz";
+        sha1 = "8cccfcbd670f676cb240812bcf8380c9a66da367";
+      };
+    }
+
+    {
+      name = "_types_node___node_10.12.18.tgz";
+      path = fetchurl {
+        name = "_types_node___node_10.12.18.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz";
+        sha1 = "1d3ca764718915584fcd9f6344621b7672665c67";
+      };
+    }
+
+    {
+      name = "_types_q___q_1.5.1.tgz";
+      path = fetchurl {
+        name = "_types_q___q_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/q/-/q-1.5.1.tgz";
+        sha1 = "48fd98c1561fe718b61733daed46ff115b496e18";
+      };
+    }
+
+    {
+      name = "_types_react___react_16.4.6.tgz";
+      path = fetchurl {
+        name = "_types_react___react_16.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz";
+        sha1 = "5024957c6bcef4f02823accf5974faba2e54fada";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_ast___ast_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_ast___ast_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz";
+        sha1 = "b988582cafbb2b095e8b556526f30c90d057cace";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz";
+        sha1 = "a69f0af6502eb9a3c045555b1a6129d3d3f2e313";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_api_error___helper_api_error_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_api_error___helper_api_error_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz";
+        sha1 = "c7b6bb8105f84039511a2b39ce494f193818a32a";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_buffer___helper_buffer_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_buffer___helper_buffer_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz";
+        sha1 = "3122d48dcc6c9456ed982debe16c8f37101df39b";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz";
+        sha1 = "cf8f106e746662a0da29bdef635fcd3d1248364b";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_fsm___helper_fsm_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_fsm___helper_fsm_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz";
+        sha1 = "df38882a624080d03f7503f93e3f17ac5ac01181";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_module_context___helper_module_context_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_module_context___helper_module_context_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz";
+        sha1 = "d874d722e51e62ac202476935d649c802fa0e209";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz";
+        sha1 = "dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz";
+        sha1 = "9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_ieee754___ieee754_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_ieee754___ieee754_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz";
+        sha1 = "c95839eb63757a31880aaec7b6512d4191ac640b";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_leb128___leb128_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_leb128___leb128_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz";
+        sha1 = "d7267a1ee9c4594fd3f7e37298818ec65687db63";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_utf8___utf8_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_utf8___utf8_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz";
+        sha1 = "06d7218ea9fdc94a6793aa92208160db3d26ee82";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wasm_edit___wasm_edit_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_edit___wasm_edit_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz";
+        sha1 = "8c74ca474d4f951d01dbae9bd70814ee22a82005";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wasm_gen___wasm_gen_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_gen___wasm_gen_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz";
+        sha1 = "9bbba942f22375686a6fb759afcd7ac9c45da1a8";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wasm_opt___wasm_opt_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_opt___wasm_opt_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz";
+        sha1 = "b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wasm_parser___wasm_parser_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_parser___wasm_parser_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz";
+        sha1 = "6e3d20fa6a3519f6b084ef9391ad58211efb0a1a";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wast_parser___wast_parser_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wast_parser___wast_parser_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz";
+        sha1 = "25bd117562ca8c002720ff8116ef9072d9ca869c";
+      };
+    }
+
+    {
+      name = "_webassemblyjs_wast_printer___wast_printer_1.7.11.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wast_printer___wast_printer_1.7.11.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz";
+        sha1 = "c4245b6de242cb50a2cc950174fdbf65c78d7813";
+      };
+    }
+
+    {
+      name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
+      path = fetchurl {
+        name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
+        sha1 = "eef014a3145ae477a1cbc00cd1e552336dceb790";
+      };
+    }
+
+    {
+      name = "_xtuc_long___long_4.2.1.tgz";
+      path = fetchurl {
+        name = "_xtuc_long___long_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz";
+        sha1 = "5c85d662f76fa1d34575766c5dcd6615abcd30d8";
+      };
+    }
+
+    {
+      name = "abab___abab_2.0.0.tgz";
+      path = fetchurl {
+        name = "abab___abab_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz";
+        sha1 = "aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f";
+      };
+    }
+
+    {
+      name = "abbrev___abbrev_1.1.1.tgz";
+      path = fetchurl {
+        name = "abbrev___abbrev_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
+        sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.3.5.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz";
+        sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2";
+      };
+    }
+
+    {
+      name = "acorn_dynamic_import___acorn_dynamic_import_3.0.0.tgz";
+      path = fetchurl {
+        name = "acorn_dynamic_import___acorn_dynamic_import_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz";
+        sha1 = "901ceee4c7faaef7e07ad2a47e890675da50a278";
+      };
+    }
+
+    {
+      name = "acorn_globals___acorn_globals_4.3.0.tgz";
+      path = fetchurl {
+        name = "acorn_globals___acorn_globals_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz";
+        sha1 = "e3b6f8da3c1552a95ae627571f7dd6923bb54103";
+      };
+    }
+
+    {
+      name = "acorn_jsx___acorn_jsx_5.0.1.tgz";
+      path = fetchurl {
+        name = "acorn_jsx___acorn_jsx_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz";
+        sha1 = "32a064fd925429216a09b141102bfdd185fae40e";
+      };
+    }
+
+    {
+      name = "acorn_walk___acorn_walk_6.1.1.tgz";
+      path = fetchurl {
+        name = "acorn_walk___acorn_walk_6.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz";
+        sha1 = "d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913";
+      };
+    }
+
+    {
+      name = "acorn___acorn_5.7.3.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_5.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz";
+        sha1 = "67aa231bf8812974b85235a96771eb6bd07ea279";
+      };
+    }
+
+    {
+      name = "acorn___acorn_6.0.4.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_6.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz";
+        sha1 = "77377e7353b72ec5104550aa2d2097a2fd40b754";
+      };
+    }
+
+    {
+      name = "ajv_errors___ajv_errors_1.0.1.tgz";
+      path = fetchurl {
+        name = "ajv_errors___ajv_errors_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz";
+        sha1 = "f35986aceb91afadec4102fbd85014950cefa64d";
+      };
+    }
+
+    {
+      name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
+      path = fetchurl {
+        name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
+        sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
+      };
+    }
+
+    {
+      name = "ajv___ajv_6.6.2.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz";
+        sha1 = "caceccf474bf3fc3ce3b147443711a24063cc30d";
+      };
+    }
+
+    {
+      name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+      path = fetchurl {
+        name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
+        sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
+      };
+    }
+
+    {
+      name = "ansi_colors___ansi_colors_3.2.3.tgz";
+      path = fetchurl {
+        name = "ansi_colors___ansi_colors_3.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz";
+        sha1 = "57d35b8686e851e2cc04c403f1c00203976a1813";
+      };
+    }
+
+    {
+      name = "ansi_escapes___ansi_escapes_3.1.0.tgz";
+      path = fetchurl {
+        name = "ansi_escapes___ansi_escapes_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz";
+        sha1 = "f73207bb81207d75fd6c83f125af26eea378ca30";
+      };
+    }
+
+    {
+      name = "ansi_html___ansi_html_0.0.7.tgz";
+      path = fetchurl {
+        name = "ansi_html___ansi_html_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz";
+        sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_2.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_3.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_4.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz";
+        sha1 = "70de791edf021404c3fd615aa89118ae0432e5a9";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_2.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_3.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
+        sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
+      };
+    }
+
+    {
+      name = "anymatch___anymatch_2.0.0.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
+        sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
+      };
+    }
+
+    {
+      name = "append_transform___append_transform_0.4.0.tgz";
+      path = fetchurl {
+        name = "append_transform___append_transform_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz";
+        sha1 = "d76ebf8ca94d276e247a36bad44a4b74ab611991";
+      };
+    }
+
+    {
+      name = "aproba___aproba_1.2.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
+        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
+      };
+    }
+
+    {
+      name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+      path = fetchurl {
+        name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
+      };
+    }
+
+    {
+      name = "argparse___argparse_1.0.10.tgz";
+      path = fetchurl {
+        name = "argparse___argparse_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
+        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
+      };
+    }
+
+    {
+      name = "aria_query___aria_query_3.0.0.tgz";
+      path = fetchurl {
+        name = "aria_query___aria_query_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz";
+        sha1 = "65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_2.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
+        sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_4.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
+        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
+      };
+    }
+
+    {
+      name = "arr_flatten___arr_flatten_1.1.0.tgz";
+      path = fetchurl {
+        name = "arr_flatten___arr_flatten_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
+      };
+    }
+
+    {
+      name = "arr_union___arr_union_3.1.0.tgz";
+      path = fetchurl {
+        name = "arr_union___arr_union_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    }
+
+    {
+      name = "array_equal___array_equal_1.0.0.tgz";
+      path = fetchurl {
+        name = "array_equal___array_equal_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz";
+        sha1 = "8c2a5ef2472fd9ea742b04c77a75093ba2757c93";
+      };
+    }
+
+    {
+      name = "array_flatten___array_flatten_1.1.1.tgz";
+      path = fetchurl {
+        name = "array_flatten___array_flatten_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    }
+
+    {
+      name = "array_flatten___array_flatten_2.1.2.tgz";
+      path = fetchurl {
+        name = "array_flatten___array_flatten_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz";
+        sha1 = "24ef80a28c1a893617e2149b0c6d0d788293b099";
+      };
+    }
+
+    {
+      name = "array_includes___array_includes_3.0.3.tgz";
+      path = fetchurl {
+        name = "array_includes___array_includes_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz";
+        sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d";
+      };
+    }
+
+    {
+      name = "array_union___array_union_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_union___array_union_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
+        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
+      };
+    }
+
+    {
+      name = "array_uniq___array_uniq_1.0.3.tgz";
+      path = fetchurl {
+        name = "array_uniq___array_uniq_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.2.1.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
+        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.3.2.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
+        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
+      };
+    }
+
+    {
+      name = "array.prototype.flat___array.prototype.flat_1.2.1.tgz";
+      path = fetchurl {
+        name = "array.prototype.flat___array.prototype.flat_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz";
+        sha1 = "812db8f02cad24d3fab65dd67eabe3b8903494a4";
+      };
+    }
+
+    {
+      name = "arrify___arrify_1.0.1.tgz";
+      path = fetchurl {
+        name = "arrify___arrify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz";
+        sha1 = "898508da2226f380df904728456849c1501a4b0d";
+      };
+    }
+
+    {
+      name = "asap___asap_2.0.6.tgz";
+      path = fetchurl {
+        name = "asap___asap_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz";
+        sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
+      };
+    }
+
+    {
+      name = "asn1.js___asn1.js_4.10.1.tgz";
+      path = fetchurl {
+        name = "asn1.js___asn1.js_4.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
+        sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
+      };
+    }
+
+    {
+      name = "asn1___asn1_0.2.4.tgz";
+      path = fetchurl {
+        name = "asn1___asn1_0.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz";
+        sha1 = "8d2475dfab553bb33e77b54e59e880bb8ce23136";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_1.0.0.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    }
+
+    {
+      name = "assert___assert_1.4.1.tgz";
+      path = fetchurl {
+        name = "assert___assert_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz";
+        sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
+      };
+    }
+
+    {
+      name = "assign_symbols___assign_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "assign_symbols___assign_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
+        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
+      };
+    }
+
+    {
+      name = "ast_types_flow___ast_types_flow_0.0.7.tgz";
+      path = fetchurl {
+        name = "ast_types_flow___ast_types_flow_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz";
+        sha1 = "f70b735c6bca1a5c9c22d982c3e39e7feba3bdad";
+      };
+    }
+
+    {
+      name = "astral_regex___astral_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "astral_regex___astral_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz";
+        sha1 = "6c8c3fb827dd43ee3918f27b82782ab7658a6fd9";
+      };
+    }
+
+    {
+      name = "async_each___async_each_1.0.1.tgz";
+      path = fetchurl {
+        name = "async_each___async_each_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
+        sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
+      };
+    }
+
+    {
+      name = "async_limiter___async_limiter_1.0.0.tgz";
+      path = fetchurl {
+        name = "async_limiter___async_limiter_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz";
+        sha1 = "78faed8c3d074ab81f22b4e985d79e8738f720f8";
+      };
+    }
+
+    {
+      name = "async___async_1.5.2.tgz";
+      path = fetchurl {
+        name = "async___async_1.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
+        sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
+      };
+    }
+
+    {
+      name = "async___async_2.6.1.tgz";
+      path = fetchurl {
+        name = "async___async_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz";
+        sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610";
+      };
+    }
+
+    {
+      name = "asynckit___asynckit_0.4.0.tgz";
+      path = fetchurl {
+        name = "asynckit___asynckit_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    }
+
+    {
+      name = "atob___atob_2.1.2.tgz";
+      path = fetchurl {
+        name = "atob___atob_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
+        sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
+      };
+    }
+
+    {
+      name = "autoprefixer___autoprefixer_9.4.3.tgz";
+      path = fetchurl {
+        name = "autoprefixer___autoprefixer_9.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.3.tgz";
+        sha1 = "c97384a8fd80477b78049163a91bbc725d9c41d9";
+      };
+    }
+
+    {
+      name = "aws_sign2___aws_sign2_0.7.0.tgz";
+      path = fetchurl {
+        name = "aws_sign2___aws_sign2_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    }
+
+    {
+      name = "aws4___aws4_1.8.0.tgz";
+      path = fetchurl {
+        name = "aws4___aws4_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz";
+        sha1 = "f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f";
+      };
+    }
+
+    {
+      name = "axios___axios_0.18.0.tgz";
+      path = fetchurl {
+        name = "axios___axios_0.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz";
+        sha1 = "32d53e4851efdc0a11993b6cd000789d70c05102";
+      };
+    }
+
+    {
+      name = "axobject_query___axobject_query_2.0.2.tgz";
+      path = fetchurl {
+        name = "axobject_query___axobject_query_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz";
+        sha1 = "ea187abe5b9002b377f925d8bf7d1c561adf38f9";
+      };
+    }
+
+    {
+      name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
+        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
+      };
+    }
+
+    {
+      name = "babel_core___babel_core_6.26.3.tgz";
+      path = fetchurl {
+        name = "babel_core___babel_core_6.26.3.tgz";
+        url  = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz";
+        sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207";
+      };
+    }
+
+    {
+      name = "babel_core___babel_core_7.0.0_bridge.0.tgz";
+      path = fetchurl {
+        name = "babel_core___babel_core_7.0.0_bridge.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz";
+        sha1 = "95a492ddd90f9b4e9a4a1da14eb335b87b634ece";
+      };
+    }
+
+    {
+      name = "babel_eslint___babel_eslint_10.0.1.tgz";
+      path = fetchurl {
+        name = "babel_eslint___babel_eslint_10.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz";
+        sha1 = "919681dc099614cd7d31d45c8908695092a1faed";
+      };
+    }
+
+    {
+      name = "babel_generator___babel_generator_6.26.1.tgz";
+      path = fetchurl {
+        name = "babel_generator___babel_generator_6.26.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz";
+        sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90";
+      };
+    }
+
+    {
+      name = "babel_helpers___babel_helpers_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helpers___babel_helpers_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz";
+        sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
+      };
+    }
+
+    {
+      name = "babel_jest___babel_jest_23.6.0.tgz";
+      path = fetchurl {
+        name = "babel_jest___babel_jest_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz";
+        sha1 = "a644232366557a2240a0c083da6b25786185a2f1";
+      };
+    }
+
+    {
+      name = "babel_loader___babel_loader_8.0.4.tgz";
+      path = fetchurl {
+        name = "babel_loader___babel_loader_8.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz";
+        sha1 = "7bbf20cbe4560629e2e41534147692d3fecbdce6";
+      };
+    }
+
+    {
+      name = "babel_messages___babel_messages_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_messages___babel_messages_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz";
+        sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
+      };
+    }
+
+    {
+      name = "babel_plugin_istanbul___babel_plugin_istanbul_4.1.6.tgz";
+      path = fetchurl {
+        name = "babel_plugin_istanbul___babel_plugin_istanbul_4.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz";
+        sha1 = "36c59b2192efce81c5b378321b74175add1c9a45";
+      };
+    }
+
+    {
+      name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_23.2.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_jest_hoist___babel_plugin_jest_hoist_23.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz";
+        sha1 = "e61fae05a1ca8801aadee57a6d66b8cefaf44167";
+      };
+    }
+
+    {
+      name = "babel_plugin_lodash___babel_plugin_lodash_3.3.4.tgz";
+      path = fetchurl {
+        name = "babel_plugin_lodash___babel_plugin_lodash_3.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz";
+        sha1 = "4f6844358a1340baed182adbeffa8df9967bc196";
+      };
+    }
+
+    {
+      name = "babel_plugin_macros___babel_plugin_macros_2.4.3.tgz";
+      path = fetchurl {
+        name = "babel_plugin_macros___babel_plugin_macros_2.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.3.tgz";
+        sha1 = "870345aa538d85f04b4614fea5922b55c45dd551";
+      };
+    }
+
+    {
+      name = "babel_plugin_preval___babel_plugin_preval_3.0.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_preval___babel_plugin_preval_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz";
+        sha1 = "a26f9690114a864a54a5cbdf865496ebf541a9c3";
+      };
+    }
+
+    {
+      name = "babel_plugin_react_intl___babel_plugin_react_intl_3.0.1.tgz";
+      path = fetchurl {
+        name = "babel_plugin_react_intl___babel_plugin_react_intl_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-3.0.1.tgz";
+        sha1 = "4abc7fff04a7bbbb7034aec0a675713f2e52181c";
+      };
+    }
+
+    {
+      name = "babel_plugin_syntax_object_rest_spread___babel_plugin_syntax_object_rest_spread_6.13.0.tgz";
+      path = fetchurl {
+        name = "babel_plugin_syntax_object_rest_spread___babel_plugin_syntax_object_rest_spread_6.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz";
+        sha1 = "fd6536f2bce13836ffa3a5458c4903a597bb3bf5";
+      };
+    }
+
+    {
+      name = "babel_plugin_transform_react_remove_prop_types___babel_plugin_transform_react_remove_prop_types_0.4.21.tgz";
+      path = fetchurl {
+        name = "babel_plugin_transform_react_remove_prop_types___babel_plugin_transform_react_remove_prop_types_0.4.21.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.21.tgz";
+        sha1 = "0087938f4348cb751b3e5055a6b38f3c61b5231b";
+      };
+    }
+
+    {
+      name = "babel_preset_jest___babel_preset_jest_23.2.0.tgz";
+      path = fetchurl {
+        name = "babel_preset_jest___babel_preset_jest_23.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz";
+        sha1 = "8ec7a03a138f001a1a8fb1e8113652bf1a55da46";
+      };
+    }
+
+    {
+      name = "babel_register___babel_register_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_register___babel_register_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz";
+        sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
+      };
+    }
+
+    {
+      name = "babel_runtime___babel_runtime_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_runtime___babel_runtime_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
+        sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
+      };
+    }
+
+    {
+      name = "babel_template___babel_template_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_template___babel_template_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz";
+        sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
+      };
+    }
+
+    {
+      name = "babel_traverse___babel_traverse_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_traverse___babel_traverse_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz";
+        sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
+      };
+    }
+
+    {
+      name = "babel_types___babel_types_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_types___babel_types_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
+        sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
+      };
+    }
+
+    {
+      name = "babylon___babylon_6.18.0.tgz";
+      path = fetchurl {
+        name = "babylon___babylon_6.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
+        sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
+      };
+    }
+
+    {
+      name = "backoff___backoff_2.5.0.tgz";
+      path = fetchurl {
+        name = "backoff___backoff_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz";
+        sha1 = "f616eda9d3e4b66b8ca7fca79f695722c5f8e26f";
+      };
+    }
+
+    {
+      name = "balanced_match___balanced_match_1.0.0.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    }
+
+    {
+      name = "base64_js___base64_js_1.3.0.tgz";
+      path = fetchurl {
+        name = "base64_js___base64_js_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz";
+        sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3";
+      };
+    }
+
+    {
+      name = "base___base_0.11.2.tgz";
+      path = fetchurl {
+        name = "base___base_0.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
+        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
+      };
+    }
+
+    {
+      name = "batch___batch_0.6.1.tgz";
+      path = fetchurl {
+        name = "batch___batch_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz";
+        sha1 = "dc34314f4e679318093fc760272525f94bf25c16";
+      };
+    }
+
+    {
+      name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+      path = fetchurl {
+        name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    }
+
+    {
+      name = "bfj___bfj_6.1.1.tgz";
+      path = fetchurl {
+        name = "bfj___bfj_6.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz";
+        sha1 = "05a3b7784fbd72cfa3c22e56002ef99336516c48";
+      };
+    }
+
+    {
+      name = "big.js___big.js_3.2.0.tgz";
+      path = fetchurl {
+        name = "big.js___big.js_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
+        sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
+      };
+    }
+
+    {
+      name = "big.js___big.js_5.2.2.tgz";
+      path = fetchurl {
+        name = "big.js___big.js_5.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz";
+        sha1 = "65f0af382f578bcdc742bd9c281e9cb2d7768328";
+      };
+    }
+
+    {
+      name = "binary_extensions___binary_extensions_1.12.0.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_1.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz";
+        sha1 = "c2d780f53d45bba8317a8902d4ceeaf3a6385b14";
+      };
+    }
+
+    {
+      name = "bluebird___bluebird_3.5.3.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_3.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz";
+        sha1 = "7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7";
+      };
+    }
+
+    {
+      name = "bn.js___bn.js_4.11.8.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_4.11.8.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz";
+        sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f";
+      };
+    }
+
+    {
+      name = "body_parser___body_parser_1.18.3.tgz";
+      path = fetchurl {
+        name = "body_parser___body_parser_1.18.3.tgz";
+        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz";
+        sha1 = "5b292198ffdd553b3a0f20ded0592b956955c8b4";
+      };
+    }
+
+    {
+      name = "bonjour___bonjour_3.5.0.tgz";
+      path = fetchurl {
+        name = "bonjour___bonjour_3.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz";
+        sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5";
+      };
+    }
+
+    {
+      name = "boolbase___boolbase_1.0.0.tgz";
+      path = fetchurl {
+        name = "boolbase___boolbase_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
+        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+      };
+    }
+
+    {
+      name = "brace_expansion___brace_expansion_1.1.11.tgz";
+      path = fetchurl {
+        name = "brace_expansion___brace_expansion_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
+      };
+    }
+
+    {
+      name = "braces___braces_1.8.5.tgz";
+      path = fetchurl {
+        name = "braces___braces_1.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
+        sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
+      };
+    }
+
+    {
+      name = "braces___braces_2.3.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
+        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
+      };
+    }
+
+    {
+      name = "bricks.js___bricks.js_1.8.0.tgz";
+      path = fetchurl {
+        name = "bricks.js___bricks.js_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/bricks.js/-/bricks.js-1.8.0.tgz";
+        sha1 = "8fdeb3c0226af251f4d5727a7df7f9ac0092b4b2";
+      };
+    }
+
+    {
+      name = "brorand___brorand_1.1.0.tgz";
+      path = fetchurl {
+        name = "brorand___brorand_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
+        sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
+      };
+    }
+
+    {
+      name = "browser_process_hrtime___browser_process_hrtime_0.1.3.tgz";
+      path = fetchurl {
+        name = "browser_process_hrtime___browser_process_hrtime_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz";
+        sha1 = "616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4";
+      };
+    }
+
+    {
+      name = "browser_resolve___browser_resolve_1.11.3.tgz";
+      path = fetchurl {
+        name = "browser_resolve___browser_resolve_1.11.3.tgz";
+        url  = "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz";
+        sha1 = "9b7cbb3d0f510e4cb86bdbd796124d28b5890af6";
+      };
+    }
+
+    {
+      name = "browserify_aes___browserify_aes_1.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_aes___browserify_aes_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
+        sha1 = "326734642f403dabc3003209853bb70ad428ef48";
+      };
+    }
+
+    {
+      name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
+        sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
+      };
+    }
+
+    {
+      name = "browserify_des___browserify_des_1.0.2.tgz";
+      path = fetchurl {
+        name = "browserify_des___browserify_des_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
+        sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
+      };
+    }
+
+    {
+      name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
+        sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
+      };
+    }
+
+    {
+      name = "browserify_sign___browserify_sign_4.0.4.tgz";
+      path = fetchurl {
+        name = "browserify_sign___browserify_sign_4.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz";
+        sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
+      };
+    }
+
+    {
+      name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
+        sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
+      };
+    }
+
+    {
+      name = "browserslist___browserslist_4.3.7.tgz";
+      path = fetchurl {
+        name = "browserslist___browserslist_4.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.7.tgz";
+        sha1 = "f1de479a6466ea47a0a26dcc725e7504817e624a";
+      };
+    }
+
+    {
+      name = "bser___bser_2.0.0.tgz";
+      path = fetchurl {
+        name = "bser___bser_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz";
+        sha1 = "9ac78d3ed5d915804fd87acb158bc797147a1719";
+      };
+    }
+
+    {
+      name = "buffer_from___buffer_from_1.1.1.tgz";
+      path = fetchurl {
+        name = "buffer_from___buffer_from_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz";
+        sha1 = "32713bc028f75c02fdb710d7c7bcec1f2c6070ef";
+      };
+    }
+
+    {
+      name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
+      path = fetchurl {
+        name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz";
+        sha1 = "52fabcc6a606d1a00302802648ef68f639da268c";
+      };
+    }
+
+    {
+      name = "buffer_writer___buffer_writer_1.0.1.tgz";
+      path = fetchurl {
+        name = "buffer_writer___buffer_writer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz";
+        sha1 = "22a936901e3029afcd7547eb4487ceb697a3bf08";
+      };
+    }
+
+    {
+      name = "buffer_xor___buffer_xor_1.0.3.tgz";
+      path = fetchurl {
+        name = "buffer_xor___buffer_xor_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
+        sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
+      };
+    }
+
+    {
+      name = "buffer___buffer_4.9.1.tgz";
+      path = fetchurl {
+        name = "buffer___buffer_4.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz";
+        sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
+      };
+    }
+
+    {
+      name = "builtin_modules___builtin_modules_1.1.1.tgz";
+      path = fetchurl {
+        name = "builtin_modules___builtin_modules_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz";
+        sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
+      };
+    }
+
+    {
+      name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+      path = fetchurl {
+        name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
+        sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
+      };
+    }
+
+    {
+      name = "bytes___bytes_3.0.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
+      };
+    }
+
+    {
+      name = "cacache___cacache_11.3.2.tgz";
+      path = fetchurl {
+        name = "cacache___cacache_11.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz";
+        sha1 = "2d81e308e3d258ca38125b676b98b2ac9ce69bfa";
+      };
+    }
+
+    {
+      name = "cache_base___cache_base_1.0.1.tgz";
+      path = fetchurl {
+        name = "cache_base___cache_base_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
+        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
+      };
+    }
+
+    {
+      name = "caller_callsite___caller_callsite_2.0.0.tgz";
+      path = fetchurl {
+        name = "caller_callsite___caller_callsite_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz";
+        sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
+      };
+    }
+
+    {
+      name = "caller_path___caller_path_0.1.0.tgz";
+      path = fetchurl {
+        name = "caller_path___caller_path_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz";
+        sha1 = "94085ef63581ecd3daa92444a8fe94e82577751f";
+      };
+    }
+
+    {
+      name = "caller_path___caller_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "caller_path___caller_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz";
+        sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
+      };
+    }
+
+    {
+      name = "callsites___callsites_0.2.0.tgz";
+      path = fetchurl {
+        name = "callsites___callsites_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz";
+        sha1 = "afab96262910a7f33c19a5775825c69f34e350ca";
+      };
+    }
+
+    {
+      name = "callsites___callsites_2.0.0.tgz";
+      path = fetchurl {
+        name = "callsites___callsites_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz";
+        sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_4.1.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz";
+        sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_5.0.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz";
+        sha1 = "03295527d58bd3cd4aa75363f35b2e8d97be2f42";
+      };
+    }
+
+    {
+      name = "caniuse_api___caniuse_api_3.0.0.tgz";
+      path = fetchurl {
+        name = "caniuse_api___caniuse_api_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz";
+        sha1 = "5e4d90e2274961d46291997df599e3ed008ee4c0";
+      };
+    }
+
+    {
+      name = "caniuse_lite___caniuse_lite_1.0.30000926.tgz";
+      path = fetchurl {
+        name = "caniuse_lite___caniuse_lite_1.0.30000926.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000926.tgz";
+        sha1 = "4361a99d818ca6e521dbe89a732de62a194a789c";
+      };
+    }
+
+    {
+      name = "capture_exit___capture_exit_1.2.0.tgz";
+      path = fetchurl {
+        name = "capture_exit___capture_exit_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz";
+        sha1 = "1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f";
+      };
+    }
+
+    {
+      name = "caseless___caseless_0.12.0.tgz";
+      path = fetchurl {
+        name = "caseless___caseless_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    }
+
+    {
+      name = "chalk___chalk_1.1.3.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    }
+
+    {
+      name = "chalk___chalk_2.4.1.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_2.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz";
+        sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e";
+      };
+    }
+
+    {
+      name = "chardet___chardet_0.7.0.tgz";
+      path = fetchurl {
+        name = "chardet___chardet_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz";
+        sha1 = "90094849f0937f2eedc2425d0d28a9e5f0cbad9e";
+      };
+    }
+
+    {
+      name = "check_types___check_types_7.4.0.tgz";
+      path = fetchurl {
+        name = "check_types___check_types_7.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz";
+        sha1 = "0378ec1b9616ec71f774931a3c6516fad8c152f4";
+      };
+    }
+
+    {
+      name = "cheerio___cheerio_1.0.0_rc.2.tgz";
+      path = fetchurl {
+        name = "cheerio___cheerio_1.0.0_rc.2.tgz";
+        url  = "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz";
+        sha1 = "4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db";
+      };
+    }
+
+    {
+      name = "chokidar___chokidar_2.0.4.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz";
+        sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26";
+      };
+    }
+
+    {
+      name = "chownr___chownr_1.1.1.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz";
+        sha1 = "54726b8b8fff4df053c42187e801fb4412df1494";
+      };
+    }
+
+    {
+      name = "chrome_trace_event___chrome_trace_event_1.0.0.tgz";
+      path = fetchurl {
+        name = "chrome_trace_event___chrome_trace_event_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz";
+        sha1 = "45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48";
+      };
+    }
+
+    {
+      name = "ci_info___ci_info_1.6.0.tgz";
+      path = fetchurl {
+        name = "ci_info___ci_info_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz";
+        sha1 = "2ca20dbb9ceb32d4524a683303313f0304b1e497";
+      };
+    }
+
+    {
+      name = "cipher_base___cipher_base_1.0.4.tgz";
+      path = fetchurl {
+        name = "cipher_base___cipher_base_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
+        sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
+      };
+    }
+
+    {
+      name = "circular_json___circular_json_0.3.3.tgz";
+      path = fetchurl {
+        name = "circular_json___circular_json_0.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz";
+        sha1 = "815c99ea84f6809529d2f45791bdf82711352d66";
+      };
+    }
+
+    {
+      name = "class_utils___class_utils_0.3.6.tgz";
+      path = fetchurl {
+        name = "class_utils___class_utils_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
+        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
+      };
+    }
+
+    {
+      name = "classnames___classnames_2.2.6.tgz";
+      path = fetchurl {
+        name = "classnames___classnames_2.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz";
+        sha1 = "43935bffdd291f326dad0a205309b38d00f650ce";
+      };
+    }
+
+    {
+      name = "cli_cursor___cli_cursor_2.1.0.tgz";
+      path = fetchurl {
+        name = "cli_cursor___cli_cursor_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz";
+        sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
+      };
+    }
+
+    {
+      name = "cli_width___cli_width_2.2.0.tgz";
+      path = fetchurl {
+        name = "cli_width___cli_width_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz";
+        sha1 = "ff19ede8a9a5e579324147b0c11f0fbcbabed639";
+      };
+    }
+
+    {
+      name = "cliui___cliui_3.2.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
+        sha1 = "120601537a916d29940f934da3b48d585a39213d";
+      };
+    }
+
+    {
+      name = "cliui___cliui_4.1.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz";
+        sha1 = "348422dbe82d800b3022eef4f6ac10bf2e4d1b49";
+      };
+    }
+
+    {
+      name = "clone_deep___clone_deep_2.0.2.tgz";
+      path = fetchurl {
+        name = "clone_deep___clone_deep_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz";
+        sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713";
+      };
+    }
+
+    {
+      name = "co___co_4.6.0.tgz";
+      path = fetchurl {
+        name = "co___co_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    }
+
+    {
+      name = "coa___coa_2.0.2.tgz";
+      path = fetchurl {
+        name = "coa___coa_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz";
+        sha1 = "43f6c21151b4ef2bf57187db0d73de229e3e7ec3";
+      };
+    }
+
+    {
+      name = "code_point_at___code_point_at_1.1.0.tgz";
+      path = fetchurl {
+        name = "code_point_at___code_point_at_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    }
+
+    {
+      name = "collection_visit___collection_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "collection_visit___collection_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
+        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
+      };
+    }
+
+    {
+      name = "color_convert___color_convert_1.9.3.tgz";
+      path = fetchurl {
+        name = "color_convert___color_convert_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz";
+        sha1 = "bb71850690e1f136567de629d2d5471deda4c1e8";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.3.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.4.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz";
+        sha1 = "c2a09a87acbde69543de6f63fa3995c826c536a2";
+      };
+    }
+
+    {
+      name = "color_string___color_string_1.5.3.tgz";
+      path = fetchurl {
+        name = "color_string___color_string_1.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz";
+        sha1 = "c9bbc5f01b58b5492f3d6857459cb6590ce204cc";
+      };
+    }
+
+    {
+      name = "color___color_3.1.0.tgz";
+      path = fetchurl {
+        name = "color___color_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz";
+        sha1 = "d8e9fb096732875774c84bf922815df0308d0ffc";
+      };
+    }
+
+    {
+      name = "colors___colors_1.1.2.tgz";
+      path = fetchurl {
+        name = "colors___colors_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz";
+        sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+      };
+    }
+
+    {
+      name = "combined_stream___combined_stream_1.0.7.tgz";
+      path = fetchurl {
+        name = "combined_stream___combined_stream_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz";
+        sha1 = "2d1d24317afb8abe95d6d2c0b07b57813539d828";
+      };
+    }
+
+    {
+      name = "commander___commander_2.19.0.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.19.0.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz";
+        sha1 = "f6198aa84e5b83c46054b94ddedbfed5ee9ff12a";
+      };
+    }
+
+    {
+      name = "commander___commander_2.17.1.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.17.1.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz";
+        sha1 = "bd77ab7de6de94205ceacc72f1716d29f20a77bf";
+      };
+    }
+
+    {
+      name = "commondir___commondir_1.0.1.tgz";
+      path = fetchurl {
+        name = "commondir___commondir_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
+        sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.2.1.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    }
+
+    {
+      name = "compressible___compressible_2.0.15.tgz";
+      path = fetchurl {
+        name = "compressible___compressible_2.0.15.tgz";
+        url  = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz";
+        sha1 = "857a9ab0a7e5a07d8d837ed43fe2defff64fe212";
+      };
+    }
+
+    {
+      name = "compression_webpack_plugin___compression_webpack_plugin_2.0.0.tgz";
+      path = fetchurl {
+        name = "compression_webpack_plugin___compression_webpack_plugin_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz";
+        sha1 = "46476350c1eb27f783dccc79ac2f709baa2cffbc";
+      };
+    }
+
+    {
+      name = "compression___compression_1.7.3.tgz";
+      path = fetchurl {
+        name = "compression___compression_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz";
+        sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db";
+      };
+    }
+
+    {
+      name = "concat_map___concat_map_0.0.1.tgz";
+      path = fetchurl {
+        name = "concat_map___concat_map_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    }
+
+    {
+      name = "concat_stream___concat_stream_1.6.2.tgz";
+      path = fetchurl {
+        name = "concat_stream___concat_stream_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz";
+        sha1 = "904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34";
+      };
+    }
+
+    {
+      name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
+      path = fetchurl {
+        name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz";
+        sha1 = "b06873934bc5e344fef611a196a6faae0aee015a";
+      };
+    }
+
+    {
+      name = "console_browserify___console_browserify_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_browserify___console_browserify_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz";
+        sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
+      };
+    }
+
+    {
+      name = "console_control_strings___console_control_strings_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_control_strings___console_control_strings_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    }
+
+    {
+      name = "constants_browserify___constants_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "constants_browserify___constants_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
+        sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
+      };
+    }
+
+    {
+      name = "contains_path___contains_path_0.1.0.tgz";
+      path = fetchurl {
+        name = "contains_path___contains_path_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz";
+        sha1 = "fe8cf184ff6670b6baef01a9d4861a5cbec4120a";
+      };
+    }
+
+    {
+      name = "content_disposition___content_disposition_0.5.2.tgz";
+      path = fetchurl {
+        name = "content_disposition___content_disposition_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz";
+        sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
+      };
+    }
+
+    {
+      name = "content_type___content_type_1.0.4.tgz";
+      path = fetchurl {
+        name = "content_type___content_type_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
+        sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
+      };
+    }
+
+    {
+      name = "convert_source_map___convert_source_map_1.6.0.tgz";
+      path = fetchurl {
+        name = "convert_source_map___convert_source_map_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz";
+        sha1 = "51b537a8c43e0f04dec1993bffcdd504e758ac20";
+      };
+    }
+
+    {
+      name = "cookie_signature___cookie_signature_1.0.6.tgz";
+      path = fetchurl {
+        name = "cookie_signature___cookie_signature_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    }
+
+    {
+      name = "cookie___cookie_0.3.1.tgz";
+      path = fetchurl {
+        name = "cookie___cookie_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    }
+
+    {
+      name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+      path = fetchurl {
+        name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
+        sha1 = "92297398cae34937fcafd6ec8139c18051f0b5e0";
+      };
+    }
+
+    {
+      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+      path = fetchurl {
+        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
+        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
+      };
+    }
+
+    {
+      name = "core_js___core_js_1.2.7.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_1.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz";
+        sha1 = "652294c14651db28fa93bd2d5ff2983a4f08c636";
+      };
+    }
+
+    {
+      name = "core_js___core_js_2.6.1.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.6.1.tgz";
+        sha1 = "87416ae817de957a3f249b3b5ca475d4aaed6042";
+      };
+    }
+
+    {
+      name = "core_util_is___core_util_is_1.0.2.tgz";
+      path = fetchurl {
+        name = "core_util_is___core_util_is_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    }
+
+    {
+      name = "cosmiconfig___cosmiconfig_4.0.0.tgz";
+      path = fetchurl {
+        name = "cosmiconfig___cosmiconfig_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz";
+        sha1 = "760391549580bbd2df1e562bc177b13c290972dc";
+      };
+    }
+
+    {
+      name = "cosmiconfig___cosmiconfig_5.0.7.tgz";
+      path = fetchurl {
+        name = "cosmiconfig___cosmiconfig_5.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz";
+        sha1 = "39826b292ee0d78eda137dfa3173bd1c21a43b04";
+      };
+    }
+
+    {
+      name = "create_ecdh___create_ecdh_4.0.3.tgz";
+      path = fetchurl {
+        name = "create_ecdh___create_ecdh_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
+        sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
+      };
+    }
+
+    {
+      name = "create_emotion___create_emotion_10.0.5.tgz";
+      path = fetchurl {
+        name = "create_emotion___create_emotion_10.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/create-emotion/-/create-emotion-10.0.5.tgz";
+        sha1 = "22487f19b59a7ed10144f808289eadffebcfab06";
+      };
+    }
+
+    {
+      name = "create_hash___create_hash_1.2.0.tgz";
+      path = fetchurl {
+        name = "create_hash___create_hash_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
+        sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
+      };
+    }
+
+    {
+      name = "create_hmac___create_hmac_1.1.7.tgz";
+      path = fetchurl {
+        name = "create_hmac___create_hmac_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
+        sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
+      };
+    }
+
+    {
+      name = "cross_env___cross_env_5.2.0.tgz";
+      path = fetchurl {
+        name = "cross_env___cross_env_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz";
+        sha1 = "6ecd4c015d5773e614039ee529076669b9d126f2";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_5.1.0.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
+        sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_6.0.5.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_6.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz";
+        sha1 = "4a5ec7c64dfae22c3a14124dbacdee846d80cbc4";
+      };
+    }
+
+    {
+      name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+      path = fetchurl {
+        name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
+        sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
+      };
+    }
+
+    {
+      name = "css_color_names___css_color_names_0.0.4.tgz";
+      path = fetchurl {
+        name = "css_color_names___css_color_names_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
+        sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
+      };
+    }
+
+    {
+      name = "css_declaration_sorter___css_declaration_sorter_4.0.1.tgz";
+      path = fetchurl {
+        name = "css_declaration_sorter___css_declaration_sorter_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz";
+        sha1 = "c198940f63a76d7e36c1e71018b001721054cb22";
+      };
+    }
+
+    {
+      name = "css_font_size_keywords___css_font_size_keywords_1.0.0.tgz";
+      path = fetchurl {
+        name = "css_font_size_keywords___css_font_size_keywords_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz";
+        sha1 = "854875ace9aca6a8d2ee0d345a44aae9bb6db6cb";
+      };
+    }
+
+    {
+      name = "css_font_stretch_keywords___css_font_stretch_keywords_1.0.1.tgz";
+      path = fetchurl {
+        name = "css_font_stretch_keywords___css_font_stretch_keywords_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz";
+        sha1 = "50cee9b9ba031fb5c952d4723139f1e107b54b10";
+      };
+    }
+
+    {
+      name = "css_font_style_keywords___css_font_style_keywords_1.0.1.tgz";
+      path = fetchurl {
+        name = "css_font_style_keywords___css_font_style_keywords_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz";
+        sha1 = "5c3532813f63b4a1de954d13cea86ab4333409e4";
+      };
+    }
+
+    {
+      name = "css_font_weight_keywords___css_font_weight_keywords_1.0.0.tgz";
+      path = fetchurl {
+        name = "css_font_weight_keywords___css_font_weight_keywords_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz";
+        sha1 = "9bc04671ac85bc724b574ef5d3ac96b0d604fd97";
+      };
+    }
+
+    {
+      name = "css_global_keywords___css_global_keywords_1.0.1.tgz";
+      path = fetchurl {
+        name = "css_global_keywords___css_global_keywords_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz";
+        sha1 = "72a9aea72796d019b1d2a3252de4e5aaa37e4a69";
+      };
+    }
+
+    {
+      name = "css_list_helpers___css_list_helpers_1.0.1.tgz";
+      path = fetchurl {
+        name = "css_list_helpers___css_list_helpers_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-list-helpers/-/css-list-helpers-1.0.1.tgz";
+        sha1 = "fff57192202db83240c41686f919e449a7024f7d";
+      };
+    }
+
+    {
+      name = "css_loader___css_loader_2.1.0.tgz";
+      path = fetchurl {
+        name = "css_loader___css_loader_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz";
+        sha1 = "42952ac22bca5d076978638e9813abce49b8f0cc";
+      };
+    }
+
+    {
+      name = "css_select_base_adapter___css_select_base_adapter_0.1.1.tgz";
+      path = fetchurl {
+        name = "css_select_base_adapter___css_select_base_adapter_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz";
+        sha1 = "3b2ff4972cc362ab88561507a95408a1432135d7";
+      };
+    }
+
+    {
+      name = "css_select___css_select_2.0.2.tgz";
+      path = fetchurl {
+        name = "css_select___css_select_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz";
+        sha1 = "ab4386cec9e1f668855564b17c3733b43b2a5ede";
+      };
+    }
+
+    {
+      name = "css_select___css_select_1.2.0.tgz";
+      path = fetchurl {
+        name = "css_select___css_select_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz";
+        sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
+      };
+    }
+
+    {
+      name = "css_selector_tokenizer___css_selector_tokenizer_0.7.1.tgz";
+      path = fetchurl {
+        name = "css_selector_tokenizer___css_selector_tokenizer_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz";
+        sha1 = "a177271a8bca5019172f4f891fc6eed9cbf68d5d";
+      };
+    }
+
+    {
+      name = "css_system_font_keywords___css_system_font_keywords_1.0.0.tgz";
+      path = fetchurl {
+        name = "css_system_font_keywords___css_system_font_keywords_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz";
+        sha1 = "85c6f086aba4eb32c571a3086affc434b84823ed";
+      };
+    }
+
+    {
+      name = "css_tree___css_tree_1.0.0_alpha.28.tgz";
+      path = fetchurl {
+        name = "css_tree___css_tree_1.0.0_alpha.28.tgz";
+        url  = "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz";
+        sha1 = "8e8968190d886c9477bc8d61e96f61af3f7ffa7f";
+      };
+    }
+
+    {
+      name = "css_tree___css_tree_1.0.0_alpha.29.tgz";
+      path = fetchurl {
+        name = "css_tree___css_tree_1.0.0_alpha.29.tgz";
+        url  = "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz";
+        sha1 = "3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39";
+      };
+    }
+
+    {
+      name = "css_unit_converter___css_unit_converter_1.1.1.tgz";
+      path = fetchurl {
+        name = "css_unit_converter___css_unit_converter_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz";
+        sha1 = "d9b9281adcfd8ced935bdbaba83786897f64e996";
+      };
+    }
+
+    {
+      name = "css_url_regex___css_url_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "css_url_regex___css_url_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz";
+        sha1 = "83834230cc9f74c457de59eebd1543feeb83b7ec";
+      };
+    }
+
+    {
+      name = "css_what___css_what_2.1.2.tgz";
+      path = fetchurl {
+        name = "css_what___css_what_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz";
+        sha1 = "c0876d9d0480927d7d4920dcd72af3595649554d";
+      };
+    }
+
+    {
+      name = "cssesc___cssesc_0.1.0.tgz";
+      path = fetchurl {
+        name = "cssesc___cssesc_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz";
+        sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
+      };
+    }
+
+    {
+      name = "cssesc___cssesc_2.0.0.tgz";
+      path = fetchurl {
+        name = "cssesc___cssesc_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz";
+        sha1 = "3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703";
+      };
+    }
+
+    {
+      name = "cssnano_preset_default___cssnano_preset_default_4.0.6.tgz";
+      path = fetchurl {
+        name = "cssnano_preset_default___cssnano_preset_default_4.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.6.tgz";
+        sha1 = "92379e2a6db4a91c0ea727f5f556eeac693eab6a";
+      };
+    }
+
+    {
+      name = "cssnano_util_get_arguments___cssnano_util_get_arguments_4.0.0.tgz";
+      path = fetchurl {
+        name = "cssnano_util_get_arguments___cssnano_util_get_arguments_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz";
+        sha1 = "ed3a08299f21d75741b20f3b81f194ed49cc150f";
+      };
+    }
+
+    {
+      name = "cssnano_util_get_match___cssnano_util_get_match_4.0.0.tgz";
+      path = fetchurl {
+        name = "cssnano_util_get_match___cssnano_util_get_match_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz";
+        sha1 = "c0e4ca07f5386bb17ec5e52250b4f5961365156d";
+      };
+    }
+
+    {
+      name = "cssnano_util_raw_cache___cssnano_util_raw_cache_4.0.1.tgz";
+      path = fetchurl {
+        name = "cssnano_util_raw_cache___cssnano_util_raw_cache_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz";
+        sha1 = "b26d5fd5f72a11dfe7a7846fb4c67260f96bf282";
+      };
+    }
+
+    {
+      name = "cssnano_util_same_parent___cssnano_util_same_parent_4.0.1.tgz";
+      path = fetchurl {
+        name = "cssnano_util_same_parent___cssnano_util_same_parent_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz";
+        sha1 = "574082fb2859d2db433855835d9a8456ea18bbf3";
+      };
+    }
+
+    {
+      name = "cssnano___cssnano_4.1.8.tgz";
+      path = fetchurl {
+        name = "cssnano___cssnano_4.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.8.tgz";
+        sha1 = "8014989679d5fd42491e4499a521dbfb85c95fd1";
+      };
+    }
+
+    {
+      name = "csso___csso_3.5.1.tgz";
+      path = fetchurl {
+        name = "csso___csso_3.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz";
+        sha1 = "7b9eb8be61628973c1b261e169d2f024008e758b";
+      };
+    }
+
+    {
+      name = "cssom___cssom_0.3.4.tgz";
+      path = fetchurl {
+        name = "cssom___cssom_0.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz";
+        sha1 = "8cd52e8a3acfd68d3aed38ee0a640177d2f9d797";
+      };
+    }
+
+    {
+      name = "cssstyle___cssstyle_1.1.1.tgz";
+      path = fetchurl {
+        name = "cssstyle___cssstyle_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz";
+        sha1 = "18b038a9c44d65f7a8e428a653b9f6fe42faf5fb";
+      };
+    }
+
+    {
+      name = "csstype___csstype_2.6.0.tgz";
+      path = fetchurl {
+        name = "csstype___csstype_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/csstype/-/csstype-2.6.0.tgz";
+        sha1 = "6cf7b2fa7fc32aab3d746802c244d4eda71371a2";
+      };
+    }
+
+    {
+      name = "cyclist___cyclist_0.2.2.tgz";
+      path = fetchurl {
+        name = "cyclist___cyclist_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz";
+        sha1 = "1b33792e11e914a2fd6d6ed6447464444e5fa640";
+      };
+    }
+
+    {
+      name = "d___d_1.0.0.tgz";
+      path = fetchurl {
+        name = "d___d_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz";
+        sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
+      };
+    }
+
+    {
+      name = "damerau_levenshtein___damerau_levenshtein_1.0.4.tgz";
+      path = fetchurl {
+        name = "damerau_levenshtein___damerau_levenshtein_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz";
+        sha1 = "03191c432cb6eea168bb77f3a55ffdccb8978514";
+      };
+    }
+
+    {
+      name = "dashdash___dashdash_1.14.1.tgz";
+      path = fetchurl {
+        name = "dashdash___dashdash_1.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    }
+
+    {
+      name = "data_urls___data_urls_1.1.0.tgz";
+      path = fetchurl {
+        name = "data_urls___data_urls_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz";
+        sha1 = "15ee0582baa5e22bb59c77140da8f9c76963bbfe";
+      };
+    }
+
+    {
+      name = "date_now___date_now_0.1.4.tgz";
+      path = fetchurl {
+        name = "date_now___date_now_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz";
+        sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
+      };
+    }
+
+    {
+      name = "debug___debug_2.6.9.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.6.9.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
+        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
+      };
+    }
+
+    {
+      name = "debug___debug_3.1.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz";
+        sha1 = "5bb5a0672628b64149566ba16819e61518c67261";
+      };
+    }
+
+    {
+      name = "debug___debug_3.2.6.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz";
+        sha1 = "e83d17de16d8a7efb7717edbe5fb10135eee629b";
+      };
+    }
+
+    {
+      name = "debug___debug_4.1.1.tgz";
+      path = fetchurl {
+        name = "debug___debug_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz";
+        sha1 = "3b72260255109c6b589cee050f1d516139664791";
+      };
+    }
+
+    {
+      name = "decamelize___decamelize_1.2.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    }
+
+    {
+      name = "decamelize___decamelize_2.0.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz";
+        sha1 = "656d7bbc8094c4c788ea53c5840908c9c7d063c7";
+      };
+    }
+
+    {
+      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+      path = fetchurl {
+        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
+        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
+      };
+    }
+
+    {
+      name = "deep_equal___deep_equal_1.0.1.tgz";
+      path = fetchurl {
+        name = "deep_equal___deep_equal_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz";
+        sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5";
+      };
+    }
+
+    {
+      name = "deep_extend___deep_extend_0.5.1.tgz";
+      path = fetchurl {
+        name = "deep_extend___deep_extend_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz";
+        sha1 = "b894a9dd90d3023fbf1c55a394fb858eb2066f1f";
+      };
+    }
+
+    {
+      name = "deep_extend___deep_extend_0.6.0.tgz";
+      path = fetchurl {
+        name = "deep_extend___deep_extend_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
+      };
+    }
+
+    {
+      name = "deep_is___deep_is_0.1.3.tgz";
+      path = fetchurl {
+        name = "deep_is___deep_is_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    }
+
+    {
+      name = "default_gateway___default_gateway_2.7.2.tgz";
+      path = fetchurl {
+        name = "default_gateway___default_gateway_2.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz";
+        sha1 = "b7ef339e5e024b045467af403d50348db4642d0f";
+      };
+    }
+
+    {
+      name = "default_require_extensions___default_require_extensions_1.0.0.tgz";
+      path = fetchurl {
+        name = "default_require_extensions___default_require_extensions_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz";
+        sha1 = "f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8";
+      };
+    }
+
+    {
+      name = "define_properties___define_properties_1.1.3.tgz";
+      path = fetchurl {
+        name = "define_properties___define_properties_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz";
+        sha1 = "cf88da6cbee26fe6db7094f61d870cbd84cee9f1";
+      };
+    }
+
+    {
+      name = "define_property___define_property_0.2.5.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
+        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
+      };
+    }
+
+    {
+      name = "define_property___define_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
+        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
+      };
+    }
+
+    {
+      name = "define_property___define_property_2.0.2.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
+        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
+      };
+    }
+
+    {
+      name = "del___del_3.0.0.tgz";
+      path = fetchurl {
+        name = "del___del_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz";
+        sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5";
+      };
+    }
+
+    {
+      name = "delayed_stream___delayed_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "delayed_stream___delayed_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    }
+
+    {
+      name = "delegates___delegates_1.0.0.tgz";
+      path = fetchurl {
+        name = "delegates___delegates_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    }
+
+    {
+      name = "depd___depd_1.1.2.tgz";
+      path = fetchurl {
+        name = "depd___depd_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    }
+
+    {
+      name = "des.js___des.js_1.0.0.tgz";
+      path = fetchurl {
+        name = "des.js___des.js_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz";
+        sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
+      };
+    }
+
+    {
+      name = "destroy___destroy_1.0.4.tgz";
+      path = fetchurl {
+        name = "destroy___destroy_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    }
+
+    {
+      name = "detect_indent___detect_indent_4.0.0.tgz";
+      path = fetchurl {
+        name = "detect_indent___detect_indent_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz";
+        sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
+      };
+    }
+
+    {
+      name = "detect_libc___detect_libc_1.0.3.tgz";
+      path = fetchurl {
+        name = "detect_libc___detect_libc_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
+        sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
+      };
+    }
+
+    {
+      name = "detect_newline___detect_newline_2.1.0.tgz";
+      path = fetchurl {
+        name = "detect_newline___detect_newline_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz";
+        sha1 = "f41f1c10be4b00e87b5f13da680759f2c5bfd3e2";
+      };
+    }
+
+    {
+      name = "detect_node___detect_node_2.0.4.tgz";
+      path = fetchurl {
+        name = "detect_node___detect_node_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz";
+        sha1 = "014ee8f8f669c5c58023da64b8179c083a28c46c";
+      };
+    }
+
+    {
+      name = "detect_passive_events___detect_passive_events_1.0.4.tgz";
+      path = fetchurl {
+        name = "detect_passive_events___detect_passive_events_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-1.0.4.tgz";
+        sha1 = "6ed477e6e5bceb79079735dcd357789d37f9a91a";
+      };
+    }
+
+    {
+      name = "diff___diff_3.5.0.tgz";
+      path = fetchurl {
+        name = "diff___diff_3.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz";
+        sha1 = "800c0dd1e0a8bfbc95835c202ad220fe317e5a12";
+      };
+    }
+
+    {
+      name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+      path = fetchurl {
+        name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
+        sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
+      };
+    }
+
+    {
+      name = "discontinuous_range___discontinuous_range_1.0.0.tgz";
+      path = fetchurl {
+        name = "discontinuous_range___discontinuous_range_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz";
+        sha1 = "e38331f0844bba49b9a9cb71c771585aab1bc65a";
+      };
+    }
+
+    {
+      name = "dns_equal___dns_equal_1.0.0.tgz";
+      path = fetchurl {
+        name = "dns_equal___dns_equal_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz";
+        sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d";
+      };
+    }
+
+    {
+      name = "dns_packet___dns_packet_1.3.1.tgz";
+      path = fetchurl {
+        name = "dns_packet___dns_packet_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz";
+        sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a";
+      };
+    }
+
+    {
+      name = "dns_txt___dns_txt_2.0.2.tgz";
+      path = fetchurl {
+        name = "dns_txt___dns_txt_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz";
+        sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6";
+      };
+    }
+
+    {
+      name = "doctrine___doctrine_1.5.0.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz";
+        sha1 = "379dce730f6166f76cefa4e6707a159b02c5a6fa";
+      };
+    }
+
+    {
+      name = "doctrine___doctrine_2.1.0.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz";
+        sha1 = "5cd01fc101621b42c4cd7f5d1a66243716d3f39d";
+      };
+    }
+
+    {
+      name = "dom_helpers___dom_helpers_3.4.0.tgz";
+      path = fetchurl {
+        name = "dom_helpers___dom_helpers_3.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz";
+        sha1 = "e9b369700f959f62ecde5a6babde4bccd9169af8";
+      };
+    }
+
+    {
+      name = "dom_serializer___dom_serializer_0.1.0.tgz";
+      path = fetchurl {
+        name = "dom_serializer___dom_serializer_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz";
+        sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
+      };
+    }
+
+    {
+      name = "domain_browser___domain_browser_1.2.0.tgz";
+      path = fetchurl {
+        name = "domain_browser___domain_browser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
+        sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
+      };
+    }
+
+    {
+      name = "domelementtype___domelementtype_1.3.1.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz";
+        sha1 = "d048c44b37b0d10a7f2a3d5fee3f4333d790481f";
+      };
+    }
+
+    {
+      name = "domelementtype___domelementtype_1.1.3.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz";
+        sha1 = "bd28773e2642881aec51544924299c5cd822185b";
+      };
+    }
+
+    {
+      name = "domexception___domexception_1.0.1.tgz";
+      path = fetchurl {
+        name = "domexception___domexception_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz";
+        sha1 = "937442644ca6a31261ef36e3ec677fe805582c90";
+      };
+    }
+
+    {
+      name = "domhandler___domhandler_2.4.2.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_2.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz";
+        sha1 = "8805097e933d65e85546f726d60f5eb88b44f803";
+      };
+    }
+
+    {
+      name = "domutils___domutils_1.5.1.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
+        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
+      };
+    }
+
+    {
+      name = "domutils___domutils_1.7.0.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz";
+        sha1 = "56ea341e834e06e6748af7a1cb25da67ea9f8c2a";
+      };
+    }
+
+    {
+      name = "dot_prop___dot_prop_4.2.0.tgz";
+      path = fetchurl {
+        name = "dot_prop___dot_prop_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz";
+        sha1 = "1f19e0c2e1aa0e32797c49799f2837ac6af69c57";
+      };
+    }
+
+    {
+      name = "dotenv___dotenv_6.2.0.tgz";
+      path = fetchurl {
+        name = "dotenv___dotenv_6.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz";
+        sha1 = "941c0410535d942c8becf28d3f357dbd9d476064";
+      };
+    }
+
+    {
+      name = "double_ended_queue___double_ended_queue_2.1.0_0.tgz";
+      path = fetchurl {
+        name = "double_ended_queue___double_ended_queue_2.1.0_0.tgz";
+        url  = "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz";
+        sha1 = "103d3527fd31528f40188130c841efdd78264e5c";
+      };
+    }
+
+    {
+      name = "duplexer___duplexer_0.1.1.tgz";
+      path = fetchurl {
+        name = "duplexer___duplexer_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz";
+        sha1 = "ace6ff808c1ce66b57d1ebf97977acb02334cfc1";
+      };
+    }
+
+    {
+      name = "duplexify___duplexify_3.6.1.tgz";
+      path = fetchurl {
+        name = "duplexify___duplexify_3.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz";
+        sha1 = "b1a7a29c4abfd639585efaecce80d666b1e34125";
+      };
+    }
+
+    {
+      name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+      path = fetchurl {
+        name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    }
+
+    {
+      name = "ee_first___ee_first_1.1.1.tgz";
+      path = fetchurl {
+        name = "ee_first___ee_first_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    }
+
+    {
+      name = "ejs___ejs_2.6.1.tgz";
+      path = fetchurl {
+        name = "ejs___ejs_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz";
+        sha1 = "498ec0d495655abc6f23cd61868d926464071aa0";
+      };
+    }
+
+    {
+      name = "electron_to_chromium___electron_to_chromium_1.3.96.tgz";
+      path = fetchurl {
+        name = "electron_to_chromium___electron_to_chromium_1.3.96.tgz";
+        url  = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz";
+        sha1 = "25770ec99b8b07706dedf3a5f43fa50cb54c4f9a";
+      };
+    }
+
+    {
+      name = "elliptic___elliptic_6.4.1.tgz";
+      path = fetchurl {
+        name = "elliptic___elliptic_6.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz";
+        sha1 = "c2d0b7776911b86722c632c3c06c60f2f819939a";
+      };
+    }
+
+    {
+      name = "https___codeload.github.com_Gargron_emoji_mart_tar.gz_ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9";
+      path = fetchurl {
+        name = "https___codeload.github.com_Gargron_emoji_mart_tar.gz_ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9";
+        url  = "https://codeload.github.com/Gargron/emoji-mart/tar.gz/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9";
+        sha1 = "4255dc41fa7df9c3a02c1595f058e248bc37b784";
+      };
+    }
+
+    {
+      name = "emoji_regex___emoji_regex_6.5.1.tgz";
+      path = fetchurl {
+        name = "emoji_regex___emoji_regex_6.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz";
+        sha1 = "9baea929b155565c11ea41c6626eaa65cef992c2";
+      };
+    }
+
+    {
+      name = "emojis_list___emojis_list_2.1.0.tgz";
+      path = fetchurl {
+        name = "emojis_list___emojis_list_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
+        sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
+      };
+    }
+
+    {
+      name = "encodeurl___encodeurl_1.0.2.tgz";
+      path = fetchurl {
+        name = "encodeurl___encodeurl_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    }
+
+    {
+      name = "encoding___encoding_0.1.12.tgz";
+      path = fetchurl {
+        name = "encoding___encoding_0.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz";
+        sha1 = "538b66f3ee62cd1ab51ec323829d1f9480c74beb";
+      };
+    }
+
+    {
+      name = "end_of_stream___end_of_stream_1.4.1.tgz";
+      path = fetchurl {
+        name = "end_of_stream___end_of_stream_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz";
+        sha1 = "ed29634d19baba463b6ce6b80a37213eab71ec43";
+      };
+    }
+
+    {
+      name = "enhanced_resolve___enhanced_resolve_4.1.0.tgz";
+      path = fetchurl {
+        name = "enhanced_resolve___enhanced_resolve_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz";
+        sha1 = "41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f";
+      };
+    }
+
+    {
+      name = "entities___entities_1.1.2.tgz";
+      path = fetchurl {
+        name = "entities___entities_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz";
+        sha1 = "bdfa735299664dfafd34529ed4f8522a275fea56";
+      };
+    }
+
+    {
+      name = "enzyme_adapter_react_16___enzyme_adapter_react_16_1.7.1.tgz";
+      path = fetchurl {
+        name = "enzyme_adapter_react_16___enzyme_adapter_react_16_1.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.7.1.tgz";
+        sha1 = "c37c4cb0fd75e88a063154a7a88096474914496a";
+      };
+    }
+
+    {
+      name = "enzyme_adapter_utils___enzyme_adapter_utils_1.9.0.tgz";
+      path = fetchurl {
+        name = "enzyme_adapter_utils___enzyme_adapter_utils_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.9.0.tgz";
+        sha1 = "3997c20f3387fdcd932b155b3740829ea10aa86c";
+      };
+    }
+
+    {
+      name = "enzyme___enzyme_3.8.0.tgz";
+      path = fetchurl {
+        name = "enzyme___enzyme_3.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/enzyme/-/enzyme-3.8.0.tgz";
+        sha1 = "646d2d5d0798cb98fdec39afcee8a53237b47ad5";
+      };
+    }
+
+    {
+      name = "errno___errno_0.1.7.tgz";
+      path = fetchurl {
+        name = "errno___errno_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
+        sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
+      };
+    }
+
+    {
+      name = "error_ex___error_ex_1.3.2.tgz";
+      path = fetchurl {
+        name = "error_ex___error_ex_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
+        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
+      };
+    }
+
+    {
+      name = "es_abstract___es_abstract_1.12.0.tgz";
+      path = fetchurl {
+        name = "es_abstract___es_abstract_1.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz";
+        sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165";
+      };
+    }
+
+    {
+      name = "es_to_primitive___es_to_primitive_1.2.0.tgz";
+      path = fetchurl {
+        name = "es_to_primitive___es_to_primitive_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
+        sha1 = "edf72478033456e8dda8ef09e00ad9650707f377";
+      };
+    }
+
+    {
+      name = "es5_ext___es5_ext_0.10.46.tgz";
+      path = fetchurl {
+        name = "es5_ext___es5_ext_0.10.46.tgz";
+        url  = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz";
+        sha1 = "efd99f67c5a7ec789baa3daa7f79870388f7f572";
+      };
+    }
+
+    {
+      name = "es6_iterator___es6_iterator_2.0.3.tgz";
+      path = fetchurl {
+        name = "es6_iterator___es6_iterator_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
+        sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
+      };
+    }
+
+    {
+      name = "es6_symbol___es6_symbol_3.1.1.tgz";
+      path = fetchurl {
+        name = "es6_symbol___es6_symbol_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz";
+        sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
+      };
+    }
+
+    {
+      name = "escape_html___escape_html_1.0.3.tgz";
+      path = fetchurl {
+        name = "escape_html___escape_html_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    }
+
+    {
+      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+      path = fetchurl {
+        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    }
+
+    {
+      name = "escodegen___escodegen_1.11.0.tgz";
+      path = fetchurl {
+        name = "escodegen___escodegen_1.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz";
+        sha1 = "b27a9389481d5bfd5bec76f7bb1eb3f8f4556589";
+      };
+    }
+
+    {
+      name = "eslint_import_resolver_node___eslint_import_resolver_node_0.3.2.tgz";
+      path = fetchurl {
+        name = "eslint_import_resolver_node___eslint_import_resolver_node_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz";
+        sha1 = "58f15fb839b8d0576ca980413476aab2472db66a";
+      };
+    }
+
+    {
+      name = "eslint_module_utils___eslint_module_utils_2.2.0.tgz";
+      path = fetchurl {
+        name = "eslint_module_utils___eslint_module_utils_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz";
+        sha1 = "b270362cd88b1a48ad308976ce7fa54e98411746";
+      };
+    }
+
+    {
+      name = "eslint_plugin_import___eslint_plugin_import_2.14.0.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_import___eslint_plugin_import_2.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz";
+        sha1 = "6b17626d2e3e6ad52cfce8807a845d15e22111a8";
+      };
+    }
+
+    {
+      name = "eslint_plugin_jsx_a11y___eslint_plugin_jsx_a11y_6.1.2.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_jsx_a11y___eslint_plugin_jsx_a11y_6.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz";
+        sha1 = "69bca4890b36dcf0fe16dd2129d2d88b98f33f88";
+      };
+    }
+
+    {
+      name = "eslint_plugin_promise___eslint_plugin_promise_4.0.1.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_promise___eslint_plugin_promise_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz";
+        sha1 = "2d074b653f35a23d1ba89d8e976a985117d1c6a2";
+      };
+    }
+
+    {
+      name = "eslint_plugin_react___eslint_plugin_react_7.12.1.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_react___eslint_plugin_react_7.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.1.tgz";
+        sha1 = "b9c4639f72469ff317ac31e3bd630d22d0dbf8f4";
+      };
+    }
+
+    {
+      name = "eslint_scope___eslint_scope_3.7.1.tgz";
+      path = fetchurl {
+        name = "eslint_scope___eslint_scope_3.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz";
+        sha1 = "3d63c3edfda02e06e01a452ad88caacc7cdcb6e8";
+      };
+    }
+
+    {
+      name = "eslint_scope___eslint_scope_4.0.0.tgz";
+      path = fetchurl {
+        name = "eslint_scope___eslint_scope_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz";
+        sha1 = "50bf3071e9338bcdc43331794a0cb533f0136172";
+      };
+    }
+
+    {
+      name = "eslint_utils___eslint_utils_1.3.1.tgz";
+      path = fetchurl {
+        name = "eslint_utils___eslint_utils_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz";
+        sha1 = "9a851ba89ee7c460346f97cf8939c7298827e512";
+      };
+    }
+
+    {
+      name = "eslint_visitor_keys___eslint_visitor_keys_1.0.0.tgz";
+      path = fetchurl {
+        name = "eslint_visitor_keys___eslint_visitor_keys_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz";
+        sha1 = "3f3180fb2e291017716acb4c9d6d5b5c34a6a81d";
+      };
+    }
+
+    {
+      name = "eslint___eslint_5.11.1.tgz";
+      path = fetchurl {
+        name = "eslint___eslint_5.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint/-/eslint-5.11.1.tgz";
+        sha1 = "8deda83db9f354bf9d3f53f9677af7e0e13eadda";
+      };
+    }
+
+    {
+      name = "espree___espree_5.0.0.tgz";
+      path = fetchurl {
+        name = "espree___espree_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz";
+        sha1 = "fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c";
+      };
+    }
+
+    {
+      name = "esprima___esprima_3.1.3.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_3.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz";
+        sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
+      };
+    }
+
+    {
+      name = "esprima___esprima_4.0.1.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
+        sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
+      };
+    }
+
+    {
+      name = "esquery___esquery_1.0.1.tgz";
+      path = fetchurl {
+        name = "esquery___esquery_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz";
+        sha1 = "406c51658b1f5991a5f9b62b1dc25b00e3e5c708";
+      };
+    }
+
+    {
+      name = "esrecurse___esrecurse_4.2.1.tgz";
+      path = fetchurl {
+        name = "esrecurse___esrecurse_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
+        sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
+      };
+    }
+
+    {
+      name = "estraverse___estraverse_4.2.0.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz";
+        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
+      };
+    }
+
+    {
+      name = "esutils___esutils_2.0.2.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    }
+
+    {
+      name = "etag___etag_1.8.1.tgz";
+      path = fetchurl {
+        name = "etag___etag_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    }
+
+    {
+      name = "eventemitter3___eventemitter3_3.1.0.tgz";
+      path = fetchurl {
+        name = "eventemitter3___eventemitter3_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz";
+        sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163";
+      };
+    }
+
+    {
+      name = "events___events_1.1.1.tgz";
+      path = fetchurl {
+        name = "events___events_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz";
+        sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
+      };
+    }
+
+    {
+      name = "eventsource___eventsource_1.0.7.tgz";
+      path = fetchurl {
+        name = "eventsource___eventsource_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz";
+        sha1 = "8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0";
+      };
+    }
+
+    {
+      name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+      path = fetchurl {
+        name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
+        sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
+      };
+    }
+
+    {
+      name = "exec_sh___exec_sh_0.2.2.tgz";
+      path = fetchurl {
+        name = "exec_sh___exec_sh_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz";
+        sha1 = "2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36";
+      };
+    }
+
+    {
+      name = "execa___execa_0.10.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_0.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz";
+        sha1 = "ff456a8f53f90f8eccc71a96d11bdfc7f082cb50";
+      };
+    }
+
+    {
+      name = "execa___execa_0.7.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz";
+        sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777";
+      };
+    }
+
+    {
+      name = "execa___execa_1.0.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz";
+        sha1 = "c6236a5bb4df6d6f15e88e7f017798216749ddd8";
+      };
+    }
+
+    {
+      name = "exif_js___exif_js_2.3.0.tgz";
+      path = fetchurl {
+        name = "exif_js___exif_js_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz";
+        sha1 = "9d10819bf571f873813e7640241255ab9ce1a814";
+      };
+    }
+
+    {
+      name = "exit___exit_0.1.2.tgz";
+      path = fetchurl {
+        name = "exit___exit_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz";
+        sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_0.1.5.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
+        sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_2.1.4.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
+        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
+      };
+    }
+
+    {
+      name = "expand_range___expand_range_1.8.2.tgz";
+      path = fetchurl {
+        name = "expand_range___expand_range_1.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
+        sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
+      };
+    }
+
+    {
+      name = "expect___expect_23.6.0.tgz";
+      path = fetchurl {
+        name = "expect___expect_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz";
+        sha1 = "1e0c8d3ba9a581c87bd71fb9bc8862d443425f98";
+      };
+    }
+
+    {
+      name = "express___express_4.16.4.tgz";
+      path = fetchurl {
+        name = "express___express_4.16.4.tgz";
+        url  = "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz";
+        sha1 = "fddef61926109e24c515ea97fd2f1bdbf62df12e";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_2.0.1.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
+        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
+        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
+      };
+    }
+
+    {
+      name = "extend___extend_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend___extend_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
+        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
+      };
+    }
+
+    {
+      name = "external_editor___external_editor_3.0.3.tgz";
+      path = fetchurl {
+        name = "external_editor___external_editor_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz";
+        sha1 = "5866db29a97826dbe4bf3afd24070ead9ea43a27";
+      };
+    }
+
+    {
+      name = "extglob___extglob_0.3.2.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
+        sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
+      };
+    }
+
+    {
+      name = "extglob___extglob_2.0.4.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
+        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.3.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.4.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
+        sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
+      };
+    }
+
+    {
+      name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
+        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
+      };
+    }
+
+    {
+      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+      path = fetchurl {
+        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
+        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
+      };
+    }
+
+    {
+      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    }
+
+    {
+      name = "fastparse___fastparse_1.1.2.tgz";
+      path = fetchurl {
+        name = "fastparse___fastparse_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz";
+        sha1 = "91728c5a5942eced8531283c79441ee4122c35a9";
+      };
+    }
+
+    {
+      name = "faye_websocket___faye_websocket_0.10.0.tgz";
+      path = fetchurl {
+        name = "faye_websocket___faye_websocket_0.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz";
+        sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4";
+      };
+    }
+
+    {
+      name = "faye_websocket___faye_websocket_0.11.1.tgz";
+      path = fetchurl {
+        name = "faye_websocket___faye_websocket_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz";
+        sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38";
+      };
+    }
+
+    {
+      name = "fb_watchman___fb_watchman_2.0.0.tgz";
+      path = fetchurl {
+        name = "fb_watchman___fb_watchman_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz";
+        sha1 = "54e9abf7dfa2f26cd9b1636c588c1afc05de5d58";
+      };
+    }
+
+    {
+      name = "fbjs___fbjs_0.8.17.tgz";
+      path = fetchurl {
+        name = "fbjs___fbjs_0.8.17.tgz";
+        url  = "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz";
+        sha1 = "c4d598ead6949112653d6588b01a5cdcd9f90fdd";
+      };
+    }
+
+    {
+      name = "fibers___fibers_3.1.1.tgz";
+      path = fetchurl {
+        name = "fibers___fibers_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/fibers/-/fibers-3.1.1.tgz";
+        sha1 = "0238902ca938347bd779523692fbeefdf4f688ab";
+      };
+    }
+
+    {
+      name = "figgy_pudding___figgy_pudding_3.5.1.tgz";
+      path = fetchurl {
+        name = "figgy_pudding___figgy_pudding_3.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz";
+        sha1 = "862470112901c727a0e495a80744bd5baa1d6790";
+      };
+    }
+
+    {
+      name = "figures___figures_2.0.0.tgz";
+      path = fetchurl {
+        name = "figures___figures_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz";
+        sha1 = "3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962";
+      };
+    }
+
+    {
+      name = "file_entry_cache___file_entry_cache_2.0.0.tgz";
+      path = fetchurl {
+        name = "file_entry_cache___file_entry_cache_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz";
+        sha1 = "c392990c3e684783d838b8c84a45d8a048458361";
+      };
+    }
+
+    {
+      name = "file_loader___file_loader_3.0.1.tgz";
+      path = fetchurl {
+        name = "file_loader___file_loader_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz";
+        sha1 = "f8e0ba0b599918b51adfe45d66d1e771ad560faa";
+      };
+    }
+
+    {
+      name = "filename_regex___filename_regex_2.0.1.tgz";
+      path = fetchurl {
+        name = "filename_regex___filename_regex_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
+        sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
+      };
+    }
+
+    {
+      name = "fileset___fileset_2.0.3.tgz";
+      path = fetchurl {
+        name = "fileset___fileset_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz";
+        sha1 = "8e7548a96d3cc2327ee5e674168723a333bba2a0";
+      };
+    }
+
+    {
+      name = "filesize___filesize_3.6.1.tgz";
+      path = fetchurl {
+        name = "filesize___filesize_3.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz";
+        sha1 = "090bb3ee01b6f801a8a8be99d31710b3422bb317";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_2.2.4.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
+        sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_4.0.0.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
+        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
+      };
+    }
+
+    {
+      name = "finalhandler___finalhandler_1.1.1.tgz";
+      path = fetchurl {
+        name = "finalhandler___finalhandler_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz";
+        sha1 = "eebf4ed840079c83f4249038c9d703008301b105";
+      };
+    }
+
+    {
+      name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
+      path = fetchurl {
+        name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
+        sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
+      };
+    }
+
+    {
+      name = "find_cache_dir___find_cache_dir_2.0.0.tgz";
+      path = fetchurl {
+        name = "find_cache_dir___find_cache_dir_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz";
+        sha1 = "4c1faed59f45184530fb9d7fa123a4d04a98472d";
+      };
+    }
+
+    {
+      name = "find_up___find_up_1.1.2.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
+        sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
+      };
+    }
+
+    {
+      name = "find_up___find_up_2.1.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
+        sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
+      };
+    }
+
+    {
+      name = "find_up___find_up_3.0.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz";
+        sha1 = "49169f1d7993430646da61ecc5ae355c21c97b73";
+      };
+    }
+
+    {
+      name = "flat_cache___flat_cache_1.3.4.tgz";
+      path = fetchurl {
+        name = "flat_cache___flat_cache_1.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz";
+        sha1 = "2c2ef77525cc2929007dfffa1dd314aa9c9dee6f";
+      };
+    }
+
+    {
+      name = "flush_write_stream___flush_write_stream_1.0.3.tgz";
+      path = fetchurl {
+        name = "flush_write_stream___flush_write_stream_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz";
+        sha1 = "c5d586ef38af6097650b49bc41b55fabb19f35bd";
+      };
+    }
+
+    {
+      name = "follow_redirects___follow_redirects_1.6.0.tgz";
+      path = fetchurl {
+        name = "follow_redirects___follow_redirects_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.0.tgz";
+        sha1 = "d12452c031e8c67eb6637d861bfc7a8090167933";
+      };
+    }
+
+    {
+      name = "font_awesome___font_awesome_4.7.0.tgz";
+      path = fetchurl {
+        name = "font_awesome___font_awesome_4.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz";
+        sha1 = "8fa8cf0411a1a31afd07b06d2902bb9fc815a133";
+      };
+    }
+
+    {
+      name = "for_in___for_in_0.1.8.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz";
+        sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
+      };
+    }
+
+    {
+      name = "for_in___for_in_1.0.2.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    }
+
+    {
+      name = "for_own___for_own_0.1.5.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
+        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
+      };
+    }
+
+    {
+      name = "for_own___for_own_1.0.0.tgz";
+      path = fetchurl {
+        name = "for_own___for_own_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
+        sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
+      };
+    }
+
+    {
+      name = "forever_agent___forever_agent_0.6.1.tgz";
+      path = fetchurl {
+        name = "forever_agent___forever_agent_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    }
+
+    {
+      name = "form_data___form_data_2.3.3.tgz";
+      path = fetchurl {
+        name = "form_data___form_data_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz";
+        sha1 = "dcce52c05f644f298c6a7ab936bd724ceffbf3a6";
+      };
+    }
+
+    {
+      name = "forwarded___forwarded_0.1.2.tgz";
+      path = fetchurl {
+        name = "forwarded___forwarded_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    }
+
+    {
+      name = "fragment_cache___fragment_cache_0.2.1.tgz";
+      path = fetchurl {
+        name = "fragment_cache___fragment_cache_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
+        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
+      };
+    }
+
+    {
+      name = "fresh___fresh_0.5.2.tgz";
+      path = fetchurl {
+        name = "fresh___fresh_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    }
+
+    {
+      name = "from2___from2_2.3.0.tgz";
+      path = fetchurl {
+        name = "from2___from2_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz";
+        sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
+      };
+    }
+
+    {
+      name = "fs_minipass___fs_minipass_1.2.5.tgz";
+      path = fetchurl {
+        name = "fs_minipass___fs_minipass_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
+        sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
+      };
+    }
+
+    {
+      name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+      path = fetchurl {
+        name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
+        sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
+      };
+    }
+
+    {
+      name = "fs.realpath___fs.realpath_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs.realpath___fs.realpath_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    }
+
+    {
+      name = "fsevents___fsevents_1.2.4.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz";
+        sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426";
+      };
+    }
+
+    {
+      name = "function_bind___function_bind_1.1.1.tgz";
+      path = fetchurl {
+        name = "function_bind___function_bind_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
+        sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
+      };
+    }
+
+    {
+      name = "function.prototype.name___function.prototype.name_1.1.0.tgz";
+      path = fetchurl {
+        name = "function.prototype.name___function.prototype.name_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz";
+        sha1 = "8bd763cc0af860a859cc5d49384d74b932cd2327";
+      };
+    }
+
+    {
+      name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
+      path = fetchurl {
+        name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz";
+        sha1 = "1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
+      };
+    }
+
+    {
+      name = "gauge___gauge_2.7.4.tgz";
+      path = fetchurl {
+        name = "gauge___gauge_2.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    }
+
+    {
+      name = "generic_pool___generic_pool_2.4.3.tgz";
+      path = fetchurl {
+        name = "generic_pool___generic_pool_2.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz";
+        sha1 = "780c36f69dfad05a5a045dd37be7adca11a4f6ff";
+      };
+    }
+
+    {
+      name = "get_caller_file___get_caller_file_1.0.3.tgz";
+      path = fetchurl {
+        name = "get_caller_file___get_caller_file_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
+        sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
+      };
+    }
+
+    {
+      name = "get_stream___get_stream_3.0.0.tgz";
+      path = fetchurl {
+        name = "get_stream___get_stream_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
+        sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
+      };
+    }
+
+    {
+      name = "get_stream___get_stream_4.1.0.tgz";
+      path = fetchurl {
+        name = "get_stream___get_stream_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz";
+        sha1 = "c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5";
+      };
+    }
+
+    {
+      name = "get_value___get_value_2.0.6.tgz";
+      path = fetchurl {
+        name = "get_value___get_value_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
+        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
+      };
+    }
+
+    {
+      name = "getpass___getpass_0.1.7.tgz";
+      path = fetchurl {
+        name = "getpass___getpass_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    }
+
+    {
+      name = "glob_base___glob_base_0.3.0.tgz";
+      path = fetchurl {
+        name = "glob_base___glob_base_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
+        sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_2.0.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
+        sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_3.1.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
+        sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
+      };
+    }
+
+    {
+      name = "glob___glob_7.1.3.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz";
+        sha1 = "3960832d3f1574108342dafd3a67b332c0969df1";
+      };
+    }
+
+    {
+      name = "global_modules_path___global_modules_path_2.3.1.tgz";
+      path = fetchurl {
+        name = "global_modules_path___global_modules_path_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz";
+        sha1 = "e541f4c800a1a8514a990477b267ac67525b9931";
+      };
+    }
+
+    {
+      name = "globals___globals_11.9.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_11.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz";
+        sha1 = "bde236808e987f290768a93d065060d78e6ab249";
+      };
+    }
+
+    {
+      name = "globals___globals_9.18.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_9.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
+        sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
+      };
+    }
+
+    {
+      name = "globby___globby_6.1.0.tgz";
+      path = fetchurl {
+        name = "globby___globby_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
+        sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_4.1.15.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz";
+        sha1 = "ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00";
+      };
+    }
+
+    {
+      name = "growly___growly_1.3.0.tgz";
+      path = fetchurl {
+        name = "growly___growly_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz";
+        sha1 = "f10748cbe76af964b7c96c93c6bcc28af120c081";
+      };
+    }
+
+    {
+      name = "gzip_size___gzip_size_5.0.0.tgz";
+      path = fetchurl {
+        name = "gzip_size___gzip_size_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz";
+        sha1 = "a55ecd99222f4c48fd8c01c625ce3b349d0a0e80";
+      };
+    }
+
+    {
+      name = "handle_thing___handle_thing_2.0.0.tgz";
+      path = fetchurl {
+        name = "handle_thing___handle_thing_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz";
+        sha1 = "0e039695ff50c93fc288557d696f3c1dc6776754";
+      };
+    }
+
+    {
+      name = "handlebars___handlebars_4.0.12.tgz";
+      path = fetchurl {
+        name = "handlebars___handlebars_4.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz";
+        sha1 = "2c15c8a96d46da5e266700518ba8cb8d919d5bc5";
+      };
+    }
+
+    {
+      name = "har_schema___har_schema_2.0.0.tgz";
+      path = fetchurl {
+        name = "har_schema___har_schema_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    }
+
+    {
+      name = "har_validator___har_validator_5.1.3.tgz";
+      path = fetchurl {
+        name = "har_validator___har_validator_5.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz";
+        sha1 = "1ef89ebd3e4996557675eed9893110dc350fa080";
+      };
+    }
+
+    {
+      name = "has_ansi___has_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
+        sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_3.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
+        sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
+      };
+    }
+
+    {
+      name = "has_symbols___has_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_symbols___has_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz";
+        sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
+      };
+    }
+
+    {
+      name = "has_unicode___has_unicode_2.0.1.tgz";
+      path = fetchurl {
+        name = "has_unicode___has_unicode_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    }
+
+    {
+      name = "has_value___has_value_0.3.1.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
+        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
+      };
+    }
+
+    {
+      name = "has_value___has_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
+        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
+      };
+    }
+
+    {
+      name = "has_values___has_values_0.1.4.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    }
+
+    {
+      name = "has_values___has_values_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
+        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
+      };
+    }
+
+    {
+      name = "has___has_1.0.3.tgz";
+      path = fetchurl {
+        name = "has___has_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
+        sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
+      };
+    }
+
+    {
+      name = "hash_base___hash_base_3.0.4.tgz";
+      path = fetchurl {
+        name = "hash_base___hash_base_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz";
+        sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
+      };
+    }
+
+    {
+      name = "hash.js___hash.js_1.1.7.tgz";
+      path = fetchurl {
+        name = "hash.js___hash.js_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz";
+        sha1 = "0babca538e8d4ee4a0f8988d68866537a003cf42";
+      };
+    }
+
+    {
+      name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
+        sha1 = "4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e";
+      };
+    }
+
+    {
+      name = "history___history_4.7.2.tgz";
+      path = fetchurl {
+        name = "history___history_4.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz";
+        sha1 = "22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b";
+      };
+    }
+
+    {
+      name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+      path = fetchurl {
+        name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
+        sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
+      };
+    }
+
+    {
+      name = "hoist_non_react_statics___hoist_non_react_statics_2.5.5.tgz";
+      path = fetchurl {
+        name = "hoist_non_react_statics___hoist_non_react_statics_2.5.5.tgz";
+        url  = "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz";
+        sha1 = "c5903cf409c0dfd908f388e619d86b9c1174cb47";
+      };
+    }
+
+    {
+      name = "hoist_non_react_statics___hoist_non_react_statics_3.2.1.tgz";
+      path = fetchurl {
+        name = "hoist_non_react_statics___hoist_non_react_statics_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz";
+        sha1 = "c09c0555c84b38a7ede6912b61efddafd6e75e1e";
+      };
+    }
+
+    {
+      name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+      path = fetchurl {
+        name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
+        sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
+      };
+    }
+
+    {
+      name = "hoopy___hoopy_0.1.4.tgz";
+      path = fetchurl {
+        name = "hoopy___hoopy_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz";
+        sha1 = "609207d661100033a9a9402ad3dea677381c1b1d";
+      };
+    }
+
+    {
+      name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
+        sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
+      };
+    }
+
+    {
+      name = "hpack.js___hpack.js_2.1.6.tgz";
+      path = fetchurl {
+        name = "hpack.js___hpack.js_2.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz";
+        sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2";
+      };
+    }
+
+    {
+      name = "hsl_regex___hsl_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "hsl_regex___hsl_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz";
+        sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
+      };
+    }
+
+    {
+      name = "hsla_regex___hsla_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "hsla_regex___hsla_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz";
+        sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
+      };
+    }
+
+    {
+      name = "html_comment_regex___html_comment_regex_1.1.2.tgz";
+      path = fetchurl {
+        name = "html_comment_regex___html_comment_regex_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
+        sha1 = "97d4688aeb5c81886a364faa0cad1dda14d433a7";
+      };
+    }
+
+    {
+      name = "html_encoding_sniffer___html_encoding_sniffer_1.0.2.tgz";
+      path = fetchurl {
+        name = "html_encoding_sniffer___html_encoding_sniffer_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz";
+        sha1 = "e70d84b94da53aa375e11fe3a351be6642ca46f8";
+      };
+    }
+
+    {
+      name = "html_entities___html_entities_1.2.1.tgz";
+      path = fetchurl {
+        name = "html_entities___html_entities_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz";
+        sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f";
+      };
+    }
+
+    {
+      name = "htmlparser2___htmlparser2_3.10.0.tgz";
+      path = fetchurl {
+        name = "htmlparser2___htmlparser2_3.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz";
+        sha1 = "5f5e422dcf6119c0d983ed36260ce9ded0bee464";
+      };
+    }
+
+    {
+      name = "http_deceiver___http_deceiver_1.2.7.tgz";
+      path = fetchurl {
+        name = "http_deceiver___http_deceiver_1.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz";
+        sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.6.3.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
+        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
+      };
+    }
+
+    {
+      name = "http_link_header___http_link_header_1.0.2.tgz";
+      path = fetchurl {
+        name = "http_link_header___http_link_header_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.2.tgz";
+        sha1 = "bea50f02e1c7996021f1013b428c63f77e0f4e11";
+      };
+    }
+
+    {
+      name = "http_parser_js___http_parser_js_0.5.0.tgz";
+      path = fetchurl {
+        name = "http_parser_js___http_parser_js_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz";
+        sha1 = "d65edbede84349d0dc30320815a15d39cc3cbbd8";
+      };
+    }
+
+    {
+      name = "http_proxy_middleware___http_proxy_middleware_0.18.0.tgz";
+      path = fetchurl {
+        name = "http_proxy_middleware___http_proxy_middleware_0.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz";
+        sha1 = "0987e6bb5a5606e5a69168d8f967a87f15dd8aab";
+      };
+    }
+
+    {
+      name = "http_proxy___http_proxy_1.17.0.tgz";
+      path = fetchurl {
+        name = "http_proxy___http_proxy_1.17.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz";
+        sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a";
+      };
+    }
+
+    {
+      name = "http_signature___http_signature_1.2.0.tgz";
+      path = fetchurl {
+        name = "http_signature___http_signature_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    }
+
+    {
+      name = "https_browserify___https_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "https_browserify___https_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
+        sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.23.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.23.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
+        sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.24.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.24.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
+      };
+    }
+
+    {
+      name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+      path = fetchurl {
+        name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
+        sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
+      };
+    }
+
+    {
+      name = "icss_utils___icss_utils_4.0.0.tgz";
+      path = fetchurl {
+        name = "icss_utils___icss_utils_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz";
+        sha1 = "d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098";
+      };
+    }
+
+    {
+      name = "ieee754___ieee754_1.1.12.tgz";
+      path = fetchurl {
+        name = "ieee754___ieee754_1.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz";
+        sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b";
+      };
+    }
+
+    {
+      name = "iferr___iferr_0.1.5.tgz";
+      path = fetchurl {
+        name = "iferr___iferr_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz";
+        sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
+      };
+    }
+
+    {
+      name = "ignore_walk___ignore_walk_3.0.1.tgz";
+      path = fetchurl {
+        name = "ignore_walk___ignore_walk_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
+        sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
+      };
+    }
+
+    {
+      name = "ignore___ignore_4.0.6.tgz";
+      path = fetchurl {
+        name = "ignore___ignore_4.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz";
+        sha1 = "750e3db5862087b4737ebac8207ffd1ef27b25fc";
+      };
+    }
+
+    {
+      name = "immutable___immutable_3.8.2.tgz";
+      path = fetchurl {
+        name = "immutable___immutable_3.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz";
+        sha1 = "c2439951455bb39913daf281376f1530e104adf3";
+      };
+    }
+
+    {
+      name = "import_cwd___import_cwd_2.1.0.tgz";
+      path = fetchurl {
+        name = "import_cwd___import_cwd_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz";
+        sha1 = "aa6cf36e722761285cb371ec6519f53e2435b0a9";
+      };
+    }
+
+    {
+      name = "import_fresh___import_fresh_2.0.0.tgz";
+      path = fetchurl {
+        name = "import_fresh___import_fresh_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz";
+        sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
+      };
+    }
+
+    {
+      name = "import_from___import_from_2.1.0.tgz";
+      path = fetchurl {
+        name = "import_from___import_from_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz";
+        sha1 = "335db7f2a7affd53aaa471d4b8021dee36b7f3b1";
+      };
+    }
+
+    {
+      name = "import_local___import_local_1.0.0.tgz";
+      path = fetchurl {
+        name = "import_local___import_local_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz";
+        sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc";
+      };
+    }
+
+    {
+      name = "import_local___import_local_2.0.0.tgz";
+      path = fetchurl {
+        name = "import_local___import_local_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz";
+        sha1 = "55070be38a5993cf18ef6db7e961f5bee5c5a09d";
+      };
+    }
+
+    {
+      name = "imports_loader___imports_loader_0.8.0.tgz";
+      path = fetchurl {
+        name = "imports_loader___imports_loader_0.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz";
+        sha1 = "030ea51b8ca05977c40a3abfd9b4088fe0be9a69";
+      };
+    }
+
+    {
+      name = "imurmurhash___imurmurhash_0.1.4.tgz";
+      path = fetchurl {
+        name = "imurmurhash___imurmurhash_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz";
+        sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
+      };
+    }
+
+    {
+      name = "indexes_of___indexes_of_1.0.1.tgz";
+      path = fetchurl {
+        name = "indexes_of___indexes_of_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
+        sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
+      };
+    }
+
+    {
+      name = "indexof___indexof_0.0.1.tgz";
+      path = fetchurl {
+        name = "indexof___indexof_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    }
+
+    {
+      name = "inflight___inflight_1.0.6.tgz";
+      path = fetchurl {
+        name = "inflight___inflight_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.3.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.1.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
+        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
+      };
+    }
+
+    {
+      name = "ini___ini_1.3.5.tgz";
+      path = fetchurl {
+        name = "ini___ini_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
+        sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
+      };
+    }
+
+    {
+      name = "inquirer___inquirer_6.2.1.tgz";
+      path = fetchurl {
+        name = "inquirer___inquirer_6.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz";
+        sha1 = "9943fc4882161bdb0b0c9276769c75b32dbfcd52";
+      };
+    }
+
+    {
+      name = "internal_ip___internal_ip_3.0.1.tgz";
+      path = fetchurl {
+        name = "internal_ip___internal_ip_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz";
+        sha1 = "df5c99876e1d2eb2ea2d74f520e3f669a00ece27";
+      };
+    }
+
+    {
+      name = "interpret___interpret_1.2.0.tgz";
+      path = fetchurl {
+        name = "interpret___interpret_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz";
+        sha1 = "d5061a6224be58e8083985f5014d844359576296";
+      };
+    }
+
+    {
+      name = "intersection_observer___intersection_observer_0.5.1.tgz";
+      path = fetchurl {
+        name = "intersection_observer___intersection_observer_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.1.tgz";
+        sha1 = "e340fc56ce74290fe2b2394d1ce88c4353ac6dfa";
+      };
+    }
+
+    {
+      name = "intl_format_cache___intl_format_cache_2.1.0.tgz";
+      path = fetchurl {
+        name = "intl_format_cache___intl_format_cache_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.1.0.tgz";
+        sha1 = "04a369fecbfad6da6005bae1f14333332dcf9316";
+      };
+    }
+
+    {
+      name = "intl_messageformat_parser___intl_messageformat_parser_1.4.0.tgz";
+      path = fetchurl {
+        name = "intl_messageformat_parser___intl_messageformat_parser_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz";
+        sha1 = "b43d45a97468cadbe44331d74bb1e8dea44fc075";
+      };
+    }
+
+    {
+      name = "intl_messageformat___intl_messageformat_2.2.0.tgz";
+      path = fetchurl {
+        name = "intl_messageformat___intl_messageformat_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz";
+        sha1 = "345bcd46de630b7683330c2e52177ff5eab484fc";
+      };
+    }
+
+    {
+      name = "intl_relativeformat___intl_relativeformat_2.1.0.tgz";
+      path = fetchurl {
+        name = "intl_relativeformat___intl_relativeformat_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.1.0.tgz";
+        sha1 = "010f1105802251f40ac47d0e3e1a201348a255df";
+      };
+    }
+
+    {
+      name = "intl___intl_1.2.5.tgz";
+      path = fetchurl {
+        name = "intl___intl_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz";
+        sha1 = "82244a2190c4e419f8371f5aa34daa3420e2abde";
+      };
+    }
+
+    {
+      name = "invariant___invariant_2.2.4.tgz";
+      path = fetchurl {
+        name = "invariant___invariant_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
+        sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_1.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
+        sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_2.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz";
+        sha1 = "7393f5afa59ec9ff5f67a27620d11c226e3eec02";
+      };
+    }
+
+    {
+      name = "ip_regex___ip_regex_2.1.0.tgz";
+      path = fetchurl {
+        name = "ip_regex___ip_regex_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz";
+        sha1 = "fa78bf5d2e6913c911ce9f819ee5146bb6d844e9";
+      };
+    }
+
+    {
+      name = "ip___ip_1.1.5.tgz";
+      path = fetchurl {
+        name = "ip___ip_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
+        sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz";
+        sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.8.1.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz";
+        sha1 = "fa4b79fa47fd3def5e3b159825161c0a519c9427";
+      };
+    }
+
+    {
+      name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
+        sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
+        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
+        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.3.2.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz";
+        sha1 = "4574a2ae56f7ab206896fb431eaeed066fdf8f03";
+      };
+    }
+
+    {
+      name = "is_binary_path___is_binary_path_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
+        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
+      };
+    }
+
+    {
+      name = "is_boolean_object___is_boolean_object_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_boolean_object___is_boolean_object_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz";
+        sha1 = "98f8b28030684219a95f375cfbd88ce3405dff93";
+      };
+    }
+
+    {
+      name = "is_buffer___is_buffer_1.1.6.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
+      };
+    }
+
+    {
+      name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
+        sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
+      };
+    }
+
+    {
+      name = "is_callable___is_callable_1.1.4.tgz";
+      path = fetchurl {
+        name = "is_callable___is_callable_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz";
+        sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75";
+      };
+    }
+
+    {
+      name = "is_ci___is_ci_1.2.1.tgz";
+      path = fetchurl {
+        name = "is_ci___is_ci_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz";
+        sha1 = "e3779c8ee17fccf428488f6e281187f2e632841c";
+      };
+    }
+
+    {
+      name = "is_color_stop___is_color_stop_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_color_stop___is_color_stop_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz";
+        sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
+        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
+        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
+      };
+    }
+
+    {
+      name = "is_date_object___is_date_object_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_date_object___is_date_object_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz";
+        sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
+        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
+        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
+      };
+    }
+
+    {
+      name = "is_directory___is_directory_0.3.1.tgz";
+      path = fetchurl {
+        name = "is_directory___is_directory_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz";
+        sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
+      };
+    }
+
+    {
+      name = "is_dotfile___is_dotfile_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_dotfile___is_dotfile_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
+        sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
+      };
+    }
+
+    {
+      name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+      path = fetchurl {
+        name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
+        sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
+        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
+        sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_2.1.1.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
+        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
+      };
+    }
+
+    {
+      name = "is_finite___is_finite_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_finite___is_finite_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
+        sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    }
+
+    {
+      name = "is_generator_fn___is_generator_fn_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_generator_fn___is_generator_fn_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz";
+        sha1 = "969d49e1bb3329f6bb7f09089be26578b2ddd46a";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_2.0.1.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
+        sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_3.1.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
+        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz";
+        sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
+      };
+    }
+
+    {
+      name = "is_nan___is_nan_1.2.1.tgz";
+      path = fetchurl {
+        name = "is_nan___is_nan_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz";
+        sha1 = "9faf65b6fb6db24b7f5c0628475ea71f988401e2";
+      };
+    }
+
+    {
+      name = "is_number_object___is_number_object_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_number_object___is_number_object_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz";
+        sha1 = "f265ab89a9f445034ef6aff15a8f00b00f551799";
+      };
+    }
+
+    {
+      name = "is_number___is_number_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
+        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
+      };
+    }
+
+    {
+      name = "is_number___is_number_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
+        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
+      };
+    }
+
+    {
+      name = "is_number___is_number_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
+        sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
+      };
+    }
+
+    {
+      name = "is_obj___is_obj_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_obj___is_obj_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz";
+        sha1 = "3e4729ac1f5fde025cd7d83a896dab9f4f67db0f";
+      };
+    }
+
+    {
+      name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
+        sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
+      };
+    }
+
+    {
+      name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz";
+        sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52";
+      };
+    }
+
+    {
+      name = "is_path_inside___is_path_inside_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_inside___is_path_inside_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz";
+        sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
+      };
+    }
+
+    {
+      name = "is_plain_object___is_plain_object_2.0.4.tgz";
+      path = fetchurl {
+        name = "is_plain_object___is_plain_object_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
+      };
+    }
+
+    {
+      name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
+        sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
+      };
+    }
+
+    {
+      name = "is_primitive___is_primitive_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_primitive___is_primitive_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
+        sha1 = "207bab91638499c07b2adf240a41a87210034575";
+      };
+    }
+
+    {
+      name = "is_promise___is_promise_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_promise___is_promise_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz";
+        sha1 = "79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa";
+      };
+    }
+
+    {
+      name = "is_regex___is_regex_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_regex___is_regex_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz";
+        sha1 = "5517489b547091b0930e095654ced25ee97e9491";
+      };
+    }
+
+    {
+      name = "is_resolvable___is_resolvable_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_resolvable___is_resolvable_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz";
+        sha1 = "fb18f87ce1feb925169c9a407c19318a3206ed88";
+      };
+    }
+
+    {
+      name = "is_stream___is_stream_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_stream___is_stream_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
+        sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
+      };
+    }
+
+    {
+      name = "is_string___is_string_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_string___is_string_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz";
+        sha1 = "cc3a9b69857d621e963725a24caeec873b826e64";
+      };
+    }
+
+    {
+      name = "is_subset___is_subset_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_subset___is_subset_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz";
+        sha1 = "8a59117d932de1de00f245fcdd39ce43f1e939a6";
+      };
+    }
+
+    {
+      name = "is_svg___is_svg_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_svg___is_svg_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz";
+        sha1 = "9321dbd29c212e5ca99c4fa9794c714bcafa2f75";
+      };
+    }
+
+    {
+      name = "is_symbol___is_symbol_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_symbol___is_symbol_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz";
+        sha1 = "a055f6ae57192caee329e7a860118b497a950f38";
+      };
+    }
+
+    {
+      name = "is_typedarray___is_typedarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_typedarray___is_typedarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    }
+
+    {
+      name = "is_utf8___is_utf8_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_utf8___is_utf8_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
+        sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
+      };
+    }
+
+    {
+      name = "is_windows___is_windows_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_windows___is_windows_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
+        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
+      };
+    }
+
+    {
+      name = "is_wsl___is_wsl_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_wsl___is_wsl_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
+        sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
+      };
+    }
+
+    {
+      name = "isarray___isarray_0.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    }
+
+    {
+      name = "isarray___isarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    }
+
+    {
+      name = "isexe___isexe_2.0.0.tgz";
+      path = fetchurl {
+        name = "isexe___isexe_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    }
+
+    {
+      name = "isobject___isobject_2.1.0.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
+        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
+      };
+    }
+
+    {
+      name = "isobject___isobject_3.0.1.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    }
+
+    {
+      name = "isomorphic_fetch___isomorphic_fetch_2.2.1.tgz";
+      path = fetchurl {
+        name = "isomorphic_fetch___isomorphic_fetch_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz";
+        sha1 = "611ae1acf14f5e81f729507472819fe9733558a9";
+      };
+    }
+
+    {
+      name = "isstream___isstream_0.1.2.tgz";
+      path = fetchurl {
+        name = "isstream___isstream_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    }
+
+    {
+      name = "istanbul_api___istanbul_api_1.3.7.tgz";
+      path = fetchurl {
+        name = "istanbul_api___istanbul_api_1.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz";
+        sha1 = "a86c770d2b03e11e3f778cd7aedd82d2722092aa";
+      };
+    }
+
+    {
+      name = "istanbul_lib_coverage___istanbul_lib_coverage_1.2.1.tgz";
+      path = fetchurl {
+        name = "istanbul_lib_coverage___istanbul_lib_coverage_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz";
+        sha1 = "ccf7edcd0a0bb9b8f729feeb0930470f9af664f0";
+      };
+    }
+
+    {
+      name = "istanbul_lib_hook___istanbul_lib_hook_1.2.2.tgz";
+      path = fetchurl {
+        name = "istanbul_lib_hook___istanbul_lib_hook_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz";
+        sha1 = "bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86";
+      };
+    }
+
+    {
+      name = "istanbul_lib_instrument___istanbul_lib_instrument_1.10.2.tgz";
+      path = fetchurl {
+        name = "istanbul_lib_instrument___istanbul_lib_instrument_1.10.2.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz";
+        sha1 = "1f55ed10ac3c47f2bdddd5307935126754d0a9ca";
+      };
+    }
+
+    {
+      name = "istanbul_lib_report___istanbul_lib_report_1.1.5.tgz";
+      path = fetchurl {
+        name = "istanbul_lib_report___istanbul_lib_report_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz";
+        sha1 = "f2a657fc6282f96170aaf281eb30a458f7f4170c";
+      };
+    }
+
+    {
+      name = "istanbul_lib_source_maps___istanbul_lib_source_maps_1.2.6.tgz";
+      path = fetchurl {
+        name = "istanbul_lib_source_maps___istanbul_lib_source_maps_1.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz";
+        sha1 = "37b9ff661580f8fca11232752ee42e08c6675d8f";
+      };
+    }
+
+    {
+      name = "istanbul_reports___istanbul_reports_1.5.1.tgz";
+      path = fetchurl {
+        name = "istanbul_reports___istanbul_reports_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz";
+        sha1 = "97e4dbf3b515e8c484caea15d6524eebd3ff4e1a";
+      };
+    }
+
+    {
+      name = "jest_changed_files___jest_changed_files_23.4.2.tgz";
+      path = fetchurl {
+        name = "jest_changed_files___jest_changed_files_23.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz";
+        sha1 = "1eed688370cd5eebafe4ae93d34bb3b64968fe83";
+      };
+    }
+
+    {
+      name = "jest_cli___jest_cli_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_cli___jest_cli_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz";
+        sha1 = "61ab917744338f443ef2baa282ddffdd658a5da4";
+      };
+    }
+
+    {
+      name = "jest_config___jest_config_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_config___jest_config_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz";
+        sha1 = "f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d";
+      };
+    }
+
+    {
+      name = "jest_diff___jest_diff_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_diff___jest_diff_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz";
+        sha1 = "1500f3f16e850bb3d71233408089be099f610c7d";
+      };
+    }
+
+    {
+      name = "jest_docblock___jest_docblock_23.2.0.tgz";
+      path = fetchurl {
+        name = "jest_docblock___jest_docblock_23.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz";
+        sha1 = "f085e1f18548d99fdd69b20207e6fd55d91383a7";
+      };
+    }
+
+    {
+      name = "jest_each___jest_each_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_each___jest_each_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz";
+        sha1 = "ba0c3a82a8054387016139c733a05242d3d71575";
+      };
+    }
+
+    {
+      name = "jest_environment_jsdom___jest_environment_jsdom_23.4.0.tgz";
+      path = fetchurl {
+        name = "jest_environment_jsdom___jest_environment_jsdom_23.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz";
+        sha1 = "056a7952b3fea513ac62a140a2c368c79d9e6023";
+      };
+    }
+
+    {
+      name = "jest_environment_node___jest_environment_node_23.4.0.tgz";
+      path = fetchurl {
+        name = "jest_environment_node___jest_environment_node_23.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz";
+        sha1 = "57e80ed0841dea303167cce8cd79521debafde10";
+      };
+    }
+
+    {
+      name = "jest_get_type___jest_get_type_22.4.3.tgz";
+      path = fetchurl {
+        name = "jest_get_type___jest_get_type_22.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz";
+        sha1 = "e3a8504d8479342dd4420236b322869f18900ce4";
+      };
+    }
+
+    {
+      name = "jest_haste_map___jest_haste_map_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_haste_map___jest_haste_map_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz";
+        sha1 = "2e3eb997814ca696d62afdb3f2529f5bbc935e16";
+      };
+    }
+
+    {
+      name = "jest_jasmine2___jest_jasmine2_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_jasmine2___jest_jasmine2_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz";
+        sha1 = "840e937f848a6c8638df24360ab869cc718592e0";
+      };
+    }
+
+    {
+      name = "jest_leak_detector___jest_leak_detector_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_leak_detector___jest_leak_detector_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz";
+        sha1 = "e4230fd42cf381a1a1971237ad56897de7e171de";
+      };
+    }
+
+    {
+      name = "jest_matcher_utils___jest_matcher_utils_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_matcher_utils___jest_matcher_utils_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz";
+        sha1 = "726bcea0c5294261a7417afb6da3186b4b8cac80";
+      };
+    }
+
+    {
+      name = "jest_message_util___jest_message_util_23.4.0.tgz";
+      path = fetchurl {
+        name = "jest_message_util___jest_message_util_23.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz";
+        sha1 = "17610c50942349508d01a3d1e0bda2c079086a9f";
+      };
+    }
+
+    {
+      name = "jest_mock___jest_mock_23.2.0.tgz";
+      path = fetchurl {
+        name = "jest_mock___jest_mock_23.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz";
+        sha1 = "ad1c60f29e8719d47c26e1138098b6d18b261134";
+      };
+    }
+
+    {
+      name = "jest_regex_util___jest_regex_util_23.3.0.tgz";
+      path = fetchurl {
+        name = "jest_regex_util___jest_regex_util_23.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz";
+        sha1 = "5f86729547c2785c4002ceaa8f849fe8ca471bc5";
+      };
+    }
+
+    {
+      name = "jest_resolve_dependencies___jest_resolve_dependencies_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_resolve_dependencies___jest_resolve_dependencies_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz";
+        sha1 = "b4526af24c8540d9a3fab102c15081cf509b723d";
+      };
+    }
+
+    {
+      name = "jest_resolve___jest_resolve_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_resolve___jest_resolve_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz";
+        sha1 = "cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae";
+      };
+    }
+
+    {
+      name = "jest_runner___jest_runner_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_runner___jest_runner_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz";
+        sha1 = "3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38";
+      };
+    }
+
+    {
+      name = "jest_runtime___jest_runtime_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_runtime___jest_runtime_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz";
+        sha1 = "059e58c8ab445917cd0e0d84ac2ba68de8f23082";
+      };
+    }
+
+    {
+      name = "jest_serializer___jest_serializer_23.0.1.tgz";
+      path = fetchurl {
+        name = "jest_serializer___jest_serializer_23.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz";
+        sha1 = "a3776aeb311e90fe83fab9e533e85102bd164165";
+      };
+    }
+
+    {
+      name = "jest_snapshot___jest_snapshot_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_snapshot___jest_snapshot_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz";
+        sha1 = "f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a";
+      };
+    }
+
+    {
+      name = "jest_util___jest_util_23.4.0.tgz";
+      path = fetchurl {
+        name = "jest_util___jest_util_23.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz";
+        sha1 = "4d063cb927baf0a23831ff61bec2cbbf49793561";
+      };
+    }
+
+    {
+      name = "jest_validate___jest_validate_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_validate___jest_validate_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz";
+        sha1 = "36761f99d1ed33fcd425b4e4c5595d62b6597474";
+      };
+    }
+
+    {
+      name = "jest_watcher___jest_watcher_23.4.0.tgz";
+      path = fetchurl {
+        name = "jest_watcher___jest_watcher_23.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz";
+        sha1 = "d2e28ce74f8dad6c6afc922b92cabef6ed05c91c";
+      };
+    }
+
+    {
+      name = "jest_worker___jest_worker_23.2.0.tgz";
+      path = fetchurl {
+        name = "jest_worker___jest_worker_23.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz";
+        sha1 = "faf706a8da36fae60eb26957257fa7b5d8ea02b9";
+      };
+    }
+
+    {
+      name = "jest___jest_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest___jest_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz";
+        sha1 = "ad5835e923ebf6e19e7a1d7529a432edfee7813d";
+      };
+    }
+
+    {
+      name = "js_base64___js_base64_2.5.0.tgz";
+      path = fetchurl {
+        name = "js_base64___js_base64_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.0.tgz";
+        sha1 = "42255ba183ab67ce59a0dee640afdc00ab5ae93e";
+      };
+    }
+
+    {
+      name = "js_levenshtein___js_levenshtein_1.1.4.tgz";
+      path = fetchurl {
+        name = "js_levenshtein___js_levenshtein_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz";
+        sha1 = "3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e";
+      };
+    }
+
+    {
+      name = "js_string_escape___js_string_escape_1.0.1.tgz";
+      path = fetchurl {
+        name = "js_string_escape___js_string_escape_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz";
+        sha1 = "e2625badbc0d67c7533e9edc1068c587ae4137ef";
+      };
+    }
+
+    {
+      name = "js_tokens___js_tokens_4.0.0.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
+        sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
+      };
+    }
+
+    {
+      name = "js_tokens___js_tokens_3.0.2.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
+        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
+      };
+    }
+
+    {
+      name = "js_yaml___js_yaml_3.12.0.tgz";
+      path = fetchurl {
+        name = "js_yaml___js_yaml_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz";
+        sha1 = "eaed656ec8344f10f527c6bfa1b6e2244de167d1";
+      };
+    }
+
+    {
+      name = "jsbn___jsbn_0.1.1.tgz";
+      path = fetchurl {
+        name = "jsbn___jsbn_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    }
+
+    {
+      name = "jsdom___jsdom_11.12.0.tgz";
+      path = fetchurl {
+        name = "jsdom___jsdom_11.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz";
+        sha1 = "1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8";
+      };
+    }
+
+    {
+      name = "jsesc___jsesc_1.3.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz";
+        sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
+      };
+    }
+
+    {
+      name = "jsesc___jsesc_2.5.2.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_2.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz";
+        sha1 = "80564d2e483dacf6e8ef209650a67df3f0c283a4";
+      };
+    }
+
+    {
+      name = "jsesc___jsesc_0.5.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
+        sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
+      };
+    }
+
+    {
+      name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+      path = fetchurl {
+        name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
+        sha1 = "bb867cfb3450e69107c131d1c514bab3dc8bcaa9";
+      };
+    }
+
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
+      };
+    }
+
+    {
+      name = "json_schema___json_schema_0.2.3.tgz";
+      path = fetchurl {
+        name = "json_schema___json_schema_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    }
+
+    {
+      name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
+      path = fetchurl {
+        name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz";
+        sha1 = "9db7b59496ad3f3cfef30a75142d2d930ad72651";
+      };
+    }
+
+    {
+      name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+      path = fetchurl {
+        name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
+        sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
+      };
+    }
+
+    {
+      name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+      path = fetchurl {
+        name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    }
+
+    {
+      name = "json3___json3_3.3.2.tgz";
+      path = fetchurl {
+        name = "json3___json3_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
+        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+      };
+    }
+
+    {
+      name = "json5___json5_0.5.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
+        sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
+      };
+    }
+
+    {
+      name = "json5___json5_1.0.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz";
+        sha1 = "779fb0018604fa854eacbf6252180d83543e3dbe";
+      };
+    }
+
+    {
+      name = "json5___json5_2.1.0.tgz";
+      path = fetchurl {
+        name = "json5___json5_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz";
+        sha1 = "e7a0c62c48285c628d20a10b85c89bb807c32850";
+      };
+    }
+
+    {
+      name = "jsonify___jsonify_0.0.0.tgz";
+      path = fetchurl {
+        name = "jsonify___jsonify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
+        sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
+      };
+    }
+
+    {
+      name = "jsprim___jsprim_1.4.1.tgz";
+      path = fetchurl {
+        name = "jsprim___jsprim_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    }
+
+    {
+      name = "jsx_ast_utils___jsx_ast_utils_2.0.1.tgz";
+      path = fetchurl {
+        name = "jsx_ast_utils___jsx_ast_utils_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz";
+        sha1 = "e801b1b39985e20fffc87b40e3748080e2dcac7f";
+      };
+    }
+
+    {
+      name = "keycode___keycode_2.2.0.tgz";
+      path = fetchurl {
+        name = "keycode___keycode_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz";
+        sha1 = "3d0af56dc7b8b8e5cba8d0a97f107204eec22b04";
+      };
+    }
+
+    {
+      name = "killable___killable_1.0.1.tgz";
+      path = fetchurl {
+        name = "killable___killable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz";
+        sha1 = "4c8ce441187a061c7474fb87ca08e2a638194892";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_3.2.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_4.0.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
+        sha1 = "20813df3d712928b207378691a45066fae72dd57";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_5.1.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
+        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_6.0.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
+        sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
+      };
+    }
+
+    {
+      name = "kleur___kleur_2.0.2.tgz";
+      path = fetchurl {
+        name = "kleur___kleur_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz";
+        sha1 = "b704f4944d95e255d038f0cb05fb8a602c55a300";
+      };
+    }
+
+    {
+      name = "knot.js___knot.js_1.1.5.tgz";
+      path = fetchurl {
+        name = "knot.js___knot.js_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/knot.js/-/knot.js-1.1.5.tgz";
+        sha1 = "28e72522f703f50fe98812fde224dd72728fef5d";
+      };
+    }
+
+    {
+      name = "lcid___lcid_1.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
+        sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
+      };
+    }
+
+    {
+      name = "lcid___lcid_2.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz";
+        sha1 = "6ef5d2df60e52f82eb228a4c373e8d1f397253cf";
+      };
+    }
+
+    {
+      name = "left_pad___left_pad_1.3.0.tgz";
+      path = fetchurl {
+        name = "left_pad___left_pad_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz";
+        sha1 = "5b8a3a7765dfe001261dde915589e782f8c94d1e";
+      };
+    }
+
+    {
+      name = "leven___leven_2.1.0.tgz";
+      path = fetchurl {
+        name = "leven___leven_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz";
+        sha1 = "c2e7a9f772094dee9d34202ae8acce4687875580";
+      };
+    }
+
+    {
+      name = "levn___levn_0.3.0.tgz";
+      path = fetchurl {
+        name = "levn___levn_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    }
+
+    {
+      name = "load_json_file___load_json_file_1.1.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
+        sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
+      };
+    }
+
+    {
+      name = "load_json_file___load_json_file_2.0.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz";
+        sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8";
+      };
+    }
+
+    {
+      name = "loader_runner___loader_runner_2.3.1.tgz";
+      path = fetchurl {
+        name = "loader_runner___loader_runner_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz";
+        sha1 = "026f12fe7c3115992896ac02ba022ba92971b979";
+      };
+    }
+
+    {
+      name = "loader_utils___loader_utils_0.2.17.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_0.2.17.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz";
+        sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
+      };
+    }
+
+    {
+      name = "loader_utils___loader_utils_1.2.3.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz";
+        sha1 = "1ff5dc6911c9f0a062531a4c04b609406108c2c7";
+      };
+    }
+
+    {
+      name = "locate_path___locate_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
+        sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
+      };
+    }
+
+    {
+      name = "locate_path___locate_path_3.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz";
+        sha1 = "dbec3b3ab759758071b58fe59fc41871af21400e";
+      };
+    }
+
+    {
+      name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+      path = fetchurl {
+        name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
+        sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
+      };
+    }
+
+    {
+      name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
+        sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
+      };
+    }
+
+    {
+      name = "lodash.escape___lodash.escape_4.0.1.tgz";
+      path = fetchurl {
+        name = "lodash.escape___lodash.escape_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz";
+        sha1 = "c9044690c21e04294beaa517712fded1fa88de98";
+      };
+    }
+
+    {
+      name = "lodash.flattendeep___lodash.flattendeep_4.4.0.tgz";
+      path = fetchurl {
+        name = "lodash.flattendeep___lodash.flattendeep_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz";
+        sha1 = "fb030917f86a3134e5bc9bec0d69e0013ddfedb2";
+      };
+    }
+
+    {
+      name = "lodash.get___lodash.get_4.4.2.tgz";
+      path = fetchurl {
+        name = "lodash.get___lodash.get_4.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz";
+        sha1 = "2d177f652fa31e939b4438d5341499dfa3825e99";
+      };
+    }
+
+    {
+      name = "lodash.has___lodash.has_4.5.2.tgz";
+      path = fetchurl {
+        name = "lodash.has___lodash.has_4.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz";
+        sha1 = "d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862";
+      };
+    }
+
+    {
+      name = "lodash.isboolean___lodash.isboolean_3.0.3.tgz";
+      path = fetchurl {
+        name = "lodash.isboolean___lodash.isboolean_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz";
+        sha1 = "6c2e171db2a257cd96802fd43b01b20d5f5870f6";
+      };
+    }
+
+    {
+      name = "lodash.isequal___lodash.isequal_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.isequal___lodash.isequal_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz";
+        sha1 = "415c4478f2bcc30120c22ce10ed3226f7d3e18e0";
+      };
+    }
+
+    {
+      name = "lodash.isobject___lodash.isobject_3.0.2.tgz";
+      path = fetchurl {
+        name = "lodash.isobject___lodash.isobject_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz";
+        sha1 = "3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d";
+      };
+    }
+
+    {
+      name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
+        sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
+      };
+    }
+
+    {
+      name = "lodash.sortby___lodash.sortby_4.7.0.tgz";
+      path = fetchurl {
+        name = "lodash.sortby___lodash.sortby_4.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz";
+        sha1 = "edd14c824e2cc9c1e0b0a1b42bb5210516a42438";
+      };
+    }
+
+    {
+      name = "lodash.tail___lodash.tail_4.1.1.tgz";
+      path = fetchurl {
+        name = "lodash.tail___lodash.tail_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz";
+        sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664";
+      };
+    }
+
+    {
+      name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
+        sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
+      };
+    }
+
+    {
+      name = "lodash___lodash_4.17.11.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.11.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz";
+        sha1 = "b39ea6229ef607ecd89e2c8df12536891cac9b8d";
+      };
+    }
+
+    {
+      name = "loglevel___loglevel_1.6.1.tgz";
+      path = fetchurl {
+        name = "loglevel___loglevel_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz";
+        sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa";
+      };
+    }
+
+    {
+      name = "loose_envify___loose_envify_1.4.0.tgz";
+      path = fetchurl {
+        name = "loose_envify___loose_envify_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
+        sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_4.1.5.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_4.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz";
+        sha1 = "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_5.1.1.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz";
+        sha1 = "1da27e6710271947695daf6848e847f01d84b920";
+      };
+    }
+
+    {
+      name = "make_dir___make_dir_1.3.0.tgz";
+      path = fetchurl {
+        name = "make_dir___make_dir_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz";
+        sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c";
+      };
+    }
+
+    {
+      name = "makeerror___makeerror_1.0.11.tgz";
+      path = fetchurl {
+        name = "makeerror___makeerror_1.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz";
+        sha1 = "e01a5c9109f2af79660e4e8b9587790184f5a96c";
+      };
+    }
+
+    {
+      name = "map_age_cleaner___map_age_cleaner_0.1.3.tgz";
+      path = fetchurl {
+        name = "map_age_cleaner___map_age_cleaner_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz";
+        sha1 = "7d583a7306434c055fe474b0f45078e6e1b4b92a";
+      };
+    }
+
+    {
+      name = "map_cache___map_cache_0.2.2.tgz";
+      path = fetchurl {
+        name = "map_cache___map_cache_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
+        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
+      };
+    }
+
+    {
+      name = "map_visit___map_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "map_visit___map_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
+        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
+      };
+    }
+
+    {
+      name = "mark_loader___mark_loader_0.1.6.tgz";
+      path = fetchurl {
+        name = "mark_loader___mark_loader_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/mark-loader/-/mark-loader-0.1.6.tgz";
+        sha1 = "0abb477dca7421d70e20128ff6489f5cae8676d5";
+      };
+    }
+
+    {
+      name = "marky___marky_1.2.1.tgz";
+      path = fetchurl {
+        name = "marky___marky_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz";
+        sha1 = "a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02";
+      };
+    }
+
+    {
+      name = "math_random___math_random_1.0.1.tgz";
+      path = fetchurl {
+        name = "math_random___math_random_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz";
+        sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac";
+      };
+    }
+
+    {
+      name = "md5.js___md5.js_1.3.5.tgz";
+      path = fetchurl {
+        name = "md5.js___md5.js_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz";
+        sha1 = "b5d07b8e3216e3e27cd728d72f70d1e6a342005f";
+      };
+    }
+
+    {
+      name = "mdn_data___mdn_data_1.1.4.tgz";
+      path = fetchurl {
+        name = "mdn_data___mdn_data_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz";
+        sha1 = "50b5d4ffc4575276573c4eedb8780812a8419f01";
+      };
+    }
+
+    {
+      name = "media_typer___media_typer_0.3.0.tgz";
+      path = fetchurl {
+        name = "media_typer___media_typer_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    }
+
+    {
+      name = "mem___mem_1.1.0.tgz";
+      path = fetchurl {
+        name = "mem___mem_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz";
+        sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76";
+      };
+    }
+
+    {
+      name = "mem___mem_4.0.0.tgz";
+      path = fetchurl {
+        name = "mem___mem_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz";
+        sha1 = "6437690d9471678f6cc83659c00cbafcd6b0cdaf";
+      };
+    }
+
+    {
+      name = "memoize_one___memoize_one_4.1.0.tgz";
+      path = fetchurl {
+        name = "memoize_one___memoize_one_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz";
+        sha1 = "a2387c58c03fff27ca390c31b764a79addf3f906";
+      };
+    }
+
+    {
+      name = "memory_fs___memory_fs_0.4.1.tgz";
+      path = fetchurl {
+        name = "memory_fs___memory_fs_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
+        sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
+      };
+    }
+
+    {
+      name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+      path = fetchurl {
+        name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    }
+
+    {
+      name = "merge_stream___merge_stream_1.0.1.tgz";
+      path = fetchurl {
+        name = "merge_stream___merge_stream_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz";
+        sha1 = "4041202d508a342ba00174008df0c251b8c135e1";
+      };
+    }
+
+    {
+      name = "merge___merge_1.2.1.tgz";
+      path = fetchurl {
+        name = "merge___merge_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz";
+        sha1 = "38bebf80c3220a8a487b6fcfb3941bb11720c145";
+      };
+    }
+
+    {
+      name = "methods___methods_1.1.2.tgz";
+      path = fetchurl {
+        name = "methods___methods_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_2.3.11.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_2.3.11.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
+        sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_3.1.10.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_3.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
+        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
+      };
+    }
+
+    {
+      name = "miller_rabin___miller_rabin_4.0.1.tgz";
+      path = fetchurl {
+        name = "miller_rabin___miller_rabin_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
+        sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
+      };
+    }
+
+    {
+      name = "mime_db___mime_db_1.37.0.tgz";
+      path = fetchurl {
+        name = "mime_db___mime_db_1.37.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz";
+        sha1 = "0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8";
+      };
+    }
+
+    {
+      name = "mime_types___mime_types_2.1.21.tgz";
+      path = fetchurl {
+        name = "mime_types___mime_types_2.1.21.tgz";
+        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz";
+        sha1 = "28995aa1ecb770742fe6ae7e58f9181c744b3f96";
+      };
+    }
+
+    {
+      name = "mime___mime_1.4.1.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz";
+        sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6";
+      };
+    }
+
+    {
+      name = "mime___mime_2.4.0.tgz";
+      path = fetchurl {
+        name = "mime___mime_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz";
+        sha1 = "e051fd881358585f3279df333fe694da0bcffdd6";
+      };
+    }
+
+    {
+      name = "mimic_fn___mimic_fn_1.2.0.tgz";
+      path = fetchurl {
+        name = "mimic_fn___mimic_fn_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
+        sha1 = "820c86a39334640e99516928bd03fca88057d022";
+      };
+    }
+
+    {
+      name = "mini_css_extract_plugin___mini_css_extract_plugin_0.5.0.tgz";
+      path = fetchurl {
+        name = "mini_css_extract_plugin___mini_css_extract_plugin_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz";
+        sha1 = "ac0059b02b9692515a637115b0cc9fed3a35c7b0";
+      };
+    }
+
+    {
+      name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
+        sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
+      };
+    }
+
+    {
+      name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
+        sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_3.0.4.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
+        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.8.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    }
+
+    {
+      name = "minimist___minimist_1.2.0.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
+        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.10.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz";
+        sha1 = "de3f98543dbf96082be48ad1a0c7cda836301dcf";
+      };
+    }
+
+    {
+      name = "minipass___minipass_2.3.5.tgz";
+      path = fetchurl {
+        name = "minipass___minipass_2.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz";
+        sha1 = "cacebe492022497f656b0f0f51e2682a9ed2d848";
+      };
+    }
+
+    {
+      name = "minizlib___minizlib_1.2.1.tgz";
+      path = fetchurl {
+        name = "minizlib___minizlib_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz";
+        sha1 = "dd27ea6136243c7c880684e8672bb3a45fd9b614";
+      };
+    }
+
+    {
+      name = "mississippi___mississippi_3.0.0.tgz";
+      path = fetchurl {
+        name = "mississippi___mississippi_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz";
+        sha1 = "ea0a3291f97e0b5e8776b363d5f0a12d94c67022";
+      };
+    }
+
+    {
+      name = "mixin_deep___mixin_deep_1.3.1.tgz";
+      path = fetchurl {
+        name = "mixin_deep___mixin_deep_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
+        sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
+      };
+    }
+
+    {
+      name = "mixin_object___mixin_object_2.0.1.tgz";
+      path = fetchurl {
+        name = "mixin_object___mixin_object_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz";
+        sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e";
+      };
+    }
+
+    {
+      name = "mkdirp___mkdirp_0.5.1.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    }
+
+    {
+      name = "moo___moo_0.4.3.tgz";
+      path = fetchurl {
+        name = "moo___moo_0.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz";
+        sha1 = "3f847a26f31cf625a956a87f2b10fbc013bfd10e";
+      };
+    }
+
+    {
+      name = "mousetrap___mousetrap_1.6.2.tgz";
+      path = fetchurl {
+        name = "mousetrap___mousetrap_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.2.tgz";
+        sha1 = "caadd9cf886db0986fb2fee59a82f6bd37527587";
+      };
+    }
+
+    {
+      name = "move_concurrently___move_concurrently_1.0.1.tgz";
+      path = fetchurl {
+        name = "move_concurrently___move_concurrently_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz";
+        sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
+      };
+    }
+
+    {
+      name = "ms___ms_2.0.0.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    }
+
+    {
+      name = "ms___ms_2.1.1.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz";
+        sha1 = "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a";
+      };
+    }
+
+    {
+      name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
+      path = fetchurl {
+        name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz";
+        sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901";
+      };
+    }
+
+    {
+      name = "multicast_dns___multicast_dns_6.2.3.tgz";
+      path = fetchurl {
+        name = "multicast_dns___multicast_dns_6.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz";
+        sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229";
+      };
+    }
+
+    {
+      name = "mute_stream___mute_stream_0.0.7.tgz";
+      path = fetchurl {
+        name = "mute_stream___mute_stream_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz";
+        sha1 = "3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab";
+      };
+    }
+
+    {
+      name = "nan___nan_2.12.1.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz";
+        sha1 = "7b1aa193e9aa86057e3c7bbd0ac448e770925552";
+      };
+    }
+
+    {
+      name = "nanomatch___nanomatch_1.2.13.tgz";
+      path = fetchurl {
+        name = "nanomatch___nanomatch_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
+        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
+      };
+    }
+
+    {
+      name = "natural_compare___natural_compare_1.4.0.tgz";
+      path = fetchurl {
+        name = "natural_compare___natural_compare_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz";
+        sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
+      };
+    }
+
+    {
+      name = "nearley___nearley_2.16.0.tgz";
+      path = fetchurl {
+        name = "nearley___nearley_2.16.0.tgz";
+        url  = "https://registry.yarnpkg.com/nearley/-/nearley-2.16.0.tgz";
+        sha1 = "77c297d041941d268290ec84b739d0ee297e83a7";
+      };
+    }
+
+    {
+      name = "needle___needle_2.2.4.tgz";
+      path = fetchurl {
+        name = "needle___needle_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz";
+        sha1 = "51931bff82533b1928b7d1d69e01f1b00ffd2a4e";
+      };
+    }
+
+    {
+      name = "negotiator___negotiator_0.6.1.tgz";
+      path = fetchurl {
+        name = "negotiator___negotiator_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
+        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
+      };
+    }
+
+    {
+      name = "neo_async___neo_async_2.6.0.tgz";
+      path = fetchurl {
+        name = "neo_async___neo_async_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz";
+        sha1 = "b9d15e4d71c6762908654b5183ed38b753340835";
+      };
+    }
+
+    {
+      name = "next_tick___next_tick_1.0.0.tgz";
+      path = fetchurl {
+        name = "next_tick___next_tick_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
+        sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
+      };
+    }
+
+    {
+      name = "nice_try___nice_try_1.0.5.tgz";
+      path = fetchurl {
+        name = "nice_try___nice_try_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz";
+        sha1 = "a3378a7696ce7d223e88fc9b764bd7ef1089e366";
+      };
+    }
+
+    {
+      name = "node_fetch___node_fetch_1.7.3.tgz";
+      path = fetchurl {
+        name = "node_fetch___node_fetch_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz";
+        sha1 = "980f6f72d85211a5347c6b2bc18c5b84c3eb47ef";
+      };
+    }
+
+    {
+      name = "node_forge___node_forge_0.7.5.tgz";
+      path = fetchurl {
+        name = "node_forge___node_forge_0.7.5.tgz";
+        url  = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz";
+        sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df";
+      };
+    }
+
+    {
+      name = "node_int64___node_int64_0.4.0.tgz";
+      path = fetchurl {
+        name = "node_int64___node_int64_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz";
+        sha1 = "87a9065cdb355d3182d8f94ce11188b825c68a3b";
+      };
+    }
+
+    {
+      name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
+      path = fetchurl {
+        name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
+        sha1 = "5f94263d404f6e44767d726901fff05478d600df";
+      };
+    }
+
+    {
+      name = "node_notifier___node_notifier_5.3.0.tgz";
+      path = fetchurl {
+        name = "node_notifier___node_notifier_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz";
+        sha1 = "c77a4a7b84038733d5fb351aafd8a268bfe19a01";
+      };
+    }
+
+    {
+      name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+      path = fetchurl {
+        name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
+        sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
+      };
+    }
+
+    {
+      name = "node_releases___node_releases_1.1.3.tgz";
+      path = fetchurl {
+        name = "node_releases___node_releases_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz";
+        sha1 = "aad9ce0dcb98129c753f772c0aa01360fb90fbd2";
+      };
+    }
+
+    {
+      name = "nopt___nopt_4.0.1.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
+        sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
+      };
+    }
+
+    {
+      name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
+        sha1 = "12f95a307d58352075a04907b84ac8be98ac012f";
+      };
+    }
+
+    {
+      name = "normalize_path___normalize_path_2.1.1.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
+        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
+      };
+    }
+
+    {
+      name = "normalize_range___normalize_range_0.1.2.tgz";
+      path = fetchurl {
+        name = "normalize_range___normalize_range_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
+        sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
+      };
+    }
+
+    {
+      name = "normalize_url___normalize_url_3.3.0.tgz";
+      path = fetchurl {
+        name = "normalize_url___normalize_url_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz";
+        sha1 = "b2e1c4dc4f7c6d57743df733a4f5978d18650559";
+      };
+    }
+
+    {
+      name = "npm_bundled___npm_bundled_1.0.5.tgz";
+      path = fetchurl {
+        name = "npm_bundled___npm_bundled_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz";
+        sha1 = "3c1732b7ba936b3a10325aef616467c0ccbcc979";
+      };
+    }
+
+    {
+      name = "npm_packlist___npm_packlist_1.1.12.tgz";
+      path = fetchurl {
+        name = "npm_packlist___npm_packlist_1.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz";
+        sha1 = "22bde2ebc12e72ca482abd67afc51eb49377243a";
+      };
+    }
+
+    {
+      name = "npm_run_path___npm_run_path_2.0.2.tgz";
+      path = fetchurl {
+        name = "npm_run_path___npm_run_path_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
+        sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
+      };
+    }
+
+    {
+      name = "npmlog___npmlog_4.1.2.tgz";
+      path = fetchurl {
+        name = "npmlog___npmlog_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
+        sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
+      };
+    }
+
+    {
+      name = "nth_check___nth_check_1.0.2.tgz";
+      path = fetchurl {
+        name = "nth_check___nth_check_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz";
+        sha1 = "b2bd295c37e3dd58a3bf0700376663ba4d9cf05c";
+      };
+    }
+
+    {
+      name = "num2fraction___num2fraction_1.2.2.tgz";
+      path = fetchurl {
+        name = "num2fraction___num2fraction_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
+        sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
+      };
+    }
+
+    {
+      name = "number_is_nan___number_is_nan_1.0.1.tgz";
+      path = fetchurl {
+        name = "number_is_nan___number_is_nan_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    }
+
+    {
+      name = "nwsapi___nwsapi_2.0.9.tgz";
+      path = fetchurl {
+        name = "nwsapi___nwsapi_2.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz";
+        sha1 = "77ac0cdfdcad52b6a1151a84e73254edc33ed016";
+      };
+    }
+
+    {
+      name = "oauth_sign___oauth_sign_0.9.0.tgz";
+      path = fetchurl {
+        name = "oauth_sign___oauth_sign_0.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha1 = "47a7b016baa68b5fa0ecf3dee08a85c679ac6455";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.0.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz";
+        sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.1.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    }
+
+    {
+      name = "object_copy___object_copy_0.1.0.tgz";
+      path = fetchurl {
+        name = "object_copy___object_copy_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
+        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
+      };
+    }
+
+    {
+      name = "object_fit_images___object_fit_images_3.2.4.tgz";
+      path = fetchurl {
+        name = "object_fit_images___object_fit_images_3.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/object-fit-images/-/object-fit-images-3.2.4.tgz";
+        sha1 = "6c299d38fdf207746e5d2d46c2877f6f25d15b52";
+      };
+    }
+
+    {
+      name = "object_inspect___object_inspect_1.6.0.tgz";
+      path = fetchurl {
+        name = "object_inspect___object_inspect_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz";
+        sha1 = "c70b6cbf72f274aab4c34c0c82f5167bf82cf15b";
+      };
+    }
+
+    {
+      name = "object_is___object_is_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_is___object_is_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz";
+        sha1 = "0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6";
+      };
+    }
+
+    {
+      name = "object_keys___object_keys_1.0.12.tgz";
+      path = fetchurl {
+        name = "object_keys___object_keys_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz";
+        sha1 = "09c53855377575310cca62f55bb334abff7b3ed2";
+      };
+    }
+
+    {
+      name = "object_visit___object_visit_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_visit___object_visit_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
+        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
+      };
+    }
+
+    {
+      name = "object.assign___object.assign_4.1.0.tgz";
+      path = fetchurl {
+        name = "object.assign___object.assign_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz";
+        sha1 = "968bf1100d7956bb3ca086f006f846b3bc4008da";
+      };
+    }
+
+    {
+      name = "object.entries___object.entries_1.1.0.tgz";
+      path = fetchurl {
+        name = "object.entries___object.entries_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz";
+        sha1 = "2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519";
+      };
+    }
+
+    {
+      name = "object.fromentries___object.fromentries_2.0.0.tgz";
+      path = fetchurl {
+        name = "object.fromentries___object.fromentries_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz";
+        sha1 = "49a543d92151f8277b3ac9600f1e930b189d30ab";
+      };
+    }
+
+    {
+      name = "object.getownpropertydescriptors___object.getownpropertydescriptors_2.0.3.tgz";
+      path = fetchurl {
+        name = "object.getownpropertydescriptors___object.getownpropertydescriptors_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz";
+        sha1 = "8758c846f5b407adab0f236e0986f14b051caa16";
+      };
+    }
+
+    {
+      name = "object.omit___object.omit_2.0.1.tgz";
+      path = fetchurl {
+        name = "object.omit___object.omit_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
+        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
+      };
+    }
+
+    {
+      name = "object.pick___object.pick_1.3.0.tgz";
+      path = fetchurl {
+        name = "object.pick___object.pick_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    }
+
+    {
+      name = "object.values___object.values_1.0.4.tgz";
+      path = fetchurl {
+        name = "object.values___object.values_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz";
+        sha1 = "e524da09b4f66ff05df457546ec72ac99f13069a";
+      };
+    }
+
+    {
+      name = "obuf___obuf_1.1.2.tgz";
+      path = fetchurl {
+        name = "obuf___obuf_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz";
+        sha1 = "09bea3343d41859ebd446292d11c9d4db619084e";
+      };
+    }
+
+    {
+      name = "offline_plugin___offline_plugin_5.0.6.tgz";
+      path = fetchurl {
+        name = "offline_plugin___offline_plugin_5.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/offline-plugin/-/offline-plugin-5.0.6.tgz";
+        sha1 = "7a7b244220cddb8a8cabecb172ec5c0be03e74b2";
+      };
+    }
+
+    {
+      name = "on_finished___on_finished_2.3.0.tgz";
+      path = fetchurl {
+        name = "on_finished___on_finished_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    }
+
+    {
+      name = "on_headers___on_headers_1.0.1.tgz";
+      path = fetchurl {
+        name = "on_headers___on_headers_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz";
+        sha1 = "928f5d0f470d49342651ea6794b0857c100693f7";
+      };
+    }
+
+    {
+      name = "once___once_1.4.0.tgz";
+      path = fetchurl {
+        name = "once___once_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    }
+
+    {
+      name = "onetime___onetime_2.0.1.tgz";
+      path = fetchurl {
+        name = "onetime___onetime_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz";
+        sha1 = "067428230fd67443b2794b22bba528b6867962d4";
+      };
+    }
+
+    {
+      name = "opener___opener_1.5.1.tgz";
+      path = fetchurl {
+        name = "opener___opener_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz";
+        sha1 = "6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed";
+      };
+    }
+
+    {
+      name = "opn___opn_5.4.0.tgz";
+      path = fetchurl {
+        name = "opn___opn_5.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz";
+        sha1 = "cb545e7aab78562beb11aa3bfabc7042e1761035";
+      };
+    }
+
+    {
+      name = "optimist___optimist_0.6.1.tgz";
+      path = fetchurl {
+        name = "optimist___optimist_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz";
+        sha1 = "da3ea74686fa21a19a111c326e90eb15a0196686";
+      };
+    }
+
+    {
+      name = "optionator___optionator_0.8.2.tgz";
+      path = fetchurl {
+        name = "optionator___optionator_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz";
+        sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
+      };
+    }
+
+    {
+      name = "original___original_1.0.2.tgz";
+      path = fetchurl {
+        name = "original___original_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz";
+        sha1 = "e442a61cffe1c5fd20a65f3261c26663b303f25f";
+      };
+    }
+
+    {
+      name = "os_browserify___os_browserify_0.3.0.tgz";
+      path = fetchurl {
+        name = "os_browserify___os_browserify_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
+        sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
+      };
+    }
+
+    {
+      name = "os_homedir___os_homedir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_homedir___os_homedir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_2.1.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz";
+        sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_3.1.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz";
+        sha1 = "a802a6ee17f24c10483ab9935719cef4ed16bf1a";
+      };
+    }
+
+    {
+      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    }
+
+    {
+      name = "osenv___osenv_0.1.5.tgz";
+      path = fetchurl {
+        name = "osenv___osenv_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
+        sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
+      };
+    }
+
+    {
+      name = "p_defer___p_defer_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_defer___p_defer_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz";
+        sha1 = "9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c";
+      };
+    }
+
+    {
+      name = "p_finally___p_finally_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_finally___p_finally_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
+        sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
+      };
+    }
+
+    {
+      name = "p_is_promise___p_is_promise_1.1.0.tgz";
+      path = fetchurl {
+        name = "p_is_promise___p_is_promise_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz";
+        sha1 = "9c9456989e9f6588017b0434d56097675c3da05e";
+      };
+    }
+
+    {
+      name = "p_limit___p_limit_1.3.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
+        sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
+      };
+    }
+
+    {
+      name = "p_limit___p_limit_2.1.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz";
+        sha1 = "1d5a0d20fb12707c758a655f6bbc4386b5930d68";
+      };
+    }
+
+    {
+      name = "p_locate___p_locate_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
+        sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
+      };
+    }
+
+    {
+      name = "p_locate___p_locate_3.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz";
+        sha1 = "322d69a05c0264b25997d9f40cd8a891ab0064a4";
+      };
+    }
+
+    {
+      name = "p_map___p_map_1.2.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz";
+        sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b";
+      };
+    }
+
+    {
+      name = "p_try___p_try_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
+        sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
+      };
+    }
+
+    {
+      name = "p_try___p_try_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz";
+        sha1 = "85080bb87c64688fa47996fe8f7dfbe8211760b1";
+      };
+    }
+
+    {
+      name = "packet_reader___packet_reader_0.3.1.tgz";
+      path = fetchurl {
+        name = "packet_reader___packet_reader_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz";
+        sha1 = "cd62e60af8d7fea8a705ec4ff990871c46871f27";
+      };
+    }
+
+    {
+      name = "pako___pako_1.0.7.tgz";
+      path = fetchurl {
+        name = "pako___pako_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz";
+        sha1 = "2473439021b57f1516c82f58be7275ad8ef1bb27";
+      };
+    }
+
+    {
+      name = "parallel_transform___parallel_transform_1.1.0.tgz";
+      path = fetchurl {
+        name = "parallel_transform___parallel_transform_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz";
+        sha1 = "d410f065b05da23081fcd10f28854c29bda33b06";
+      };
+    }
+
+    {
+      name = "parse_asn1___parse_asn1_5.1.1.tgz";
+      path = fetchurl {
+        name = "parse_asn1___parse_asn1_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz";
+        sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8";
+      };
+    }
+
+    {
+      name = "parse_css_font___parse_css_font_2.0.2.tgz";
+      path = fetchurl {
+        name = "parse_css_font___parse_css_font_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/parse-css-font/-/parse-css-font-2.0.2.tgz";
+        sha1 = "7b60b060705a25a9b90b7f0ed493e5823248a652";
+      };
+    }
+
+    {
+      name = "parse_glob___parse_glob_3.0.4.tgz";
+      path = fetchurl {
+        name = "parse_glob___parse_glob_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
+        sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
+      };
+    }
+
+    {
+      name = "parse_json___parse_json_2.2.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
+        sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
+      };
+    }
+
+    {
+      name = "parse_json___parse_json_4.0.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz";
+        sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
+      };
+    }
+
+    {
+      name = "parse5___parse5_4.0.0.tgz";
+      path = fetchurl {
+        name = "parse5___parse5_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz";
+        sha1 = "6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608";
+      };
+    }
+
+    {
+      name = "parse5___parse5_3.0.3.tgz";
+      path = fetchurl {
+        name = "parse5___parse5_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz";
+        sha1 = "042f792ffdd36851551cf4e9e066b3874ab45b5c";
+      };
+    }
+
+    {
+      name = "parseurl___parseurl_1.3.2.tgz";
+      path = fetchurl {
+        name = "parseurl___parseurl_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
+        sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
+      };
+    }
+
+    {
+      name = "pascalcase___pascalcase_0.1.1.tgz";
+      path = fetchurl {
+        name = "pascalcase___pascalcase_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
+        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
+      };
+    }
+
+    {
+      name = "path_browserify___path_browserify_0.0.0.tgz";
+      path = fetchurl {
+        name = "path_browserify___path_browserify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz";
+        sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
+      };
+    }
+
+    {
+      name = "path_complete_extname___path_complete_extname_1.0.0.tgz";
+      path = fetchurl {
+        name = "path_complete_extname___path_complete_extname_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-complete-extname/-/path-complete-extname-1.0.0.tgz";
+        sha1 = "f889985dc91000c815515c0bfed06c5acda0752b";
+      };
+    }
+
+    {
+      name = "path_dirname___path_dirname_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_dirname___path_dirname_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
+        sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_2.1.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
+        sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_3.0.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
+        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
+      };
+    }
+
+    {
+      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+      path = fetchurl {
+        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    }
+
+    {
+      name = "path_is_inside___path_is_inside_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_is_inside___path_is_inside_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
+        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
+      };
+    }
+
+    {
+      name = "path_key___path_key_2.0.1.tgz";
+      path = fetchurl {
+        name = "path_key___path_key_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
+        sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
+      };
+    }
+
+    {
+      name = "path_parse___path_parse_1.0.6.tgz";
+      path = fetchurl {
+        name = "path_parse___path_parse_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
+        sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
+      };
+    }
+
+    {
+      name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+      path = fetchurl {
+        name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    }
+
+    {
+      name = "path_to_regexp___path_to_regexp_1.7.0.tgz";
+      path = fetchurl {
+        name = "path_to_regexp___path_to_regexp_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz";
+        sha1 = "59fde0f435badacba103a84e9d3bc64e96b9937d";
+      };
+    }
+
+    {
+      name = "path_type___path_type_1.1.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
+        sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
+      };
+    }
+
+    {
+      name = "path_type___path_type_2.0.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz";
+        sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73";
+      };
+    }
+
+    {
+      name = "pbkdf2___pbkdf2_3.0.17.tgz";
+      path = fetchurl {
+        name = "pbkdf2___pbkdf2_3.0.17.tgz";
+        url  = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz";
+        sha1 = "976c206530617b14ebb32114239f7b09336e93a6";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_0.2.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz";
+        sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_2.1.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    }
+
+    {
+      name = "pg_connection_string___pg_connection_string_0.1.3.tgz";
+      path = fetchurl {
+        name = "pg_connection_string___pg_connection_string_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz";
+        sha1 = "da1847b20940e42ee1492beaf65d49d91b245df7";
+      };
+    }
+
+    {
+      name = "pg_int8___pg_int8_1.0.1.tgz";
+      path = fetchurl {
+        name = "pg_int8___pg_int8_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz";
+        sha1 = "943bd463bf5b71b4170115f80f8efc9a0c0eb78c";
+      };
+    }
+
+    {
+      name = "pg_pool___pg_pool_1.8.0.tgz";
+      path = fetchurl {
+        name = "pg_pool___pg_pool_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz";
+        sha1 = "f7ec73824c37a03f076f51bfdf70e340147c4f37";
+      };
+    }
+
+    {
+      name = "pg_types___pg_types_1.13.0.tgz";
+      path = fetchurl {
+        name = "pg_types___pg_types_1.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/pg-types/-/pg-types-1.13.0.tgz";
+        sha1 = "75f490b8a8abf75f1386ef5ec4455ecf6b345c63";
+      };
+    }
+
+    {
+      name = "pg___pg_6.4.2.tgz";
+      path = fetchurl {
+        name = "pg___pg_6.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/pg/-/pg-6.4.2.tgz";
+        sha1 = "c364011060eac7a507a2ae063eb857ece910e27f";
+      };
+    }
+
+    {
+      name = "pgpass___pgpass_1.0.2.tgz";
+      path = fetchurl {
+        name = "pgpass___pgpass_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz";
+        sha1 = "2a7bb41b6065b67907e91da1b07c1847c877b306";
+      };
+    }
+
+    {
+      name = "pify___pify_2.3.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    }
+
+    {
+      name = "pify___pify_3.0.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
+        sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
+      };
+    }
+
+    {
+      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+      path = fetchurl {
+        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    }
+
+    {
+      name = "pinkie___pinkie_2.0.4.tgz";
+      path = fetchurl {
+        name = "pinkie___pinkie_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    }
+
+    {
+      name = "pkg_dir___pkg_dir_1.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz";
+        sha1 = "7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4";
+      };
+    }
+
+    {
+      name = "pkg_dir___pkg_dir_2.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz";
+        sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
+      };
+    }
+
+    {
+      name = "pkg_dir___pkg_dir_3.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz";
+        sha1 = "2749020f239ed990881b1f71210d51eb6523bea3";
+      };
+    }
+
+    {
+      name = "pluralize___pluralize_7.0.0.tgz";
+      path = fetchurl {
+        name = "pluralize___pluralize_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz";
+        sha1 = "298b89df8b93b0221dbf421ad2b1b1ea23fc6777";
+      };
+    }
+
+    {
+      name = "pn___pn_1.1.0.tgz";
+      path = fetchurl {
+        name = "pn___pn_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz";
+        sha1 = "e2f4cef0e219f463c179ab37463e4e1ecdccbafb";
+      };
+    }
+
+    {
+      name = "portfinder___portfinder_1.0.20.tgz";
+      path = fetchurl {
+        name = "portfinder___portfinder_1.0.20.tgz";
+        url  = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz";
+        sha1 = "bea68632e54b2e13ab7b0c4775e9b41bf270e44a";
+      };
+    }
+
+    {
+      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+      path = fetchurl {
+        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
+        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
+      };
+    }
+
+    {
+      name = "postcss_calc___postcss_calc_7.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_calc___postcss_calc_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz";
+        sha1 = "36d77bab023b0ecbb9789d84dcb23c4941145436";
+      };
+    }
+
+    {
+      name = "postcss_colormin___postcss_colormin_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_colormin___postcss_colormin_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.2.tgz";
+        sha1 = "93cd1fa11280008696887db1a528048b18e7ed99";
+      };
+    }
+
+    {
+      name = "postcss_convert_values___postcss_convert_values_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_convert_values___postcss_convert_values_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz";
+        sha1 = "ca3813ed4da0f812f9d43703584e449ebe189a7f";
+      };
+    }
+
+    {
+      name = "postcss_discard_comments___postcss_discard_comments_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_comments___postcss_discard_comments_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz";
+        sha1 = "30697735b0c476852a7a11050eb84387a67ef55d";
+      };
+    }
+
+    {
+      name = "postcss_discard_duplicates___postcss_discard_duplicates_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_discard_duplicates___postcss_discard_duplicates_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz";
+        sha1 = "3fe133cd3c82282e550fc9b239176a9207b784eb";
+      };
+    }
+
+    {
+      name = "postcss_discard_empty___postcss_discard_empty_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_empty___postcss_discard_empty_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz";
+        sha1 = "c8c951e9f73ed9428019458444a02ad90bb9f765";
+      };
+    }
+
+    {
+      name = "postcss_discard_overridden___postcss_discard_overridden_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_overridden___postcss_discard_overridden_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz";
+        sha1 = "652aef8a96726f029f5e3e00146ee7a4e755ff57";
+      };
+    }
+
+    {
+      name = "postcss_load_config___postcss_load_config_2.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_load_config___postcss_load_config_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz";
+        sha1 = "f1312ddbf5912cd747177083c5ef7a19d62ee484";
+      };
+    }
+
+    {
+      name = "postcss_loader___postcss_loader_3.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_loader___postcss_loader_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz";
+        sha1 = "6b97943e47c72d845fa9e03f273773d4e8dd6c2d";
+      };
+    }
+
+    {
+      name = "postcss_merge_longhand___postcss_merge_longhand_4.0.10.tgz";
+      path = fetchurl {
+        name = "postcss_merge_longhand___postcss_merge_longhand_4.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.10.tgz";
+        sha1 = "c4d63ab57bdc054ab4067ab075d488c8c2978380";
+      };
+    }
+
+    {
+      name = "postcss_merge_rules___postcss_merge_rules_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_merge_rules___postcss_merge_rules_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz";
+        sha1 = "2be44401bf19856f27f32b8b12c0df5af1b88e74";
+      };
+    }
+
+    {
+      name = "postcss_minify_font_values___postcss_minify_font_values_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_minify_font_values___postcss_minify_font_values_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz";
+        sha1 = "cd4c344cce474343fac5d82206ab2cbcb8afd5a6";
+      };
+    }
+
+    {
+      name = "postcss_minify_gradients___postcss_minify_gradients_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_gradients___postcss_minify_gradients_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz";
+        sha1 = "6da95c6e92a809f956bb76bf0c04494953e1a7dd";
+      };
+    }
+
+    {
+      name = "postcss_minify_params___postcss_minify_params_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_params___postcss_minify_params_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz";
+        sha1 = "5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2";
+      };
+    }
+
+    {
+      name = "postcss_minify_selectors___postcss_minify_selectors_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_selectors___postcss_minify_selectors_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz";
+        sha1 = "a891c197977cc37abf60b3ea06b84248b1c1e9cd";
+      };
+    }
+
+    {
+      name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz";
+        sha1 = "818719a1ae1da325f9832446b01136eeb493cd7e";
+      };
+    }
+
+    {
+      name = "postcss_modules_local_by_default___postcss_modules_local_by_default_2.0.3.tgz";
+      path = fetchurl {
+        name = "postcss_modules_local_by_default___postcss_modules_local_by_default_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.3.tgz";
+        sha1 = "6a199d596ec3ef57b8f5ced96d786b8cb16a7dec";
+      };
+    }
+
+    {
+      name = "postcss_modules_scope___postcss_modules_scope_2.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_modules_scope___postcss_modules_scope_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz";
+        sha1 = "2c0f2394cde4cd09147db054c68917e38f6d43a4";
+      };
+    }
+
+    {
+      name = "postcss_modules_values___postcss_modules_values_2.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_values___postcss_modules_values_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz";
+        sha1 = "479b46dc0c5ca3dc7fa5270851836b9ec7152f64";
+      };
+    }
+
+    {
+      name = "postcss_normalize_charset___postcss_normalize_charset_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_charset___postcss_normalize_charset_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz";
+        sha1 = "8b35add3aee83a136b0471e0d59be58a50285dd4";
+      };
+    }
+
+    {
+      name = "postcss_normalize_display_values___postcss_normalize_display_values_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_display_values___postcss_normalize_display_values_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz";
+        sha1 = "d9a83d47c716e8a980f22f632c8b0458cfb48a4c";
+      };
+    }
+
+    {
+      name = "postcss_normalize_positions___postcss_normalize_positions_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_positions___postcss_normalize_positions_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz";
+        sha1 = "ee2d4b67818c961964c6be09d179894b94fd6ba1";
+      };
+    }
+
+    {
+      name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz";
+        sha1 = "5293f234b94d7669a9f805495d35b82a581c50e5";
+      };
+    }
+
+    {
+      name = "postcss_normalize_string___postcss_normalize_string_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_string___postcss_normalize_string_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz";
+        sha1 = "23c5030c2cc24175f66c914fa5199e2e3c10fef3";
+      };
+    }
+
+    {
+      name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz";
+        sha1 = "8be83e0b9cb3ff2d1abddee032a49108f05f95d7";
+      };
+    }
+
+    {
+      name = "postcss_normalize_unicode___postcss_normalize_unicode_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_unicode___postcss_normalize_unicode_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz";
+        sha1 = "841bd48fdcf3019ad4baa7493a3d363b52ae1cfb";
+      };
+    }
+
+    {
+      name = "postcss_normalize_url___postcss_normalize_url_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_url___postcss_normalize_url_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz";
+        sha1 = "10e437f86bc7c7e58f7b9652ed878daaa95faae1";
+      };
+    }
+
+    {
+      name = "postcss_normalize_whitespace___postcss_normalize_whitespace_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_whitespace___postcss_normalize_whitespace_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz";
+        sha1 = "d14cb639b61238418ac8bc8d3b7bdd65fc86575e";
+      };
+    }
+
+    {
+      name = "postcss_object_fit_images___postcss_object_fit_images_1.1.2.tgz";
+      path = fetchurl {
+        name = "postcss_object_fit_images___postcss_object_fit_images_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-object-fit-images/-/postcss-object-fit-images-1.1.2.tgz";
+        sha1 = "8b773043db14672ef6cd6f2cb1f0d8b26a9f573b";
+      };
+    }
+
+    {
+      name = "postcss_ordered_values___postcss_ordered_values_4.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_ordered_values___postcss_ordered_values_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz";
+        sha1 = "2e3b432ef3e489b18333aeca1f1295eb89be9fc2";
+      };
+    }
+
+    {
+      name = "postcss_reduce_initial___postcss_reduce_initial_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_initial___postcss_reduce_initial_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz";
+        sha1 = "bac8e325d67510ee01fa460676dc8ea9e3b40f15";
+      };
+    }
+
+    {
+      name = "postcss_reduce_transforms___postcss_reduce_transforms_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_transforms___postcss_reduce_transforms_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz";
+        sha1 = "8600d5553bdd3ad640f43bff81eb52f8760d4561";
+      };
+    }
+
+    {
+      name = "postcss_selector_parser___postcss_selector_parser_3.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_selector_parser___postcss_selector_parser_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz";
+        sha1 = "4f875f4afb0c96573d5cf4d74011aee250a7e865";
+      };
+    }
+
+    {
+      name = "postcss_selector_parser___postcss_selector_parser_5.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_selector_parser___postcss_selector_parser_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz";
+        sha1 = "249044356697b33b64f1a8f7c80922dddee7195c";
+      };
+    }
+
+    {
+      name = "postcss_svgo___postcss_svgo_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_svgo___postcss_svgo_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.1.tgz";
+        sha1 = "5628cdb38f015de6b588ce6d0bf0724b492b581d";
+      };
+    }
+
+    {
+      name = "postcss_unique_selectors___postcss_unique_selectors_4.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_unique_selectors___postcss_unique_selectors_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz";
+        sha1 = "9446911f3289bfd64c6d680f073c03b1f9ee4bac";
+      };
+    }
+
+    {
+      name = "postcss_value_parser___postcss_value_parser_3.3.1.tgz";
+      path = fetchurl {
+        name = "postcss_value_parser___postcss_value_parser_3.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
+        sha1 = "9ff822547e2893213cf1c30efa51ac5fd1ba8281";
+      };
+    }
+
+    {
+      name = "postcss___postcss_5.2.18.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_5.2.18.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz";
+        sha1 = "badfa1497d46244f6390f58b319830d9107853c5";
+      };
+    }
+
+    {
+      name = "postcss___postcss_7.0.7.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_7.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-7.0.7.tgz";
+        sha1 = "2754d073f77acb4ef08f1235c36c5721a7201614";
+      };
+    }
+
+    {
+      name = "postgres_array___postgres_array_1.0.3.tgz";
+      path = fetchurl {
+        name = "postgres_array___postgres_array_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz";
+        sha1 = "c561fc3b266b21451fc6555384f4986d78ec80f5";
+      };
+    }
+
+    {
+      name = "postgres_bytea___postgres_bytea_1.0.0.tgz";
+      path = fetchurl {
+        name = "postgres_bytea___postgres_bytea_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz";
+        sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
+      };
+    }
+
+    {
+      name = "postgres_date___postgres_date_1.0.3.tgz";
+      path = fetchurl {
+        name = "postgres_date___postgres_date_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz";
+        sha1 = "e2d89702efdb258ff9d9cee0fe91bd06975257a8";
+      };
+    }
+
+    {
+      name = "postgres_interval___postgres_interval_1.1.2.tgz";
+      path = fetchurl {
+        name = "postgres_interval___postgres_interval_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz";
+        sha1 = "bf71ff902635f21cb241a013fc421d81d1db15a9";
+      };
+    }
+
+    {
+      name = "precond___precond_0.2.3.tgz";
+      path = fetchurl {
+        name = "precond___precond_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz";
+        sha1 = "aa9591bcaa24923f1e0f4849d240f47efc1075ac";
+      };
+    }
+
+    {
+      name = "prelude_ls___prelude_ls_1.1.2.tgz";
+      path = fetchurl {
+        name = "prelude_ls___prelude_ls_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
+      };
+    }
+
+    {
+      name = "preserve___preserve_0.2.0.tgz";
+      path = fetchurl {
+        name = "preserve___preserve_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
+        sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
+      };
+    }
+
+    {
+      name = "pretty_format___pretty_format_23.6.0.tgz";
+      path = fetchurl {
+        name = "pretty_format___pretty_format_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz";
+        sha1 = "5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760";
+      };
+    }
+
+    {
+      name = "private___private_0.1.8.tgz";
+      path = fetchurl {
+        name = "private___private_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
+        sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
+      };
+    }
+
+    {
+      name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+      path = fetchurl {
+        name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
+        sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
+      };
+    }
+
+    {
+      name = "process___process_0.11.10.tgz";
+      path = fetchurl {
+        name = "process___process_0.11.10.tgz";
+        url  = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
+        sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
+      };
+    }
+
+    {
+      name = "progress___progress_2.0.3.tgz";
+      path = fetchurl {
+        name = "progress___progress_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz";
+        sha1 = "7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8";
+      };
+    }
+
+    {
+      name = "promise_inflight___promise_inflight_1.0.1.tgz";
+      path = fetchurl {
+        name = "promise_inflight___promise_inflight_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz";
+        sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
+      };
+    }
+
+    {
+      name = "promise___promise_7.3.1.tgz";
+      path = fetchurl {
+        name = "promise___promise_7.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz";
+        sha1 = "064b72602b18f90f29192b8b1bc418ffd1ebd3bf";
+      };
+    }
+
+    {
+      name = "prompts___prompts_0.1.14.tgz";
+      path = fetchurl {
+        name = "prompts___prompts_0.1.14.tgz";
+        url  = "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz";
+        sha1 = "a8e15c612c5c9ec8f8111847df3337c9cbd443b2";
+      };
+    }
+
+    {
+      name = "prop_types_extra___prop_types_extra_1.1.0.tgz";
+      path = fetchurl {
+        name = "prop_types_extra___prop_types_extra_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz";
+        sha1 = "32609910ea2dcf190366bacd3490d5a6412a605f";
+      };
+    }
+
+    {
+      name = "prop_types___prop_types_15.6.2.tgz";
+      path = fetchurl {
+        name = "prop_types___prop_types_15.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz";
+        sha1 = "05d5ca77b4453e985d60fc7ff8c859094a497102";
+      };
+    }
+
+    {
+      name = "proxy_addr___proxy_addr_2.0.4.tgz";
+      path = fetchurl {
+        name = "proxy_addr___proxy_addr_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz";
+        sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93";
+      };
+    }
+
+    {
+      name = "prr___prr_1.0.1.tgz";
+      path = fetchurl {
+        name = "prr___prr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
+        sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
+      };
+    }
+
+    {
+      name = "pseudomap___pseudomap_1.0.2.tgz";
+      path = fetchurl {
+        name = "pseudomap___pseudomap_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
+        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
+      };
+    }
+
+    {
+      name = "psl___psl_1.1.31.tgz";
+      path = fetchurl {
+        name = "psl___psl_1.1.31.tgz";
+        url  = "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz";
+        sha1 = "e9aa86d0101b5b105cbe93ac6b784cd547276184";
+      };
+    }
+
+    {
+      name = "public_encrypt___public_encrypt_4.0.3.tgz";
+      path = fetchurl {
+        name = "public_encrypt___public_encrypt_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz";
+        sha1 = "4fcc9d77a07e48ba7527e7cbe0de33d0701331e0";
+      };
+    }
+
+    {
+      name = "pump___pump_2.0.1.tgz";
+      path = fetchurl {
+        name = "pump___pump_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz";
+        sha1 = "12399add6e4cf7526d973cbc8b5ce2e2908b3909";
+      };
+    }
+
+    {
+      name = "pump___pump_3.0.0.tgz";
+      path = fetchurl {
+        name = "pump___pump_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz";
+        sha1 = "b4a2116815bde2f4e1ea602354e8c75565107a64";
+      };
+    }
+
+    {
+      name = "pumpify___pumpify_1.5.1.tgz";
+      path = fetchurl {
+        name = "pumpify___pumpify_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz";
+        sha1 = "36513be246ab27570b1a374a5ce278bfd74370ce";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.3.2.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
+        sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.4.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    }
+
+    {
+      name = "punycode___punycode_2.1.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
+        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
+      };
+    }
+
+    {
+      name = "q___q_1.5.1.tgz";
+      path = fetchurl {
+        name = "q___q_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
+        sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
+      };
+    }
+
+    {
+      name = "qs___qs_6.5.2.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
+        sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
+      };
+    }
+
+    {
+      name = "querystring_es3___querystring_es3_0.2.1.tgz";
+      path = fetchurl {
+        name = "querystring_es3___querystring_es3_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
+        sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
+      };
+    }
+
+    {
+      name = "querystring___querystring_0.2.0.tgz";
+      path = fetchurl {
+        name = "querystring___querystring_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
+        sha1 = "b209849203bb25df820da756e747005878521620";
+      };
+    }
+
+    {
+      name = "querystringify___querystringify_2.1.0.tgz";
+      path = fetchurl {
+        name = "querystringify___querystringify_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz";
+        sha1 = "7ded8dfbf7879dcc60d0a644ac6754b283ad17ef";
+      };
+    }
+
+    {
+      name = "quote___quote_0.4.0.tgz";
+      path = fetchurl {
+        name = "quote___quote_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/quote/-/quote-0.4.0.tgz";
+        sha1 = "10839217f6c1362b89194044d29b233fd7f32f01";
+      };
+    }
+
+    {
+      name = "raf___raf_3.4.1.tgz";
+      path = fetchurl {
+        name = "raf___raf_3.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz";
+        sha1 = "0742e99a4a6552f445d73e3ee0328af0ff1ede39";
+      };
+    }
+
+    {
+      name = "railroad_diagrams___railroad_diagrams_1.0.0.tgz";
+      path = fetchurl {
+        name = "railroad_diagrams___railroad_diagrams_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz";
+        sha1 = "eb7e6267548ddedfb899c1b90e57374559cddb7e";
+      };
+    }
+
+    {
+      name = "rails_ujs___rails_ujs_5.2.2.tgz";
+      path = fetchurl {
+        name = "rails_ujs___rails_ujs_5.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/rails-ujs/-/rails-ujs-5.2.2.tgz";
+        sha1 = "ab01dd087a323975637b50e93e7afcc0f9068568";
+      };
+    }
+
+    {
+      name = "randexp___randexp_0.4.6.tgz";
+      path = fetchurl {
+        name = "randexp___randexp_0.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz";
+        sha1 = "e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3";
+      };
+    }
+
+    {
+      name = "randomatic___randomatic_3.1.1.tgz";
+      path = fetchurl {
+        name = "randomatic___randomatic_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz";
+        sha1 = "b776efc59375984e36c537b2f51a1f0aff0da1ed";
+      };
+    }
+
+    {
+      name = "randombytes___randombytes_2.0.6.tgz";
+      path = fetchurl {
+        name = "randombytes___randombytes_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz";
+        sha1 = "d302c522948588848a8d300c932b44c24231da80";
+      };
+    }
+
+    {
+      name = "randomfill___randomfill_1.0.4.tgz";
+      path = fetchurl {
+        name = "randomfill___randomfill_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
+        sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
+      };
+    }
+
+    {
+      name = "range_parser___range_parser_1.2.0.tgz";
+      path = fetchurl {
+        name = "range_parser___range_parser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz";
+        sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
+      };
+    }
+
+    {
+      name = "raw_body___raw_body_2.3.3.tgz";
+      path = fetchurl {
+        name = "raw_body___raw_body_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz";
+        sha1 = "1b324ece6b5706e153855bc1148c65bb7f6ea0c3";
+      };
+    }
+
+    {
+      name = "rc___rc_1.2.8.tgz";
+      path = fetchurl {
+        name = "rc___rc_1.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
+        sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
+      };
+    }
+
+    {
+      name = "react_dom___react_dom_16.7.0.tgz";
+      path = fetchurl {
+        name = "react_dom___react_dom_16.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0.tgz";
+        sha1 = "a17b2a7ca89ee7390bc1ed5eb81783c7461748b8";
+      };
+    }
+
+    {
+      name = "react_event_listener___react_event_listener_0.6.5.tgz";
+      path = fetchurl {
+        name = "react_event_listener___react_event_listener_0.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.5.tgz";
+        sha1 = "d374dbe5da485c9f9d4702f0e76971afbe9b6b2e";
+      };
+    }
+
+    {
+      name = "react_hotkeys___react_hotkeys_1.1.4.tgz";
+      path = fetchurl {
+        name = "react_hotkeys___react_hotkeys_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-1.1.4.tgz";
+        sha1 = "a0712aa2e0c03a759fd7885808598497a4dace72";
+      };
+    }
+
+    {
+      name = "react_immutable_proptypes___react_immutable_proptypes_2.1.0.tgz";
+      path = fetchurl {
+        name = "react_immutable_proptypes___react_immutable_proptypes_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz";
+        sha1 = "023d6f39bb15c97c071e9e60d00d136eac5fa0b4";
+      };
+    }
+
+    {
+      name = "react_immutable_pure_component___react_immutable_pure_component_1.2.3.tgz";
+      path = fetchurl {
+        name = "react_immutable_pure_component___react_immutable_pure_component_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz";
+        sha1 = "fa33638df68cfe9f73ccbee1d5861c17f3053f86";
+      };
+    }
+
+    {
+      name = "react_infinite_scroller___react_infinite_scroller_1.2.4.tgz";
+      path = fetchurl {
+        name = "react_infinite_scroller___react_infinite_scroller_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz";
+        sha1 = "f67eaec4940a4ce6417bebdd6e3433bfc38826e9";
+      };
+    }
+
+    {
+      name = "react_input_autosize___react_input_autosize_2.2.1.tgz";
+      path = fetchurl {
+        name = "react_input_autosize___react_input_autosize_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz";
+        sha1 = "ec428fa15b1592994fb5f9aa15bb1eb6baf420f8";
+      };
+    }
+
+    {
+      name = "react_intl_translations_manager___react_intl_translations_manager_5.0.3.tgz";
+      path = fetchurl {
+        name = "react_intl_translations_manager___react_intl_translations_manager_5.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/react-intl-translations-manager/-/react-intl-translations-manager-5.0.3.tgz";
+        sha1 = "aee010ecf35975673e033ca5d7d3f4147894324d";
+      };
+    }
+
+    {
+      name = "react_intl___react_intl_2.7.2.tgz";
+      path = fetchurl {
+        name = "react_intl___react_intl_2.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-intl/-/react-intl-2.7.2.tgz";
+        sha1 = "efe97e3fc0e99b4e88a6e6150854d3d1852a4381";
+      };
+    }
+
+    {
+      name = "react_is___react_is_16.7.0.tgz";
+      path = fetchurl {
+        name = "react_is___react_is_16.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz";
+        sha1 = "c1bd21c64f1f1364c6f70695ec02d69392f41bfa";
+      };
+    }
+
+    {
+      name = "react_lifecycles_compat___react_lifecycles_compat_3.0.4.tgz";
+      path = fetchurl {
+        name = "react_lifecycles_compat___react_lifecycles_compat_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz";
+        sha1 = "4f1a273afdfc8f3488a8c516bfda78f872352362";
+      };
+    }
+
+    {
+      name = "react_masonry_infinite___react_masonry_infinite_1.2.2.tgz";
+      path = fetchurl {
+        name = "react_masonry_infinite___react_masonry_infinite_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-masonry-infinite/-/react-masonry-infinite-1.2.2.tgz";
+        sha1 = "20c1386f9ccdda9747527c8f42bc2c02dd2e7951";
+      };
+    }
+
+    {
+      name = "react_motion___react_motion_0.5.2.tgz";
+      path = fetchurl {
+        name = "react_motion___react_motion_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz";
+        sha1 = "0dd3a69e411316567927917c6626551ba0607316";
+      };
+    }
+
+    {
+      name = "react_notification___react_notification_6.8.4.tgz";
+      path = fetchurl {
+        name = "react_notification___react_notification_6.8.4.tgz";
+        url  = "https://registry.yarnpkg.com/react-notification/-/react-notification-6.8.4.tgz";
+        sha1 = "c189d23f47b0e1b240932f4cfab2f4082cd420bf";
+      };
+    }
+
+    {
+      name = "react_overlays___react_overlays_0.8.3.tgz";
+      path = fetchurl {
+        name = "react_overlays___react_overlays_0.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz";
+        sha1 = "fad65eea5b24301cca192a169f5dddb0b20d3ac5";
+      };
+    }
+
+    {
+      name = "react_redux_loading_bar___react_redux_loading_bar_4.0.8.tgz";
+      path = fetchurl {
+        name = "react_redux_loading_bar___react_redux_loading_bar_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-4.0.8.tgz";
+        sha1 = "e84d59d1517b79f53b0f39c8ddb40682af648c1b";
+      };
+    }
+
+    {
+      name = "react_redux___react_redux_6.0.0.tgz";
+      path = fetchurl {
+        name = "react_redux___react_redux_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz";
+        sha1 = "09e86eeed5febb98e9442458ad2970c8f1a173ef";
+      };
+    }
+
+    {
+      name = "react_router_dom___react_router_dom_4.3.1.tgz";
+      path = fetchurl {
+        name = "react_router_dom___react_router_dom_4.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz";
+        sha1 = "4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6";
+      };
+    }
+
+    {
+      name = "react_router_scroll_4___react_router_scroll_4_1.0.0_beta.2.tgz";
+      path = fetchurl {
+        name = "react_router_scroll_4___react_router_scroll_4_1.0.0_beta.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-router-scroll-4/-/react-router-scroll-4-1.0.0-beta.2.tgz";
+        sha1 = "d887063ec0f66124aaf450158dd158ff7d3dc279";
+      };
+    }
+
+    {
+      name = "react_router___react_router_4.3.1.tgz";
+      path = fetchurl {
+        name = "react_router___react_router_4.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz";
+        sha1 = "aada4aef14c809cb2e686b05cee4742234506c4e";
+      };
+    }
+
+    {
+      name = "react_select___react_select_2.2.0.tgz";
+      path = fetchurl {
+        name = "react_select___react_select_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-select/-/react-select-2.2.0.tgz";
+        sha1 = "67c8b5c2dcb8df0384f2a103efe952570f5d6b93";
+      };
+    }
+
+    {
+      name = "react_sparklines___react_sparklines_1.7.0.tgz";
+      path = fetchurl {
+        name = "react_sparklines___react_sparklines_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-sparklines/-/react-sparklines-1.7.0.tgz";
+        sha1 = "9b1d97e8c8610095eeb2ad658d2e1fcf91f91a60";
+      };
+    }
+
+    {
+      name = "react_swipeable_views_core___react_swipeable_views_core_0.13.0.tgz";
+      path = fetchurl {
+        name = "react_swipeable_views_core___react_swipeable_views_core_0.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.0.tgz";
+        sha1 = "6bf8a8132a756355444537672a14e84b1e3b53c2";
+      };
+    }
+
+    {
+      name = "react_swipeable_views_utils___react_swipeable_views_utils_0.13.0.tgz";
+      path = fetchurl {
+        name = "react_swipeable_views_utils___react_swipeable_views_utils_0.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.0.tgz";
+        sha1 = "0ea17aa67f88a69d534c79d591f8d82ef98346a4";
+      };
+    }
+
+    {
+      name = "react_swipeable_views___react_swipeable_views_0.13.0.tgz";
+      path = fetchurl {
+        name = "react_swipeable_views___react_swipeable_views_0.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.0.tgz";
+        sha1 = "a200cef1005d55af6a27b97048afe9a4056e0ab8";
+      };
+    }
+
+    {
+      name = "react_test_renderer___react_test_renderer_16.7.0.tgz";
+      path = fetchurl {
+        name = "react_test_renderer___react_test_renderer_16.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.7.0.tgz";
+        sha1 = "1ca96c2b450ab47c36ba92cd8c03fcefc52ea01c";
+      };
+    }
+
+    {
+      name = "react_textarea_autosize___react_textarea_autosize_7.1.0.tgz";
+      path = fetchurl {
+        name = "react_textarea_autosize___react_textarea_autosize_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz";
+        sha1 = "3132cb77e65d94417558d37c0bfe415a5afd3445";
+      };
+    }
+
+    {
+      name = "react_toggle___react_toggle_4.0.2.tgz";
+      path = fetchurl {
+        name = "react_toggle___react_toggle_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.0.2.tgz";
+        sha1 = "77f487860efb87fafd197672a2db8c885be1440f";
+      };
+    }
+
+    {
+      name = "react_transition_group___react_transition_group_2.5.2.tgz";
+      path = fetchurl {
+        name = "react_transition_group___react_transition_group_2.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.2.tgz";
+        sha1 = "9457166a9ba6ce697a3e1b076b3c049b9fb2c408";
+      };
+    }
+
+    {
+      name = "react___react_16.7.0.tgz";
+      path = fetchurl {
+        name = "react___react_16.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz";
+        sha1 = "b674ec396b0a5715873b350446f7ea0802ab6381";
+      };
+    }
+
+    {
+      name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
+        sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
+      };
+    }
+
+    {
+      name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz";
+        sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_1.1.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
+        sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz";
+        sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_2.3.6.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_2.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
+        sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_3.1.1.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz";
+        sha1 = "ed6bbc6c5ba58b090039ff18ce670515795aeb06";
+      };
+    }
+
+    {
+      name = "readdirp___readdirp_2.2.1.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
+        sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
+      };
+    }
+
+    {
+      name = "realpath_native___realpath_native_1.0.2.tgz";
+      path = fetchurl {
+        name = "realpath_native___realpath_native_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz";
+        sha1 = "cd51ce089b513b45cf9b1516c82989b51ccc6560";
+      };
+    }
+
+    {
+      name = "redis_commands___redis_commands_1.4.0.tgz";
+      path = fetchurl {
+        name = "redis_commands___redis_commands_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz";
+        sha1 = "52f9cf99153efcce56a8f86af986bd04e988602f";
+      };
+    }
+
+    {
+      name = "redis_parser___redis_parser_2.6.0.tgz";
+      path = fetchurl {
+        name = "redis_parser___redis_parser_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz";
+        sha1 = "52ed09dacac108f1a631c07e9b69941e7a19504b";
+      };
+    }
+
+    {
+      name = "redis___redis_2.8.0.tgz";
+      path = fetchurl {
+        name = "redis___redis_2.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz";
+        sha1 = "202288e3f58c49f6079d97af7a10e1303ae14b02";
+      };
+    }
+
+    {
+      name = "redux_immutable___redux_immutable_4.0.0.tgz";
+      path = fetchurl {
+        name = "redux_immutable___redux_immutable_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz";
+        sha1 = "3a1a32df66366462b63691f0e1dc35e472bbc9f3";
+      };
+    }
+
+    {
+      name = "redux_thunk___redux_thunk_2.3.0.tgz";
+      path = fetchurl {
+        name = "redux_thunk___redux_thunk_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz";
+        sha1 = "51c2c19a185ed5187aaa9a2d08b666d0d6467622";
+      };
+    }
+
+    {
+      name = "redux___redux_4.0.1.tgz";
+      path = fetchurl {
+        name = "redux___redux_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz";
+        sha1 = "436cae6cc40fbe4727689d7c8fae44808f1bfef5";
+      };
+    }
+
+    {
+      name = "regenerate_unicode_properties___regenerate_unicode_properties_7.0.0.tgz";
+      path = fetchurl {
+        name = "regenerate_unicode_properties___regenerate_unicode_properties_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz";
+        sha1 = "107405afcc4a190ec5ed450ecaa00ed0cafa7a4c";
+      };
+    }
+
+    {
+      name = "regenerate___regenerate_1.4.0.tgz";
+      path = fetchurl {
+        name = "regenerate___regenerate_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz";
+        sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11";
+      };
+    }
+
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
+        sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
+      };
+    }
+
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.12.1.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz";
+        sha1 = "fa1a71544764c036f8c49b13a08b2594c9f8a0de";
+      };
+    }
+
+    {
+      name = "regenerator_transform___regenerator_transform_0.13.3.tgz";
+      path = fetchurl {
+        name = "regenerator_transform___regenerator_transform_0.13.3.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz";
+        sha1 = "264bd9ff38a8ce24b06e0636496b2c856b57bcbb";
+      };
+    }
+
+    {
+      name = "regex_cache___regex_cache_0.4.4.tgz";
+      path = fetchurl {
+        name = "regex_cache___regex_cache_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
+        sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
+      };
+    }
+
+    {
+      name = "regex_not___regex_not_1.0.2.tgz";
+      path = fetchurl {
+        name = "regex_not___regex_not_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
+        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
+      };
+    }
+
+    {
+      name = "regexpp___regexpp_2.0.1.tgz";
+      path = fetchurl {
+        name = "regexpp___regexpp_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz";
+        sha1 = "8d19d31cf632482b589049f8281f93dbcba4d07f";
+      };
+    }
+
+    {
+      name = "regexpu_core___regexpu_core_1.0.0.tgz";
+      path = fetchurl {
+        name = "regexpu_core___regexpu_core_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz";
+        sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
+      };
+    }
+
+    {
+      name = "regexpu_core___regexpu_core_4.4.0.tgz";
+      path = fetchurl {
+        name = "regexpu_core___regexpu_core_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz";
+        sha1 = "8d43e0d1266883969720345e70c275ee0aec0d32";
+      };
+    }
+
+    {
+      name = "regjsgen___regjsgen_0.2.0.tgz";
+      path = fetchurl {
+        name = "regjsgen___regjsgen_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz";
+        sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
+      };
+    }
+
+    {
+      name = "regjsgen___regjsgen_0.5.0.tgz";
+      path = fetchurl {
+        name = "regjsgen___regjsgen_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz";
+        sha1 = "a7634dc08f89209c2049adda3525711fb97265dd";
+      };
+    }
+
+    {
+      name = "regjsparser___regjsparser_0.1.5.tgz";
+      path = fetchurl {
+        name = "regjsparser___regjsparser_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz";
+        sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
+      };
+    }
+
+    {
+      name = "regjsparser___regjsparser_0.6.0.tgz";
+      path = fetchurl {
+        name = "regjsparser___regjsparser_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz";
+        sha1 = "f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c";
+      };
+    }
+
+    {
+      name = "rellax___rellax_1.7.1.tgz";
+      path = fetchurl {
+        name = "rellax___rellax_1.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/rellax/-/rellax-1.7.1.tgz";
+        sha1 = "2f82aaa1c1d8116eef08fc533c59655a097c8be2";
+      };
+    }
+
+    {
+      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+      path = fetchurl {
+        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
+        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
+      };
+    }
+
+    {
+      name = "repeat_element___repeat_element_1.1.3.tgz";
+      path = fetchurl {
+        name = "repeat_element___repeat_element_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
+        sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
+      };
+    }
+
+    {
+      name = "repeat_string___repeat_string_1.6.1.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    }
+
+    {
+      name = "repeating___repeating_2.0.1.tgz";
+      path = fetchurl {
+        name = "repeating___repeating_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
+        sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
+      };
+    }
+
+    {
+      name = "request_promise_core___request_promise_core_1.1.1.tgz";
+      path = fetchurl {
+        name = "request_promise_core___request_promise_core_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz";
+        sha1 = "3eee00b2c5aa83239cfb04c5700da36f81cd08b6";
+      };
+    }
+
+    {
+      name = "request_promise_native___request_promise_native_1.0.5.tgz";
+      path = fetchurl {
+        name = "request_promise_native___request_promise_native_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz";
+        sha1 = "5281770f68e0c9719e5163fd3fab482215f4fda5";
+      };
+    }
+
+    {
+      name = "request___request_2.88.0.tgz";
+      path = fetchurl {
+        name = "request___request_2.88.0.tgz";
+        url  = "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz";
+        sha1 = "9c2fca4f7d35b592efe57c7f0a55e81052124fef";
+      };
+    }
+
+    {
+      name = "requestidlecallback___requestidlecallback_0.3.0.tgz";
+      path = fetchurl {
+        name = "requestidlecallback___requestidlecallback_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/requestidlecallback/-/requestidlecallback-0.3.0.tgz";
+        sha1 = "6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5";
+      };
+    }
+
+    {
+      name = "require_directory___require_directory_2.1.1.tgz";
+      path = fetchurl {
+        name = "require_directory___require_directory_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    }
+
+    {
+      name = "require_from_string___require_from_string_2.0.2.tgz";
+      path = fetchurl {
+        name = "require_from_string___require_from_string_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz";
+        sha1 = "89a7fdd938261267318eafe14f9c32e598c36909";
+      };
+    }
+
+    {
+      name = "require_main_filename___require_main_filename_1.0.1.tgz";
+      path = fetchurl {
+        name = "require_main_filename___require_main_filename_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
+        sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
+      };
+    }
+
+    {
+      name = "require_package_name___require_package_name_2.0.1.tgz";
+      path = fetchurl {
+        name = "require_package_name___require_package_name_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz";
+        sha1 = "c11e97276b65b8e2923f75dabf5fb2ef0c3841b9";
+      };
+    }
+
+    {
+      name = "require_uncached___require_uncached_1.0.3.tgz";
+      path = fetchurl {
+        name = "require_uncached___require_uncached_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz";
+        sha1 = "4e0d56d6c9662fd31e43011c4b95aa49955421d3";
+      };
+    }
+
+    {
+      name = "requires_port___requires_port_1.0.0.tgz";
+      path = fetchurl {
+        name = "requires_port___requires_port_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
+        sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
+      };
+    }
+
+    {
+      name = "reselect___reselect_4.0.0.tgz";
+      path = fetchurl {
+        name = "reselect___reselect_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz";
+        sha1 = "f2529830e5d3d0e021408b246a206ef4ea4437f7";
+      };
+    }
+
+    {
+      name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
+        sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_1.0.1.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz";
+        sha1 = "26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_3.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
+        sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
+      };
+    }
+
+    {
+      name = "resolve_pathname___resolve_pathname_2.2.0.tgz";
+      path = fetchurl {
+        name = "resolve_pathname___resolve_pathname_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz";
+        sha1 = "7e9ae21ed815fd63ab189adeee64dc831eefa879";
+      };
+    }
+
+    {
+      name = "resolve_url___resolve_url_0.2.1.tgz";
+      path = fetchurl {
+        name = "resolve_url___resolve_url_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
+        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
+      };
+    }
+
+    {
+      name = "resolve___resolve_1.1.7.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz";
+        sha1 = "203114d82ad2c5ed9e8e0411b3932875e889e97b";
+      };
+    }
+
+    {
+      name = "resolve___resolve_1.9.0.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz";
+        sha1 = "a14c6fdfa8f92a7df1d996cb7105fa744658ea06";
+      };
+    }
+
+    {
+      name = "restore_cursor___restore_cursor_2.0.0.tgz";
+      path = fetchurl {
+        name = "restore_cursor___restore_cursor_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz";
+        sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
+      };
+    }
+
+    {
+      name = "ret___ret_0.1.15.tgz";
+      path = fetchurl {
+        name = "ret___ret_0.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
+        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+      };
+    }
+
+    {
+      name = "rgb_regex___rgb_regex_1.0.1.tgz";
+      path = fetchurl {
+        name = "rgb_regex___rgb_regex_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz";
+        sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
+      };
+    }
+
+    {
+      name = "rgba_regex___rgba_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "rgba_regex___rgba_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz";
+        sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
+      };
+    }
+
+    {
+      name = "rimraf___rimraf_2.6.2.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz";
+        sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36";
+      };
+    }
+
+    {
+      name = "ripemd160___ripemd160_2.0.2.tgz";
+      path = fetchurl {
+        name = "ripemd160___ripemd160_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
+        sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
+      };
+    }
+
+    {
+      name = "rst_selector_parser___rst_selector_parser_2.2.3.tgz";
+      path = fetchurl {
+        name = "rst_selector_parser___rst_selector_parser_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz";
+        sha1 = "81b230ea2fcc6066c89e3472de794285d9b03d91";
+      };
+    }
+
+    {
+      name = "rsvp___rsvp_3.6.2.tgz";
+      path = fetchurl {
+        name = "rsvp___rsvp_3.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz";
+        sha1 = "2e96491599a96cde1b515d5674a8f7a91452926a";
+      };
+    }
+
+    {
+      name = "run_async___run_async_2.3.0.tgz";
+      path = fetchurl {
+        name = "run_async___run_async_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz";
+        sha1 = "0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0";
+      };
+    }
+
+    {
+      name = "run_queue___run_queue_1.0.3.tgz";
+      path = fetchurl {
+        name = "run_queue___run_queue_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz";
+        sha1 = "e848396f057d223f24386924618e25694161ec47";
+      };
+    }
+
+    {
+      name = "rxjs___rxjs_6.3.3.tgz";
+      path = fetchurl {
+        name = "rxjs___rxjs_6.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz";
+        sha1 = "3c6a7fa420e844a81390fb1158a9ec614f4bad55";
+      };
+    }
+
+    {
+      name = "safe_buffer___safe_buffer_5.1.2.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
+      };
+    }
+
+    {
+      name = "safe_regex___safe_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "safe_regex___safe_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
+        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
+      };
+    }
+
+    {
+      name = "safer_buffer___safer_buffer_2.1.2.tgz";
+      path = fetchurl {
+        name = "safer_buffer___safer_buffer_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
+      };
+    }
+
+    {
+      name = "sane___sane_2.5.2.tgz";
+      path = fetchurl {
+        name = "sane___sane_2.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz";
+        sha1 = "b4dc1861c21b427e929507a3e751e2a2cb8ab3fa";
+      };
+    }
+
+    {
+      name = "sass_loader___sass_loader_7.1.0.tgz";
+      path = fetchurl {
+        name = "sass_loader___sass_loader_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz";
+        sha1 = "16fd5138cb8b424bf8a759528a1972d72aad069d";
+      };
+    }
+
+    {
+      name = "sass___sass_1.15.2.tgz";
+      path = fetchurl {
+        name = "sass___sass_1.15.2.tgz";
+        url  = "https://registry.yarnpkg.com/sass/-/sass-1.15.2.tgz";
+        sha1 = "539f464a61e29a9e4f560ec9dc2ccc5236db8474";
+      };
+    }
+
+    {
+      name = "sax___sax_1.2.4.tgz";
+      path = fetchurl {
+        name = "sax___sax_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
+        sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
+      };
+    }
+
+    {
+      name = "scheduler___scheduler_0.12.0.tgz";
+      path = fetchurl {
+        name = "scheduler___scheduler_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz";
+        sha1 = "8ab17699939c0aedc5a196a657743c496538647b";
+      };
+    }
+
+    {
+      name = "schema_utils___schema_utils_0.4.7.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_0.4.7.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz";
+        sha1 = "ba74f597d2be2ea880131746ee17d0a093c68187";
+      };
+    }
+
+    {
+      name = "schema_utils___schema_utils_1.0.0.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz";
+        sha1 = "0b79a93204d7b600d4b2850d1f66c2a34951c770";
+      };
+    }
+
+    {
+      name = "scroll_behavior___scroll_behavior_0.9.9.tgz";
+      path = fetchurl {
+        name = "scroll_behavior___scroll_behavior_0.9.9.tgz";
+        url  = "https://registry.yarnpkg.com/scroll-behavior/-/scroll-behavior-0.9.9.tgz";
+        sha1 = "ebfe0658455b82ad885b66195215416674dacce2";
+      };
+    }
+
+    {
+      name = "select_hose___select_hose_2.0.0.tgz";
+      path = fetchurl {
+        name = "select_hose___select_hose_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz";
+        sha1 = "625d8658f865af43ec962bfc376a37359a4994ca";
+      };
+    }
+
+    {
+      name = "selfsigned___selfsigned_1.10.4.tgz";
+      path = fetchurl {
+        name = "selfsigned___selfsigned_1.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz";
+        sha1 = "cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd";
+      };
+    }
+
+    {
+      name = "semver___semver_5.6.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz";
+        sha1 = "7e74256fbaa49c75aa7c7a205cc22799cac80004";
+      };
+    }
+
+    {
+      name = "semver___semver_4.3.2.tgz";
+      path = fetchurl {
+        name = "semver___semver_4.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz";
+        sha1 = "c7a07158a80bedd052355b770d82d6640f803be7";
+      };
+    }
+
+    {
+      name = "send___send_0.16.2.tgz";
+      path = fetchurl {
+        name = "send___send_0.16.2.tgz";
+        url  = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz";
+        sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1";
+      };
+    }
+
+    {
+      name = "serialize_javascript___serialize_javascript_1.6.1.tgz";
+      path = fetchurl {
+        name = "serialize_javascript___serialize_javascript_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz";
+        sha1 = "4d1f697ec49429a847ca6f442a2a755126c4d879";
+      };
+    }
+
+    {
+      name = "serve_index___serve_index_1.9.1.tgz";
+      path = fetchurl {
+        name = "serve_index___serve_index_1.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz";
+        sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239";
+      };
+    }
+
+    {
+      name = "serve_static___serve_static_1.13.2.tgz";
+      path = fetchurl {
+        name = "serve_static___serve_static_1.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz";
+        sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1";
+      };
+    }
+
+    {
+      name = "set_blocking___set_blocking_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_blocking___set_blocking_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    }
+
+    {
+      name = "set_value___set_value_0.4.3.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_0.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
+        sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
+      };
+    }
+
+    {
+      name = "set_value___set_value_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
+        sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
+      };
+    }
+
+    {
+      name = "setimmediate___setimmediate_1.0.5.tgz";
+      path = fetchurl {
+        name = "setimmediate___setimmediate_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
+        sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
+      };
+    }
+
+    {
+      name = "setprototypeof___setprototypeof_1.1.0.tgz";
+      path = fetchurl {
+        name = "setprototypeof___setprototypeof_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
+        sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
+      };
+    }
+
+    {
+      name = "sha.js___sha.js_2.4.11.tgz";
+      path = fetchurl {
+        name = "sha.js___sha.js_2.4.11.tgz";
+        url  = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
+        sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
+      };
+    }
+
+    {
+      name = "shallow_clone___shallow_clone_1.0.0.tgz";
+      path = fetchurl {
+        name = "shallow_clone___shallow_clone_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz";
+        sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571";
+      };
+    }
+
+    {
+      name = "shebang_command___shebang_command_1.2.0.tgz";
+      path = fetchurl {
+        name = "shebang_command___shebang_command_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
+        sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
+      };
+    }
+
+    {
+      name = "shebang_regex___shebang_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_regex___shebang_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
+        sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
+      };
+    }
+
+    {
+      name = "shellwords___shellwords_0.1.1.tgz";
+      path = fetchurl {
+        name = "shellwords___shellwords_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz";
+        sha1 = "d6b9181c1a48d397324c84871efbcfc73fc0654b";
+      };
+    }
+
+    {
+      name = "signal_exit___signal_exit_3.0.2.tgz";
+      path = fetchurl {
+        name = "signal_exit___signal_exit_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
+        sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
+      };
+    }
+
+    {
+      name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
+      path = fetchurl {
+        name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
+        sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
+      };
+    }
+
+    {
+      name = "sisteransi___sisteransi_0.1.1.tgz";
+      path = fetchurl {
+        name = "sisteransi___sisteransi_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz";
+        sha1 = "5431447d5f7d1675aac667ccd0b865a4994cb3ce";
+      };
+    }
+
+    {
+      name = "slash___slash_1.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
+        sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+      };
+    }
+
+    {
+      name = "slice_ansi___slice_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "slice_ansi___slice_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz";
+        sha1 = "5373bdb8559b45676e8541c66916cdd6251612e7";
+      };
+    }
+
+    {
+      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
+        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
+      };
+    }
+
+    {
+      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
+        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
+      };
+    }
+
+    {
+      name = "snapdragon___snapdragon_0.8.2.tgz";
+      path = fetchurl {
+        name = "snapdragon___snapdragon_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
+        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
+      };
+    }
+
+    {
+      name = "sockjs_client___sockjs_client_1.3.0.tgz";
+      path = fetchurl {
+        name = "sockjs_client___sockjs_client_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz";
+        sha1 = "12fc9d6cb663da5739d3dc5fb6e8687da95cb177";
+      };
+    }
+
+    {
+      name = "sockjs___sockjs_0.3.19.tgz";
+      path = fetchurl {
+        name = "sockjs___sockjs_0.3.19.tgz";
+        url  = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz";
+        sha1 = "d976bbe800af7bd20ae08598d582393508993c0d";
+      };
+    }
+
+    {
+      name = "source_list_map___source_list_map_2.0.1.tgz";
+      path = fetchurl {
+        name = "source_list_map___source_list_map_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz";
+        sha1 = "3993bd873bfc48479cca9ea3a547835c7c154b34";
+      };
+    }
+
+    {
+      name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+      path = fetchurl {
+        name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
+        sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
+      };
+    }
+
+    {
+      name = "source_map_support___source_map_support_0.4.18.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.4.18.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz";
+        sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f";
+      };
+    }
+
+    {
+      name = "source_map_support___source_map_support_0.5.9.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.5.9.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz";
+        sha1 = "41bc953b2534267ea2d605bccfa7bfa3111ced5f";
+      };
+    }
+
+    {
+      name = "source_map_url___source_map_url_0.4.0.tgz";
+      path = fetchurl {
+        name = "source_map_url___source_map_url_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
+        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.5.7.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.6.1.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
+        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
+      };
+    }
+
+    {
+      name = "spdx_correct___spdx_correct_3.1.0.tgz";
+      path = fetchurl {
+        name = "spdx_correct___spdx_correct_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz";
+        sha1 = "fb83e504445268f154b074e218c87c003cd31df4";
+      };
+    }
+
+    {
+      name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+      path = fetchurl {
+        name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
+        sha1 = "2ea450aee74f2a89bfb94519c07fcd6f41322977";
+      };
+    }
+
+    {
+      name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
+        sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
+      };
+    }
+
+    {
+      name = "spdx_license_ids___spdx_license_ids_3.0.3.tgz";
+      path = fetchurl {
+        name = "spdx_license_ids___spdx_license_ids_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz";
+        sha1 = "81c0ce8f21474756148bbb5f3bfc0f36bf15d76e";
+      };
+    }
+
+    {
+      name = "spdy_transport___spdy_transport_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdy_transport___spdy_transport_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz";
+        sha1 = "00d4863a6400ad75df93361a1608605e5dcdcf31";
+      };
+    }
+
+    {
+      name = "spdy___spdy_4.0.0.tgz";
+      path = fetchurl {
+        name = "spdy___spdy_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz";
+        sha1 = "81f222b5a743a329aa12cea6a390e60e9b613c52";
+      };
+    }
+
+    {
+      name = "split_string___split_string_3.1.0.tgz";
+      path = fetchurl {
+        name = "split_string___split_string_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
+        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
+      };
+    }
+
+    {
+      name = "split___split_1.0.1.tgz";
+      path = fetchurl {
+        name = "split___split_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz";
+        sha1 = "605bd9be303aa59fb35f9229fbea0ddec9ea07d9";
+      };
+    }
+
+    {
+      name = "sprintf_js___sprintf_js_1.0.3.tgz";
+      path = fetchurl {
+        name = "sprintf_js___sprintf_js_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    }
+
+    {
+      name = "sshpk___sshpk_1.16.0.tgz";
+      path = fetchurl {
+        name = "sshpk___sshpk_1.16.0.tgz";
+        url  = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz";
+        sha1 = "1d4963a2fbffe58050aa9084ca20be81741c07de";
+      };
+    }
+
+    {
+      name = "ssri___ssri_6.0.1.tgz";
+      path = fetchurl {
+        name = "ssri___ssri_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz";
+        sha1 = "2a3c41b28dd45b62b63676ecb74001265ae9edd8";
+      };
+    }
+
+    {
+      name = "stable___stable_0.1.8.tgz";
+      path = fetchurl {
+        name = "stable___stable_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz";
+        sha1 = "836eb3c8382fe2936feaf544631017ce7d47a3cf";
+      };
+    }
+
+    {
+      name = "stack_utils___stack_utils_1.0.2.tgz";
+      path = fetchurl {
+        name = "stack_utils___stack_utils_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz";
+        sha1 = "33eba3897788558bebfc2db059dc158ec36cebb8";
+      };
+    }
+
+    {
+      name = "static_extend___static_extend_0.1.2.tgz";
+      path = fetchurl {
+        name = "static_extend___static_extend_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
+        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.5.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.4.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz";
+        sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087";
+      };
+    }
+
+    {
+      name = "stealthy_require___stealthy_require_1.1.1.tgz";
+      path = fetchurl {
+        name = "stealthy_require___stealthy_require_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz";
+        sha1 = "35b09875b4ff49f26a777e509b3090a3226bf24b";
+      };
+    }
+
+    {
+      name = "stream_browserify___stream_browserify_2.0.1.tgz";
+      path = fetchurl {
+        name = "stream_browserify___stream_browserify_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz";
+        sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
+      };
+    }
+
+    {
+      name = "stream_each___stream_each_1.2.3.tgz";
+      path = fetchurl {
+        name = "stream_each___stream_each_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz";
+        sha1 = "ebe27a0c389b04fbcc233642952e10731afa9bae";
+      };
+    }
+
+    {
+      name = "stream_http___stream_http_2.8.3.tgz";
+      path = fetchurl {
+        name = "stream_http___stream_http_2.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
+        sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
+      };
+    }
+
+    {
+      name = "stream_shift___stream_shift_1.0.0.tgz";
+      path = fetchurl {
+        name = "stream_shift___stream_shift_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz";
+        sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
+      };
+    }
+
+    {
+      name = "string_length___string_length_2.0.0.tgz";
+      path = fetchurl {
+        name = "string_length___string_length_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz";
+        sha1 = "d40dbb686a3ace960c1cffca562bf2c45f8363ed";
+      };
+    }
+
+    {
+      name = "string_width___string_width_1.0.2.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    }
+
+    {
+      name = "string_width___string_width_2.1.1.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
+        sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
+      };
+    }
+
+    {
+      name = "string.prototype.trim___string.prototype.trim_1.1.2.tgz";
+      path = fetchurl {
+        name = "string.prototype.trim___string.prototype.trim_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz";
+        sha1 = "d04de2c89e137f4d7d206f086b5ed2fae6be8cea";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.2.0.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz";
+        sha1 = "fe86e738b19544afe70469243b2a1ee9240eae8d";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.1.1.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
+      };
+    }
+
+    {
+      name = "stringz___stringz_1.0.0.tgz";
+      path = fetchurl {
+        name = "stringz___stringz_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stringz/-/stringz-1.0.0.tgz";
+        sha1 = "d2acba994e4ce3c725ee15c86fff4281280d2025";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_4.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_5.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz";
+        sha1 = "f78f68b5d0866c20b2c9b8c61b5298508dc8756f";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_3.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz";
+        sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
+      };
+    }
+
+    {
+      name = "strip_bom___strip_bom_2.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
+        sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
+      };
+    }
+
+    {
+      name = "strip_eof___strip_eof_1.0.0.tgz";
+      path = fetchurl {
+        name = "strip_eof___strip_eof_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
+        sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
+      };
+    }
+
+    {
+      name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
+      };
+    }
+
+    {
+      name = "style_loader___style_loader_0.23.1.tgz";
+      path = fetchurl {
+        name = "style_loader___style_loader_0.23.1.tgz";
+        url  = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz";
+        sha1 = "cb9154606f3e771ab6c4ab637026a1049174d925";
+      };
+    }
+
+    {
+      name = "stylehacks___stylehacks_4.0.1.tgz";
+      path = fetchurl {
+        name = "stylehacks___stylehacks_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz";
+        sha1 = "3186595d047ab0df813d213e51c8b94e0b9010f2";
+      };
+    }
+
+    {
+      name = "substring_trie___substring_trie_1.0.2.tgz";
+      path = fetchurl {
+        name = "substring_trie___substring_trie_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/substring-trie/-/substring-trie-1.0.2.tgz";
+        sha1 = "7b42592391628b4f2cb17365c6cce4257c7b7af5";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_2.0.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_3.2.3.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_3.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
+        sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_5.5.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_5.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz";
+        sha1 = "e2e69a44ac8772f78a1ec0b35b689df6530efc8f";
+      };
+    }
+
+    {
+      name = "svgo___svgo_1.1.1.tgz";
+      path = fetchurl {
+        name = "svgo___svgo_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz";
+        sha1 = "12384b03335bcecd85cfa5f4e3375fed671cb985";
+      };
+    }
+
+    {
+      name = "symbol_observable___symbol_observable_1.2.0.tgz";
+      path = fetchurl {
+        name = "symbol_observable___symbol_observable_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz";
+        sha1 = "c22688aed4eab3cdc2dfeacbb561660560a00804";
+      };
+    }
+
+    {
+      name = "symbol_tree___symbol_tree_3.2.2.tgz";
+      path = fetchurl {
+        name = "symbol_tree___symbol_tree_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz";
+        sha1 = "ae27db38f660a7ae2e1c3b7d1bc290819b8519e6";
+      };
+    }
+
+    {
+      name = "table___table_5.1.1.tgz";
+      path = fetchurl {
+        name = "table___table_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/table/-/table-5.1.1.tgz";
+        sha1 = "92030192f1b7b51b6eeab23ed416862e47b70837";
+      };
+    }
+
+    {
+      name = "tapable___tapable_1.1.1.tgz";
+      path = fetchurl {
+        name = "tapable___tapable_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz";
+        sha1 = "4d297923c5a72a42360de2ab52dadfaaec00018e";
+      };
+    }
+
+    {
+      name = "tar___tar_4.4.8.tgz";
+      path = fetchurl {
+        name = "tar___tar_4.4.8.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz";
+        sha1 = "b19eec3fde2a96e64666df9fdb40c5ca1bc3747d";
+      };
+    }
+
+    {
+      name = "tcomb___tcomb_2.7.0.tgz";
+      path = fetchurl {
+        name = "tcomb___tcomb_2.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz";
+        sha1 = "10d62958041669a5d53567b9a4ee8cde22b1c2b0";
+      };
+    }
+
+    {
+      name = "terser_webpack_plugin___terser_webpack_plugin_1.2.1.tgz";
+      path = fetchurl {
+        name = "terser_webpack_plugin___terser_webpack_plugin_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz";
+        sha1 = "7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26";
+      };
+    }
+
+    {
+      name = "terser___terser_3.14.0.tgz";
+      path = fetchurl {
+        name = "terser___terser_3.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/terser/-/terser-3.14.0.tgz";
+        sha1 = "49a8ddf34a1308a901d787dab03a42c51b557447";
+      };
+    }
+
+    {
+      name = "test_exclude___test_exclude_4.2.3.tgz";
+      path = fetchurl {
+        name = "test_exclude___test_exclude_4.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz";
+        sha1 = "a9a5e64474e4398339245a0a769ad7c2f4a97c20";
+      };
+    }
+
+    {
+      name = "text_table___text_table_0.2.0.tgz";
+      path = fetchurl {
+        name = "text_table___text_table_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz";
+        sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+      };
+    }
+
+    {
+      name = "throat___throat_4.1.0.tgz";
+      path = fetchurl {
+        name = "throat___throat_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz";
+        sha1 = "89037cbc92c56ab18926e6ba4cbb200e15672a6a";
+      };
+    }
+
+    {
+      name = "throng___throng_4.0.0.tgz";
+      path = fetchurl {
+        name = "throng___throng_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/throng/-/throng-4.0.0.tgz";
+        sha1 = "983c6ba1993b58eae859998aa687ffe88df84c17";
+      };
+    }
+
+    {
+      name = "through2___through2_2.0.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
+        sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
+      };
+    }
+
+    {
+      name = "through___through_2.3.8.tgz";
+      path = fetchurl {
+        name = "through___through_2.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    }
+
+    {
+      name = "thunky___thunky_1.0.3.tgz";
+      path = fetchurl {
+        name = "thunky___thunky_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz";
+        sha1 = "f5df732453407b09191dae73e2a8cc73f381a826";
+      };
+    }
+
+    {
+      name = "timers_browserify___timers_browserify_2.0.10.tgz";
+      path = fetchurl {
+        name = "timers_browserify___timers_browserify_2.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz";
+        sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae";
+      };
+    }
+
+    {
+      name = "timsort___timsort_0.3.0.tgz";
+      path = fetchurl {
+        name = "timsort___timsort_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz";
+        sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
+      };
+    }
+
+    {
+      name = "tiny_queue___tiny_queue_0.2.1.tgz";
+      path = fetchurl {
+        name = "tiny_queue___tiny_queue_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz";
+        sha1 = "25a67f2c6e253b2ca941977b5ef7442ef97a6046";
+      };
+    }
+
+    {
+      name = "tmp___tmp_0.0.33.tgz";
+      path = fetchurl {
+        name = "tmp___tmp_0.0.33.tgz";
+        url  = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz";
+        sha1 = "6d34335889768d21b2bcda0aa277ced3b1bfadf9";
+      };
+    }
+
+    {
+      name = "tmpl___tmpl_1.0.4.tgz";
+      path = fetchurl {
+        name = "tmpl___tmpl_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz";
+        sha1 = "23640dd7b42d00433911140820e5cf440e521dd1";
+      };
+    }
+
+    {
+      name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+      path = fetchurl {
+        name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
+        sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
+      };
+    }
+
+    {
+      name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+      path = fetchurl {
+        name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
+        sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
+      };
+    }
+
+    {
+      name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
+      path = fetchurl {
+        name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
+        sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
+      };
+    }
+
+    {
+      name = "to_object_path___to_object_path_0.3.0.tgz";
+      path = fetchurl {
+        name = "to_object_path___to_object_path_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
+        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
+      };
+    }
+
+    {
+      name = "to_regex_range___to_regex_range_2.1.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
+        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
+      };
+    }
+
+    {
+      name = "to_regex___to_regex_3.0.2.tgz";
+      path = fetchurl {
+        name = "to_regex___to_regex_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
+        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
+      };
+    }
+
+    {
+      name = "tough_cookie___tough_cookie_2.5.0.tgz";
+      path = fetchurl {
+        name = "tough_cookie___tough_cookie_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz";
+        sha1 = "cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2";
+      };
+    }
+
+    {
+      name = "tough_cookie___tough_cookie_2.4.3.tgz";
+      path = fetchurl {
+        name = "tough_cookie___tough_cookie_2.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz";
+        sha1 = "53f36da3f47783b0925afa06ff9f3b165280f781";
+      };
+    }
+
+    {
+      name = "tr46___tr46_1.0.1.tgz";
+      path = fetchurl {
+        name = "tr46___tr46_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz";
+        sha1 = "a8b13fd6bfd2489519674ccde55ba3693b706d09";
+      };
+    }
+
+    {
+      name = "trim_right___trim_right_1.0.1.tgz";
+      path = fetchurl {
+        name = "trim_right___trim_right_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz";
+        sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
+      };
+    }
+
+    {
+      name = "tryer___tryer_1.0.1.tgz";
+      path = fetchurl {
+        name = "tryer___tryer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz";
+        sha1 = "f2c85406800b9b0f74c9f7465b81eaad241252f8";
+      };
+    }
+
+    {
+      name = "tslib___tslib_1.9.3.tgz";
+      path = fetchurl {
+        name = "tslib___tslib_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz";
+        sha1 = "d7e4dd79245d85428c4d7e4822a79917954ca286";
+      };
+    }
+
+    {
+      name = "tty_browserify___tty_browserify_0.0.0.tgz";
+      path = fetchurl {
+        name = "tty_browserify___tty_browserify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
+        sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
+      };
+    }
+
+    {
+      name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+      path = fetchurl {
+        name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    }
+
+    {
+      name = "tweetnacl___tweetnacl_0.14.5.tgz";
+      path = fetchurl {
+        name = "tweetnacl___tweetnacl_0.14.5.tgz";
+        url  = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    }
+
+    {
+      name = "type_check___type_check_0.3.2.tgz";
+      path = fetchurl {
+        name = "type_check___type_check_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    }
+
+    {
+      name = "type_is___type_is_1.6.16.tgz";
+      path = fetchurl {
+        name = "type_is___type_is_1.6.16.tgz";
+        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
+        sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
+      };
+    }
+
+    {
+      name = "typedarray___typedarray_0.0.6.tgz";
+      path = fetchurl {
+        name = "typedarray___typedarray_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz";
+        sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
+      };
+    }
+
+    {
+      name = "ua_parser_js___ua_parser_js_0.7.19.tgz";
+      path = fetchurl {
+        name = "ua_parser_js___ua_parser_js_0.7.19.tgz";
+        url  = "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz";
+        sha1 = "94151be4c0a7fb1d001af7022fdaca4642659e4b";
+      };
+    }
+
+    {
+      name = "uglify_js___uglify_js_3.4.9.tgz";
+      path = fetchurl {
+        name = "uglify_js___uglify_js_3.4.9.tgz";
+        url  = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz";
+        sha1 = "af02f180c1207d76432e473ed24a28f4a782bae3";
+      };
+    }
+
+    {
+      name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_2.1.1.tgz";
+      path = fetchurl {
+        name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.1.1.tgz";
+        sha1 = "6937d7513a37280d4792f1fb536bef35e08e420a";
+      };
+    }
+
+    {
+      name = "unicode_astral_regex___unicode_astral_regex_1.0.1.tgz";
+      path = fetchurl {
+        name = "unicode_astral_regex___unicode_astral_regex_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/unicode-astral-regex/-/unicode-astral-regex-1.0.1.tgz";
+        sha1 = "2cab8529480646f9614ddbc7b62158ad05123feb";
+      };
+    }
+
+    {
+      name = "unicode_canonical_property_names_ecmascript___unicode_canonical_property_names_ecmascript_1.0.4.tgz";
+      path = fetchurl {
+        name = "unicode_canonical_property_names_ecmascript___unicode_canonical_property_names_ecmascript_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
+        sha1 = "2619800c4c825800efdd8343af7dd9933cbe2818";
+      };
+    }
+
+    {
+      name = "unicode_match_property_ecmascript___unicode_match_property_ecmascript_1.0.4.tgz";
+      path = fetchurl {
+        name = "unicode_match_property_ecmascript___unicode_match_property_ecmascript_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
+        sha1 = "8ed2a32569961bce9227d09cd3ffbb8fed5f020c";
+      };
+    }
+
+    {
+      name = "unicode_match_property_value_ecmascript___unicode_match_property_value_ecmascript_1.0.2.tgz";
+      path = fetchurl {
+        name = "unicode_match_property_value_ecmascript___unicode_match_property_value_ecmascript_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz";
+        sha1 = "9f1dc76926d6ccf452310564fd834ace059663d4";
+      };
+    }
+
+    {
+      name = "unicode_property_aliases_ecmascript___unicode_property_aliases_ecmascript_1.0.4.tgz";
+      path = fetchurl {
+        name = "unicode_property_aliases_ecmascript___unicode_property_aliases_ecmascript_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz";
+        sha1 = "5a533f31b4317ea76f17d807fa0d116546111dd0";
+      };
+    }
+
+    {
+      name = "union_value___union_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "union_value___union_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
+        sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
+      };
+    }
+
+    {
+      name = "uniq___uniq_1.0.1.tgz";
+      path = fetchurl {
+        name = "uniq___uniq_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
+        sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
+      };
+    }
+
+    {
+      name = "uniqs___uniqs_2.0.0.tgz";
+      path = fetchurl {
+        name = "uniqs___uniqs_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
+        sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
+      };
+    }
+
+    {
+      name = "unique_filename___unique_filename_1.1.1.tgz";
+      path = fetchurl {
+        name = "unique_filename___unique_filename_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz";
+        sha1 = "1d69769369ada0583103a1e6ae87681b56573230";
+      };
+    }
+
+    {
+      name = "unique_slug___unique_slug_2.0.1.tgz";
+      path = fetchurl {
+        name = "unique_slug___unique_slug_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz";
+        sha1 = "5e9edc6d1ce8fb264db18a507ef9bd8544451ca6";
+      };
+    }
+
+    {
+      name = "unpipe___unpipe_1.0.0.tgz";
+      path = fetchurl {
+        name = "unpipe___unpipe_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    }
+
+    {
+      name = "unquote___unquote_1.1.1.tgz";
+      path = fetchurl {
+        name = "unquote___unquote_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz";
+        sha1 = "8fded7324ec6e88a0ff8b905e7c098cdc086d544";
+      };
+    }
+
+    {
+      name = "unset_value___unset_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "unset_value___unset_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
+        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
+      };
+    }
+
+    {
+      name = "upath___upath_1.1.0.tgz";
+      path = fetchurl {
+        name = "upath___upath_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz";
+        sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd";
+      };
+    }
+
+    {
+      name = "uri_js___uri_js_4.2.2.tgz";
+      path = fetchurl {
+        name = "uri_js___uri_js_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
+        sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
+      };
+    }
+
+    {
+      name = "urix___urix_0.1.0.tgz";
+      path = fetchurl {
+        name = "urix___urix_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
+        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
+      };
+    }
+
+    {
+      name = "url_parse___url_parse_1.4.4.tgz";
+      path = fetchurl {
+        name = "url_parse___url_parse_1.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz";
+        sha1 = "cac1556e95faa0303691fec5cf9d5a1bc34648f8";
+      };
+    }
+
+    {
+      name = "url___url_0.11.0.tgz";
+      path = fetchurl {
+        name = "url___url_0.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
+        sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
+      };
+    }
+
+    {
+      name = "use___use_3.1.1.tgz";
+      path = fetchurl {
+        name = "use___use_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
+        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
+      };
+    }
+
+    {
+      name = "util_deprecate___util_deprecate_1.0.2.tgz";
+      path = fetchurl {
+        name = "util_deprecate___util_deprecate_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    }
+
+    {
+      name = "util.promisify___util.promisify_1.0.0.tgz";
+      path = fetchurl {
+        name = "util.promisify___util.promisify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz";
+        sha1 = "440f7165a459c9a16dc145eb8e72f35687097030";
+      };
+    }
+
+    {
+      name = "util___util_0.10.3.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
+        sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
+      };
+    }
+
+    {
+      name = "util___util_0.10.4.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
+        sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
+      };
+    }
+
+    {
+      name = "utils_merge___utils_merge_1.0.1.tgz";
+      path = fetchurl {
+        name = "utils_merge___utils_merge_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    }
+
+    {
+      name = "uuid___uuid_3.3.2.tgz";
+      path = fetchurl {
+        name = "uuid___uuid_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
+        sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
+      };
+    }
+
+    {
+      name = "uws___uws_10.148.0.tgz";
+      path = fetchurl {
+        name = "uws___uws_10.148.0.tgz";
+        url  = "https://registry.yarnpkg.com/uws/-/uws-10.148.0.tgz";
+        sha1 = "3fcd35f083ca515e091cd33b2d78f0f51a666215";
+      };
+    }
+
+    {
+      name = "v8_compile_cache___v8_compile_cache_2.0.2.tgz";
+      path = fetchurl {
+        name = "v8_compile_cache___v8_compile_cache_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz";
+        sha1 = "a428b28bb26790734c4fc8bc9fa106fccebf6a6c";
+      };
+    }
+
+    {
+      name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
+        sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
+      };
+    }
+
+    {
+      name = "value_equal___value_equal_0.4.0.tgz";
+      path = fetchurl {
+        name = "value_equal___value_equal_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz";
+        sha1 = "c5bdd2f54ee093c04839d71ce2e4758a6890abc7";
+      };
+    }
+
+    {
+      name = "vary___vary_1.1.2.tgz";
+      path = fetchurl {
+        name = "vary___vary_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    }
+
+    {
+      name = "vendors___vendors_1.0.2.tgz";
+      path = fetchurl {
+        name = "vendors___vendors_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz";
+        sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801";
+      };
+    }
+
+    {
+      name = "verror___verror_1.10.0.tgz";
+      path = fetchurl {
+        name = "verror___verror_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    }
+
+    {
+      name = "vm_browserify___vm_browserify_0.0.4.tgz";
+      path = fetchurl {
+        name = "vm_browserify___vm_browserify_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz";
+        sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
+      };
+    }
+
+    {
+      name = "w3c_hr_time___w3c_hr_time_1.0.1.tgz";
+      path = fetchurl {
+        name = "w3c_hr_time___w3c_hr_time_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz";
+        sha1 = "82ac2bff63d950ea9e3189a58a65625fedf19045";
+      };
+    }
+
+    {
+      name = "walker___walker_1.0.7.tgz";
+      path = fetchurl {
+        name = "walker___walker_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz";
+        sha1 = "2f7f9b8fd10d677262b18a884e28d19618e028fb";
+      };
+    }
+
+    {
+      name = "warning___warning_3.0.0.tgz";
+      path = fetchurl {
+        name = "warning___warning_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz";
+        sha1 = "32e5377cb572de4ab04753bdf8821c01ed605b7c";
+      };
+    }
+
+    {
+      name = "warning___warning_4.0.2.tgz";
+      path = fetchurl {
+        name = "warning___warning_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz";
+        sha1 = "aa6876480872116fa3e11d434b0d0d8d91e44607";
+      };
+    }
+
+    {
+      name = "watch___watch_0.18.0.tgz";
+      path = fetchurl {
+        name = "watch___watch_0.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz";
+        sha1 = "28095476c6df7c90c963138990c0a5423eb4b986";
+      };
+    }
+
+    {
+      name = "watchpack___watchpack_1.6.0.tgz";
+      path = fetchurl {
+        name = "watchpack___watchpack_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz";
+        sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00";
+      };
+    }
+
+    {
+      name = "wbuf___wbuf_1.7.3.tgz";
+      path = fetchurl {
+        name = "wbuf___wbuf_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz";
+        sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df";
+      };
+    }
+
+    {
+      name = "webidl_conversions___webidl_conversions_4.0.2.tgz";
+      path = fetchurl {
+        name = "webidl_conversions___webidl_conversions_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz";
+        sha1 = "a855980b1f0b6b359ba1d5d9fb39ae941faa63ad";
+      };
+    }
+
+    {
+      name = "webpack_assets_manifest___webpack_assets_manifest_3.1.1.tgz";
+      path = fetchurl {
+        name = "webpack_assets_manifest___webpack_assets_manifest_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz";
+        sha1 = "39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de";
+      };
+    }
+
+    {
+      name = "webpack_bundle_analyzer___webpack_bundle_analyzer_3.0.3.tgz";
+      path = fetchurl {
+        name = "webpack_bundle_analyzer___webpack_bundle_analyzer_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz";
+        sha1 = "dbc7fff8f52058b6714a20fddf309d0790e3e0a0";
+      };
+    }
+
+    {
+      name = "webpack_cli___webpack_cli_3.1.2.tgz";
+      path = fetchurl {
+        name = "webpack_cli___webpack_cli_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz";
+        sha1 = "17d7e01b77f89f884a2bbf9db545f0f6a648e746";
+      };
+    }
+
+    {
+      name = "webpack_dev_middleware___webpack_dev_middleware_3.4.0.tgz";
+      path = fetchurl {
+        name = "webpack_dev_middleware___webpack_dev_middleware_3.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz";
+        sha1 = "1132fecc9026fd90f0ecedac5cbff75d1fb45890";
+      };
+    }
+
+    {
+      name = "webpack_dev_server___webpack_dev_server_3.1.14.tgz";
+      path = fetchurl {
+        name = "webpack_dev_server___webpack_dev_server_3.1.14.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz";
+        sha1 = "60fb229b997fc5a0a1fc6237421030180959d469";
+      };
+    }
+
+    {
+      name = "webpack_log___webpack_log_2.0.0.tgz";
+      path = fetchurl {
+        name = "webpack_log___webpack_log_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz";
+        sha1 = "5b7928e0637593f119d32f6227c1e0ac31e1b47f";
+      };
+    }
+
+    {
+      name = "webpack_merge___webpack_merge_4.1.5.tgz";
+      path = fetchurl {
+        name = "webpack_merge___webpack_merge_4.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.5.tgz";
+        sha1 = "2be31e846c20767d1bef56bdca64c328a681190a";
+      };
+    }
+
+    {
+      name = "webpack_sources___webpack_sources_1.3.0.tgz";
+      path = fetchurl {
+        name = "webpack_sources___webpack_sources_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz";
+        sha1 = "2a28dcb9f1f45fe960d8f1493252b5ee6530fa85";
+      };
+    }
+
+    {
+      name = "webpack___webpack_4.28.3.tgz";
+      path = fetchurl {
+        name = "webpack___webpack_4.28.3.tgz";
+        url  = "https://registry.yarnpkg.com/webpack/-/webpack-4.28.3.tgz";
+        sha1 = "8acef6e77fad8a01bfd0c2b25aa3636d46511874";
+      };
+    }
+
+    {
+      name = "websocket_driver___websocket_driver_0.7.0.tgz";
+      path = fetchurl {
+        name = "websocket_driver___websocket_driver_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz";
+        sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb";
+      };
+    }
+
+    {
+      name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+      path = fetchurl {
+        name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
+        sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
+      };
+    }
+
+    {
+      name = "websocket.js___websocket.js_0.1.12.tgz";
+      path = fetchurl {
+        name = "websocket.js___websocket.js_0.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/websocket.js/-/websocket.js-0.1.12.tgz";
+        sha1 = "46c980787c57ebc8edcf44a0263e5d639367b85b";
+      };
+    }
+
+    {
+      name = "whatwg_encoding___whatwg_encoding_1.0.5.tgz";
+      path = fetchurl {
+        name = "whatwg_encoding___whatwg_encoding_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz";
+        sha1 = "5abacf777c32166a51d085d6b4f3e7d27113ddb0";
+      };
+    }
+
+    {
+      name = "whatwg_fetch___whatwg_fetch_3.0.0.tgz";
+      path = fetchurl {
+        name = "whatwg_fetch___whatwg_fetch_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz";
+        sha1 = "fc804e458cc460009b1a2b966bc8817d2578aefb";
+      };
+    }
+
+    {
+      name = "whatwg_mimetype___whatwg_mimetype_2.3.0.tgz";
+      path = fetchurl {
+        name = "whatwg_mimetype___whatwg_mimetype_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz";
+        sha1 = "3d4b1e0312d2079879f826aff18dbeeca5960fbf";
+      };
+    }
+
+    {
+      name = "whatwg_url___whatwg_url_6.5.0.tgz";
+      path = fetchurl {
+        name = "whatwg_url___whatwg_url_6.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz";
+        sha1 = "f2df02bff176fd65070df74ad5ccbb5a199965a8";
+      };
+    }
+
+    {
+      name = "whatwg_url___whatwg_url_7.0.0.tgz";
+      path = fetchurl {
+        name = "whatwg_url___whatwg_url_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz";
+        sha1 = "fde926fa54a599f3adf82dff25a9f7be02dc6edd";
+      };
+    }
+
+    {
+      name = "which_module___which_module_2.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
+        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
+      };
+    }
+
+    {
+      name = "which___which_1.3.1.tgz";
+      path = fetchurl {
+        name = "which___which_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
+        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
+      };
+    }
+
+    {
+      name = "wide_align___wide_align_1.1.3.tgz";
+      path = fetchurl {
+        name = "wide_align___wide_align_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
+        sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_0.0.3.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz";
+        sha1 = "a3d5da6cd5c0bc0008d37234bbaf1bed63059107";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_1.0.0.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz";
+        sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
+      };
+    }
+
+    {
+      name = "worker_farm___worker_farm_1.6.0.tgz";
+      path = fetchurl {
+        name = "worker_farm___worker_farm_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz";
+        sha1 = "aecc405976fab5a95526180846f0dba288f3a4a0";
+      };
+    }
+
+    {
+      name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
+        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
+      };
+    }
+
+    {
+      name = "wrappy___wrappy_1.0.2.tgz";
+      path = fetchurl {
+        name = "wrappy___wrappy_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    }
+
+    {
+      name = "write_file_atomic___write_file_atomic_2.3.0.tgz";
+      path = fetchurl {
+        name = "write_file_atomic___write_file_atomic_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz";
+        sha1 = "1ff61575c2e2a4e8e510d6fa4e243cce183999ab";
+      };
+    }
+
+    {
+      name = "write___write_0.2.1.tgz";
+      path = fetchurl {
+        name = "write___write_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz";
+        sha1 = "5fc03828e264cea3fe91455476f7a3c566cb0757";
+      };
+    }
+
+    {
+      name = "ws___ws_5.2.2.tgz";
+      path = fetchurl {
+        name = "ws___ws_5.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz";
+        sha1 = "dffef14866b8e8dc9133582514d1befaf96e980f";
+      };
+    }
+
+    {
+      name = "ws___ws_6.1.2.tgz";
+      path = fetchurl {
+        name = "ws___ws_6.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz";
+        sha1 = "3cc7462e98792f0ac679424148903ded3b9c3ad8";
+      };
+    }
+
+    {
+      name = "xml_name_validator___xml_name_validator_3.0.0.tgz";
+      path = fetchurl {
+        name = "xml_name_validator___xml_name_validator_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz";
+        sha1 = "6ae73e06de4d8c6e47f9fb181f78d648ad457c6a";
+      };
+    }
+
+    {
+      name = "xregexp___xregexp_4.0.0.tgz";
+      path = fetchurl {
+        name = "xregexp___xregexp_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz";
+        sha1 = "e698189de49dd2a18cc5687b05e17c8e43943020";
+      };
+    }
+
+    {
+      name = "xtend___xtend_4.0.1.tgz";
+      path = fetchurl {
+        name = "xtend___xtend_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    }
+
+    {
+      name = "y18n___y18n_3.2.1.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
+        sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
+      };
+    }
+
+    {
+      name = "y18n___y18n_4.0.0.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz";
+        sha1 = "95ef94f85ecc81d007c264e190a120f0a3c8566b";
+      };
+    }
+
+    {
+      name = "yallist___yallist_2.1.2.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
+        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
+      };
+    }
+
+    {
+      name = "yallist___yallist_3.0.3.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz";
+        sha1 = "b4b049e314be545e3ce802236d6cd22cd91c3de9";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_10.1.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_10.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz";
+        sha1 = "7202265b89f7e9e9f2e5765e0fe735a905edbaa8";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_11.1.1.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_11.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz";
+        sha1 = "879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_7.0.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz";
+        sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_9.0.2.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_9.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz";
+        sha1 = "9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077";
+      };
+    }
+
+    {
+      name = "yargs___yargs_12.0.2.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_12.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz";
+        sha1 = "fe58234369392af33ecbef53819171eff0f5aadc";
+      };
+    }
+
+    {
+      name = "yargs___yargs_11.1.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_11.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz";
+        sha1 = "90b869934ed6e871115ea2ff58b03f4724ed2d77";
+      };
+    }
+
+    {
+      name = "yargs___yargs_12.0.5.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_12.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz";
+        sha1 = "05f5997b609647b64f66b81e3b4b10a368e7ad13";
+      };
+    }
+
+    {
+      name = "yargs___yargs_8.0.2.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_8.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz";
+        sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360";
+      };
+    }
+  ];
+}
diff --git a/pkgs/webapps/mediagoblin/bower-packages.nix b/pkgs/webapps/mediagoblin/bower-packages.nix
new file mode 100644 (file)
index 0000000..03af849
--- /dev/null
@@ -0,0 +1,8 @@
+# Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
+{ fetchbower, buildEnv }:
+buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
+  (fetchbower "jquery" "2.1.4" "~2.1.3" "1ywrpk2xsr6ghkm3j9gfnl9r3jn6xarfamp99b0bcm57kq9fm2k0")
+  (fetchbower "video.js" "4.11.4" "~4.11.4" "05prdvyk0rxbkh7sdd0d9ns5l5crwvc68wzkyqmrdjw367pcv8sn")
+  (fetchbower "leaflet" "0.7.7" "~0.7.3" "0jim285bljmxxngpm3yx6bnnd10n2whwkgmmhzpcd1rdksnr5nca")
+  (fetchbower "tinymce" "4.1.10" "~4.1.7" "16jyvdb9bq8gjwhs69q8p88vdixalajrz81nsmbrzzxhkih57dyx")
+]; }
diff --git a/pkgs/webapps/mediagoblin/default.nix b/pkgs/webapps/mediagoblin/default.nix
new file mode 100644 (file)
index 0000000..643daed
--- /dev/null
@@ -0,0 +1,169 @@
+{ makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, mylibs, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages }:
+let
+  overridePython = let
+    packageOverrides = self: super: {
+      celery = super.celery.overridePythonAttrs(old: rec {
+        version = "3.1.26.post2";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "5493e172ae817b81ba7d09443ada114886765a8ce02f16a56e6fac68d953a9b2";
+        };
+        patches = [];
+        doCheck = false;
+      });
+      billiard = super.billiard.overridePythonAttrs(old: rec {
+        version = "3.3.0.23";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9";
+        };
+      });
+      amqp = super.amqp.overridePythonAttrs(old: rec {
+        version = "1.4.9";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "2dea4d16d073c902c3b89d9b96620fb6729ac0f7a923bbc777cb4ad827c0c61a";
+        };
+      });
+      kombu = super.kombu.overridePythonAttrs(old: rec {
+        version = "3.0.37";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "e064a00c66b4d1058cd2b0523fb8d98c82c18450244177b6c0f7913016642650";
+        };
+        propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.anyjson ];
+        doCheck = false;
+      });
+      sqlalchemy = super.sqlalchemy.overridePythonAttrs(old: rec {
+        version = "1.1.18";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "8b0ec71af9291191ba83a91c03d157b19ab3e7119e27da97932a4773a3f664a9";
+        };
+      });
+      tempita_5_3_dev = super.buildPythonPackage (mylibs.fetchedGithub ./tempita.json // rec {
+        buildInputs = with self; [ nose ];
+        disabled = false;
+      });
+      sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
+        propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
+      });
+      pasteScript = super.pasteScript.overridePythonAttrs(old: rec {
+        version = "2.0.2";
+        name = "PasteScript-${version}";
+        src = fetchurl {
+          url = "mirror://pypi/P/PasteScript/${name}.tar.gz";
+          sha256 = "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0";
+        };
+        propagatedBuildInputs = with self; [ six paste PasteDeploy ];
+      });
+    };
+    in
+      python36.override { inherit packageOverrides; };
+  pythonEnv = python-pkgs: with python-pkgs; [
+    waitress alembic dateutil wtforms pybcrypt
+    pytest pytest_xdist werkzeug celery
+    kombu jinja2 Babel webtest configobj markdown
+    sqlalchemy itsdangerous pytz sphinx six
+    oauthlib unidecode jsonschema PasteDeploy
+    requests PyLD exifread
+    typing pasteScript lxml
+    # For images plugin
+    pillow
+    # For video plugin
+    gst-python
+    # migrations
+    sqlalchemy_migrate
+    # authentication
+    ldap3
+    redis
+    psycopg2
+  ];
+  python = overridePython.withPackages pythonEnv;
+  gmg = writeScript "gmg" ''
+    #!${python}/bin/python
+    __requires__ = 'mediagoblin'
+    import sys
+    from pkg_resources import load_entry_point
+
+    if __name__ == '__main__':
+        sys.exit(
+            load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
+        )
+    '';
+  bowerComponents = buildBowerComponents {
+    name = "mediagoblin-bower-components";
+    generated = ./bower-packages.nix;
+    src = (mylibs.fetchedGit ./mediagoblin.json).src;
+  };
+  withPlugins = plugins: package.overrideAttrs(old: {
+    name = "${old.name}-with-plugins";
+    postBuild = old.postBuild + (
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -s ${value} mediagoblin/plugins/${value.pluginName}") plugins
+        )
+      );
+    passthru = old.passthru // {
+      inherit plugins;
+      withPlugins = morePlugins: old.withPlugins (morePlugins ++ plugins);
+    };
+  });
+  package = stdenv.mkDerivation (mylibs.fetchedGit ./mediagoblin.json // rec {
+    preConfigure = ''
+      # ./bootstrap.sh
+      aclocal -I m4 --install
+      autoreconf -fvi
+      # end
+      export HOME=$PWD
+      '';
+    configureFlags = [ "--with-python3" "--without-virtualenv" ];
+    postBuild = ''
+      cp -a ${bowerComponents}/bower_components/* extlib
+      chmod -R u+w extlib
+      make extlib
+      '';
+    installPhase = let
+      libpaths = with gst_all_1; [
+        python
+        gstreamer
+        gst-plugins-base
+        gst-libav
+        gst-plugins-good
+        gst-plugins-bad
+        gst-plugins-ugly
+      ];
+      plugin_paths = builtins.concatStringsSep ":" (map (x: "${x}/lib") libpaths);
+      typelib_paths = with gst_all_1; "${gstreamer}/lib/girepository-1.0:${gst-plugins-base}/lib/girepository-1.0";
+    in ''
+      sed -i "s/registry.has_key(current_theme_name)/current_theme_name in registry/" mediagoblin/tools/theme.py
+      sed -i -e "s@\[DEFAULT\]@[DEFAULT]\nhere = $out@" mediagoblin/config_spec.ini
+      sed -i -e "/from gi.repository import GstPbutils/s/^/gi.require_version('GstPbutils', '1.0')\n/" mediagoblin/media_types/video/transcoders.py
+      cp ${./ldap_fix.py} mediagoblin/plugins/ldap/tools.py
+      find . -name '*.pyc' -delete
+      find . -type f -exec sed -i "s|$PWD|$out|g" {} \;
+      python setup.py build
+      cp -a . $out
+      mkdir $out/bin
+      makeWrapper ${gmg} $out/bin/gmg --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      makeWrapper ${python}/bin/paster $out/bin/paster --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      makeWrapper ${python}/bin/celery $out/bin/celery --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      '';
+    buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ];
+    propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
+    passthru = {
+      plugins = [];
+      inherit withPlugins;
+    };
+  });
+in package
diff --git a/pkgs/webapps/mediagoblin/ldap_fix.py b/pkgs/webapps/mediagoblin/ldap_fix.py
new file mode 100644 (file)
index 0000000..10cc375
--- /dev/null
@@ -0,0 +1,93 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors.  See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from ldap3 import Server, Connection, SUBTREE
+from ldap3.core.exceptions import LDAPException
+import logging
+
+import six
+
+from mediagoblin.tools import pluginapi
+
+_log = logging.getLogger(__name__)
+
+
+class LDAP(object):
+    def __init__(self):
+        self.ldap_settings = pluginapi.get_config('mediagoblin.plugins.ldap')
+
+    def _connect(self, server):
+        _log.info('Connecting to {0}.'.format(server['LDAP_SERVER_URI']))
+        self.server = Server(server['LDAP_SERVER_URI'])
+
+        if 'LDAP_START_TLS' in server and server['LDAP_START_TLS'] == 'true':
+            _log.info('Initiating TLS')
+            self.server.start_tls()
+
+    def _manager_auth(self, settings, username, password):
+        conn = Connection(self.server,
+                settings['LDAP_BIND_DN'],
+                settings['LDAP_BIND_PW'],
+                auto_bind=True)
+        found = conn.search(
+                search_base=settings['LDAP_SEARCH_BASE'],
+                search_filter=settings['LDAP_SEARCH_FILTER'].format(username=username),
+                search_scope=SUBTREE,
+                attributes=[settings['EMAIL_SEARCH_FIELD']])
+        if (not found) or len(conn.entries) > 1:
+            return False, None
+
+        user = conn.entries[0]
+        user_dn = user.entry_dn
+        try:
+            email = user.entry_attributes_as_dict[settings['EMAIL_SEARCH_FIELD']][0]
+        except KeyError:
+            email = None
+
+        Connection(self.server, user_dn, password, auto_bind=True)
+
+        return username, email
+
+    def _direct_auth(self, settings, username, password):
+        user_dn = settings['LDAP_USER_DN_TEMPLATE'].format(username=username)
+        conn = Connection(self.server, user_dn, password, auto_bind=True)
+        email_found = conn.search(
+                search_base=settings['LDAP_SEARCH_BASE'],
+                search_filter='uid={0}'.format(username),
+                search_scope=SUBTREE,
+                attributes=[settings['EMAIL_SEARCH_FIELD']])
+
+        if email_found:
+            try:
+                email = conn.entries[0].entry_attributes_as_dict[settings['EMAIL_SEARCH_FIELD']][0]
+            except KeyError:
+                email = None
+
+        return username, email
+
+    def login(self, username, password):
+        for k, v in six.iteritems(self.ldap_settings):
+            try:
+                self._connect(v)
+
+                if 'LDAP_BIND_DN' in v:
+                    return self._manager_auth(v, username, password)
+                else:
+                    return self._direct_auth(v, username, password)
+
+            except LDAPException as e:
+                _log.info(e)
+
+        return False, None
diff --git a/pkgs/webapps/mediagoblin/mediagoblin.json b/pkgs/webapps/mediagoblin/mediagoblin.json
new file mode 100644 (file)
index 0000000..7ea72d1
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "cd465eb-stable",
+  "meta": {
+    "name": "mediagoblin",
+    "url": "git://git.savannah.gnu.org/mediagoblin.git",
+    "branch": "stable"
+  },
+  "git": {
+    "url": "git://git.savannah.gnu.org/mediagoblin.git",
+    "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+    "sha256": "1yz4i4i97z3rxl534a6psaybyjbyp5nnc52v3nvbpzc4pd2s69mx",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix b/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix
new file mode 100644 (file)
index 0000000..16be613
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  name = "mediagoblin-plugin-basicsearch-${version}";
+  version = "ba0a154-master";
+  src = fetchFromGitHub {
+    owner = "ayleph";
+    repo = "mediagoblin-basicsearch";
+    rev = "ba0a1547bd24ebaf363227fe17644d38c6ce8a6b";
+    sha256 = "0d4r7xkf4gxmgaxlb264l44xbanis77g49frwfhfzsflxmdwgncy";
+  };
+  phases = "unpackPhase installPhase";
+  installPhase = ''
+    cp -R ./basicsearch $out
+    '';
+  passthru = {
+    pluginName = "basicsearch";
+  };
+}
diff --git a/pkgs/webapps/mediagoblin/tempita.json b/pkgs/webapps/mediagoblin/tempita.json
new file mode 100644 (file)
index 0000000..5371e17
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "47414a7-master",
+  "meta": {
+    "name": "tempita",
+    "url": "https://github.com/gjhiggins/tempita",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "gjhiggins",
+    "repo": "tempita",
+    "rev": "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d",
+    "sha256": "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/nextcloud/apps/audioplayer.nix b/pkgs/webapps/nextcloud/apps/audioplayer.nix
new file mode 100644 (file)
index 0000000..e321002
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "audioplayer";
+  version = "2.7.0";
+  url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+  sha256 = "05dylw45hs32agy6wqjy4r2x3h1dxzyzn0378ig6h5a22xd52mik";
+}
diff --git a/pkgs/webapps/nextcloud/apps/bookmarks.nix b/pkgs/webapps/nextcloud/apps/bookmarks.nix
new file mode 100644 (file)
index 0000000..4632c92
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "bookmarks";
+  version = "1.0.2";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+  sha256 = "1ph123d0pram9a0vq73rn0zw0pyg4l0xqg162b59ds68179m2jfp";
+}
diff --git a/pkgs/webapps/nextcloud/apps/calendar.nix b/pkgs/webapps/nextcloud/apps/calendar.nix
new file mode 100644 (file)
index 0000000..0812810
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "calendar";
+  version = "1.7.0";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "0cgvvgzc2kgs2ng36hzff8rrpw9n58f0hyrr41n3wjkf0iynm56r";
+}
diff --git a/pkgs/webapps/nextcloud/apps/carnet.nix b/pkgs/webapps/nextcloud/apps/carnet.nix
new file mode 100644 (file)
index 0000000..61431e5
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "carnet";
+  version = "0.15.2";
+  url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
+  sha256 = "1npjb2bgwcfxlf22ygl2hfhfgaigk1kpdk795yc79mx2l1iicmg0";
+}
diff --git a/pkgs/webapps/nextcloud/apps/contacts.nix b/pkgs/webapps/nextcloud/apps/contacts.nix
new file mode 100644 (file)
index 0000000..34329ab
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "contacts";
+  version = "3.1.1";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "1qfn532p1pb4m6q2jzyzlyw4c5qccmq6vj0h2zv9xfkajfvz7i7v";
+}
diff --git a/pkgs/webapps/nextcloud/apps/deck.nix b/pkgs/webapps/nextcloud/apps/deck.nix
new file mode 100644 (file)
index 0000000..c5737af
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "deck";
+  version = "0.6.1";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "1hafgj67zbhs4higf7nyr61p4s31axzxrsq09c4wmcwviz7p7zvs";
+}
diff --git a/pkgs/webapps/nextcloud/apps/files_markdown.nix b/pkgs/webapps/nextcloud/apps/files_markdown.nix
new file mode 100644 (file)
index 0000000..9ed5007
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "files_markdown";
+  version = "2.0.6";
+  url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "1ng8gpjl3g1141k1nii59cg005viidlcbsg4x9brzcj25c5qhjjp";
+}
diff --git a/pkgs/webapps/nextcloud/apps/flowupload.nix b/pkgs/webapps/nextcloud/apps/flowupload.nix
new file mode 100644 (file)
index 0000000..cbadbda
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "flowupload";
+  version = "0.1.0";
+  url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}.tar.gz";
+  sha256 = "0cai76hcjrwvq32yav0nd9kkhslandp1sj5czz119gsfjlkpalw9";
+}
diff --git a/pkgs/webapps/nextcloud/apps/gpxedit.nix b/pkgs/webapps/nextcloud/apps/gpxedit.nix
new file mode 100644 (file)
index 0000000..b9c267b
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp }:
+buildApp rec {
+  appName = "gpxedit";
+  version = "0.0.11";
+  url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/18058077d0170256c3f4c9201443d09d/${appName}-${version}.tar.gz";
+  sha256 = "1ww32jysjnwxrn8r9fjdfhbfqnzgaakn08m64wcmavx29dd42y6m";
+  otherConfig = {
+    mimetypealiases = {
+      "application/gpx+xml" = "gpx";
+    };
+    mimetypemapping = {
+      "gpx" = ["application/gpx+xml"];
+    };
+  };
+}
diff --git a/pkgs/webapps/nextcloud/apps/gpxpod.nix b/pkgs/webapps/nextcloud/apps/gpxpod.nix
new file mode 100644 (file)
index 0000000..6544ac2
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp }:
+buildApp rec {
+  appName = "gpxpod";
+  version = "3.0.3";
+  url = "https://gitlab.com/eneiluj/gpxpod-oc/wikis/uploads/34af9435d7a2cd8fa915b84f0dda0724/${appName}-${version}.tar.gz";
+  sha256 = "0v30j5b4ki6nbxqdmnlkrgl1lpg2x2nir9gik6rfj0c3jhmb5mch";
+  otherConfig = {
+    mimetypealiases = {
+      "application/gpx+xml" = "gpx";
+    };
+    mimetypemapping = {
+      "gpx" = ["application/gpx+xml"];
+    };
+  };
+}
diff --git a/pkgs/webapps/nextcloud/apps/keeweb.nix b/pkgs/webapps/nextcloud/apps/keeweb.nix
new file mode 100644 (file)
index 0000000..99713ee
--- /dev/null
@@ -0,0 +1,20 @@
+{ buildApp }:
+buildApp rec {
+  appName = "keeweb";
+  version = "0.5.0";
+  url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
+  sha256 = "0wdr6ywlirmac7w1ld5ma7fwb4bykclbxfq2sxwg6pvzfid5vc8x";
+  installPhase = ''
+    mkdir -p $out
+    cp -R . $out/
+    sed -i -e 's/max-version="15"/max-version="16"/' $out/appinfo/info.xml
+    '';
+  otherConfig = {
+    mimetypealiases = {
+      "x-application/kdbx" = "kdbx";
+    };
+    mimetypemapping = {
+      "kdbx" = ["x-application/kdbx"];
+    };
+  };
+}
diff --git a/pkgs/webapps/nextcloud/apps/music.nix b/pkgs/webapps/nextcloud/apps/music.nix
new file mode 100644 (file)
index 0000000..1c7181a
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "music";
+  version = "0.9.5";
+  url = "https://github.com/owncloud/${appName}/archive/v${version}.tar.gz";
+  sha256 = "0dx136z7anmi18harc1v2hyfdaq568lqf3wpy9hgx309ggb4wwzx";
+}
diff --git a/pkgs/webapps/nextcloud/apps/notes.nix b/pkgs/webapps/nextcloud/apps/notes.nix
new file mode 100644 (file)
index 0000000..23d6a06
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "notes";
+  version = "2.6.0";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "1b1vc8plv4mpsxl7mgwgrcrswphclsm9xa89vxf3s4xzlwwq11c4";
+}
diff --git a/pkgs/webapps/nextcloud/apps/ocsms.nix b/pkgs/webapps/nextcloud/apps/ocsms.nix
new file mode 100644 (file)
index 0000000..bd77295
--- /dev/null
@@ -0,0 +1,13 @@
+{ buildApp }:
+buildApp rec {
+  appName = "ocsms";
+  version = "2.1.1";
+  url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+  sha256 = "0sgfbmy1c8rgzjvf9snc7rzgp8aqsc65zfwgi6qcsf2g6gam5n7a";
+  installPhase = ''
+    sed -i -e "/addScript.*devel/d" -e "s@//\(.*addScript.*app.min\)@\1@" templates/main.php
+    sed -i -e 's/max-version="15.0"/max-version="16.0"/' appinfo/info.xml
+    mkdir -p $out
+    cp -R . $out/
+    '';
+}
diff --git a/pkgs/webapps/nextcloud/apps/passman.nix b/pkgs/webapps/nextcloud/apps/passman.nix
new file mode 100644 (file)
index 0000000..869acb3
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "passman";
+  version = "2.2.1";
+  url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
+  sha256 = "064pq9d0pl3y1vcywpi19fg47zy7j4h0jaxy6jklwzwcrmzagbka";
+}
diff --git a/pkgs/webapps/nextcloud/apps/spreed.nix b/pkgs/webapps/nextcloud/apps/spreed.nix
new file mode 100644 (file)
index 0000000..a958470
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "spreed";
+  version = "6.0.0";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+  sha256 = "14rcskp4pdcf0g816cdp070c8pzrj33fg2w7jb3af8maf1d77306";
+}
diff --git a/pkgs/webapps/nextcloud/apps/tasks.nix b/pkgs/webapps/nextcloud/apps/tasks.nix
new file mode 100644 (file)
index 0000000..1e5f8f2
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildApp }:
+buildApp rec {
+  appName = "tasks";
+  version = "0.10.1";
+  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+  sha256 = "0r888yr6bl2y5mp65q8md5k139as1a0xw4yfzvkv7y77wmqn9wsm";
+}
diff --git a/pkgs/webapps/nextcloud/default.nix b/pkgs/webapps/nextcloud/default.nix
new file mode 100644 (file)
index 0000000..2d4eb39
--- /dev/null
@@ -0,0 +1,63 @@
+{ varDir ? "/var/lib/nextcloud", otherConfig ? {}, lib, stdenv, fetchurl }:
+let
+  buildApp = { appName, version, url, sha256, otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }:
+    stdenv.mkDerivation rec {
+      name = "nextcloud-app-${appName}-${version}";
+      inherit version;
+      phases = "unpackPhase installPhase";
+      inherit installPhase;
+      src = fetchurl { inherit url sha256; };
+      passthru = {
+        inherit appName otherConfig;
+      };
+    };
+  withApps = apps: package.overrideAttrs(old: {
+    name = "${old.name}-with-apps";
+
+    installPhase = old.installPhase + (
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -sf ${value} $out/apps/${value.appName}") apps
+      ));
+
+    passthru = old.passthru // {
+      otherConfig = with lib.attrsets; with lib.lists; let
+        zipped = zipAttrs ([old.otherConfig or {}] ++ map (v: v.otherConfig) apps);
+      in
+        {
+          mimetypealiases = foldr (h: prev: prev // h) {} zipped.mimetypealiases;
+          mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs zipped.mimetypemapping);
+        };
+      inherit apps;
+      withApps = moreApps: old.withApps (moreApps ++ apps);
+    };
+  });
+
+  package = stdenv.mkDerivation rec {
+    name = "nextcloud-${version}";
+    version = "16.0.0";
+
+    src = fetchurl {
+      url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2";
+      sha256 = "0bj014vczlrql1w32pqmr7cyqn9awnyzpi2syxhg16qxic1gfcj5";
+    };
+
+    installPhase = ''
+      mkdir -p $out/
+      cp -R . $out/
+      rm -r $out/config
+      ln -sf ${varDir}/config $out/config
+      '';
+
+    passthru = {
+      apps = [];
+      inherit otherConfig buildApp withApps varDir;
+    };
+    meta = {
+      description = "Sharing solution for files, calendars, contacts and more";
+      homepage = https://nextcloud.com;
+      maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ];
+      license = lib.licenses.agpl3Plus;
+      platforms = with lib.platforms; unix;
+    };
+  };
+in package
diff --git a/pkgs/webapps/peertube/default.nix b/pkgs/webapps/peertube/default.nix
new file mode 100644 (file)
index 0000000..a04d490
--- /dev/null
@@ -0,0 +1,123 @@
+{ ldap ? false
+, lib, stdenv, fetchzip, youtube-dl, fetchurl, mylibs, python, nodejs, nodePackages }:
+let
+  nodeHeaders = fetchurl {
+    url = "https://nodejs.org/download/release/v${nodejs.version}/node-v${nodejs.version}-headers.tar.gz";
+    sha256 = "16f20ya3ys6w5w6y6l4536f7jrgk4gz46bf71w1r1xxb26a54m32";
+  };
+  patchedPackages = stdenv.mkDerivation (mylibs.fetchedGithub ./peertube.json // rec {
+    patches = if ldap then [ ./ldap.patch ././yarn_fix_bluebird_ldap.patch ] else [ ./yarn_fix_bluebird.patch ];
+    installPhase = ''
+      mkdir $out
+      cp package.json yarn.lock $out/
+      '';
+  });
+  # if yarn complains about
+  #   TypeError: Cannot read property 'lang' of undefined yarn
+  #   make sure that all package names in yarn-packages.nix finish in
+  #   .tar.gz where due (especially jsonld-signatures)
+  # Most errors where due to jsonld-signature (name, git version, etc.)
+  #   or bluebird (3.5.18 instead vs 3.5.21)
+  yarnModulesArg = rec {
+    pname = "peertube-yarn-modules";
+    version = "1.2.0";
+    name = "peertube-yarn-modules-${version}";
+    packageJSON = "${patchedPackages}/package.json";
+    yarnLock = "${patchedPackages}/yarn.lock";
+    yarnNix = ./yarn-packages.nix;
+    pkgConfig = {
+      all = {
+        buildInputs = [ mylibs.yarn2nixPackage.src ];
+      };
+      bcrypt = {
+        buildInputs = [ nodePackages.node-pre-gyp ];
+        postInstall = let
+          bcrypt_lib = fetchurl {
+            url = "https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.2/bcrypt_lib-v3.0.2-node-v57-linux-x64-glibc.tar.gz";
+            sha256 = "04bj3yn1wi8a6izihskyks0bb4nls3mndgb2yj12iraiv5dmg097";
+          };
+        in
+          ''
+            mkdir lib && tar -C lib -xf ${bcrypt_lib}
+            patchShebangs ../node-pre-gyp
+            npm run install
+          '';
+      };
+      dtrace-provider = {
+        buildInputs = [ python nodePackages.node-gyp ];
+        postInstall = ''
+          npx node-gyp rebuild --tarball=${nodeHeaders}
+          '';
+      };
+      rdf-canonize = {
+        buildInputs = [ python nodePackages.node-gyp ];
+        postInstall = ''
+          npx node-gyp rebuild --tarball=${nodeHeaders}
+          '';
+      };
+      sharp = {
+        buildInputs = [ python nodePackages.node-gyp ];
+        postInstall =
+          let
+            tarball = fetchurl {
+              url = "https://github.com/lovell/sharp-libvips/releases/download/v8.7.0/libvips-8.7.0-linux-x64.tar.gz";
+              sha256 = "1sq7qrp1q1pcrd165c3sky7qjx1kqihfpr4ailb5k73rwyh8lxg4";
+            };
+          in
+          ''
+            mkdir vendor
+            tar -C vendor -xf ${tarball}
+            patchShebangs ../prebuild-install
+            npx node install/libvips
+            npx node install/dll-copy
+            npx prebuild-install || npx node-gyp rebuild --tarball=${nodeHeaders}
+          '';
+      };
+      utf-8-validate = {
+        buildInputs = [ nodePackages.node-gyp-build ];
+      };
+      youtube-dl = {
+        postInstall = ''
+          mkdir bin
+          ln -s ${youtube-dl}/bin/youtube-dl bin/youtube-dl
+          cat > bin/details <<EOF
+          {"version":"${youtube-dl.version}","path":null,"exec":"youtube-dl"}
+          EOF
+          '';
+      };
+    };
+  };
+  yarnModules = mylibs.yarn2nixPackage.mkYarnModules yarnModulesArg;
+  yarnModulesProd = mylibs.yarn2nixPackage.mkYarnModules (yarnModulesArg // { yarnFlags = mylibs.yarn2nixPackage.defaultYarnFlags ++ [ "--production" ]; });
+  patchedServer = stdenv.mkDerivation (mylibs.fetchedGithub ./peertube.json // rec {
+    patches = lib.optionals ldap [ ./ldap.patch ] ++ [ ./sendmail.patch ];
+    buildPhase = ''
+      ln -s ${yarnModules}/node_modules .
+      npm run build:server
+      '';
+    installPhase = ''
+      mkdir $out
+      cp -a dist/server $out
+      '';
+    buildInputs = [ nodejs yarnModules ];
+  });
+in
+  stdenv.mkDerivation rec {
+    version = "v1.2.0";
+    name = "peertube-${version}";
+    src = fetchzip {
+      url = "https://github.com/Chocobozzz/PeerTube/releases/download/${version}/${name}.zip";
+      sha256 = "18fp3fy1crw67gdpc29nr38b5zy2f68l70w47zwp7dzhd8bbbipp";
+    };
+    patches = lib.optionals ldap [ ./ldap_yarn.patch ];
+    buildPhase = ''
+      ln -s ${yarnModulesProd}/node_modules .
+      rm -rf dist/server && cp -a ${patchedServer}/server dist
+      '';
+    installPhase = ''
+      mkdir $out
+      cp -a * $out
+      ln -s /tmp $out/.cache
+      '';
+    buildInputs = [ yarnModulesProd ];
+  }
diff --git a/pkgs/webapps/peertube/ldap.patch b/pkgs/webapps/peertube/ldap.patch
new file mode 100644 (file)
index 0000000..7ad5cc5
--- /dev/null
@@ -0,0 +1,542 @@
+commit 45a9e4a7b1badbea15d74bd8b3990303a424dfa6
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Tue Feb 12 18:47:53 2019 +0100
+
+    Add LDAP authentication
+
+diff --git a/config/default.yaml b/config/default.yaml
+index e16b8c35..eac0dd3f 100644
+--- a/config/default.yaml
++++ b/config/default.yaml
+@@ -33,6 +33,9 @@ redis:
+   auth: null
+   db: 0
++ldap:
++  enable: false
++
+ smtp:
+   hostname: null
+   port: 465
+diff --git a/config/production.yaml.example b/config/production.yaml.example
+index 661eac0d..bb5ac251 100644
+--- a/config/production.yaml.example
++++ b/config/production.yaml.example
+@@ -33,6 +33,17 @@ redis:
+   auth: null
+   db: 0
++ldap:
++  enable: true
++  # Disallow non-ldap users (it also disables root!)
++  ldap_only: true
++  url: ldap://localhost:389/dc=example,dc=com
++  bind_dn: cn=admin,dc=example,dc=com
++  bind_password: adminPass
++  base: dc=example,dc=com
++  mail_entry: "mail"
++  user_filter: "(|(email=%username%)(uid=%username%))"
++
+ # SMTP server to send emails
+ smtp:
+   hostname: null
+diff --git a/package.json b/package.json
+index 0cf39c7e..fd1ce3ea 100644
+--- a/package.json
++++ b/package.json
+@@ -125,6 +125,7 @@
+     "js-yaml": "^3.5.4",
+     "jsonld": "^1.0.1",
+     "jsonld-signatures": "https://github.com/Chocobozzz/jsonld-signatures#rsa2017",
++    "ldapjs": "^1.0.2",
+     "lodash": "^4.17.10",
+     "magnet-uri": "^5.1.4",
+     "memoizee": "^0.4.14",
+diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
+index 6f3ebb9a..fb21df37 100644
+--- a/server/initializers/constants.ts
++++ b/server/initializers/constants.ts
+@@ -16,7 +16,7 @@ let config: IConfig = require('config')
+ // ---------------------------------------------------------------------------
+-const LAST_MIGRATION_VERSION = 325
++const LAST_MIGRATION_VERSION = 326
+ // ---------------------------------------------------------------------------
+@@ -177,6 +177,16 @@ const CONFIG = {
+     AUTH: config.has('redis.auth') ? config.get<string>('redis.auth') : null,
+     DB: config.has('redis.db') ? config.get<number>('redis.db') : null
+   },
++  LDAP: {
++    ENABLE: config.has('ldap.enable') ? config.get<boolean>('ldap.enable') : false,
++    LDAP_ONLY: config.has('ldap.ldap_only') ? config.get<boolean>('ldap.ldap_only') : false,
++    URL: config.has('ldap.url') ? config.get<string>('ldap.url') : null,
++    BIND_DN: config.has('ldap.bind_dn') ? config.get<string>('ldap.bind_dn') : null,
++    BIND_PASSWORD: config.has('ldap.bind_password') ? config.get<string>('ldap.bind_password') : null,
++    BASE: config.has('ldap.base') ? config.get<string>('ldap.base') : null,
++    MAIL_ENTRY: config.has('ldap.mail_entry') ? config.get<string>('ldap.mail_entry') : 'mail',
++    USER_FILTER: config.has('ldap.user_filter') ? config.get<string>('ldap.user_filter') : '(|(email=%username%)(uid=%username%))'
++  },
+   SMTP: {
+     HOSTNAME: config.get<string>('smtp.hostname'),
+     PORT: config.get<number>('smtp.port'),
+diff --git a/server/initializers/migrations/0326-user-ldap-dn.ts b/server/initializers/migrations/0326-user-ldap-dn.ts
+new file mode 100644
+index 00000000..a9d68124
+--- /dev/null
++++ b/server/initializers/migrations/0326-user-ldap-dn.ts
+@@ -0,0 +1,26 @@
++import * as Sequelize from 'sequelize'
++
++async function up (utils: {
++  transaction: Sequelize.Transaction,
++  queryInterface: Sequelize.QueryInterface,
++  sequelize: Sequelize.Sequelize
++}): Promise<void> {
++
++  {
++    const data = {
++      type: Sequelize.STRING,
++      allowNull: true,
++      defaultValue: null
++    }
++    await utils.queryInterface.addColumn('user', 'ldapDn', data)
++  }
++}
++
++function down (options) {
++  throw new Error('Not implemented.')
++}
++
++export {
++  up,
++  down
++}
+diff --git a/server/lib/oauth-model.ts b/server/lib/oauth-model.ts
+index 2cd2ae97..3f14b216 100644
+--- a/server/lib/oauth-model.ts
++++ b/server/lib/oauth-model.ts
+@@ -66,7 +66,13 @@ function getRefreshToken (refreshToken: string) {
+ async function getUser (usernameOrEmail: string, password: string) {
+   logger.debug('Getting User (username/email: ' + usernameOrEmail + ', password: ******).')
+-  const user = await UserModel.loadByUsernameOrEmail(usernameOrEmail)
++  let user
++  if (CONFIG.LDAP.ENABLE) {
++    user = await UserModel.findOrCreateLDAPUser(usernameOrEmail)
++  }
++  if (!user && (!CONFIG.LDAP.ENABLE || !CONFIG.LDAP.LDAP_ONLY)) {
++    user = await UserModel.loadByUsernameOrEmail(usernameOrEmail)
++  }
+   if (!user) return null
+   const passwordMatch = await user.isPasswordMatch(password)
+diff --git a/server/models/account/user.ts b/server/models/account/user.ts
+index 017a9665..a4d0145c 100644
+--- a/server/models/account/user.ts
++++ b/server/models/account/user.ts
+@@ -1,3 +1,4 @@
++import * as ldap from 'ldapjs'
+ import * as Sequelize from 'sequelize'
+ import {
+   AfterDestroy,
+@@ -42,8 +43,9 @@ import { VideoChannelModel } from '../video/video-channel'
+ import { AccountModel } from './account'
+ import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type'
+ import { values } from 'lodash'
+-import { NSFW_POLICY_TYPES } from '../../initializers'
++import { CONFIG, NSFW_POLICY_TYPES } from '../../initializers'
+ import { clearCacheByUserId } from '../../lib/oauth-model'
++import { createUserAccountAndChannel } from '../../lib/user'
+ import { UserNotificationSettingModel } from './user-notification-setting'
+ import { VideoModel } from '../video/video'
+ import { ActorModel } from '../activitypub/actor'
+@@ -111,6 +113,11 @@ export class UserModel extends Model<UserModel> {
+   @Column(DataType.STRING(400))
+   email: string
++  @AllowNull(true)
++  @Default(null)
++  @Column
++  ldapDn: string
++
+   @AllowNull(true)
+   @Default(null)
+   @Is('UserEmailVerified', value => throwIfNotValid(value, isUserEmailVerifiedValid, 'email verified boolean'))
+@@ -354,6 +361,90 @@ export class UserModel extends Model<UserModel> {
+     return UserModel.findOne(query)
+   }
++  static loadByLdapDn (ldapDn: string) {
++    const query = {
++      where: {
++        ldapDn
++      }
++    }
++
++    return UserModel.findOne(query)
++  }
++
++  static findOrCreateLDAPUser (username: string) {
++    let userInfos
++
++    return Promise.resolve(UserModel.findLDAPUser(username))
++      .then((_userInfos) => {
++        userInfos = _userInfos
++        return UserModel.loadByLdapDn(userInfos['dn'])
++      })
++      .then((user) => {
++        if (user) {
++          return user
++        } else {
++          return UserModel.createLDAPUser(username, userInfos)
++        }
++      })
++      .catch(() => { return null })
++  }
++
++  static findLDAPUser (username: string) {
++    const client = ldap.createClient({
++      url: CONFIG.LDAP.URL
++    })
++    const filter = ldap.parseFilter(CONFIG.LDAP.USER_FILTER)
++    filter.forEach(function (element) {
++      if (element.value === '%username%') element.value = username
++    })
++    const opts = {
++      filter,
++      scope: 'sub',
++      attributes: [ CONFIG.LDAP.MAIL_ENTRY, 'dn' ]
++    }
++
++    return new Promise(function (resolve, reject) {
++      client.bind(CONFIG.LDAP.BIND_DN, CONFIG.LDAP.BIND_PASSWORD, function (err) {
++        if (err) reject()
++        let entries = []
++        client.search(CONFIG.LDAP.BASE, opts, function (err, search) {
++          if (err) reject()
++          search.on('searchEntry', function (entry) {
++            entries.push(entry.object)
++          })
++          search.on('end', function (result) {
++            if (entries.length === 1) {
++              resolve(entries[0])
++            } else {
++              reject()
++            }
++          })
++        })
++      })
++    })
++  }
++
++  static createLDAPUser (username: string, userInfos: {}) {
++    return Promise.resolve(userInfos)
++      .then((userInfos) => {
++        const userToCreate = new UserModel({
++          username: username,
++          password: 'SomeInvalidPassword',
++          email: userInfos[CONFIG.LDAP.MAIL_ENTRY],
++          ldapDn: userInfos['dn'],
++          nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
++          autoPlayVideo: true,
++          role: UserRole.USER,
++          videoQuota: CONFIG.USER.VIDEO_QUOTA,
++          videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY,
++          emailVerified: true
++        })
++
++        return createUserAccountAndChannel(userToCreate)
++      })
++      .then(({ user }) => { return user })
++  }
++
+   static loadByUsernameAndPopulateChannels (username: string) {
+     const query = {
+       where: {
+@@ -516,8 +607,22 @@ export class UserModel extends Model<UserModel> {
+     return hasUserRight(this.role, right)
+   }
++  static checkLDAPUser (dn: string, password: string) {
++    const client = ldap.createClient({ url: CONFIG.LDAP.URL })
++
++    return new Promise(function (resolve, reject) {
++      client.bind(dn, password, function (err) {
++        resolve(!err)
++      })
++    })
++  }
++
+   isPasswordMatch (password: string) {
+-    return comparePassword(password, this.password)
++    if (this.ldapDn === null) {
++      return comparePassword(password, this.password)
++    } else {
++      return UserModel.checkLDAPUser(this.ldapDn, password)
++    }
+   }
+   toFormattedJSON (): User {
+diff --git a/yarn.lock b/yarn.lock
+index 1e759af1..1eb61a9f 100644
+--- a/yarn.lock
++++ b/yarn.lock
+@@ -674,6 +674,11 @@ asap@^2.0.0:
+   resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+   integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
++asn1@0.2.3:
++  version "0.2.3"
++  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
++  integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=
++
+ asn1@~0.2.3:
+   version "0.2.4"
+   resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+@@ -681,6 +686,11 @@ asn1@~0.2.3:
+   dependencies:
+     safer-buffer "~2.1.0"
++assert-plus@0.1.5:
++  version "0.1.5"
++  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160"
++  integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=
++
+ assert-plus@1.0.0, assert-plus@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+@@ -779,6 +789,13 @@ backo2@1.0.2:
+   resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+   integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
++backoff@^2.5.0:
++  version "2.5.0"
++  resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
++  integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
++  dependencies:
++    precond "0.2"
++
+ balanced-match@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+@@ -1186,6 +1203,16 @@ bull@^3.4.2:
+     semver "^5.6.0"
+     uuid "^3.2.1"
++bunyan@^1.8.3:
++  version "1.8.12"
++  resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797"
++  integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=
++  optionalDependencies:
++    dtrace-provider "~0.8"
++    moment "^2.10.6"
++    mv "~2"
++    safe-json-stringify "~1"
++
+ busboy@^0.2.11:
+   version "0.2.14"
+   resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+@@ -1966,7 +1993,7 @@ d@1:
+   dependencies:
+     es5-ext "^0.10.9"
+-dashdash@^1.12.0:
++dashdash@^1.12.0, dashdash@^1.14.0:
+   version "1.14.1"
+   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+   integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+@@ -2292,6 +2319,13 @@ double-ended-queue@^2.1.0-0:
+   resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+   integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
++dtrace-provider@~0.8:
++  version "0.8.7"
++  resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz#dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04"
++  integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=
++  dependencies:
++    nan "^2.10.0"
++
+ duplexer3@^0.1.4:
+   version "0.1.4"
+   resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+@@ -2864,6 +2898,11 @@ extglob@^2.0.4:
+     snapdragon "^0.8.1"
+     to-regex "^3.0.1"
++extsprintf@1.2.0:
++  version "1.2.0"
++  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529"
++  integrity sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=
++
+ extsprintf@1.3.0:
+   version "1.3.0"
+   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+@@ -3350,6 +3389,17 @@ glob@7.1.2:
+     once "^1.3.0"
+     path-is-absolute "^1.0.0"
++glob@^6.0.1:
++  version "6.0.4"
++  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
++  integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
++  dependencies:
++    inflight "^1.0.4"
++    inherits "2"
++    minimatch "2 || 3"
++    once "^1.3.0"
++    path-is-absolute "^1.0.0"
++
+ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2:
+   version "7.1.3"
+   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+@@ -4522,6 +4572,30 @@ lcid@^2.0.0:
+   dependencies:
+     invert-kv "^2.0.0"
++ldap-filter@0.2.2:
++  version "0.2.2"
++  resolved "https://registry.yarnpkg.com/ldap-filter/-/ldap-filter-0.2.2.tgz#f2b842be0b86da3352798505b31ebcae590d77d0"
++  integrity sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=
++  dependencies:
++    assert-plus "0.1.5"
++
++ldapjs@^1.0.2:
++  version "1.0.2"
++  resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-1.0.2.tgz#544ff7032b7b83c68f0701328d9297aa694340f9"
++  integrity sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=
++  dependencies:
++    asn1 "0.2.3"
++    assert-plus "^1.0.0"
++    backoff "^2.5.0"
++    bunyan "^1.8.3"
++    dashdash "^1.14.0"
++    ldap-filter "0.2.2"
++    once "^1.4.0"
++    vasync "^1.6.4"
++    verror "^1.8.1"
++  optionalDependencies:
++    dtrace-provider "~0.8"
++
+ leven@^2.1.0:
+   version "2.1.0"
+   resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+@@ -5186,7 +5260,7 @@ minimalistic-assert@^1.0.1:
+   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+   integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+-minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
++"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
+   version "3.0.4"
+   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+@@ -5299,6 +5373,11 @@ moment-timezone@^0.5.14, moment-timezone@^0.5.23:
+   resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+   integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=
++moment@^2.10.6:
++  version "2.24.0"
++  resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
++  integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
++
+ morgan@^1.5.3:
+   version "1.9.1"
+   resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59"
+@@ -5394,6 +5473,15 @@ mute-stream@~0.0.4:
+   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
++mv@~2:
++  version "2.1.1"
++  resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2"
++  integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=
++  dependencies:
++    mkdirp "~0.5.1"
++    ncp "~2.0.0"
++    rimraf "~2.4.0"
++
+ nan@2.11.1, nan@^2.10.0, nan@^2.11.1, nan@^2.9.2:
+   version "2.11.1"
+   resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+@@ -5431,6 +5519,11 @@ ncp@1.0.x:
+   resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
+   integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
++ncp@~2.0.0:
++  version "2.0.0"
++  resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
++  integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=
++
+ needle@^2.2.1:
+   version "2.2.4"
+   resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
+@@ -6520,6 +6613,11 @@ prebuild-install@^5.2.0:
+     tunnel-agent "^0.6.0"
+     which-pm-runs "^1.0.0"
++precond@0.2:
++  version "0.2.3"
++  resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
++  integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
++
+ prelude-ls@~1.1.2:
+   version "1.1.2"
+   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+@@ -7141,6 +7239,13 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, rimraf@^2.5
+   dependencies:
+     glob "^7.0.5"
++rimraf@~2.4.0:
++  version "2.4.5"
++  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da"
++  integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=
++  dependencies:
++    glob "^6.0.1"
++
+ run-async@^0.1.0:
+   version "0.1.0"
+   resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+@@ -7197,6 +7302,11 @@ safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, s
+   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
++safe-json-stringify@~1:
++  version "1.2.0"
++  resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd"
++  integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==
++
+ safe-regex@^1.1.0:
+   version "1.1.0"
+   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+@@ -8857,7 +8967,14 @@ vary@~1.0.1:
+   resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
+   integrity sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=
+-verror@1.10.0:
++vasync@^1.6.4:
++  version "1.6.4"
++  resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f"
++  integrity sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=
++  dependencies:
++    verror "1.6.0"
++
++verror@1.10.0, verror@^1.8.1:
+   version "1.10.0"
+   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+   integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+@@ -8866,6 +8983,13 @@ verror@1.10.0:
+     core-util-is "1.0.2"
+     extsprintf "^1.2.0"
++verror@1.6.0:
++  version "1.6.0"
++  resolved "https://registry.yarnpkg.com/verror/-/verror-1.6.0.tgz#7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5"
++  integrity sha1-fROyex+swuLakEBetepuW90lLqU=
++  dependencies:
++    extsprintf "1.2.0"
++
+ videostream@^2.5.1:
+   version "2.6.0"
+   resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.6.0.tgz#7f0b2b84bc457c12cfe599aa2345f5cc06241ab6"
diff --git a/pkgs/webapps/peertube/ldap_yarn.patch b/pkgs/webapps/peertube/ldap_yarn.patch
new file mode 100644 (file)
index 0000000..538ce04
--- /dev/null
@@ -0,0 +1,278 @@
+commit 45a9e4a7b1badbea15d74bd8b3990303a424dfa6
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Tue Feb 12 18:47:53 2019 +0100
+
+    Add LDAP authentication
+
+diff --git a/package.json b/package.json
+index 0cf39c7e..fd1ce3ea 100644
+--- a/package.json
++++ b/package.json
+@@ -125,6 +125,7 @@
+     "js-yaml": "^3.5.4",
+     "jsonld": "^1.0.1",
+     "jsonld-signatures": "https://github.com/Chocobozzz/jsonld-signatures#rsa2017",
++    "ldapjs": "^1.0.2",
+     "lodash": "^4.17.10",
+     "magnet-uri": "^5.1.4",
+     "memoizee": "^0.4.14",
+diff --git a/yarn.lock b/yarn.lock
+index 1e759af1..1eb61a9f 100644
+--- a/yarn.lock
++++ b/yarn.lock
+@@ -674,6 +674,11 @@ asap@^2.0.0:
+   resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+   integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
++asn1@0.2.3:
++  version "0.2.3"
++  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
++  integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=
++
+ asn1@~0.2.3:
+   version "0.2.4"
+   resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+@@ -681,6 +686,11 @@ asn1@~0.2.3:
+   dependencies:
+     safer-buffer "~2.1.0"
++assert-plus@0.1.5:
++  version "0.1.5"
++  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160"
++  integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=
++
+ assert-plus@1.0.0, assert-plus@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+@@ -779,6 +789,13 @@ backo2@1.0.2:
+   resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+   integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
++backoff@^2.5.0:
++  version "2.5.0"
++  resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
++  integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
++  dependencies:
++    precond "0.2"
++
+ balanced-match@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+@@ -1186,6 +1203,16 @@ bull@^3.4.2:
+     semver "^5.6.0"
+     uuid "^3.2.1"
++bunyan@^1.8.3:
++  version "1.8.12"
++  resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797"
++  integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=
++  optionalDependencies:
++    dtrace-provider "~0.8"
++    moment "^2.10.6"
++    mv "~2"
++    safe-json-stringify "~1"
++
+ busboy@^0.2.11:
+   version "0.2.14"
+   resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+@@ -1966,7 +1993,7 @@ d@1:
+   dependencies:
+     es5-ext "^0.10.9"
+-dashdash@^1.12.0:
++dashdash@^1.12.0, dashdash@^1.14.0:
+   version "1.14.1"
+   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+   integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+@@ -2292,6 +2319,13 @@ double-ended-queue@^2.1.0-0:
+   resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+   integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
++dtrace-provider@~0.8:
++  version "0.8.7"
++  resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz#dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04"
++  integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=
++  dependencies:
++    nan "^2.10.0"
++
+ duplexer3@^0.1.4:
+   version "0.1.4"
+   resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+@@ -2864,6 +2898,11 @@ extglob@^2.0.4:
+     snapdragon "^0.8.1"
+     to-regex "^3.0.1"
++extsprintf@1.2.0:
++  version "1.2.0"
++  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529"
++  integrity sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=
++
+ extsprintf@1.3.0:
+   version "1.3.0"
+   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+@@ -3350,6 +3389,17 @@ glob@7.1.2:
+     once "^1.3.0"
+     path-is-absolute "^1.0.0"
++glob@^6.0.1:
++  version "6.0.4"
++  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
++  integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
++  dependencies:
++    inflight "^1.0.4"
++    inherits "2"
++    minimatch "2 || 3"
++    once "^1.3.0"
++    path-is-absolute "^1.0.0"
++
+ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2:
+   version "7.1.3"
+   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+@@ -4522,6 +4572,30 @@ lcid@^2.0.0:
+   dependencies:
+     invert-kv "^2.0.0"
++ldap-filter@0.2.2:
++  version "0.2.2"
++  resolved "https://registry.yarnpkg.com/ldap-filter/-/ldap-filter-0.2.2.tgz#f2b842be0b86da3352798505b31ebcae590d77d0"
++  integrity sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=
++  dependencies:
++    assert-plus "0.1.5"
++
++ldapjs@^1.0.2:
++  version "1.0.2"
++  resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-1.0.2.tgz#544ff7032b7b83c68f0701328d9297aa694340f9"
++  integrity sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=
++  dependencies:
++    asn1 "0.2.3"
++    assert-plus "^1.0.0"
++    backoff "^2.5.0"
++    bunyan "^1.8.3"
++    dashdash "^1.14.0"
++    ldap-filter "0.2.2"
++    once "^1.4.0"
++    vasync "^1.6.4"
++    verror "^1.8.1"
++  optionalDependencies:
++    dtrace-provider "~0.8"
++
+ leven@^2.1.0:
+   version "2.1.0"
+   resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+@@ -5186,7 +5260,7 @@ minimalistic-assert@^1.0.1:
+   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+   integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+-minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
++"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
+   version "3.0.4"
+   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+@@ -5299,6 +5373,11 @@ moment-timezone@^0.5.14, moment-timezone@^0.5.23:
+   resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+   integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=
++moment@^2.10.6:
++  version "2.24.0"
++  resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
++  integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
++
+ morgan@^1.5.3:
+   version "1.9.1"
+   resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59"
+@@ -5394,6 +5473,15 @@ mute-stream@~0.0.4:
+   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
++mv@~2:
++  version "2.1.1"
++  resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2"
++  integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=
++  dependencies:
++    mkdirp "~0.5.1"
++    ncp "~2.0.0"
++    rimraf "~2.4.0"
++
+ nan@2.11.1, nan@^2.10.0, nan@^2.11.1, nan@^2.9.2:
+   version "2.11.1"
+   resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+@@ -5431,6 +5519,11 @@ ncp@1.0.x:
+   resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
+   integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
++ncp@~2.0.0:
++  version "2.0.0"
++  resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
++  integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=
++
+ needle@^2.2.1:
+   version "2.2.4"
+   resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
+@@ -6520,6 +6613,11 @@ prebuild-install@^5.2.0:
+     tunnel-agent "^0.6.0"
+     which-pm-runs "^1.0.0"
++precond@0.2:
++  version "0.2.3"
++  resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
++  integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
++
+ prelude-ls@~1.1.2:
+   version "1.1.2"
+   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+@@ -7141,6 +7239,13 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, rimraf@^2.5
+   dependencies:
+     glob "^7.0.5"
++rimraf@~2.4.0:
++  version "2.4.5"
++  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da"
++  integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=
++  dependencies:
++    glob "^6.0.1"
++
+ run-async@^0.1.0:
+   version "0.1.0"
+   resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+@@ -7197,6 +7302,11 @@ safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, s
+   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
++safe-json-stringify@~1:
++  version "1.2.0"
++  resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd"
++  integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==
++
+ safe-regex@^1.1.0:
+   version "1.1.0"
+   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+@@ -8857,7 +8967,14 @@ vary@~1.0.1:
+   resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
+   integrity sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=
+-verror@1.10.0:
++vasync@^1.6.4:
++  version "1.6.4"
++  resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f"
++  integrity sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=
++  dependencies:
++    verror "1.6.0"
++
++verror@1.10.0, verror@^1.8.1:
+   version "1.10.0"
+   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+   integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+@@ -8866,6 +8983,13 @@ verror@1.10.0:
+     core-util-is "1.0.2"
+     extsprintf "^1.2.0"
++verror@1.6.0:
++  version "1.6.0"
++  resolved "https://registry.yarnpkg.com/verror/-/verror-1.6.0.tgz#7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5"
++  integrity sha1-fROyex+swuLakEBetepuW90lLqU=
++  dependencies:
++    extsprintf "1.2.0"
++
+ videostream@^2.5.1:
+   version "2.6.0"
+   resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.6.0.tgz#7f0b2b84bc457c12cfe599aa2345f5cc06241ab6"
diff --git a/pkgs/webapps/peertube/peertube.json b/pkgs/webapps/peertube/peertube.json
new file mode 100644 (file)
index 0000000..fd2ef7d
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "v1.2.0",
+  "meta": {
+    "name": "peertube",
+    "url": "https://github.com/Chocobozzz/PeerTube",
+    "branch": "refs/tags/v1.2.0"
+  },
+  "github": {
+    "owner": "Chocobozzz",
+    "repo": "PeerTube",
+    "rev": "5cc304b909a70d8cbfe9cb5e0c46b4fe7b3d8ea2",
+    "sha256": "0fpzp9qh3ns3bg2w7f50b5schg30swyhyhk1zd311fy27mdmza6z",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/peertube/sendmail.patch b/pkgs/webapps/peertube/sendmail.patch
new file mode 100644 (file)
index 0000000..b42bc49
--- /dev/null
@@ -0,0 +1,121 @@
+commit 677374d59c6aa2cb8145da3cd9c17fe05fd9b149
+Author: Ismaël Bouya <ismael.bouya@normalesup.org>
+Date:   Wed Feb 13 12:16:27 2019 +0100
+
+    Add sendmail
+
+diff --git a/config/production.yaml.example b/config/production.yaml.example
+index bb5ac251..4583f1f5 100644
+--- a/config/production.yaml.example
++++ b/config/production.yaml.example
+@@ -46,6 +46,8 @@ ldap:
+ # SMTP server to send emails
+ smtp:
++  transport: smtp
++  sendmail: null
+   hostname: null
+   port: 465 # If you use StartTLS: 587
+   username: null
+diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
+index fb21df37..c551b4f9 100644
+--- a/server/initializers/constants.ts
++++ b/server/initializers/constants.ts
+@@ -188,6 +188,8 @@ const CONFIG = {
+     USER_FILTER: config.has('ldap.user_filter') ? config.get<string>('ldap.user_filter') : '(|(email=%username%)(uid=%username%))'
+   },
+   SMTP: {
++    TRANSPORT: config.has('smtp.transport') ? config.get<string>('smtp.transport') : 'smtp',
++    SENDMAIL: config.has('smtp.sendmail') ? config.get<string>('smtp.sendmail') : null,
+     HOSTNAME: config.get<string>('smtp.hostname'),
+     PORT: config.get<number>('smtp.port'),
+     USERNAME: config.get<string>('smtp.username'),
+diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
+index f384a254..ec6e249b 100644
+--- a/server/lib/emailer.ts
++++ b/server/lib/emailer.ts
+@@ -27,33 +27,41 @@ class Emailer {
+     this.initialized = true
+     if (Emailer.isEnabled()) {
+-      logger.info('Using %s:%s as SMTP server.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT)
+-
+-      let tls
+-      if (CONFIG.SMTP.CA_FILE) {
+-        tls = {
+-          ca: [ readFileSync(CONFIG.SMTP.CA_FILE) ]
++      if (CONFIG.SMTP.TRANSPORT === 'smtp') {
++        logger.info('Using %s:%s as SMTP server.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT)
++
++        let tls
++        if (CONFIG.SMTP.CA_FILE) {
++          tls = {
++            ca: [ readFileSync(CONFIG.SMTP.CA_FILE) ]
++          }
+         }
+-      }
+-      let auth
+-      if (CONFIG.SMTP.USERNAME && CONFIG.SMTP.PASSWORD) {
+-        auth = {
+-          user: CONFIG.SMTP.USERNAME,
+-          pass: CONFIG.SMTP.PASSWORD
++        let auth
++        if (CONFIG.SMTP.USERNAME && CONFIG.SMTP.PASSWORD) {
++          auth = {
++            user: CONFIG.SMTP.USERNAME,
++            pass: CONFIG.SMTP.PASSWORD
++          }
+         }
+-      }
+-      this.transporter = createTransport({
+-        host: CONFIG.SMTP.HOSTNAME,
+-        port: CONFIG.SMTP.PORT,
+-        secure: CONFIG.SMTP.TLS,
+-        debug: CONFIG.LOG.LEVEL === 'debug',
+-        logger: bunyanLogger as any,
+-        ignoreTLS: CONFIG.SMTP.DISABLE_STARTTLS,
+-        tls,
+-        auth
+-      })
++        this.transporter = createTransport({
++          host: CONFIG.SMTP.HOSTNAME,
++          port: CONFIG.SMTP.PORT,
++          secure: CONFIG.SMTP.TLS,
++          debug: CONFIG.LOG.LEVEL === 'debug',
++          logger: bunyanLogger as any,
++          ignoreTLS: CONFIG.SMTP.DISABLE_STARTTLS,
++          tls,
++          auth
++        })
++      } else { // sendmail
++        this.transporter = createTransport({
++          sendmail: true,
++          newline: 'unix',
++          path: CONFIG.SMTP.SENDMAIL,
++        })
++      }
+     } else {
+       if (!isTestInstance()) {
+         logger.error('Cannot use SMTP server because of lack of configuration. PeerTube will not be able to send mails!')
+@@ -62,11 +70,17 @@ class Emailer {
+   }
+   static isEnabled () {
+-    return !!CONFIG.SMTP.HOSTNAME && !!CONFIG.SMTP.PORT
++    if (CONFIG.SMTP.TRANSPORT === 'sendmail') {
++      return !!CONFIG.SMTP.SENDMAIL
++    } else if (CONFIG.SMTP.TRANSPORT === 'smtp') {
++      return !!CONFIG.SMTP.HOSTNAME && !!CONFIG.SMTP.PORT
++    } else {
++      return false
++    }
+   }
+   async checkConnectionOrDie () {
+-    if (!this.transporter) return
++    if (!this.transporter || CONFIG.SMTP.TRANSPORT !== 'smtp') return
+     logger.info('Testing SMTP server...')
diff --git a/pkgs/webapps/peertube/yarn-packages.nix b/pkgs/webapps/peertube/yarn-packages.nix
new file mode 100644 (file)
index 0000000..d99dfd3
--- /dev/null
@@ -0,0 +1,11552 @@
+{fetchurl, linkFarm}: rec {
+  offline_cache = linkFarm "offline" packages;
+  packages = [
+
+    {
+      name = "_iamstarkov_listr_update_renderer___listr_update_renderer_0.4.1.tgz";
+      path = fetchurl {
+        name = "_iamstarkov_listr_update_renderer___listr_update_renderer_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz";
+        sha1 = "d7c48092a2dcf90fd672b6c8b458649cb350c77e";
+      };
+    }
+
+    {
+      name = "_samverschueren_stream_to_observable___stream_to_observable_0.3.0.tgz";
+      path = fetchurl {
+        name = "_samverschueren_stream_to_observable___stream_to_observable_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz";
+        sha1 = "ecdf48d532c58ea477acfcab80348424f8d0662f";
+      };
+    }
+
+    {
+      name = "_types_async_lock___async_lock_1.1.0.tgz";
+      path = fetchurl {
+        name = "_types_async_lock___async_lock_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-1.1.0.tgz";
+        sha1 = "002b1ebeebd382aff66b68bed70a74c7bdd06e3e";
+      };
+    }
+
+    {
+      name = "_types_async___async_2.0.50.tgz";
+      path = fetchurl {
+        name = "_types_async___async_2.0.50.tgz";
+        url  = "https://registry.yarnpkg.com/@types/async/-/async-2.0.50.tgz";
+        sha1 = "117540e026d64e1846093abbd5adc7e27fda7bcb";
+      };
+    }
+
+    {
+      name = "_types_bcrypt___bcrypt_3.0.0.tgz";
+      path = fetchurl {
+        name = "_types_bcrypt___bcrypt_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-3.0.0.tgz";
+        sha1 = "851489a9065a067cb7f3c9cbe4ce9bed8bba0876";
+      };
+    }
+
+    {
+      name = "_types_bittorrent_protocol___bittorrent_protocol_2.2.2.tgz";
+      path = fetchurl {
+        name = "_types_bittorrent_protocol___bittorrent_protocol_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz";
+        sha1 = "169e9633e1bd18e6b830d11cf42e611b1972cb83";
+      };
+    }
+
+    {
+      name = "_types_bluebird___bluebird_3.5.21.tgz";
+      path = fetchurl {
+        name = "_types_bluebird___bluebird_3.5.21.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz";
+        sha1 = "567615589cc913e84a28ecf9edb031732bdf2634";
+      };
+    }
+
+    {
+      name = "_types_bluebird___bluebird_3.5.18.tgz";
+      path = fetchurl {
+        name = "_types_bluebird___bluebird_3.5.18.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz";
+        sha1 = "6a60435d4663e290f3709898a4f75014f279c4d6";
+      };
+    }
+
+    {
+      name = "_types_body_parser___body_parser_1.17.0.tgz";
+      path = fetchurl {
+        name = "_types_body_parser___body_parser_1.17.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz";
+        sha1 = "9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c";
+      };
+    }
+
+    {
+      name = "_types_bull___bull_3.4.0.tgz";
+      path = fetchurl {
+        name = "_types_bull___bull_3.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bull/-/bull-3.4.0.tgz";
+        sha1 = "18ffefefa4dd1cfbdbdc8ca7df56c934459f6b9d";
+      };
+    }
+
+    {
+      name = "_types_bytes___bytes_3.0.0.tgz";
+      path = fetchurl {
+        name = "_types_bytes___bytes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "549eeacd0a8fecfaa459334583a4edcee738e6db";
+      };
+    }
+
+    {
+      name = "_types_caseless___caseless_0.12.1.tgz";
+      path = fetchurl {
+        name = "_types_caseless___caseless_0.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz";
+        sha1 = "9794c69c8385d0192acc471a540d1f8e0d16218a";
+      };
+    }
+
+    {
+      name = "_types_chai_json_schema___chai_json_schema_1.4.3.tgz";
+      path = fetchurl {
+        name = "_types_chai_json_schema___chai_json_schema_1.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/chai-json-schema/-/chai-json-schema-1.4.3.tgz";
+        sha1 = "1dd1e88ae911dd6e6e1c3c2d0e0397328aab0bfb";
+      };
+    }
+
+    {
+      name = "_types_chai_xml___chai_xml_0.3.1.tgz";
+      path = fetchurl {
+        name = "_types_chai_xml___chai_xml_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/chai-xml/-/chai-xml-0.3.1.tgz";
+        sha1 = "a9cc5812bd67e9c9221d1e9b4dfb0cca797fd40a";
+      };
+    }
+
+    {
+      name = "_types_chai___chai_4.1.7.tgz";
+      path = fetchurl {
+        name = "_types_chai___chai_4.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz";
+        sha1 = "1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a";
+      };
+    }
+
+    {
+      name = "_types_config___config_0.0.34.tgz";
+      path = fetchurl {
+        name = "_types_config___config_0.0.34.tgz";
+        url  = "https://registry.yarnpkg.com/@types/config/-/config-0.0.34.tgz";
+        sha1 = "123f91bdb5afdd702294b9de9ca04d9ea11137b0";
+      };
+    }
+
+    {
+      name = "_types_connect___connect_3.4.32.tgz";
+      path = fetchurl {
+        name = "_types_connect___connect_3.4.32.tgz";
+        url  = "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz";
+        sha1 = "aa0e9616b9435ccad02bc52b5b454ffc2c70ba28";
+      };
+    }
+
+    {
+      name = "_types_continuation_local_storage___continuation_local_storage_3.2.1.tgz";
+      path = fetchurl {
+        name = "_types_continuation_local_storage___continuation_local_storage_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz";
+        sha1 = "a33e0df9dce9b424d1c98fc4fdebd8578dceec7e";
+      };
+    }
+
+    {
+      name = "_types_cookiejar___cookiejar_2.1.0.tgz";
+      path = fetchurl {
+        name = "_types_cookiejar___cookiejar_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.0.tgz";
+        sha1 = "4b7daf2c51696cfc70b942c11690528229d1a1ce";
+      };
+    }
+
+    {
+      name = "_types_events___events_1.2.0.tgz";
+      path = fetchurl {
+        name = "_types_events___events_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz";
+        sha1 = "81a6731ce4df43619e5c8c945383b3e62a89ea86";
+      };
+    }
+
+    {
+      name = "_types_express_rate_limit___express_rate_limit_2.9.3.tgz";
+      path = fetchurl {
+        name = "_types_express_rate_limit___express_rate_limit_2.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/express-rate-limit/-/express-rate-limit-2.9.3.tgz";
+        sha1 = "e83a548bf251ad12ca49055c22d3f2da4e16b62d";
+      };
+    }
+
+    {
+      name = "_types_express_serve_static_core___express_serve_static_core_4.16.0.tgz";
+      path = fetchurl {
+        name = "_types_express_serve_static_core___express_serve_static_core_4.16.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz";
+        sha1 = "fdfe777594ddc1fe8eb8eccce52e261b496e43e7";
+      };
+    }
+
+    {
+      name = "_types_express___express_4.16.0.tgz";
+      path = fetchurl {
+        name = "_types_express___express_4.16.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz";
+        sha1 = "6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19";
+      };
+    }
+
+    {
+      name = "_types_fluent_ffmpeg___fluent_ffmpeg_2.1.8.tgz";
+      path = fetchurl {
+        name = "_types_fluent_ffmpeg___fluent_ffmpeg_2.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.8.tgz";
+        sha1 = "a9ffff2140d641ec898ebdddaa1e6e7e962d7943";
+      };
+    }
+
+    {
+      name = "_types_form_data___form_data_2.2.1.tgz";
+      path = fetchurl {
+        name = "_types_form_data___form_data_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz";
+        sha1 = "ee2b3b8eaa11c0938289953606b745b738c54b1e";
+      };
+    }
+
+    {
+      name = "_types_fs_extra___fs_extra_5.0.4.tgz";
+      path = fetchurl {
+        name = "_types_fs_extra___fs_extra_5.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.4.tgz";
+        sha1 = "b971134d162cc0497d221adde3dbb67502225599";
+      };
+    }
+
+    {
+      name = "_types_geojson___geojson_1.0.6.tgz";
+      path = fetchurl {
+        name = "_types_geojson___geojson_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz";
+        sha1 = "3e02972728c69248c2af08d60a48cbb8680fffdf";
+      };
+    }
+
+    {
+      name = "_types_ioredis___ioredis_4.0.4.tgz";
+      path = fetchurl {
+        name = "_types_ioredis___ioredis_4.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.0.4.tgz";
+        sha1 = "c0a809064c05e4c2663803128d46042e73c92558";
+      };
+    }
+
+    {
+      name = "_types_libxmljs___libxmljs_0.18.2.tgz";
+      path = fetchurl {
+        name = "_types_libxmljs___libxmljs_0.18.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/libxmljs/-/libxmljs-0.18.2.tgz";
+        sha1 = "c424173a07477a7552173d7c779d5ffe77dd8efc";
+      };
+    }
+
+    {
+      name = "_types_lodash___lodash_4.14.118.tgz";
+      path = fetchurl {
+        name = "_types_lodash___lodash_4.14.118.tgz";
+        url  = "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz";
+        sha1 = "247bab39bfcc6d910d4927c6e06cbc70ec376f27";
+      };
+    }
+
+    {
+      name = "_types_magnet_uri___magnet_uri_5.1.1.tgz";
+      path = fetchurl {
+        name = "_types_magnet_uri___magnet_uri_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz";
+        sha1 = "861aaf64c92a3137dd848fefc55cd352a8ea851a";
+      };
+    }
+
+    {
+      name = "_types_maildev___maildev_0.0.1.tgz";
+      path = fetchurl {
+        name = "_types_maildev___maildev_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/maildev/-/maildev-0.0.1.tgz";
+        sha1 = "9fe4fa05610f6c6afc10224bcca6b67bc3c56fc0";
+      };
+    }
+
+    {
+      name = "_types_memoizee___memoizee_0.4.2.tgz";
+      path = fetchurl {
+        name = "_types_memoizee___memoizee_0.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.2.tgz";
+        sha1 = "a500158999a8144a9b46cf9a9fb49b15f1853573";
+      };
+    }
+
+    {
+      name = "_types_mime___mime_2.0.0.tgz";
+      path = fetchurl {
+        name = "_types_mime___mime_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz";
+        sha1 = "5a7306e367c539b9f6543499de8dd519fac37a8b";
+      };
+    }
+
+    {
+      name = "_types_mkdirp___mkdirp_0.5.2.tgz";
+      path = fetchurl {
+        name = "_types_mkdirp___mkdirp_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz";
+        sha1 = "503aacfe5cc2703d5484326b1b27efa67a339c1f";
+      };
+    }
+
+    {
+      name = "_types_mocha___mocha_5.2.5.tgz";
+      path = fetchurl {
+        name = "_types_mocha___mocha_5.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz";
+        sha1 = "8a4accfc403c124a0bafe8a9fc61a05ec1032073";
+      };
+    }
+
+    {
+      name = "_types_morgan___morgan_1.7.35.tgz";
+      path = fetchurl {
+        name = "_types_morgan___morgan_1.7.35.tgz";
+        url  = "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.7.35.tgz";
+        sha1 = "6358f502931cc2583d7a94248c41518baa688494";
+      };
+    }
+
+    {
+      name = "_types_multer___multer_1.3.7.tgz";
+      path = fetchurl {
+        name = "_types_multer___multer_1.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/@types/multer/-/multer-1.3.7.tgz";
+        sha1 = "9fe1de9f44f401ff2eaf0d4468cf16935a9c6866";
+      };
+    }
+
+    {
+      name = "_types_node___node_10.12.12.tgz";
+      path = fetchurl {
+        name = "_types_node___node_10.12.12.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz";
+        sha1 = "e15a9d034d9210f00320ef718a50c4a799417c47";
+      };
+    }
+
+    {
+      name = "_types_node___node_6.0.41.tgz";
+      path = fetchurl {
+        name = "_types_node___node_6.0.41.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-6.0.41.tgz";
+        sha1 = "578cf53aaec65887bcaf16792f8722932e8ff8ea";
+      };
+    }
+
+    {
+      name = "_types_nodemailer___nodemailer_4.6.5.tgz";
+      path = fetchurl {
+        name = "_types_nodemailer___nodemailer_4.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-4.6.5.tgz";
+        sha1 = "8bb799202f8cfcc8200a1c1627f6a8a74fe71da6";
+      };
+    }
+
+    {
+      name = "_types_oauth2_server___oauth2_server_3.0.10.tgz";
+      path = fetchurl {
+        name = "_types_oauth2_server___oauth2_server_3.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/@types/oauth2-server/-/oauth2-server-3.0.10.tgz";
+        sha1 = "ea671a6ad3d02062aac5f7c1ba1fb9c468314db0";
+      };
+    }
+
+    {
+      name = "_types_parse_torrent_file___parse_torrent_file_4.0.1.tgz";
+      path = fetchurl {
+        name = "_types_parse_torrent_file___parse_torrent_file_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz";
+        sha1 = "056a6c18f3fac0cd7c6c74540f00496a3225976b";
+      };
+    }
+
+    {
+      name = "_types_parse_torrent___parse_torrent_5.8.2.tgz";
+      path = fetchurl {
+        name = "_types_parse_torrent___parse_torrent_5.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.2.tgz";
+        sha1 = "53ab880e38ced2005a79948f0df0c8762539323e";
+      };
+    }
+
+    {
+      name = "_types_pem___pem_1.9.3.tgz";
+      path = fetchurl {
+        name = "_types_pem___pem_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.3.tgz";
+        sha1 = "0c864c8b79e43fef6367db895f60fd1edd10e86c";
+      };
+    }
+
+    {
+      name = "_types_range_parser___range_parser_1.2.2.tgz";
+      path = fetchurl {
+        name = "_types_range_parser___range_parser_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz";
+        sha1 = "fa8e1ad1d474688a757140c91de6dace6f4abc8d";
+      };
+    }
+
+    {
+      name = "_types_redis___redis_2.8.8.tgz";
+      path = fetchurl {
+        name = "_types_redis___redis_2.8.8.tgz";
+        url  = "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.8.tgz";
+        sha1 = "70855e79a6020080cca3cb5f1f5ee7f11b49a979";
+      };
+    }
+
+    {
+      name = "_types_request___request_2.48.1.tgz";
+      path = fetchurl {
+        name = "_types_request___request_2.48.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/request/-/request-2.48.1.tgz";
+        sha1 = "e402d691aa6670fbbff1957b15f1270230ab42fa";
+      };
+    }
+
+    {
+      name = "_types_sequelize___sequelize_4.27.24.tgz";
+      path = fetchurl {
+        name = "_types_sequelize___sequelize_4.27.24.tgz";
+        url  = "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.27.24.tgz";
+        sha1 = "7d593c062c368f570c68b0217f5c1d4c892ead48";
+      };
+    }
+
+    {
+      name = "_types_serve_static___serve_static_1.13.2.tgz";
+      path = fetchurl {
+        name = "_types_serve_static___serve_static_1.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz";
+        sha1 = "f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48";
+      };
+    }
+
+    {
+      name = "_types_sharp___sharp_0.21.0.tgz";
+      path = fetchurl {
+        name = "_types_sharp___sharp_0.21.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.21.0.tgz";
+        sha1 = "e364b345c70e5924a5c626aaccaa236e0cfc2455";
+      };
+    }
+
+    {
+      name = "_types_simple_peer___simple_peer_6.1.5.tgz";
+      path = fetchurl {
+        name = "_types_simple_peer___simple_peer_6.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.5.tgz";
+        sha1 = "9353f84cefd052a9684b9a5662c983fc2bcfab41";
+      };
+    }
+
+    {
+      name = "_types_socket.io___socket.io_2.1.2.tgz";
+      path = fetchurl {
+        name = "_types_socket.io___socket.io_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.2.tgz";
+        sha1 = "7165c2587cc3b86b44aa78e2a0060140551de211";
+      };
+    }
+
+    {
+      name = "_types_superagent___superagent_3.8.4.tgz";
+      path = fetchurl {
+        name = "_types_superagent___superagent_3.8.4.tgz";
+        url  = "https://registry.yarnpkg.com/@types/superagent/-/superagent-3.8.4.tgz";
+        sha1 = "24a5973c7d1a9c024b4bbda742a79267c33fb86a";
+      };
+    }
+
+    {
+      name = "_types_supertest___supertest_2.0.7.tgz";
+      path = fetchurl {
+        name = "_types_supertest___supertest_2.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.7.tgz";
+        sha1 = "46ff6508075cd4519736be060f0d6331a5c8ca7b";
+      };
+    }
+
+    {
+      name = "_types_tough_cookie___tough_cookie_2.3.4.tgz";
+      path = fetchurl {
+        name = "_types_tough_cookie___tough_cookie_2.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.4.tgz";
+        sha1 = "821878b81bfab971b93a265a561d54ea61f9059f";
+      };
+    }
+
+    {
+      name = "_types_tv4___tv4_1.2.29.tgz";
+      path = fetchurl {
+        name = "_types_tv4___tv4_1.2.29.tgz";
+        url  = "https://registry.yarnpkg.com/@types/tv4/-/tv4-1.2.29.tgz";
+        sha1 = "4c6d2222b03245dd2104f4fd67f54d1658985911";
+      };
+    }
+
+    {
+      name = "_types_validator___validator_9.4.3.tgz";
+      path = fetchurl {
+        name = "_types_validator___validator_9.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/validator/-/validator-9.4.3.tgz";
+        sha1 = "11321eae0546b20f13020131ff890c294df72ecb";
+      };
+    }
+
+    {
+      name = "_types_webtorrent___webtorrent_0.98.4.tgz";
+      path = fetchurl {
+        name = "_types_webtorrent___webtorrent_0.98.4.tgz";
+        url  = "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz";
+        sha1 = "cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4";
+      };
+    }
+
+    {
+      name = "_types_ws___ws_6.0.1.tgz";
+      path = fetchurl {
+        name = "_types_ws___ws_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz";
+        sha1 = "ca7a3f3756aa12f62a0a62145ed14c6db25d5a28";
+      };
+    }
+
+    {
+      name = "JSONStream___JSONStream_1.3.5.tgz";
+      path = fetchurl {
+        name = "JSONStream___JSONStream_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz";
+        sha1 = "3208c1f08d3a4d99261ab64f92302bc15e111ca0";
+      };
+    }
+
+    {
+      name = "abbrev___abbrev_1.1.1.tgz";
+      path = fetchurl {
+        name = "abbrev___abbrev_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
+        sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.3.3.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz";
+        sha1 = "c3ca7434938648c3e0d9c1e328dd68b622c284ca";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.2.13.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz";
+        sha1 = "e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea";
+      };
+    }
+
+    {
+      name = "accepts___accepts_1.3.5.tgz";
+      path = fetchurl {
+        name = "accepts___accepts_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz";
+        sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2";
+      };
+    }
+
+    {
+      name = "acorn_jsx___acorn_jsx_3.0.1.tgz";
+      path = fetchurl {
+        name = "acorn_jsx___acorn_jsx_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz";
+        sha1 = "afdf9488fb1ecefc8348f6fb22f464e32a58b36b";
+      };
+    }
+
+    {
+      name = "acorn___acorn_3.3.0.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz";
+        sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
+      };
+    }
+
+    {
+      name = "acorn___acorn_5.7.3.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_5.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz";
+        sha1 = "67aa231bf8812974b85235a96771eb6bd07ea279";
+      };
+    }
+
+    {
+      name = "addr_to_ip_port___addr_to_ip_port_1.5.1.tgz";
+      path = fetchurl {
+        name = "addr_to_ip_port___addr_to_ip_port_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz";
+        sha1 = "bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208";
+      };
+    }
+
+    {
+      name = "addressparser___addressparser_1.0.1.tgz";
+      path = fetchurl {
+        name = "addressparser___addressparser_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz";
+        sha1 = "47afbe1a2a9262191db6838e4fd1d39b40821746";
+      };
+    }
+
+    {
+      name = "after___after_0.8.2.tgz";
+      path = fetchurl {
+        name = "after___after_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    }
+
+    {
+      name = "agent_base___agent_base_4.2.1.tgz";
+      path = fetchurl {
+        name = "agent_base___agent_base_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz";
+        sha1 = "d89e5999f797875674c07d87f260fc41e83e8ca9";
+      };
+    }
+
+    {
+      name = "agentkeepalive___agentkeepalive_3.5.2.tgz";
+      path = fetchurl {
+        name = "agentkeepalive___agentkeepalive_3.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz";
+        sha1 = "a113924dd3fa24a0bc3b78108c450c2abee00f67";
+      };
+    }
+
+    {
+      name = "ajv_keywords___ajv_keywords_1.5.1.tgz";
+      path = fetchurl {
+        name = "ajv_keywords___ajv_keywords_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz";
+        sha1 = "314dd0a4b3368fad3dfcdc54ede6171b886daf3c";
+      };
+    }
+
+    {
+      name = "ajv___ajv_4.11.8.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_4.11.8.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz";
+        sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
+      };
+    }
+
+    {
+      name = "ajv___ajv_6.6.1.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz";
+        sha1 = "6360f5ed0d80f232cc2b294c362d5dc2e538dd61";
+      };
+    }
+
+    {
+      name = "ansi_align___ansi_align_2.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_align___ansi_align_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz";
+        sha1 = "c36aeccba563b89ceb556f3690f0b1d9e3547f7f";
+      };
+    }
+
+    {
+      name = "ansi_escapes___ansi_escapes_1.4.0.tgz";
+      path = fetchurl {
+        name = "ansi_escapes___ansi_escapes_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz";
+        sha1 = "d3a8a83b319aa67793662b13e761c7911422306e";
+      };
+    }
+
+    {
+      name = "ansi_escapes___ansi_escapes_3.1.0.tgz";
+      path = fetchurl {
+        name = "ansi_escapes___ansi_escapes_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz";
+        sha1 = "f73207bb81207d75fd6c83f125af26eea378ca30";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_2.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    }
+
+    {
+      name = "ansi_regex___ansi_regex_3.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_2.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    }
+
+    {
+      name = "ansi_styles___ansi_styles_3.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
+        sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
+      };
+    }
+
+    {
+      name = "ansicolors___ansicolors_0.3.2.tgz";
+      path = fetchurl {
+        name = "ansicolors___ansicolors_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz";
+        sha1 = "665597de86a9ffe3aa9bfbe6cae5c6ea426b4979";
+      };
+    }
+
+    {
+      name = "ansistyles___ansistyles_0.1.3.tgz";
+      path = fetchurl {
+        name = "ansistyles___ansistyles_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz";
+        sha1 = "5de60415bda071bb37127854c864f41b23254539";
+      };
+    }
+
+    {
+      name = "any_observable___any_observable_0.3.0.tgz";
+      path = fetchurl {
+        name = "any_observable___any_observable_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz";
+        sha1 = "af933475e5806a67d0d7df090dd5e8bef65d119b";
+      };
+    }
+
+    {
+      name = "anymatch___anymatch_2.0.0.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
+        sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
+      };
+    }
+
+    {
+      name = "append_field___append_field_1.0.0.tgz";
+      path = fetchurl {
+        name = "append_field___append_field_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz";
+        sha1 = "1e3440e915f0b1203d23748e78edd7b9b5b43e56";
+      };
+    }
+
+    {
+      name = "application_config_path___application_config_path_0.1.0.tgz";
+      path = fetchurl {
+        name = "application_config_path___application_config_path_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/application-config-path/-/application-config-path-0.1.0.tgz";
+        sha1 = "193c5f0a86541a4c66fba1e2dc38583362ea5e8f";
+      };
+    }
+
+    {
+      name = "application_config___application_config_1.0.1.tgz";
+      path = fetchurl {
+        name = "application_config___application_config_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/application-config/-/application-config-1.0.1.tgz";
+        sha1 = "5aa2e2a5ed6abd2e5d1d473d3596f574044fe9e7";
+      };
+    }
+
+    {
+      name = "aproba___aproba_1.2.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
+        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
+      };
+    }
+
+    {
+      name = "aproba___aproba_2.0.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz";
+        sha1 = "52520b8ae5b569215b354efc0caa3fe1e45a8adc";
+      };
+    }
+
+    {
+      name = "archy___archy_1.0.0.tgz";
+      path = fetchurl {
+        name = "archy___archy_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz";
+        sha1 = "f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40";
+      };
+    }
+
+    {
+      name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+      path = fetchurl {
+        name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
+      };
+    }
+
+    {
+      name = "argparse___argparse_1.0.10.tgz";
+      path = fetchurl {
+        name = "argparse___argparse_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
+        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
+      };
+    }
+
+    {
+      name = "arr_diff___arr_diff_4.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
+        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
+      };
+    }
+
+    {
+      name = "arr_flatten___arr_flatten_1.1.0.tgz";
+      path = fetchurl {
+        name = "arr_flatten___arr_flatten_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
+      };
+    }
+
+    {
+      name = "arr_union___arr_union_3.1.0.tgz";
+      path = fetchurl {
+        name = "arr_union___arr_union_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    }
+
+    {
+      name = "array_flatten___array_flatten_1.1.1.tgz";
+      path = fetchurl {
+        name = "array_flatten___array_flatten_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    }
+
+    {
+      name = "array_union___array_union_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_union___array_union_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
+        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
+      };
+    }
+
+    {
+      name = "array_uniq___array_uniq_1.0.3.tgz";
+      path = fetchurl {
+        name = "array_uniq___array_uniq_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    }
+
+    {
+      name = "array_unique___array_unique_0.3.2.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
+        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
+      };
+    }
+
+    {
+      name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
+      path = fetchurl {
+        name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz";
+        sha1 = "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca";
+      };
+    }
+
+    {
+      name = "arraybuffer.slice___arraybuffer.slice_0.0.7.tgz";
+      path = fetchurl {
+        name = "arraybuffer.slice___arraybuffer.slice_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz";
+        sha1 = "3bbc4275dd584cc1b10809b89d4e8b63a69e7675";
+      };
+    }
+
+    {
+      name = "arrify___arrify_1.0.1.tgz";
+      path = fetchurl {
+        name = "arrify___arrify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz";
+        sha1 = "898508da2226f380df904728456849c1501a4b0d";
+      };
+    }
+
+    {
+      name = "asap___asap_2.0.6.tgz";
+      path = fetchurl {
+        name = "asap___asap_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz";
+        sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
+      };
+    }
+
+    {
+      name = "asn1___asn1_0.2.3.tgz";
+      path = fetchurl {
+        name = "asn1___asn1_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz";
+        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
+      };
+    }
+
+    {
+      name = "asn1___asn1_0.2.4.tgz";
+      path = fetchurl {
+        name = "asn1___asn1_0.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz";
+        sha1 = "8d2475dfab553bb33e77b54e59e880bb8ce23136";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_0.1.5.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz";
+        sha1 = "ee74009413002d84cec7219c6ac811812e723160";
+      };
+    }
+
+    {
+      name = "assert_plus___assert_plus_1.0.0.tgz";
+      path = fetchurl {
+        name = "assert_plus___assert_plus_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    }
+
+    {
+      name = "assertion_error___assertion_error_1.0.0.tgz";
+      path = fetchurl {
+        name = "assertion_error___assertion_error_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz";
+        sha1 = "c7f85438fdd466bc7ca16ab90c81513797a5d23b";
+      };
+    }
+
+    {
+      name = "assertion_error___assertion_error_1.1.0.tgz";
+      path = fetchurl {
+        name = "assertion_error___assertion_error_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz";
+        sha1 = "e60b6b0e8f301bd97e5375215bda406c85118c0b";
+      };
+    }
+
+    {
+      name = "assign_symbols___assign_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "assign_symbols___assign_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
+        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
+      };
+    }
+
+    {
+      name = "async_each___async_each_1.0.1.tgz";
+      path = fetchurl {
+        name = "async_each___async_each_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
+        sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
+      };
+    }
+
+    {
+      name = "async_limiter___async_limiter_1.0.0.tgz";
+      path = fetchurl {
+        name = "async_limiter___async_limiter_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz";
+        sha1 = "78faed8c3d074ab81f22b4e985d79e8738f720f8";
+      };
+    }
+
+    {
+      name = "async_lock___async_lock_1.1.3.tgz";
+      path = fetchurl {
+        name = "async_lock___async_lock_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/async-lock/-/async-lock-1.1.3.tgz";
+        sha1 = "e47f1cbb6bec765b73e27ed8961d58006457ec08";
+      };
+    }
+
+    {
+      name = "async_lru___async_lru_1.1.2.tgz";
+      path = fetchurl {
+        name = "async_lru___async_lru_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/async-lru/-/async-lru-1.1.2.tgz";
+        sha1 = "abe831f3a52123c87d44273615e203b1ef04692e";
+      };
+    }
+
+    {
+      name = "async___async_1.5.1.tgz";
+      path = fetchurl {
+        name = "async___async_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-1.5.1.tgz";
+        sha1 = "b05714f4b11b357bf79adaffdd06da42d0766c10";
+      };
+    }
+
+    {
+      name = "async___async_2.6.1.tgz";
+      path = fetchurl {
+        name = "async___async_2.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz";
+        sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610";
+      };
+    }
+
+    {
+      name = "async___async_0.9.2.tgz";
+      path = fetchurl {
+        name = "async___async_0.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz";
+        sha1 = "aea74d5e61c1f899613bf64bda66d4c78f2fd17d";
+      };
+    }
+
+    {
+      name = "async___async_1.0.0.tgz";
+      path = fetchurl {
+        name = "async___async_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz";
+        sha1 = "f8fc04ca3a13784ade9e1641af98578cfbd647a9";
+      };
+    }
+
+    {
+      name = "asynckit___asynckit_0.4.0.tgz";
+      path = fetchurl {
+        name = "asynckit___asynckit_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    }
+
+    {
+      name = "atob___atob_2.1.2.tgz";
+      path = fetchurl {
+        name = "atob___atob_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
+        sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
+      };
+    }
+
+    {
+      name = "aws_sign2___aws_sign2_0.7.0.tgz";
+      path = fetchurl {
+        name = "aws_sign2___aws_sign2_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    }
+
+    {
+      name = "aws4___aws4_1.8.0.tgz";
+      path = fetchurl {
+        name = "aws4___aws4_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz";
+        sha1 = "f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f";
+      };
+    }
+
+    {
+      name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
+        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
+      };
+    }
+
+    {
+      name = "backo2___backo2_1.0.2.tgz";
+      path = fetchurl {
+        name = "backo2___backo2_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    }
+
+    {
+      name = "backoff___backoff_2.5.0.tgz";
+      path = fetchurl {
+        name = "backoff___backoff_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz";
+        sha1 = "f616eda9d3e4b66b8ca7fca79f695722c5f8e26f";
+      };
+    }
+
+    {
+      name = "balanced_match___balanced_match_1.0.0.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    }
+
+    {
+      name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
+      path = fetchurl {
+        name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    }
+
+    {
+      name = "base64id___base64id_1.0.0.tgz";
+      path = fetchurl {
+        name = "base64id___base64id_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz";
+        sha1 = "47688cb99bb6804f0e06d3e763b1c32e57d8e6b6";
+      };
+    }
+
+    {
+      name = "base___base_0.11.2.tgz";
+      path = fetchurl {
+        name = "base___base_0.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
+        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
+      };
+    }
+
+    {
+      name = "basic_auth___basic_auth_1.1.0.tgz";
+      path = fetchurl {
+        name = "basic_auth___basic_auth_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz";
+        sha1 = "45221ee429f7ee1e5035be3f51533f1cdfd29884";
+      };
+    }
+
+    {
+      name = "basic_auth___basic_auth_2.0.1.tgz";
+      path = fetchurl {
+        name = "basic_auth___basic_auth_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz";
+        sha1 = "b998279bf47ce38344b4f3cf916d4679bbf51e3a";
+      };
+    }
+
+    {
+      name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+      path = fetchurl {
+        name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    }
+
+    {
+      name = "bcrypt___bcrypt_3.0.2.tgz";
+      path = fetchurl {
+        name = "bcrypt___bcrypt_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.2.tgz";
+        sha1 = "3c575c49ccbfdf0875eb42aa1453f5654092a33d";
+      };
+    }
+
+    {
+      name = "bencode___bencode_2.0.0.tgz";
+      path = fetchurl {
+        name = "bencode___bencode_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bencode/-/bencode-2.0.0.tgz";
+        sha1 = "e72e6b3691d824bd03ea7aa9d752cd1d49a50027";
+      };
+    }
+
+    {
+      name = "better_assert___better_assert_1.0.2.tgz";
+      path = fetchurl {
+        name = "better_assert___better_assert_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    }
+
+    {
+      name = "bin_links___bin_links_1.1.2.tgz";
+      path = fetchurl {
+        name = "bin_links___bin_links_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz";
+        sha1 = "fb74bd54bae6b7befc6c6221f25322ac830d9757";
+      };
+    }
+
+    {
+      name = "binary_extensions___binary_extensions_1.12.0.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_1.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz";
+        sha1 = "c2d780f53d45bba8317a8902d4ceeaf3a6385b14";
+      };
+    }
+
+    {
+      name = "binary_search___binary_search_1.3.4.tgz";
+      path = fetchurl {
+        name = "binary_search___binary_search_1.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.4.tgz";
+        sha1 = "d15f44ff9226ef309d85247fa0dbfbf659955f56";
+      };
+    }
+
+    {
+      name = "bindings___bindings_1.3.1.tgz";
+      path = fetchurl {
+        name = "bindings___bindings_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz";
+        sha1 = "21fc7c6d67c18516ec5aaa2815b145ff77b26ea5";
+      };
+    }
+
+    {
+      name = "bindings___bindings_1.2.1.tgz";
+      path = fetchurl {
+        name = "bindings___bindings_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz";
+        sha1 = "14ad6113812d2d37d72e67b4cacb4bb726505f11";
+      };
+    }
+
+    {
+      name = "bitcore_lib___bitcore_lib_0.13.19.tgz";
+      path = fetchurl {
+        name = "bitcore_lib___bitcore_lib_0.13.19.tgz";
+        url  = "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.13.19.tgz";
+        sha1 = "48af1e9bda10067c1ab16263472b5add2000f3dc";
+      };
+    }
+
+    {
+      name = "https___codeload.github.com_CoMakery_bitcore_message_tar.gz_8799cc327029c3d34fc725f05b2cf981363f6ebf";
+      path = fetchurl {
+        name = "https___codeload.github.com_CoMakery_bitcore_message_tar.gz_8799cc327029c3d34fc725f05b2cf981363f6ebf";
+        url  = "https://codeload.github.com/CoMakery/bitcore-message/tar.gz/8799cc327029c3d34fc725f05b2cf981363f6ebf";
+        sha1 = "c5ac190157ac535fd6aeb3148ab5591ea874e281";
+      };
+    }
+
+    {
+      name = "bitfield___bitfield_2.0.0.tgz";
+      path = fetchurl {
+        name = "bitfield___bitfield_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz";
+        sha1 = "fbe6767592fe5b4c87ecf1d04126294cc1bfa837";
+      };
+    }
+
+    {
+      name = "bittorrent_dht___bittorrent_dht_9.0.0.tgz";
+      path = fetchurl {
+        name = "bittorrent_dht___bittorrent_dht_9.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bittorrent-dht/-/bittorrent-dht-9.0.0.tgz";
+        sha1 = "08d5ebb51ed91d7e3eea5c275554f4323fb523e5";
+      };
+    }
+
+    {
+      name = "bittorrent_peerid___bittorrent_peerid_1.3.0.tgz";
+      path = fetchurl {
+        name = "bittorrent_peerid___bittorrent_peerid_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz";
+        sha1 = "a435d3b267c887c586c528b53359845905d7c158";
+      };
+    }
+
+    {
+      name = "bittorrent_protocol___bittorrent_protocol_3.0.1.tgz";
+      path = fetchurl {
+        name = "bittorrent_protocol___bittorrent_protocol_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz";
+        sha1 = "d3948f4d2b09d538095f7e5f93f64ba5df6b5c2a";
+      };
+    }
+
+    {
+      name = "bittorrent_tracker___bittorrent_tracker_9.10.1.tgz";
+      path = fetchurl {
+        name = "bittorrent_tracker___bittorrent_tracker_9.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz";
+        sha1 = "5de14aac012a287af394d3cc9eda1ec6cc956f11";
+      };
+    }
+
+    {
+      name = "bl___bl_1.2.2.tgz";
+      path = fetchurl {
+        name = "bl___bl_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz";
+        sha1 = "a160911717103c07410cef63ef51b397c025af9c";
+      };
+    }
+
+    {
+      name = "blob_to_buffer___blob_to_buffer_1.2.8.tgz";
+      path = fetchurl {
+        name = "blob_to_buffer___blob_to_buffer_1.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz";
+        sha1 = "78eeeb332f1280ed0ca6fb2b60693a8c6d36903a";
+      };
+    }
+
+    {
+      name = "blob___blob_0.0.4.tgz";
+      path = fetchurl {
+        name = "blob___blob_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz";
+        sha1 = "bcf13052ca54463f30f9fc7e95b9a47630a94921";
+      };
+    }
+
+    {
+      name = "blob___blob_0.0.5.tgz";
+      path = fetchurl {
+        name = "blob___blob_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz";
+        sha1 = "d680eeef25f8cd91ad533f5b01eed48e64caf683";
+      };
+    }
+
+    {
+      name = "block_stream2___block_stream2_1.1.0.tgz";
+      path = fetchurl {
+        name = "block_stream2___block_stream2_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz";
+        sha1 = "c738e3a91ba977ebb5e1fef431e13ca11d8639e2";
+      };
+    }
+
+    {
+      name = "block_stream___block_stream_0.0.9.tgz";
+      path = fetchurl {
+        name = "block_stream___block_stream_0.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
+        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
+      };
+    }
+
+    {
+      name = "bluebird___bluebird_3.5.0.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_3.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz";
+        sha1 = "791420d7f551eea2897453a8a77653f96606d67c";
+      };
+    }
+
+    {
+      name = "bluebird___bluebird_2.11.0.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_2.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz";
+        sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
+      };
+    }
+
+    {
+      name = "bluebird___bluebird_3.5.3.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_3.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz";
+        sha1 = "7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7";
+      };
+    }
+
+    {
+      name = "bn.js___bn.js_2.0.4.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz";
+        sha1 = "220a7cd677f7f1bfa93627ff4193776fe7819480";
+      };
+    }
+
+    {
+      name = "bn.js___bn.js_2.2.0.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz";
+        sha1 = "12162bc2ae71fc40a5626c33438f3a875cd37625";
+      };
+    }
+
+    {
+      name = "bn.js___bn.js_4.11.8.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_4.11.8.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz";
+        sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f";
+      };
+    }
+
+    {
+      name = "body_parser___body_parser_1.18.3.tgz";
+      path = fetchurl {
+        name = "body_parser___body_parser_1.18.3.tgz";
+        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz";
+        sha1 = "5b292198ffdd553b3a0f20ded0592b956955c8b4";
+      };
+    }
+
+    {
+      name = "boxen___boxen_1.3.0.tgz";
+      path = fetchurl {
+        name = "boxen___boxen_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz";
+        sha1 = "55c6c39a8ba58d9c61ad22cd877532deb665a20b";
+      };
+    }
+
+    {
+      name = "brace_expansion___brace_expansion_1.1.11.tgz";
+      path = fetchurl {
+        name = "brace_expansion___brace_expansion_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
+      };
+    }
+
+    {
+      name = "braces___braces_2.3.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
+        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
+      };
+    }
+
+    {
+      name = "brorand___brorand_1.1.0.tgz";
+      path = fetchurl {
+        name = "brorand___brorand_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
+        sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
+      };
+    }
+
+    {
+      name = "browser_stdout___browser_stdout_1.3.1.tgz";
+      path = fetchurl {
+        name = "browser_stdout___browser_stdout_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz";
+        sha1 = "baa559ee14ced73452229bad7326467c61fabd60";
+      };
+    }
+
+    {
+      name = "browserify_package_json___browserify_package_json_1.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_package_json___browserify_package_json_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz";
+        sha1 = "98dde8aa5c561fd6d3fe49bbaa102b74b396fdea";
+      };
+    }
+
+    {
+      name = "bs58___bs58_2.0.0.tgz";
+      path = fetchurl {
+        name = "bs58___bs58_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz";
+        sha1 = "72b713bed223a0ac518bbda0e3ce3f4817f39eb5";
+      };
+    }
+
+    {
+      name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
+      path = fetchurl {
+        name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz";
+        sha1 = "bd7dc26ae2972d0eda253be061dba992349c19f0";
+      };
+    }
+
+    {
+      name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
+      path = fetchurl {
+        name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz";
+        sha1 = "890dd90d923a873e08e10e5fd51a57e5b7cce0ec";
+      };
+    }
+
+    {
+      name = "buffer_compare___buffer_compare_1.0.0.tgz";
+      path = fetchurl {
+        name = "buffer_compare___buffer_compare_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz";
+        sha1 = "acaa7a966e98eee9fae14b31c39a5f158fb3c4a2";
+      };
+    }
+
+    {
+      name = "buffer_equal_constant_time___buffer_equal_constant_time_1.0.1.tgz";
+      path = fetchurl {
+        name = "buffer_equal_constant_time___buffer_equal_constant_time_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz";
+        sha1 = "f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819";
+      };
+    }
+
+    {
+      name = "buffer_equals___buffer_equals_1.0.4.tgz";
+      path = fetchurl {
+        name = "buffer_equals___buffer_equals_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz";
+        sha1 = "0353b54fd07fd9564170671ae6f66b9cf10d27f5";
+      };
+    }
+
+    {
+      name = "buffer_fill___buffer_fill_1.0.0.tgz";
+      path = fetchurl {
+        name = "buffer_fill___buffer_fill_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz";
+        sha1 = "f8f78b76789888ef39f205cd637f68e702122b2c";
+      };
+    }
+
+    {
+      name = "buffer_from___buffer_from_1.1.1.tgz";
+      path = fetchurl {
+        name = "buffer_from___buffer_from_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz";
+        sha1 = "32713bc028f75c02fdb710d7c7bcec1f2c6070ef";
+      };
+    }
+
+    {
+      name = "buffer_writer___buffer_writer_2.0.0.tgz";
+      path = fetchurl {
+        name = "buffer_writer___buffer_writer_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz";
+        sha1 = "ce7eb81a38f7829db09c873f2fbb792c0c98ec04";
+      };
+    }
+
+    {
+      name = "bufferutil___bufferutil_4.0.0.tgz";
+      path = fetchurl {
+        name = "bufferutil___bufferutil_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.0.tgz";
+        sha1 = "a5078160e443751a4e83b6f4d6d7e26c058326a0";
+      };
+    }
+
+    {
+      name = "builtin_modules___builtin_modules_1.1.1.tgz";
+      path = fetchurl {
+        name = "builtin_modules___builtin_modules_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz";
+        sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
+      };
+    }
+
+    {
+      name = "builtins___builtins_1.0.3.tgz";
+      path = fetchurl {
+        name = "builtins___builtins_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz";
+        sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
+      };
+    }
+
+    {
+      name = "bull___bull_3.5.2.tgz";
+      path = fetchurl {
+        name = "bull___bull_3.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/bull/-/bull-3.5.2.tgz";
+        sha1 = "9c85f205b17686efab2ee28aaa4388887360de32";
+      };
+    }
+
+    {
+      name = "bunyan___bunyan_1.8.12.tgz";
+      path = fetchurl {
+        name = "bunyan___bunyan_1.8.12.tgz";
+        url  = "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz";
+        sha1 = "f150f0f6748abdd72aeae84f04403be2ef113797";
+      };
+    }
+
+    {
+      name = "busboy___busboy_0.2.14.tgz";
+      path = fetchurl {
+        name = "busboy___busboy_0.2.14.tgz";
+        url  = "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz";
+        sha1 = "6c2a622efcf47c57bbbe1e2a9c37ad36c7925453";
+      };
+    }
+
+    {
+      name = "byline___byline_5.0.0.tgz";
+      path = fetchurl {
+        name = "byline___byline_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz";
+        sha1 = "741c5216468eadc457b03410118ad77de8c1ddb1";
+      };
+    }
+
+    {
+      name = "byte_size___byte_size_4.0.4.tgz";
+      path = fetchurl {
+        name = "byte_size___byte_size_4.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.4.tgz";
+        sha1 = "29d381709f41aae0d89c631f1c81aec88cd40b23";
+      };
+    }
+
+    {
+      name = "bytes___bytes_3.0.0.tgz";
+      path = fetchurl {
+        name = "bytes___bytes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
+        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
+      };
+    }
+
+    {
+      name = "cacache___cacache_10.0.4.tgz";
+      path = fetchurl {
+        name = "cacache___cacache_10.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz";
+        sha1 = "6452367999eff9d4188aefd9a14e9d7c6a263460";
+      };
+    }
+
+    {
+      name = "cacache___cacache_11.3.1.tgz";
+      path = fetchurl {
+        name = "cacache___cacache_11.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz";
+        sha1 = "d09d25f6c4aca7a6d305d141ae332613aa1d515f";
+      };
+    }
+
+    {
+      name = "cache_base___cache_base_1.0.1.tgz";
+      path = fetchurl {
+        name = "cache_base___cache_base_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
+        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
+      };
+    }
+
+    {
+      name = "call_limit___call_limit_1.1.0.tgz";
+      path = fetchurl {
+        name = "call_limit___call_limit_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz";
+        sha1 = "6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea";
+      };
+    }
+
+    {
+      name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
+      path = fetchurl {
+        name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
+        sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
+      };
+    }
+
+    {
+      name = "caller_callsite___caller_callsite_2.0.0.tgz";
+      path = fetchurl {
+        name = "caller_callsite___caller_callsite_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz";
+        sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
+      };
+    }
+
+    {
+      name = "caller_path___caller_path_0.1.0.tgz";
+      path = fetchurl {
+        name = "caller_path___caller_path_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz";
+        sha1 = "94085ef63581ecd3daa92444a8fe94e82577751f";
+      };
+    }
+
+    {
+      name = "caller_path___caller_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "caller_path___caller_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz";
+        sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
+      };
+    }
+
+    {
+      name = "callsite___callsite_1.0.0.tgz";
+      path = fetchurl {
+        name = "callsite___callsite_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    }
+
+    {
+      name = "callsites___callsites_0.2.0.tgz";
+      path = fetchurl {
+        name = "callsites___callsites_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz";
+        sha1 = "afab96262910a7f33c19a5775825c69f34e350ca";
+      };
+    }
+
+    {
+      name = "callsites___callsites_2.0.0.tgz";
+      path = fetchurl {
+        name = "callsites___callsites_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz";
+        sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_4.1.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz";
+        sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
+      };
+    }
+
+    {
+      name = "camelcase___camelcase_5.0.0.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz";
+        sha1 = "03295527d58bd3cd4aa75363f35b2e8d97be2f42";
+      };
+    }
+
+    {
+      name = "camelize___camelize_1.0.0.tgz";
+      path = fetchurl {
+        name = "camelize___camelize_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz";
+        sha1 = "164a5483e630fa4321e5af07020e531831b2609b";
+      };
+    }
+
+    {
+      name = "capture_stack_trace___capture_stack_trace_1.0.1.tgz";
+      path = fetchurl {
+        name = "capture_stack_trace___capture_stack_trace_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz";
+        sha1 = "a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d";
+      };
+    }
+
+    {
+      name = "caseless___caseless_0.12.0.tgz";
+      path = fetchurl {
+        name = "caseless___caseless_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    }
+
+    {
+      name = "chai_json_schema___chai_json_schema_1.5.0.tgz";
+      path = fetchurl {
+        name = "chai_json_schema___chai_json_schema_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/chai-json-schema/-/chai-json-schema-1.5.0.tgz";
+        sha1 = "6960719e40f71fd5b377c9282e5c9a46799474f6";
+      };
+    }
+
+    {
+      name = "chai_xml___chai_xml_0.3.2.tgz";
+      path = fetchurl {
+        name = "chai_xml___chai_xml_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/chai-xml/-/chai-xml-0.3.2.tgz";
+        sha1 = "61d0776aa8fd936a2178769adcaabf3bfb52b8b1";
+      };
+    }
+
+    {
+      name = "chai___chai_1.10.0.tgz";
+      path = fetchurl {
+        name = "chai___chai_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/chai/-/chai-1.10.0.tgz";
+        sha1 = "e4031cc87654461a75943e5a35ab46eaf39c1eb9";
+      };
+    }
+
+    {
+      name = "chai___chai_4.2.0.tgz";
+      path = fetchurl {
+        name = "chai___chai_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz";
+        sha1 = "760aa72cf20e3795e84b12877ce0e83737aa29e5";
+      };
+    }
+
+    {
+      name = "chalk___chalk_1.1.3.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    }
+
+    {
+      name = "chalk___chalk_2.4.1.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_2.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz";
+        sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e";
+      };
+    }
+
+    {
+      name = "charenc___charenc_0.0.2.tgz";
+      path = fetchurl {
+        name = "charenc___charenc_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz";
+        sha1 = "c0a1d2f3a7092e03774bfa83f14c0fc5790a8667";
+      };
+    }
+
+    {
+      name = "charset_detector___charset_detector_0.0.2.tgz";
+      path = fetchurl {
+        name = "charset_detector___charset_detector_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/charset-detector/-/charset-detector-0.0.2.tgz";
+        sha1 = "1cd5ddaf56e83259c6ef8e906ccf06f75fe9a1b2";
+      };
+    }
+
+    {
+      name = "check_error___check_error_1.0.2.tgz";
+      path = fetchurl {
+        name = "check_error___check_error_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz";
+        sha1 = "574d312edd88bb5dd8912e9286dd6c0aed4aac82";
+      };
+    }
+
+    {
+      name = "chokidar___chokidar_2.0.4.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz";
+        sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26";
+      };
+    }
+
+    {
+      name = "chownr___chownr_1.1.1.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz";
+        sha1 = "54726b8b8fff4df053c42187e801fb4412df1494";
+      };
+    }
+
+    {
+      name = "chownr___chownr_1.0.1.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz";
+        sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181";
+      };
+    }
+
+    {
+      name = "chunk_store_stream___chunk_store_stream_3.0.1.tgz";
+      path = fetchurl {
+        name = "chunk_store_stream___chunk_store_stream_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/chunk-store-stream/-/chunk-store-stream-3.0.1.tgz";
+        sha1 = "8e0d739226dcb386f44447b82a005b597a1d41d9";
+      };
+    }
+
+    {
+      name = "ci_info___ci_info_1.6.0.tgz";
+      path = fetchurl {
+        name = "ci_info___ci_info_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz";
+        sha1 = "2ca20dbb9ceb32d4524a683303313f0304b1e497";
+      };
+    }
+
+    {
+      name = "cidr_regex___cidr_regex_2.0.10.tgz";
+      path = fetchurl {
+        name = "cidr_regex___cidr_regex_2.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz";
+        sha1 = "af13878bd4ad704de77d6dc800799358b3afa70d";
+      };
+    }
+
+    {
+      name = "circular_json___circular_json_0.3.3.tgz";
+      path = fetchurl {
+        name = "circular_json___circular_json_0.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz";
+        sha1 = "815c99ea84f6809529d2f45791bdf82711352d66";
+      };
+    }
+
+    {
+      name = "class_utils___class_utils_0.3.6.tgz";
+      path = fetchurl {
+        name = "class_utils___class_utils_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
+        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
+      };
+    }
+
+    {
+      name = "cli_boxes___cli_boxes_1.0.0.tgz";
+      path = fetchurl {
+        name = "cli_boxes___cli_boxes_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz";
+        sha1 = "4fa917c3e59c94a004cd61f8ee509da651687143";
+      };
+    }
+
+    {
+      name = "cli_columns___cli_columns_3.1.2.tgz";
+      path = fetchurl {
+        name = "cli_columns___cli_columns_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz";
+        sha1 = "6732d972979efc2ae444a1f08e08fa139c96a18e";
+      };
+    }
+
+    {
+      name = "cli_cursor___cli_cursor_1.0.2.tgz";
+      path = fetchurl {
+        name = "cli_cursor___cli_cursor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz";
+        sha1 = "64da3f7d56a54412e59794bd62dc35295e8f2987";
+      };
+    }
+
+    {
+      name = "cli_cursor___cli_cursor_2.1.0.tgz";
+      path = fetchurl {
+        name = "cli_cursor___cli_cursor_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz";
+        sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
+      };
+    }
+
+    {
+      name = "cli_table3___cli_table3_0.5.1.tgz";
+      path = fetchurl {
+        name = "cli_table3___cli_table3_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz";
+        sha1 = "0252372d94dfc40dbd8df06005f48f31f656f202";
+      };
+    }
+
+    {
+      name = "cli_table___cli_table_0.3.1.tgz";
+      path = fetchurl {
+        name = "cli_table___cli_table_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz";
+        sha1 = "f53b05266a8b1a0b934b3d0821e6e2dc5914ae23";
+      };
+    }
+
+    {
+      name = "cli_truncate___cli_truncate_0.2.1.tgz";
+      path = fetchurl {
+        name = "cli_truncate___cli_truncate_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz";
+        sha1 = "9f15cfbb0705005369216c626ac7d05ab90dd574";
+      };
+    }
+
+    {
+      name = "cli_width___cli_width_2.2.0.tgz";
+      path = fetchurl {
+        name = "cli_width___cli_width_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz";
+        sha1 = "ff19ede8a9a5e579324147b0c11f0fbcbabed639";
+      };
+    }
+
+    {
+      name = "cliui___cliui_4.1.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz";
+        sha1 = "348422dbe82d800b3022eef4f6ac10bf2e4d1b49";
+      };
+    }
+
+    {
+      name = "clone___clone_1.0.4.tgz";
+      path = fetchurl {
+        name = "clone___clone_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
+        sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
+      };
+    }
+
+    {
+      name = "closest_to___closest_to_2.0.0.tgz";
+      path = fetchurl {
+        name = "closest_to___closest_to_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/closest-to/-/closest-to-2.0.0.tgz";
+        sha1 = "bb2a860edb7769b62d04821748ae50da24dbefaa";
+      };
+    }
+
+    {
+      name = "cls_bluebird___cls_bluebird_2.1.0.tgz";
+      path = fetchurl {
+        name = "cls_bluebird___cls_bluebird_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz";
+        sha1 = "37ef1e080a8ffb55c2f4164f536f1919e7968aee";
+      };
+    }
+
+    {
+      name = "cluster_key_slot___cluster_key_slot_1.0.12.tgz";
+      path = fetchurl {
+        name = "cluster_key_slot___cluster_key_slot_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz";
+        sha1 = "d5deff2a520717bc98313979b687309b2d368e29";
+      };
+    }
+
+    {
+      name = "cmd_shim___cmd_shim_2.0.2.tgz";
+      path = fetchurl {
+        name = "cmd_shim___cmd_shim_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz";
+        sha1 = "6fcbda99483a8fd15d7d30a196ca69d688a2efdb";
+      };
+    }
+
+    {
+      name = "co_bluebird___co_bluebird_1.1.0.tgz";
+      path = fetchurl {
+        name = "co_bluebird___co_bluebird_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/co-bluebird/-/co-bluebird-1.1.0.tgz";
+        sha1 = "c8b9f3a9320a7ed30987dcca1a5c3cff59655c7c";
+      };
+    }
+
+    {
+      name = "co_use___co_use_1.1.0.tgz";
+      path = fetchurl {
+        name = "co_use___co_use_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/co-use/-/co-use-1.1.0.tgz";
+        sha1 = "c6bb3cdf10cb735ecaa9daeeda46d725c94a4e62";
+      };
+    }
+
+    {
+      name = "co___co_4.6.0.tgz";
+      path = fetchurl {
+        name = "co___co_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    }
+
+    {
+      name = "code_point_at___code_point_at_1.1.0.tgz";
+      path = fetchurl {
+        name = "code_point_at___code_point_at_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    }
+
+    {
+      name = "collection_visit___collection_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "collection_visit___collection_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
+        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
+      };
+    }
+
+    {
+      name = "color_convert___color_convert_1.9.3.tgz";
+      path = fetchurl {
+        name = "color_convert___color_convert_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz";
+        sha1 = "bb71850690e1f136567de629d2d5471deda4c1e8";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.3.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    }
+
+    {
+      name = "color_name___color_name_1.1.4.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz";
+        sha1 = "c2a09a87acbde69543de6f63fa3995c826c536a2";
+      };
+    }
+
+    {
+      name = "color_string___color_string_1.5.3.tgz";
+      path = fetchurl {
+        name = "color_string___color_string_1.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz";
+        sha1 = "c9bbc5f01b58b5492f3d6857459cb6590ce204cc";
+      };
+    }
+
+    {
+      name = "color___color_3.0.0.tgz";
+      path = fetchurl {
+        name = "color___color_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz";
+        sha1 = "d920b4328d534a3ac8295d68f7bd4ba6c427be9a";
+      };
+    }
+
+    {
+      name = "color___color_3.1.0.tgz";
+      path = fetchurl {
+        name = "color___color_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz";
+        sha1 = "d8e9fb096732875774c84bf922815df0308d0ffc";
+      };
+    }
+
+    {
+      name = "colornames___colornames_1.1.1.tgz";
+      path = fetchurl {
+        name = "colornames___colornames_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz";
+        sha1 = "f8889030685c7c4ff9e2a559f5077eb76a816f96";
+      };
+    }
+
+    {
+      name = "colors___colors_1.0.3.tgz";
+      path = fetchurl {
+        name = "colors___colors_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz";
+        sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
+      };
+    }
+
+    {
+      name = "colors___colors_1.3.2.tgz";
+      path = fetchurl {
+        name = "colors___colors_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz";
+        sha1 = "2df8ff573dfbf255af562f8ce7181d6b971a359b";
+      };
+    }
+
+    {
+      name = "colorspace___colorspace_1.1.1.tgz";
+      path = fetchurl {
+        name = "colorspace___colorspace_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz";
+        sha1 = "9ac2491e1bc6f8fb690e2176814f8d091636d972";
+      };
+    }
+
+    {
+      name = "columnify___columnify_1.5.4.tgz";
+      path = fetchurl {
+        name = "columnify___columnify_1.5.4.tgz";
+        url  = "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz";
+        sha1 = "4737ddf1c7b69a8a7c340570782e947eec8e78bb";
+      };
+    }
+
+    {
+      name = "combined_stream___combined_stream_1.0.7.tgz";
+      path = fetchurl {
+        name = "combined_stream___combined_stream_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz";
+        sha1 = "2d1d24317afb8abe95d6d2c0b07b57813539d828";
+      };
+    }
+
+    {
+      name = "commander___commander_2.15.1.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.15.1.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz";
+        sha1 = "df46e867d0fc2aec66a34662b406a9ccafff5b0f";
+      };
+    }
+
+    {
+      name = "commander___commander_2.9.0.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz";
+        sha1 = "9c99094176e12240cb22d6c5146098400fe0f7d4";
+      };
+    }
+
+    {
+      name = "commander___commander_2.19.0.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.19.0.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz";
+        sha1 = "f6198aa84e5b83c46054b94ddedbfed5ee9ff12a";
+      };
+    }
+
+    {
+      name = "compact2string___compact2string_1.4.0.tgz";
+      path = fetchurl {
+        name = "compact2string___compact2string_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/compact2string/-/compact2string-1.4.0.tgz";
+        sha1 = "a99cd96ea000525684b269683ae2222d6eea7b49";
+      };
+    }
+
+    {
+      name = "component_bind___component_bind_1.0.0.tgz";
+      path = fetchurl {
+        name = "component_bind___component_bind_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.1.2.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz";
+        sha1 = "296594f2753daa63996d2af08d15a95116c9aec3";
+      };
+    }
+
+    {
+      name = "component_emitter___component_emitter_1.2.1.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    }
+
+    {
+      name = "component_inherit___component_inherit_0.0.3.tgz";
+      path = fetchurl {
+        name = "component_inherit___component_inherit_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    }
+
+    {
+      name = "concat_map___concat_map_0.0.1.tgz";
+      path = fetchurl {
+        name = "concat_map___concat_map_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    }
+
+    {
+      name = "concat_stream___concat_stream_1.6.2.tgz";
+      path = fetchurl {
+        name = "concat_stream___concat_stream_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz";
+        sha1 = "904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34";
+      };
+    }
+
+    {
+      name = "concurrently___concurrently_4.1.0.tgz";
+      path = fetchurl {
+        name = "concurrently___concurrently_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz";
+        sha1 = "17fdf067da71210685d9ea554423ef239da30d33";
+      };
+    }
+
+    {
+      name = "config_chain___config_chain_1.1.12.tgz";
+      path = fetchurl {
+        name = "config_chain___config_chain_1.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz";
+        sha1 = "0fde8d091200eb5e808caf25fe618c02f48e4efa";
+      };
+    }
+
+    {
+      name = "config___config_3.0.0.tgz";
+      path = fetchurl {
+        name = "config___config_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/config/-/config-3.0.0.tgz";
+        sha1 = "a71cdbb22d225df9eff20b95178d65a63c452367";
+      };
+    }
+
+    {
+      name = "configstore___configstore_3.1.2.tgz";
+      path = fetchurl {
+        name = "configstore___configstore_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz";
+        sha1 = "c6f25defaeef26df12dd33414b001fe81a543f8f";
+      };
+    }
+
+    {
+      name = "console_control_strings___console_control_strings_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_control_strings___console_control_strings_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    }
+
+    {
+      name = "content_disposition___content_disposition_0.5.1.tgz";
+      path = fetchurl {
+        name = "content_disposition___content_disposition_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz";
+        sha1 = "87476c6a67c8daa87e32e87616df883ba7fb071b";
+      };
+    }
+
+    {
+      name = "content_disposition___content_disposition_0.5.2.tgz";
+      path = fetchurl {
+        name = "content_disposition___content_disposition_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz";
+        sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
+      };
+    }
+
+    {
+      name = "content_security_policy_builder___content_security_policy_builder_2.0.0.tgz";
+      path = fetchurl {
+        name = "content_security_policy_builder___content_security_policy_builder_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz";
+        sha1 = "8749a1d542fcbe82237281ea9f716ce68b394dd2";
+      };
+    }
+
+    {
+      name = "content_type___content_type_1.0.4.tgz";
+      path = fetchurl {
+        name = "content_type___content_type_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
+        sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
+      };
+    }
+
+    {
+      name = "cookie_parser___cookie_parser_1.4.3.tgz";
+      path = fetchurl {
+        name = "cookie_parser___cookie_parser_1.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz";
+        sha1 = "0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5";
+      };
+    }
+
+    {
+      name = "cookie_signature___cookie_signature_1.0.6.tgz";
+      path = fetchurl {
+        name = "cookie_signature___cookie_signature_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    }
+
+    {
+      name = "cookie___cookie_0.1.5.tgz";
+      path = fetchurl {
+        name = "cookie___cookie_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.1.5.tgz";
+        sha1 = "6ab9948a4b1ae21952cd2588530a4722d4044d7c";
+      };
+    }
+
+    {
+      name = "cookie___cookie_0.3.1.tgz";
+      path = fetchurl {
+        name = "cookie___cookie_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    }
+
+    {
+      name = "cookiejar___cookiejar_2.1.2.tgz";
+      path = fetchurl {
+        name = "cookiejar___cookiejar_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz";
+        sha1 = "dd8a235530752f988f9a0844f3fc589e3111125c";
+      };
+    }
+
+    {
+      name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+      path = fetchurl {
+        name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
+        sha1 = "92297398cae34937fcafd6ec8139c18051f0b5e0";
+      };
+    }
+
+    {
+      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+      path = fetchurl {
+        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
+        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
+      };
+    }
+
+    {
+      name = "core_js___core_js_2.5.7.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_2.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz";
+        sha1 = "f972608ff0cead68b841a16a932d0b183791814e";
+      };
+    }
+
+    {
+      name = "core_util_is___core_util_is_1.0.2.tgz";
+      path = fetchurl {
+        name = "core_util_is___core_util_is_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    }
+
+    {
+      name = "cors___cors_2.8.5.tgz";
+      path = fetchurl {
+        name = "cors___cors_2.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz";
+        sha1 = "eac11da51592dd86b9f06f6e7ac293b3df875d29";
+      };
+    }
+
+    {
+      name = "cosmiconfig___cosmiconfig_5.0.6.tgz";
+      path = fetchurl {
+        name = "cosmiconfig___cosmiconfig_5.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz";
+        sha1 = "dca6cf680a0bd03589aff684700858c81abeeb39";
+      };
+    }
+
+    {
+      name = "cosmiconfig___cosmiconfig_5.0.7.tgz";
+      path = fetchurl {
+        name = "cosmiconfig___cosmiconfig_5.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz";
+        sha1 = "39826b292ee0d78eda137dfa3173bd1c21a43b04";
+      };
+    }
+
+    {
+      name = "create_error_class___create_error_class_3.0.2.tgz";
+      path = fetchurl {
+        name = "create_error_class___create_error_class_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz";
+        sha1 = "06be7abef947a3f14a30fd610671d401bca8b7b6";
+      };
+    }
+
+    {
+      name = "create_torrent___create_torrent_3.33.0.tgz";
+      path = fetchurl {
+        name = "create_torrent___create_torrent_3.33.0.tgz";
+        url  = "https://registry.yarnpkg.com/create-torrent/-/create-torrent-3.33.0.tgz";
+        sha1 = "8a7a2aa2213a799c266c40e4c12f1468ede25105";
+      };
+    }
+
+    {
+      name = "cron_parser___cron_parser_2.7.3.tgz";
+      path = fetchurl {
+        name = "cron_parser___cron_parser_2.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.7.3.tgz";
+        sha1 = "12603f89f5375af353a9357be2543d3172eac651";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_5.1.0.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
+        sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
+      };
+    }
+
+    {
+      name = "cross_spawn___cross_spawn_6.0.5.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_6.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz";
+        sha1 = "4a5ec7c64dfae22c3a14124dbacdee846d80cbc4";
+      };
+    }
+
+    {
+      name = "crypt___crypt_0.0.2.tgz";
+      path = fetchurl {
+        name = "crypt___crypt_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz";
+        sha1 = "88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b";
+      };
+    }
+
+    {
+      name = "crypto_random_string___crypto_random_string_1.0.0.tgz";
+      path = fetchurl {
+        name = "crypto_random_string___crypto_random_string_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz";
+        sha1 = "a230f64f568310e1498009940790ec99545bca7e";
+      };
+    }
+
+    {
+      name = "cycle___cycle_1.0.3.tgz";
+      path = fetchurl {
+        name = "cycle___cycle_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz";
+        sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
+      };
+    }
+
+    {
+      name = "cyclist___cyclist_0.2.2.tgz";
+      path = fetchurl {
+        name = "cyclist___cyclist_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz";
+        sha1 = "1b33792e11e914a2fd6d6ed6447464444e5fa640";
+      };
+    }
+
+    {
+      name = "d___d_1.0.0.tgz";
+      path = fetchurl {
+        name = "d___d_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz";
+        sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
+      };
+    }
+
+    {
+      name = "dashdash___dashdash_1.14.1.tgz";
+      path = fetchurl {
+        name = "dashdash___dashdash_1.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    }
+
+    {
+      name = "dasherize___dasherize_2.0.0.tgz";
+      path = fetchurl {
+        name = "dasherize___dasherize_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz";
+        sha1 = "6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308";
+      };
+    }
+
+    {
+      name = "date_fns___date_fns_1.29.0.tgz";
+      path = fetchurl {
+        name = "date_fns___date_fns_1.29.0.tgz";
+        url  = "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz";
+        sha1 = "12e609cdcb935127311d04d33334e2960a2a54e6";
+      };
+    }
+
+    {
+      name = "deasync___deasync_0.1.14.tgz";
+      path = fetchurl {
+        name = "deasync___deasync_0.1.14.tgz";
+        url  = "https://registry.yarnpkg.com/deasync/-/deasync-0.1.14.tgz";
+        sha1 = "232ea2252b443948cad033d792eb3b24b0a3d828";
+      };
+    }
+
+    {
+      name = "debug___debug_2.2.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz";
+        sha1 = "f87057e995b1a1f6ae6a4960664137bc56f039da";
+      };
+    }
+
+    {
+      name = "debug___debug_2.3.3.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz";
+        sha1 = "40c453e67e6e13c901ddec317af8986cda9eff8c";
+      };
+    }
+
+    {
+      name = "debug___debug_2.6.9.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.6.9.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
+        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
+      };
+    }
+
+    {
+      name = "debug___debug_3.1.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz";
+        sha1 = "5bb5a0672628b64149566ba16819e61518c67261";
+      };
+    }
+
+    {
+      name = "debug___debug_3.2.6.tgz";
+      path = fetchurl {
+        name = "debug___debug_3.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz";
+        sha1 = "e83d17de16d8a7efb7717edbe5fb10135eee629b";
+      };
+    }
+
+    {
+      name = "debug___debug_4.1.0.tgz";
+      path = fetchurl {
+        name = "debug___debug_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz";
+        sha1 = "373687bffa678b38b1cd91f861b63850035ddc87";
+      };
+    }
+
+    {
+      name = "debug___debug_4.1.1.tgz";
+      path = fetchurl {
+        name = "debug___debug_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz";
+        sha1 = "3b72260255109c6b589cee050f1d516139664791";
+      };
+    }
+
+    {
+      name = "debuglog___debuglog_1.0.1.tgz";
+      path = fetchurl {
+        name = "debuglog___debuglog_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz";
+        sha1 = "aa24ffb9ac3df9a2351837cfb2d279360cd78492";
+      };
+    }
+
+    {
+      name = "decamelize___decamelize_1.2.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    }
+
+    {
+      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+      path = fetchurl {
+        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
+        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
+      };
+    }
+
+    {
+      name = "decompress_response___decompress_response_3.3.0.tgz";
+      path = fetchurl {
+        name = "decompress_response___decompress_response_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz";
+        sha1 = "80a4dd323748384bfa248083622aedec982adff3";
+      };
+    }
+
+    {
+      name = "dedent___dedent_0.7.0.tgz";
+      path = fetchurl {
+        name = "dedent___dedent_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz";
+        sha1 = "2495ddbaf6eb874abb0e1be9df22d2e5a544326c";
+      };
+    }
+
+    {
+      name = "deep_eql___deep_eql_0.1.3.tgz";
+      path = fetchurl {
+        name = "deep_eql___deep_eql_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz";
+        sha1 = "ef558acab8de25206cd713906d74e56930eb69f2";
+      };
+    }
+
+    {
+      name = "deep_eql___deep_eql_3.0.1.tgz";
+      path = fetchurl {
+        name = "deep_eql___deep_eql_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz";
+        sha1 = "dfc9404400ad1c8fe023e7da1df1c147c4b444df";
+      };
+    }
+
+    {
+      name = "deep_equal___deep_equal_0.2.2.tgz";
+      path = fetchurl {
+        name = "deep_equal___deep_equal_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz";
+        sha1 = "84b745896f34c684e98f2ce0e42abaf43bba017d";
+      };
+    }
+
+    {
+      name = "deep_extend___deep_extend_0.6.0.tgz";
+      path = fetchurl {
+        name = "deep_extend___deep_extend_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
+      };
+    }
+
+    {
+      name = "deep_is___deep_is_0.1.3.tgz";
+      path = fetchurl {
+        name = "deep_is___deep_is_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    }
+
+    {
+      name = "deep_object_diff___deep_object_diff_1.1.0.tgz";
+      path = fetchurl {
+        name = "deep_object_diff___deep_object_diff_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz";
+        sha1 = "d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a";
+      };
+    }
+
+    {
+      name = "defaults___defaults_1.0.3.tgz";
+      path = fetchurl {
+        name = "defaults___defaults_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz";
+        sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
+      };
+    }
+
+    {
+      name = "define_properties___define_properties_1.1.3.tgz";
+      path = fetchurl {
+        name = "define_properties___define_properties_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz";
+        sha1 = "cf88da6cbee26fe6db7094f61d870cbd84cee9f1";
+      };
+    }
+
+    {
+      name = "define_property___define_property_0.2.5.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
+        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
+      };
+    }
+
+    {
+      name = "define_property___define_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
+        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
+      };
+    }
+
+    {
+      name = "define_property___define_property_2.0.2.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
+        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
+      };
+    }
+
+    {
+      name = "defined___defined_1.0.0.tgz";
+      path = fetchurl {
+        name = "defined___defined_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz";
+        sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
+      };
+    }
+
+    {
+      name = "del___del_3.0.0.tgz";
+      path = fetchurl {
+        name = "del___del_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz";
+        sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5";
+      };
+    }
+
+    {
+      name = "delayed_stream___delayed_stream_1.0.0.tgz";
+      path = fetchurl {
+        name = "delayed_stream___delayed_stream_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    }
+
+    {
+      name = "delegates___delegates_1.0.0.tgz";
+      path = fetchurl {
+        name = "delegates___delegates_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    }
+
+    {
+      name = "denque___denque_1.4.0.tgz";
+      path = fetchurl {
+        name = "denque___denque_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/denque/-/denque-1.4.0.tgz";
+        sha1 = "79e2f0490195502107f24d9553f374837dabc916";
+      };
+    }
+
+    {
+      name = "depd___depd_1.1.2.tgz";
+      path = fetchurl {
+        name = "depd___depd_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    }
+
+    {
+      name = "descrevit___descrevit_0.1.1.tgz";
+      path = fetchurl {
+        name = "descrevit___descrevit_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/descrevit/-/descrevit-0.1.1.tgz";
+        sha1 = "c0f5840de0a0f7b1b8b4078569b173327947d5da";
+      };
+    }
+
+    {
+      name = "destroy___destroy_1.0.4.tgz";
+      path = fetchurl {
+        name = "destroy___destroy_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    }
+
+    {
+      name = "detect_indent___detect_indent_5.0.0.tgz";
+      path = fetchurl {
+        name = "detect_indent___detect_indent_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz";
+        sha1 = "3871cc0a6a002e8c3e5b3cf7f336264675f06b9d";
+      };
+    }
+
+    {
+      name = "detect_libc___detect_libc_1.0.3.tgz";
+      path = fetchurl {
+        name = "detect_libc___detect_libc_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
+        sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
+      };
+    }
+
+    {
+      name = "detect_newline___detect_newline_2.1.0.tgz";
+      path = fetchurl {
+        name = "detect_newline___detect_newline_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz";
+        sha1 = "f41f1c10be4b00e87b5f13da680759f2c5bfd3e2";
+      };
+    }
+
+    {
+      name = "dezalgo___dezalgo_1.0.3.tgz";
+      path = fetchurl {
+        name = "dezalgo___dezalgo_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz";
+        sha1 = "7f742de066fc748bc8db820569dddce49bf0d456";
+      };
+    }
+
+    {
+      name = "diagnostics___diagnostics_1.1.1.tgz";
+      path = fetchurl {
+        name = "diagnostics___diagnostics_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz";
+        sha1 = "cab6ac33df70c9d9a727490ae43ac995a769b22a";
+      };
+    }
+
+    {
+      name = "dicer___dicer_0.2.5.tgz";
+      path = fetchurl {
+        name = "dicer___dicer_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz";
+        sha1 = "5996c086bb33218c812c090bddc09cd12facb70f";
+      };
+    }
+
+    {
+      name = "diff___diff_3.5.0.tgz";
+      path = fetchurl {
+        name = "diff___diff_3.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz";
+        sha1 = "800c0dd1e0a8bfbc95835c202ad220fe317e5a12";
+      };
+    }
+
+    {
+      name = "dns_prefetch_control___dns_prefetch_control_0.1.0.tgz";
+      path = fetchurl {
+        name = "dns_prefetch_control___dns_prefetch_control_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz";
+        sha1 = "60ddb457774e178f1f9415f0cabb0e85b0b300b2";
+      };
+    }
+
+    {
+      name = "docopt___docopt_0.6.2.tgz";
+      path = fetchurl {
+        name = "docopt___docopt_0.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz";
+        sha1 = "b28e9e2220da5ec49f7ea5bb24a47787405eeb11";
+      };
+    }
+
+    {
+      name = "doctrine___doctrine_0.7.2.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_0.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz";
+        sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
+      };
+    }
+
+    {
+      name = "doctrine___doctrine_1.5.0.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz";
+        sha1 = "379dce730f6166f76cefa4e6707a159b02c5a6fa";
+      };
+    }
+
+    {
+      name = "dont_sniff_mimetype___dont_sniff_mimetype_1.0.0.tgz";
+      path = fetchurl {
+        name = "dont_sniff_mimetype___dont_sniff_mimetype_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz";
+        sha1 = "5932890dc9f4e2f19e5eb02a20026e5e5efc8f58";
+      };
+    }
+
+    {
+      name = "dot_json___dot_json_1.0.4.tgz";
+      path = fetchurl {
+        name = "dot_json___dot_json_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/dot-json/-/dot-json-1.0.4.tgz";
+        sha1 = "b5c5818eb526a7917ac02df017fe9fba37b11195";
+      };
+    }
+
+    {
+      name = "dot_prop___dot_prop_4.2.0.tgz";
+      path = fetchurl {
+        name = "dot_prop___dot_prop_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz";
+        sha1 = "1f19e0c2e1aa0e32797c49799f2837ac6af69c57";
+      };
+    }
+
+    {
+      name = "dotenv___dotenv_5.0.1.tgz";
+      path = fetchurl {
+        name = "dotenv___dotenv_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz";
+        sha1 = "a5317459bd3d79ab88cff6e44057a6a3fbb1fcef";
+      };
+    }
+
+    {
+      name = "dottie___dottie_2.0.1.tgz";
+      path = fetchurl {
+        name = "dottie___dottie_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/dottie/-/dottie-2.0.1.tgz";
+        sha1 = "697ad9d72004db7574d21f892466a3c285893659";
+      };
+    }
+
+    {
+      name = "double_ended_queue___double_ended_queue_2.1.0_0.tgz";
+      path = fetchurl {
+        name = "double_ended_queue___double_ended_queue_2.1.0_0.tgz";
+        url  = "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz";
+        sha1 = "103d3527fd31528f40188130c841efdd78264e5c";
+      };
+    }
+
+    {
+      name = "dtrace_provider___dtrace_provider_0.8.7.tgz";
+      path = fetchurl {
+        name = "dtrace_provider___dtrace_provider_0.8.7.tgz";
+        url  = "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz";
+        sha1 = "dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04";
+      };
+    }
+
+    {
+      name = "duplexer3___duplexer3_0.1.4.tgz";
+      path = fetchurl {
+        name = "duplexer3___duplexer3_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz";
+        sha1 = "ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2";
+      };
+    }
+
+    {
+      name = "duplexify___duplexify_3.6.1.tgz";
+      path = fetchurl {
+        name = "duplexify___duplexify_3.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz";
+        sha1 = "b1a7a29c4abfd639585efaecce80d666b1e34125";
+      };
+    }
+
+    {
+      name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+      path = fetchurl {
+        name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    }
+
+    {
+      name = "ecdsa_sig_formatter___ecdsa_sig_formatter_1.0.10.tgz";
+      path = fetchurl {
+        name = "ecdsa_sig_formatter___ecdsa_sig_formatter_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz";
+        sha1 = "1c595000f04a8897dfb85000892a0f4c33af86c3";
+      };
+    }
+
+    {
+      name = "editor___editor_1.0.0.tgz";
+      path = fetchurl {
+        name = "editor___editor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz";
+        sha1 = "60c7f87bd62bcc6a894fa8ccd6afb7823a24f742";
+      };
+    }
+
+    {
+      name = "ee_first___ee_first_1.1.1.tgz";
+      path = fetchurl {
+        name = "ee_first___ee_first_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    }
+
+    {
+      name = "elegant_spinner___elegant_spinner_1.0.1.tgz";
+      path = fetchurl {
+        name = "elegant_spinner___elegant_spinner_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz";
+        sha1 = "db043521c95d7e303fd8f345bedc3349cfb0729e";
+      };
+    }
+
+    {
+      name = "elliptic___elliptic_3.0.3.tgz";
+      path = fetchurl {
+        name = "elliptic___elliptic_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/elliptic/-/elliptic-3.0.3.tgz";
+        sha1 = "865c9b420bfbe55006b9f969f97a0d2c44966595";
+      };
+    }
+
+    {
+      name = "enabled___enabled_1.0.2.tgz";
+      path = fetchurl {
+        name = "enabled___enabled_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz";
+        sha1 = "965f6513d2c2d1c5f4652b64a2e3396467fc2f93";
+      };
+    }
+
+    {
+      name = "encodeurl___encodeurl_1.0.2.tgz";
+      path = fetchurl {
+        name = "encodeurl___encodeurl_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    }
+
+    {
+      name = "encoding___encoding_0.1.12.tgz";
+      path = fetchurl {
+        name = "encoding___encoding_0.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz";
+        sha1 = "538b66f3ee62cd1ab51ec323829d1f9480c74beb";
+      };
+    }
+
+    {
+      name = "end_of_stream___end_of_stream_1.4.1.tgz";
+      path = fetchurl {
+        name = "end_of_stream___end_of_stream_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz";
+        sha1 = "ed29634d19baba463b6ce6b80a37213eab71ec43";
+      };
+    }
+
+    {
+      name = "engine.io_client___engine.io_client_1.8.3.tgz";
+      path = fetchurl {
+        name = "engine.io_client___engine.io_client_1.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz";
+        sha1 = "1798ed93451246453d4c6f635d7a201fe940d5ab";
+      };
+    }
+
+    {
+      name = "engine.io_client___engine.io_client_3.3.1.tgz";
+      path = fetchurl {
+        name = "engine.io_client___engine.io_client_3.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz";
+        sha1 = "afedb4a07b2ea48b7190c3136bfea98fdd4f0f03";
+      };
+    }
+
+    {
+      name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
+      path = fetchurl {
+        name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz";
+        sha1 = "937b079f0007d0893ec56d46cb220b8cb435220a";
+      };
+    }
+
+    {
+      name = "engine.io_parser___engine.io_parser_2.1.3.tgz";
+      path = fetchurl {
+        name = "engine.io_parser___engine.io_parser_2.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz";
+        sha1 = "757ab970fbf2dfb32c7b74b033216d5739ef79a6";
+      };
+    }
+
+    {
+      name = "engine.io___engine.io_1.8.3.tgz";
+      path = fetchurl {
+        name = "engine.io___engine.io_1.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz";
+        sha1 = "8de7f97895d20d39b85f88eeee777b2bd42b13d4";
+      };
+    }
+
+    {
+      name = "engine.io___engine.io_3.3.2.tgz";
+      path = fetchurl {
+        name = "engine.io___engine.io_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz";
+        sha1 = "18cbc8b6f36e9461c5c0f81df2b830de16058a59";
+      };
+    }
+
+    {
+      name = "env_variable___env_variable_0.0.5.tgz";
+      path = fetchurl {
+        name = "env_variable___env_variable_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz";
+        sha1 = "913dd830bef11e96a039c038d4130604eba37f88";
+      };
+    }
+
+    {
+      name = "err_code___err_code_1.1.2.tgz";
+      path = fetchurl {
+        name = "err_code___err_code_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz";
+        sha1 = "06e0116d3028f6aef4806849eb0ea6a748ae6960";
+      };
+    }
+
+    {
+      name = "errno___errno_0.1.7.tgz";
+      path = fetchurl {
+        name = "errno___errno_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
+        sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
+      };
+    }
+
+    {
+      name = "error_ex___error_ex_1.3.2.tgz";
+      path = fetchurl {
+        name = "error_ex___error_ex_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
+        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
+      };
+    }
+
+    {
+      name = "es5_ext___es5_ext_0.10.46.tgz";
+      path = fetchurl {
+        name = "es5_ext___es5_ext_0.10.46.tgz";
+        url  = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz";
+        sha1 = "efd99f67c5a7ec789baa3daa7f79870388f7f572";
+      };
+    }
+
+    {
+      name = "es6_iterator___es6_iterator_2.0.3.tgz";
+      path = fetchurl {
+        name = "es6_iterator___es6_iterator_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
+        sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
+      };
+    }
+
+    {
+      name = "es6_map___es6_map_0.1.5.tgz";
+      path = fetchurl {
+        name = "es6_map___es6_map_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz";
+        sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0";
+      };
+    }
+
+    {
+      name = "es6_promise___es6_promise_4.2.5.tgz";
+      path = fetchurl {
+        name = "es6_promise___es6_promise_4.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz";
+        sha1 = "da6d0d5692efb461e082c14817fe2427d8f5d054";
+      };
+    }
+
+    {
+      name = "es6_promisify___es6_promisify_5.0.0.tgz";
+      path = fetchurl {
+        name = "es6_promisify___es6_promisify_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz";
+        sha1 = "5109d62f3e56ea967c4b63505aef08291c8a5203";
+      };
+    }
+
+    {
+      name = "es6_promisify___es6_promisify_6.0.1.tgz";
+      path = fetchurl {
+        name = "es6_promisify___es6_promisify_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.1.tgz";
+        sha1 = "6edaa45f3bd570ffe08febce66f7116be4b1cdb6";
+      };
+    }
+
+    {
+      name = "es6_set___es6_set_0.1.5.tgz";
+      path = fetchurl {
+        name = "es6_set___es6_set_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz";
+        sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1";
+      };
+    }
+
+    {
+      name = "es6_shim___es6_shim_0.35.3.tgz";
+      path = fetchurl {
+        name = "es6_shim___es6_shim_0.35.3.tgz";
+        url  = "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz";
+        sha1 = "9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26";
+      };
+    }
+
+    {
+      name = "es6_symbol___es6_symbol_3.1.1.tgz";
+      path = fetchurl {
+        name = "es6_symbol___es6_symbol_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz";
+        sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
+      };
+    }
+
+    {
+      name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
+      path = fetchurl {
+        name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz";
+        sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f";
+      };
+    }
+
+    {
+      name = "escape_html___escape_html_1.0.3.tgz";
+      path = fetchurl {
+        name = "escape_html___escape_html_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    }
+
+    {
+      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+      path = fetchurl {
+        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    }
+
+    {
+      name = "escope___escope_3.6.0.tgz";
+      path = fetchurl {
+        name = "escope___escope_3.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz";
+        sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3";
+      };
+    }
+
+    {
+      name = "eslint___eslint_2.13.1.tgz";
+      path = fetchurl {
+        name = "eslint___eslint_2.13.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz";
+        sha1 = "e4cc8fa0f009fb829aaae23855a29360be1f6c11";
+      };
+    }
+
+    {
+      name = "espree___espree_3.5.4.tgz";
+      path = fetchurl {
+        name = "espree___espree_3.5.4.tgz";
+        url  = "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz";
+        sha1 = "b0f447187c8a8bed944b815a660bddf5deb5d1a7";
+      };
+    }
+
+    {
+      name = "esprima___esprima_4.0.1.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
+        sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
+      };
+    }
+
+    {
+      name = "esrecurse___esrecurse_4.2.1.tgz";
+      path = fetchurl {
+        name = "esrecurse___esrecurse_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
+        sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
+      };
+    }
+
+    {
+      name = "estraverse___estraverse_4.2.0.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz";
+        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
+      };
+    }
+
+    {
+      name = "esutils___esutils_1.1.6.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz";
+        sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
+      };
+    }
+
+    {
+      name = "esutils___esutils_2.0.2.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
+        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
+      };
+    }
+
+    {
+      name = "etag___etag_1.7.0.tgz";
+      path = fetchurl {
+        name = "etag___etag_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz";
+        sha1 = "03d30b5f67dd6e632d2945d30d6652731a34d5d8";
+      };
+    }
+
+    {
+      name = "etag___etag_1.8.1.tgz";
+      path = fetchurl {
+        name = "etag___etag_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    }
+
+    {
+      name = "event_emitter___event_emitter_0.3.5.tgz";
+      path = fetchurl {
+        name = "event_emitter___event_emitter_0.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz";
+        sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
+      };
+    }
+
+    {
+      name = "execa___execa_0.10.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_0.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz";
+        sha1 = "ff456a8f53f90f8eccc71a96d11bdfc7f082cb50";
+      };
+    }
+
+    {
+      name = "execa___execa_0.7.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz";
+        sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777";
+      };
+    }
+
+    {
+      name = "execa___execa_1.0.0.tgz";
+      path = fetchurl {
+        name = "execa___execa_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz";
+        sha1 = "c6236a5bb4df6d6f15e88e7f017798216749ddd8";
+      };
+    }
+
+    {
+      name = "exit_hook___exit_hook_1.1.1.tgz";
+      path = fetchurl {
+        name = "exit_hook___exit_hook_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz";
+        sha1 = "f05ca233b48c05d54fff07765df8507e95c02ff8";
+      };
+    }
+
+    {
+      name = "expand_brackets___expand_brackets_2.1.4.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
+        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
+      };
+    }
+
+    {
+      name = "expand_template___expand_template_2.0.3.tgz";
+      path = fetchurl {
+        name = "expand_template___expand_template_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz";
+        sha1 = "6e14b3fcee0f3a6340ecb57d2e8918692052a47c";
+      };
+    }
+
+    {
+      name = "expect_ct___expect_ct_0.1.1.tgz";
+      path = fetchurl {
+        name = "expect_ct___expect_ct_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.1.tgz";
+        sha1 = "de84476a2dbcb85000d5903737e9bc8a5ba7b897";
+      };
+    }
+
+    {
+      name = "express_oauth_server___express_oauth_server_2.0.0.tgz";
+      path = fetchurl {
+        name = "express_oauth_server___express_oauth_server_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/express-oauth-server/-/express-oauth-server-2.0.0.tgz";
+        sha1 = "57b08665c1201532f52c4c02f19709238b99a48d";
+      };
+    }
+
+    {
+      name = "express_rate_limit___express_rate_limit_3.3.2.tgz";
+      path = fetchurl {
+        name = "express_rate_limit___express_rate_limit_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-3.3.2.tgz";
+        sha1 = "c5b2fc770d533878ce01a5dbbfadca340f3b8915";
+      };
+    }
+
+    {
+      name = "express_validator___express_validator_5.3.0.tgz";
+      path = fetchurl {
+        name = "express_validator___express_validator_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/express-validator/-/express-validator-5.3.0.tgz";
+        sha1 = "18a4e4a6e6410e3b9d492fb4ffcb4556fec51806";
+      };
+    }
+
+    {
+      name = "express___express_4.13.4.tgz";
+      path = fetchurl {
+        name = "express___express_4.13.4.tgz";
+        url  = "https://registry.yarnpkg.com/express/-/express-4.13.4.tgz";
+        sha1 = "3c0b76f3c77590c8345739061ec0bd3ba067ec24";
+      };
+    }
+
+    {
+      name = "express___express_4.16.4.tgz";
+      path = fetchurl {
+        name = "express___express_4.16.4.tgz";
+        url  = "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz";
+        sha1 = "fddef61926109e24c515ea97fd2f1bdbf62df12e";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_2.0.1.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
+        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
+      };
+    }
+
+    {
+      name = "extend_shallow___extend_shallow_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
+        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
+      };
+    }
+
+    {
+      name = "extend___extend_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend___extend_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
+        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
+      };
+    }
+
+    {
+      name = "extglob___extglob_2.0.4.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
+        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.2.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz";
+        sha1 = "5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.3.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    }
+
+    {
+      name = "extsprintf___extsprintf_1.4.0.tgz";
+      path = fetchurl {
+        name = "extsprintf___extsprintf_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
+        sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
+      };
+    }
+
+    {
+      name = "eyes___eyes_0.1.8.tgz";
+      path = fetchurl {
+        name = "eyes___eyes_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz";
+        sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
+      };
+    }
+
+    {
+      name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
+        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
+      };
+    }
+
+    {
+      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+      path = fetchurl {
+        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
+        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
+      };
+    }
+
+    {
+      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    }
+
+    {
+      name = "fast_safe_stringify___fast_safe_stringify_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_safe_stringify___fast_safe_stringify_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz";
+        sha1 = "04b26106cc56681f51a044cfc0d76cf0008ac2c2";
+      };
+    }
+
+    {
+      name = "feature_policy___feature_policy_0.2.0.tgz";
+      path = fetchurl {
+        name = "feature_policy___feature_policy_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/feature-policy/-/feature-policy-0.2.0.tgz";
+        sha1 = "22096de49ab240176878ffe2bde2f6ff04d48c43";
+      };
+    }
+
+    {
+      name = "fecha___fecha_2.3.3.tgz";
+      path = fetchurl {
+        name = "fecha___fecha_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz";
+        sha1 = "948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd";
+      };
+    }
+
+    {
+      name = "figgy_pudding___figgy_pudding_3.5.1.tgz";
+      path = fetchurl {
+        name = "figgy_pudding___figgy_pudding_3.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz";
+        sha1 = "862470112901c727a0e495a80744bd5baa1d6790";
+      };
+    }
+
+    {
+      name = "figures___figures_1.7.0.tgz";
+      path = fetchurl {
+        name = "figures___figures_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz";
+        sha1 = "cbe1e3affcf1cd44b80cadfed28dc793a9701d2e";
+      };
+    }
+
+    {
+      name = "figures___figures_2.0.0.tgz";
+      path = fetchurl {
+        name = "figures___figures_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz";
+        sha1 = "3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962";
+      };
+    }
+
+    {
+      name = "file_entry_cache___file_entry_cache_1.3.1.tgz";
+      path = fetchurl {
+        name = "file_entry_cache___file_entry_cache_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz";
+        sha1 = "44c61ea607ae4be9c1402f41f44270cbfe334ff8";
+      };
+    }
+
+    {
+      name = "filestream___filestream_4.1.3.tgz";
+      path = fetchurl {
+        name = "filestream___filestream_4.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/filestream/-/filestream-4.1.3.tgz";
+        sha1 = "948fcaade8221f715f5ecaddc54862faaacc9325";
+      };
+    }
+
+    {
+      name = "fill_range___fill_range_4.0.0.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
+        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
+      };
+    }
+
+    {
+      name = "finalhandler___finalhandler_0.4.1.tgz";
+      path = fetchurl {
+        name = "finalhandler___finalhandler_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz";
+        sha1 = "85a17c6c59a94717d262d61230d4b0ebe3d4a14d";
+      };
+    }
+
+    {
+      name = "finalhandler___finalhandler_1.1.1.tgz";
+      path = fetchurl {
+        name = "finalhandler___finalhandler_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz";
+        sha1 = "eebf4ed840079c83f4249038c9d703008301b105";
+      };
+    }
+
+    {
+      name = "find_npm_prefix___find_npm_prefix_1.0.2.tgz";
+      path = fetchurl {
+        name = "find_npm_prefix___find_npm_prefix_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz";
+        sha1 = "8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf";
+      };
+    }
+
+    {
+      name = "find_parent_dir___find_parent_dir_0.3.0.tgz";
+      path = fetchurl {
+        name = "find_parent_dir___find_parent_dir_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz";
+        sha1 = "33c44b429ab2b2f0646299c5f9f718f376ff8d54";
+      };
+    }
+
+    {
+      name = "find_up___find_up_2.1.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
+        sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
+      };
+    }
+
+    {
+      name = "find_up___find_up_3.0.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz";
+        sha1 = "49169f1d7993430646da61ecc5ae355c21c97b73";
+      };
+    }
+
+    {
+      name = "flat_cache___flat_cache_1.3.4.tgz";
+      path = fetchurl {
+        name = "flat_cache___flat_cache_1.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz";
+        sha1 = "2c2ef77525cc2929007dfffa1dd314aa9c9dee6f";
+      };
+    }
+
+    {
+      name = "flat___flat_4.1.0.tgz";
+      path = fetchurl {
+        name = "flat___flat_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz";
+        sha1 = "090bec8b05e39cba309747f1d588f04dbaf98db2";
+      };
+    }
+
+    {
+      name = "flatten___flatten_1.0.2.tgz";
+      path = fetchurl {
+        name = "flatten___flatten_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz";
+        sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
+      };
+    }
+
+    {
+      name = "flexbuffer___flexbuffer_0.0.6.tgz";
+      path = fetchurl {
+        name = "flexbuffer___flexbuffer_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz";
+        sha1 = "039fdf23f8823e440c38f3277e6fef1174215b30";
+      };
+    }
+
+    {
+      name = "fluent_ffmpeg___fluent_ffmpeg_2.1.2.tgz";
+      path = fetchurl {
+        name = "fluent_ffmpeg___fluent_ffmpeg_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz";
+        sha1 = "c952de2240f812ebda0aa8006d7776ee2acf7d74";
+      };
+    }
+
+    {
+      name = "flush_write_stream___flush_write_stream_1.0.3.tgz";
+      path = fetchurl {
+        name = "flush_write_stream___flush_write_stream_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz";
+        sha1 = "c5d586ef38af6097650b49bc41b55fabb19f35bd";
+      };
+    }
+
+    {
+      name = "for_in___for_in_1.0.2.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    }
+
+    {
+      name = "forever_agent___forever_agent_0.6.1.tgz";
+      path = fetchurl {
+        name = "forever_agent___forever_agent_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    }
+
+    {
+      name = "form_data___form_data_2.3.3.tgz";
+      path = fetchurl {
+        name = "form_data___form_data_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz";
+        sha1 = "dcce52c05f644f298c6a7ab936bd724ceffbf3a6";
+      };
+    }
+
+    {
+      name = "format_util___format_util_1.0.3.tgz";
+      path = fetchurl {
+        name = "format_util___format_util_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz";
+        sha1 = "032dca4a116262a12c43f4c3ec8566416c5b2d95";
+      };
+    }
+
+    {
+      name = "formidable___formidable_1.2.1.tgz";
+      path = fetchurl {
+        name = "formidable___formidable_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz";
+        sha1 = "70fb7ca0290ee6ff961090415f4b3df3d2082659";
+      };
+    }
+
+    {
+      name = "forwarded___forwarded_0.1.2.tgz";
+      path = fetchurl {
+        name = "forwarded___forwarded_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    }
+
+    {
+      name = "fragment_cache___fragment_cache_0.2.1.tgz";
+      path = fetchurl {
+        name = "fragment_cache___fragment_cache_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
+        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
+      };
+    }
+
+    {
+      name = "frameguard___frameguard_3.0.0.tgz";
+      path = fetchurl {
+        name = "frameguard___frameguard_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz";
+        sha1 = "7bcad469ee7b96e91d12ceb3959c78235a9272e9";
+      };
+    }
+
+    {
+      name = "fresh___fresh_0.3.0.tgz";
+      path = fetchurl {
+        name = "fresh___fresh_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz";
+        sha1 = "651f838e22424e7566de161d8358caa199f83d4f";
+      };
+    }
+
+    {
+      name = "fresh___fresh_0.5.2.tgz";
+      path = fetchurl {
+        name = "fresh___fresh_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    }
+
+    {
+      name = "from2___from2_1.3.0.tgz";
+      path = fetchurl {
+        name = "from2___from2_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz";
+        sha1 = "88413baaa5f9a597cfde9221d86986cd3c061dfd";
+      };
+    }
+
+    {
+      name = "from2___from2_2.3.0.tgz";
+      path = fetchurl {
+        name = "from2___from2_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz";
+        sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
+      };
+    }
+
+    {
+      name = "front_matter___front_matter_2.1.2.tgz";
+      path = fetchurl {
+        name = "front_matter___front_matter_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz";
+        sha1 = "f75983b9f2f413be658c93dfd7bd8ce4078f5cdb";
+      };
+    }
+
+    {
+      name = "fs_chunk_store___fs_chunk_store_1.7.0.tgz";
+      path = fetchurl {
+        name = "fs_chunk_store___fs_chunk_store_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz";
+        sha1 = "1c4bcbe93c99af10aa04b65348f2bb27377a4010";
+      };
+    }
+
+    {
+      name = "fs_constants___fs_constants_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs_constants___fs_constants_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz";
+        sha1 = "6be0de9be998ce16af8afc24497b9ee9b7ccd9ad";
+      };
+    }
+
+    {
+      name = "fs_copy_file_sync___fs_copy_file_sync_1.1.1.tgz";
+      path = fetchurl {
+        name = "fs_copy_file_sync___fs_copy_file_sync_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz";
+        sha1 = "11bf32c096c10d126e5f6b36d06eece776062918";
+      };
+    }
+
+    {
+      name = "fs_extra___fs_extra_3.0.1.tgz";
+      path = fetchurl {
+        name = "fs_extra___fs_extra_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz";
+        sha1 = "3794f378c58b342ea7dbbb23095109c4b3b62291";
+      };
+    }
+
+    {
+      name = "fs_extra___fs_extra_7.0.1.tgz";
+      path = fetchurl {
+        name = "fs_extra___fs_extra_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz";
+        sha1 = "4f189c44aa123b895f722804f55ea23eadc348e9";
+      };
+    }
+
+    {
+      name = "fs_minipass___fs_minipass_1.2.5.tgz";
+      path = fetchurl {
+        name = "fs_minipass___fs_minipass_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
+        sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
+      };
+    }
+
+    {
+      name = "fs_vacuum___fs_vacuum_1.2.10.tgz";
+      path = fetchurl {
+        name = "fs_vacuum___fs_vacuum_1.2.10.tgz";
+        url  = "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz";
+        sha1 = "b7629bec07a4031a2548fdf99f5ecf1cc8b31e36";
+      };
+    }
+
+    {
+      name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+      path = fetchurl {
+        name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
+        sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
+      };
+    }
+
+    {
+      name = "fs.realpath___fs.realpath_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs.realpath___fs.realpath_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    }
+
+    {
+      name = "fsevents___fsevents_1.2.4.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz";
+        sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426";
+      };
+    }
+
+    {
+      name = "fstream___fstream_1.0.11.tgz";
+      path = fetchurl {
+        name = "fstream___fstream_1.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz";
+        sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171";
+      };
+    }
+
+    {
+      name = "g_status___g_status_2.0.2.tgz";
+      path = fetchurl {
+        name = "g_status___g_status_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz";
+        sha1 = "270fd32119e8fc9496f066fe5fe88e0a6bc78b97";
+      };
+    }
+
+    {
+      name = "gauge___gauge_2.7.4.tgz";
+      path = fetchurl {
+        name = "gauge___gauge_2.7.4.tgz";
+        url  = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    }
+
+    {
+      name = "generate_function___generate_function_2.3.1.tgz";
+      path = fetchurl {
+        name = "generate_function___generate_function_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz";
+        sha1 = "f069617690c10c868e73b8465746764f97c3479f";
+      };
+    }
+
+    {
+      name = "generate_object_property___generate_object_property_1.2.0.tgz";
+      path = fetchurl {
+        name = "generate_object_property___generate_object_property_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz";
+        sha1 = "9c0e1c40308ce804f4783618b937fa88f99d50d0";
+      };
+    }
+
+    {
+      name = "generic_pool___generic_pool_3.4.2.tgz";
+      path = fetchurl {
+        name = "generic_pool___generic_pool_3.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz";
+        sha1 = "92ff7196520d670839a67308092a12aadf2f6a59";
+      };
+    }
+
+    {
+      name = "genfun___genfun_5.0.0.tgz";
+      path = fetchurl {
+        name = "genfun___genfun_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz";
+        sha1 = "9dd9710a06900a5c4a5bf57aca5da4e52fe76537";
+      };
+    }
+
+    {
+      name = "gentle_fs___gentle_fs_2.0.1.tgz";
+      path = fetchurl {
+        name = "gentle_fs___gentle_fs_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz";
+        sha1 = "585cfd612bfc5cd52471fdb42537f016a5ce3687";
+      };
+    }
+
+    {
+      name = "get_browser_rtc___get_browser_rtc_1.0.2.tgz";
+      path = fetchurl {
+        name = "get_browser_rtc___get_browser_rtc_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz";
+        sha1 = "bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9";
+      };
+    }
+
+    {
+      name = "get_caller_file___get_caller_file_1.0.3.tgz";
+      path = fetchurl {
+        name = "get_caller_file___get_caller_file_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
+        sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
+      };
+    }
+
+    {
+      name = "get_func_name___get_func_name_2.0.0.tgz";
+      path = fetchurl {
+        name = "get_func_name___get_func_name_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz";
+        sha1 = "ead774abee72e20409433a066366023dd6887a41";
+      };
+    }
+
+    {
+      name = "get_own_enumerable_property_symbols___get_own_enumerable_property_symbols_3.0.0.tgz";
+      path = fetchurl {
+        name = "get_own_enumerable_property_symbols___get_own_enumerable_property_symbols_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz";
+        sha1 = "b877b49a5c16aefac3655f2ed2ea5b684df8d203";
+      };
+    }
+
+    {
+      name = "get_stdin___get_stdin_6.0.0.tgz";
+      path = fetchurl {
+        name = "get_stdin___get_stdin_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz";
+        sha1 = "9e09bf712b360ab9225e812048f71fde9c89657b";
+      };
+    }
+
+    {
+      name = "get_stream___get_stream_3.0.0.tgz";
+      path = fetchurl {
+        name = "get_stream___get_stream_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
+        sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
+      };
+    }
+
+    {
+      name = "get_stream___get_stream_4.1.0.tgz";
+      path = fetchurl {
+        name = "get_stream___get_stream_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz";
+        sha1 = "c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5";
+      };
+    }
+
+    {
+      name = "get_value___get_value_2.0.6.tgz";
+      path = fetchurl {
+        name = "get_value___get_value_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
+        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
+      };
+    }
+
+    {
+      name = "getpass___getpass_0.1.7.tgz";
+      path = fetchurl {
+        name = "getpass___getpass_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    }
+
+    {
+      name = "github_from_package___github_from_package_0.0.0.tgz";
+      path = fetchurl {
+        name = "github_from_package___github_from_package_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz";
+        sha1 = "97fb5d96bfde8973313f20e8288ef9a167fa64ce";
+      };
+    }
+
+    {
+      name = "glob_parent___glob_parent_3.1.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
+        sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
+      };
+    }
+
+    {
+      name = "glob___glob_7.1.2.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz";
+        sha1 = "c19c9df9a028702d678612384a6552404c636d15";
+      };
+    }
+
+    {
+      name = "glob___glob_6.0.4.tgz";
+      path = fetchurl {
+        name = "glob___glob_6.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz";
+        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
+      };
+    }
+
+    {
+      name = "glob___glob_7.1.3.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz";
+        sha1 = "3960832d3f1574108342dafd3a67b332c0969df1";
+      };
+    }
+
+    {
+      name = "global_dirs___global_dirs_0.1.1.tgz";
+      path = fetchurl {
+        name = "global_dirs___global_dirs_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz";
+        sha1 = "b319c0dd4607f353f3be9cca4c72fc148c49f445";
+      };
+    }
+
+    {
+      name = "globals___globals_9.18.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_9.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
+        sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
+      };
+    }
+
+    {
+      name = "globby___globby_6.1.0.tgz";
+      path = fetchurl {
+        name = "globby___globby_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
+        sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
+      };
+    }
+
+    {
+      name = "globule___globule_1.2.1.tgz";
+      path = fetchurl {
+        name = "globule___globule_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz";
+        sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d";
+      };
+    }
+
+    {
+      name = "gonzales_pe_sl___gonzales_pe_sl_4.2.3.tgz";
+      path = fetchurl {
+        name = "gonzales_pe_sl___gonzales_pe_sl_4.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz";
+        sha1 = "6a868bc380645f141feeb042c6f97fcc71b59fe6";
+      };
+    }
+
+    {
+      name = "got___got_6.7.1.tgz";
+      path = fetchurl {
+        name = "got___got_6.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz";
+        sha1 = "240cd05785a9a18e561dc1b44b41c763ef1e8db0";
+      };
+    }
+
+    {
+      name = "graceful_fs___graceful_fs_4.1.15.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz";
+        sha1 = "ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00";
+      };
+    }
+
+    {
+      name = "graceful_readlink___graceful_readlink_1.0.1.tgz";
+      path = fetchurl {
+        name = "graceful_readlink___graceful_readlink_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz";
+        sha1 = "4cafad76bc62f02fa039b2f94e9a3dd3a391a725";
+      };
+    }
+
+    {
+      name = "growl___growl_1.10.5.tgz";
+      path = fetchurl {
+        name = "growl___growl_1.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz";
+        sha1 = "f2735dc2283674fa67478b10181059355c369e5e";
+      };
+    }
+
+    {
+      name = "har_schema___har_schema_2.0.0.tgz";
+      path = fetchurl {
+        name = "har_schema___har_schema_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    }
+
+    {
+      name = "har_validator___har_validator_5.1.3.tgz";
+      path = fetchurl {
+        name = "har_validator___har_validator_5.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz";
+        sha1 = "1ef89ebd3e4996557675eed9893110dc350fa080";
+      };
+    }
+
+    {
+      name = "has_ansi___has_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    }
+
+    {
+      name = "has_binary2___has_binary2_1.0.3.tgz";
+      path = fetchurl {
+        name = "has_binary2___has_binary2_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz";
+        sha1 = "7776ac627f3ea77250cfc332dab7ddf5e4f5d11d";
+      };
+    }
+
+    {
+      name = "has_binary___has_binary_0.1.7.tgz";
+      path = fetchurl {
+        name = "has_binary___has_binary_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz";
+        sha1 = "68e61eb16210c9545a0a5cce06a873912fe1e68c";
+      };
+    }
+
+    {
+      name = "has_cors___has_cors_1.1.0.tgz";
+      path = fetchurl {
+        name = "has_cors___has_cors_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz";
+        sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51";
+      };
+    }
+
+    {
+      name = "has_flag___has_flag_3.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
+        sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
+      };
+    }
+
+    {
+      name = "has_unicode___has_unicode_2.0.1.tgz";
+      path = fetchurl {
+        name = "has_unicode___has_unicode_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    }
+
+    {
+      name = "has_value___has_value_0.3.1.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
+        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
+      };
+    }
+
+    {
+      name = "has_value___has_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
+        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
+      };
+    }
+
+    {
+      name = "has_values___has_values_0.1.4.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    }
+
+    {
+      name = "has_values___has_values_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
+        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
+      };
+    }
+
+    {
+      name = "hash.js___hash.js_1.1.7.tgz";
+      path = fetchurl {
+        name = "hash.js___hash.js_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz";
+        sha1 = "0babca538e8d4ee4a0f8988d68866537a003cf42";
+      };
+    }
+
+    {
+      name = "hashish___hashish_0.0.4.tgz";
+      path = fetchurl {
+        name = "hashish___hashish_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz";
+        sha1 = "6d60bc6ffaf711b6afd60e426d077988014e6554";
+      };
+    }
+
+    {
+      name = "he___he_1.1.1.tgz";
+      path = fetchurl {
+        name = "he___he_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz";
+        sha1 = "93410fd21b009735151f8868c2f271f3427e23fd";
+      };
+    }
+
+    {
+      name = "helmet_crossdomain___helmet_crossdomain_0.3.0.tgz";
+      path = fetchurl {
+        name = "helmet_crossdomain___helmet_crossdomain_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz";
+        sha1 = "707e2df930f13ad61f76ed08e1bb51ab2b2e85fa";
+      };
+    }
+
+    {
+      name = "helmet_csp___helmet_csp_2.7.1.tgz";
+      path = fetchurl {
+        name = "helmet_csp___helmet_csp_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.7.1.tgz";
+        sha1 = "e8e0b5186ffd4db625cfcce523758adbfadb9dca";
+      };
+    }
+
+    {
+      name = "helmet___helmet_3.15.0.tgz";
+      path = fetchurl {
+        name = "helmet___helmet_3.15.0.tgz";
+        url  = "https://registry.yarnpkg.com/helmet/-/helmet-3.15.0.tgz";
+        sha1 = "fe0bb80e05d9eec589e3cbecaf5384409a3a64c9";
+      };
+    }
+
+    {
+      name = "hh_mm_ss___hh_mm_ss_1.2.0.tgz";
+      path = fetchurl {
+        name = "hh_mm_ss___hh_mm_ss_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/hh-mm-ss/-/hh-mm-ss-1.2.0.tgz";
+        sha1 = "6d0f0b8280824a634cb1d1f20e0bc7bc8b689948";
+      };
+    }
+
+    {
+      name = "hide_powered_by___hide_powered_by_1.0.0.tgz";
+      path = fetchurl {
+        name = "hide_powered_by___hide_powered_by_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz";
+        sha1 = "4a85ad65881f62857fc70af7174a1184dccce32b";
+      };
+    }
+
+    {
+      name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
+        sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
+      };
+    }
+
+    {
+      name = "hpkp___hpkp_2.0.0.tgz";
+      path = fetchurl {
+        name = "hpkp___hpkp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz";
+        sha1 = "10e142264e76215a5d30c44ec43de64dee6d1672";
+      };
+    }
+
+    {
+      name = "hsts___hsts_2.1.0.tgz";
+      path = fetchurl {
+        name = "hsts___hsts_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz";
+        sha1 = "cbd6c918a2385fee1dd5680bfb2b3a194c0121cc";
+      };
+    }
+
+    {
+      name = "http_cache_semantics___http_cache_semantics_3.8.1.tgz";
+      path = fetchurl {
+        name = "http_cache_semantics___http_cache_semantics_3.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz";
+        sha1 = "39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.6.3.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
+        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
+      };
+    }
+
+    {
+      name = "http_errors___http_errors_1.3.1.tgz";
+      path = fetchurl {
+        name = "http_errors___http_errors_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz";
+        sha1 = "197e22cdebd4198585e8694ef6786197b91ed942";
+      };
+    }
+
+    {
+      name = "http_proxy_agent___http_proxy_agent_2.1.0.tgz";
+      path = fetchurl {
+        name = "http_proxy_agent___http_proxy_agent_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz";
+        sha1 = "e4821beef5b2142a2026bd73926fe537631c5405";
+      };
+    }
+
+    {
+      name = "http_signature___http_signature_1.2.0.tgz";
+      path = fetchurl {
+        name = "http_signature___http_signature_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    }
+
+    {
+      name = "https_proxy_agent___https_proxy_agent_2.2.1.tgz";
+      path = fetchurl {
+        name = "https_proxy_agent___https_proxy_agent_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz";
+        sha1 = "51552970fa04d723e04c56d04178c3f92592bbc0";
+      };
+    }
+
+    {
+      name = "humanize_ms___humanize_ms_1.2.1.tgz";
+      path = fetchurl {
+        name = "humanize_ms___humanize_ms_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz";
+        sha1 = "c46e3159a293f6b896da29316d8b6fe8bb79bbed";
+      };
+    }
+
+    {
+      name = "husky___husky_1.2.0.tgz";
+      path = fetchurl {
+        name = "husky___husky_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/husky/-/husky-1.2.0.tgz";
+        sha1 = "d631dda1e4a9ee8ba69a10b0c51a0e2c66e711e5";
+      };
+    }
+
+    {
+      name = "i___i_0.3.6.tgz";
+      path = fetchurl {
+        name = "i___i_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz";
+        sha1 = "d96c92732076f072711b6b10fd7d4f65ad8ee23d";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.23.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.23.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
+        sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
+      };
+    }
+
+    {
+      name = "iconv_lite___iconv_lite_0.4.24.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.24.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
+      };
+    }
+
+    {
+      name = "ienoopen___ienoopen_1.0.0.tgz";
+      path = fetchurl {
+        name = "ienoopen___ienoopen_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz";
+        sha1 = "346a428f474aac8f50cf3784ea2d0f16f62bda6b";
+      };
+    }
+
+    {
+      name = "iferr___iferr_0.1.5.tgz";
+      path = fetchurl {
+        name = "iferr___iferr_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz";
+        sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
+      };
+    }
+
+    {
+      name = "iferr___iferr_1.0.2.tgz";
+      path = fetchurl {
+        name = "iferr___iferr_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz";
+        sha1 = "e9fde49a9da06dc4a4194c6c9ed6d08305037a6d";
+      };
+    }
+
+    {
+      name = "ignore_by_default___ignore_by_default_1.0.1.tgz";
+      path = fetchurl {
+        name = "ignore_by_default___ignore_by_default_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz";
+        sha1 = "48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09";
+      };
+    }
+
+    {
+      name = "ignore_walk___ignore_walk_3.0.1.tgz";
+      path = fetchurl {
+        name = "ignore_walk___ignore_walk_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
+        sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
+      };
+    }
+
+    {
+      name = "ignore___ignore_3.3.10.tgz";
+      path = fetchurl {
+        name = "ignore___ignore_3.3.10.tgz";
+        url  = "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz";
+        sha1 = "0a97fb876986e8081c631160f8f9f389157f0043";
+      };
+    }
+
+    {
+      name = "immediate_chunk_store___immediate_chunk_store_2.0.0.tgz";
+      path = fetchurl {
+        name = "immediate_chunk_store___immediate_chunk_store_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.0.0.tgz";
+        sha1 = "f313fd0cc71396d8911ad031179e1cccfda3da18";
+      };
+    }
+
+    {
+      name = "import_fresh___import_fresh_2.0.0.tgz";
+      path = fetchurl {
+        name = "import_fresh___import_fresh_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz";
+        sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
+      };
+    }
+
+    {
+      name = "import_lazy___import_lazy_2.1.0.tgz";
+      path = fetchurl {
+        name = "import_lazy___import_lazy_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz";
+        sha1 = "05698e3d45c88e8d7e9d92cb0584e77f096f3e43";
+      };
+    }
+
+    {
+      name = "imurmurhash___imurmurhash_0.1.4.tgz";
+      path = fetchurl {
+        name = "imurmurhash___imurmurhash_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz";
+        sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
+      };
+    }
+
+    {
+      name = "indent_string___indent_string_3.2.0.tgz";
+      path = fetchurl {
+        name = "indent_string___indent_string_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz";
+        sha1 = "4a5fd6d27cc332f37e5419a504dbb837105c9289";
+      };
+    }
+
+    {
+      name = "indexof___indexof_0.0.1.tgz";
+      path = fetchurl {
+        name = "indexof___indexof_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    }
+
+    {
+      name = "inflection___inflection_1.12.0.tgz";
+      path = fetchurl {
+        name = "inflection___inflection_1.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz";
+        sha1 = "a200935656d6f5f6bc4dc7502e1aecb703228416";
+      };
+    }
+
+    {
+      name = "inflight___inflight_1.0.6.tgz";
+      path = fetchurl {
+        name = "inflight___inflight_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.3.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    }
+
+    {
+      name = "inherits___inherits_2.0.1.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
+        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
+      };
+    }
+
+    {
+      name = "ini___ini_1.3.5.tgz";
+      path = fetchurl {
+        name = "ini___ini_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
+        sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
+      };
+    }
+
+    {
+      name = "init_package_json___init_package_json_1.10.3.tgz";
+      path = fetchurl {
+        name = "init_package_json___init_package_json_1.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz";
+        sha1 = "45ffe2f610a8ca134f2bd1db5637b235070f6cbe";
+      };
+    }
+
+    {
+      name = "inquirer___inquirer_0.12.0.tgz";
+      path = fetchurl {
+        name = "inquirer___inquirer_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz";
+        sha1 = "1ef2bfd63504df0bc75785fff8c2c41df12f077e";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_1.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
+        sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
+      };
+    }
+
+    {
+      name = "invert_kv___invert_kv_2.0.0.tgz";
+      path = fetchurl {
+        name = "invert_kv___invert_kv_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz";
+        sha1 = "7393f5afa59ec9ff5f67a27620d11c226e3eec02";
+      };
+    }
+
+    {
+      name = "ioredis___ioredis_3.2.2.tgz";
+      path = fetchurl {
+        name = "ioredis___ioredis_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/ioredis/-/ioredis-3.2.2.tgz";
+        sha1 = "b7d5ff3afd77bb9718bb2821329b894b9a44c00b";
+      };
+    }
+
+    {
+      name = "ip_anonymize___ip_anonymize_0.0.6.tgz";
+      path = fetchurl {
+        name = "ip_anonymize___ip_anonymize_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/ip-anonymize/-/ip-anonymize-0.0.6.tgz";
+        sha1 = "d2c513e448e874e8cc380d03404691b94b018e68";
+      };
+    }
+
+    {
+      name = "ip_regex___ip_regex_2.1.0.tgz";
+      path = fetchurl {
+        name = "ip_regex___ip_regex_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz";
+        sha1 = "fa78bf5d2e6913c911ce9f819ee5146bb6d844e9";
+      };
+    }
+
+    {
+      name = "ip_set___ip_set_1.0.1.tgz";
+      path = fetchurl {
+        name = "ip_set___ip_set_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ip-set/-/ip-set-1.0.1.tgz";
+        sha1 = "633b66d0bd6c8d0de968d053263c9120d3b6727e";
+      };
+    }
+
+    {
+      name = "ip___ip_1.1.5.tgz";
+      path = fetchurl {
+        name = "ip___ip_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
+        sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.0.5.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.0.5.tgz";
+        sha1 = "5fa78cf301b825c78abc3042d812723049ea23c7";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz";
+        sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e";
+      };
+    }
+
+    {
+      name = "ipaddr.js___ipaddr.js_1.8.1.tgz";
+      path = fetchurl {
+        name = "ipaddr.js___ipaddr.js_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz";
+        sha1 = "fa4b79fa47fd3def5e3b159825161c0a519c9427";
+      };
+    }
+
+    {
+      name = "ipv6_normalize___ipv6_normalize_1.0.1.tgz";
+      path = fetchurl {
+        name = "ipv6_normalize___ipv6_normalize_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz";
+        sha1 = "1b3258290d365fa83239e89907dde4592e7620a8";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
+        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
+      };
+    }
+
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
+        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
+      };
+    }
+
+    {
+      name = "is_arrayish___is_arrayish_0.3.2.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz";
+        sha1 = "4574a2ae56f7ab206896fb431eaeed066fdf8f03";
+      };
+    }
+
+    {
+      name = "is_ascii___is_ascii_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_ascii___is_ascii_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-ascii/-/is-ascii-1.0.0.tgz";
+        sha1 = "f02ad0259a0921cd199ff21ce1b09e0f6b4e3929";
+      };
+    }
+
+    {
+      name = "is_binary_path___is_binary_path_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
+        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
+      };
+    }
+
+    {
+      name = "is_bluebird___is_bluebird_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_bluebird___is_bluebird_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz";
+        sha1 = "096439060f4aa411abee19143a84d6a55346d6e2";
+      };
+    }
+
+    {
+      name = "is_buffer___is_buffer_1.1.6.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
+      };
+    }
+
+    {
+      name = "is_buffer___is_buffer_2.0.3.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz";
+        sha1 = "4ecf3fcf749cbd1e472689e109ac66261a25e725";
+      };
+    }
+
+    {
+      name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
+        sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
+      };
+    }
+
+    {
+      name = "is_ci___is_ci_1.2.1.tgz";
+      path = fetchurl {
+        name = "is_ci___is_ci_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz";
+        sha1 = "e3779c8ee17fccf428488f6e281187f2e632841c";
+      };
+    }
+
+    {
+      name = "is_cidr___is_cidr_2.0.7.tgz";
+      path = fetchurl {
+        name = "is_cidr___is_cidr_2.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/is-cidr/-/is-cidr-2.0.7.tgz";
+        sha1 = "0fd4b863c26b2eb2d157ed21060c4f3f8dd356ce";
+      };
+    }
+
+    {
+      name = "is_cidr___is_cidr_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_cidr___is_cidr_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.0.0.tgz";
+        sha1 = "1acf35c9e881063cd5f696d48959b30fed3eed56";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
+        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
+      };
+    }
+
+    {
+      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
+        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
+        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
+      };
+    }
+
+    {
+      name = "is_descriptor___is_descriptor_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
+        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
+      };
+    }
+
+    {
+      name = "is_directory___is_directory_0.3.1.tgz";
+      path = fetchurl {
+        name = "is_directory___is_directory_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz";
+        sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    }
+
+    {
+      name = "is_extendable___is_extendable_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
+        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
+      };
+    }
+
+    {
+      name = "is_extglob___is_extglob_2.1.1.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
+        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
+      };
+    }
+
+    {
+      name = "is_file___is_file_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_file___is_file_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz";
+        sha1 = "28a44cfbd9d3db193045f22b65fce8edf9620596";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    }
+
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    }
+
+    {
+      name = "is_generator___is_generator_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_generator___is_generator_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz";
+        sha1 = "c14c21057ed36e328db80347966c693f886389f3";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_3.1.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
+        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
+      };
+    }
+
+    {
+      name = "is_glob___is_glob_4.0.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz";
+        sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
+      };
+    }
+
+    {
+      name = "is_installed_globally___is_installed_globally_0.1.0.tgz";
+      path = fetchurl {
+        name = "is_installed_globally___is_installed_globally_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz";
+        sha1 = "0dfd98f5a9111716dd535dda6492f67bf3d25a80";
+      };
+    }
+
+    {
+      name = "is_my_ip_valid___is_my_ip_valid_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_my_ip_valid___is_my_ip_valid_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz";
+        sha1 = "7b351b8e8edd4d3995d4d066680e664d94696824";
+      };
+    }
+
+    {
+      name = "is_my_json_valid___is_my_json_valid_2.19.0.tgz";
+      path = fetchurl {
+        name = "is_my_json_valid___is_my_json_valid_2.19.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz";
+        sha1 = "8fd6e40363cd06b963fa877d444bfb5eddc62175";
+      };
+    }
+
+    {
+      name = "is_nan___is_nan_1.2.1.tgz";
+      path = fetchurl {
+        name = "is_nan___is_nan_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz";
+        sha1 = "9faf65b6fb6db24b7f5c0628475ea71f988401e2";
+      };
+    }
+
+    {
+      name = "is_npm___is_npm_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_npm___is_npm_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz";
+        sha1 = "f2fb63a65e4905b406c86072765a1a4dc793b9f4";
+      };
+    }
+
+    {
+      name = "is_number___is_number_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
+        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
+      };
+    }
+
+    {
+      name = "is_obj___is_obj_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_obj___is_obj_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz";
+        sha1 = "3e4729ac1f5fde025cd7d83a896dab9f4f67db0f";
+      };
+    }
+
+    {
+      name = "is_observable___is_observable_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_observable___is_observable_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz";
+        sha1 = "b3e986c8f44de950867cab5403f5a3465005975e";
+      };
+    }
+
+    {
+      name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
+        sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
+      };
+    }
+
+    {
+      name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz";
+        sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52";
+      };
+    }
+
+    {
+      name = "is_path_inside___is_path_inside_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_path_inside___is_path_inside_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz";
+        sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
+      };
+    }
+
+    {
+      name = "is_plain_object___is_plain_object_2.0.4.tgz";
+      path = fetchurl {
+        name = "is_plain_object___is_plain_object_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
+      };
+    }
+
+    {
+      name = "is_promise___is_promise_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_promise___is_promise_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz";
+        sha1 = "79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa";
+      };
+    }
+
+    {
+      name = "is_property___is_property_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_property___is_property_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz";
+        sha1 = "57fe1c4e48474edd65b09911f26b1cd4095dda84";
+      };
+    }
+
+    {
+      name = "is_redirect___is_redirect_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_redirect___is_redirect_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz";
+        sha1 = "1d03dded53bd8db0f30c26e4f95d36fc7c87dc24";
+      };
+    }
+
+    {
+      name = "is_regexp___is_regexp_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_regexp___is_regexp_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz";
+        sha1 = "fd2d883545c46bac5a633e7b9a09e87fa2cb5069";
+      };
+    }
+
+    {
+      name = "is_resolvable___is_resolvable_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_resolvable___is_resolvable_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz";
+        sha1 = "fb18f87ce1feb925169c9a407c19318a3206ed88";
+      };
+    }
+
+    {
+      name = "is_retry_allowed___is_retry_allowed_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_retry_allowed___is_retry_allowed_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz";
+        sha1 = "11a060568b67339444033d0125a61a20d564fb34";
+      };
+    }
+
+    {
+      name = "is_stream___is_stream_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_stream___is_stream_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
+        sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
+      };
+    }
+
+    {
+      name = "is_typedarray___is_typedarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_typedarray___is_typedarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    }
+
+    {
+      name = "is_windows___is_windows_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_windows___is_windows_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
+        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
+      };
+    }
+
+    {
+      name = "isarray___isarray_0.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    }
+
+    {
+      name = "isarray___isarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    }
+
+    {
+      name = "isarray___isarray_2.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz";
+        sha1 = "a37d94ed9cda2d59865c9f76fe596ee1f338741e";
+      };
+    }
+
+    {
+      name = "isexe___isexe_2.0.0.tgz";
+      path = fetchurl {
+        name = "isexe___isexe_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    }
+
+    {
+      name = "iso_639_3___iso_639_3_1.1.0.tgz";
+      path = fetchurl {
+        name = "iso_639_3___iso_639_3_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz";
+        sha1 = "83722daf55490a707c318ae18a33ba3bab06c843";
+      };
+    }
+
+    {
+      name = "isobject___isobject_2.1.0.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
+        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
+      };
+    }
+
+    {
+      name = "isobject___isobject_3.0.1.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    }
+
+    {
+      name = "isstream___isstream_0.1.2.tgz";
+      path = fetchurl {
+        name = "isstream___isstream_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    }
+
+    {
+      name = "jest_get_type___jest_get_type_22.4.3.tgz";
+      path = fetchurl {
+        name = "jest_get_type___jest_get_type_22.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz";
+        sha1 = "e3a8504d8479342dd4420236b322869f18900ce4";
+      };
+    }
+
+    {
+      name = "jest_validate___jest_validate_23.6.0.tgz";
+      path = fetchurl {
+        name = "jest_validate___jest_validate_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz";
+        sha1 = "36761f99d1ed33fcd425b4e4c5595d62b6597474";
+      };
+    }
+
+    {
+      name = "js_tokens___js_tokens_3.0.2.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
+        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
+      };
+    }
+
+    {
+      name = "js_yaml___js_yaml_3.12.0.tgz";
+      path = fetchurl {
+        name = "js_yaml___js_yaml_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz";
+        sha1 = "eaed656ec8344f10f527c6bfa1b6e2244de167d1";
+      };
+    }
+
+    {
+      name = "jsbn___jsbn_0.1.1.tgz";
+      path = fetchurl {
+        name = "jsbn___jsbn_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    }
+
+    {
+      name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+      path = fetchurl {
+        name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
+        sha1 = "bb867cfb3450e69107c131d1c514bab3dc8bcaa9";
+      };
+    }
+
+    {
+      name = "json_schema_ref_parser___json_schema_ref_parser_6.0.2.tgz";
+      path = fetchurl {
+        name = "json_schema_ref_parser___json_schema_ref_parser_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.0.2.tgz";
+        sha1 = "c17bfed06fa7ff8f1ade36067d087b46f5465ef8";
+      };
+    }
+
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
+      };
+    }
+
+    {
+      name = "json_schema___json_schema_0.2.3.tgz";
+      path = fetchurl {
+        name = "json_schema___json_schema_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    }
+
+    {
+      name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+      path = fetchurl {
+        name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
+        sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
+      };
+    }
+
+    {
+      name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+      path = fetchurl {
+        name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    }
+
+    {
+      name = "json3___json3_3.3.2.tgz";
+      path = fetchurl {
+        name = "json3___json3_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
+        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+      };
+    }
+
+    {
+      name = "json5___json5_1.0.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz";
+        sha1 = "779fb0018604fa854eacbf6252180d83543e3dbe";
+      };
+    }
+
+    {
+      name = "jsonfile___jsonfile_3.0.1.tgz";
+      path = fetchurl {
+        name = "jsonfile___jsonfile_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz";
+        sha1 = "a5ecc6f65f53f662c4415c7675a0331d0992ec66";
+      };
+    }
+
+    {
+      name = "jsonfile___jsonfile_4.0.0.tgz";
+      path = fetchurl {
+        name = "jsonfile___jsonfile_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz";
+        sha1 = "8771aae0799b64076b76640fca058f9c10e33ecb";
+      };
+    }
+
+    {
+      name = "jsonify___jsonify_0.0.0.tgz";
+      path = fetchurl {
+        name = "jsonify___jsonify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
+        sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
+      };
+    }
+
+    {
+      name = "https___github.com_Chocobozzz_jsonld_signatures_archive_77660963e722eb4541d2d255f9d9d4216329665f.tar.gz";
+      path = fetchurl {
+        name = "jsonld-signatures.tar.gz";
+        url  = "https://github.com/Chocobozzz/jsonld-signatures/archive/77660963e722eb4541d2d255f9d9d4216329665f.tar.gz";
+        sha256 = "0prld6q913bsh6kyfq43ny7cw5s1ixki5d4z1kw932shw9piqv5m";
+      };
+    }
+
+    {
+      name = "jsonld___jsonld_0.5.21.tgz";
+      path = fetchurl {
+        name = "jsonld___jsonld_0.5.21.tgz";
+        url  = "https://registry.yarnpkg.com/jsonld/-/jsonld-0.5.21.tgz";
+        sha1 = "4d5b78d717eb92bcd1ac9d88e34efad95370c0bf";
+      };
+    }
+
+    {
+      name = "jsonld___jsonld_1.1.0.tgz";
+      path = fetchurl {
+        name = "jsonld___jsonld_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonld/-/jsonld-1.1.0.tgz";
+        sha1 = "afcb168c44557a7bddead4d4513c3cbcae3bc5b9";
+      };
+    }
+
+    {
+      name = "jsonparse___jsonparse_1.3.1.tgz";
+      path = fetchurl {
+        name = "jsonparse___jsonparse_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz";
+        sha1 = "3f4dae4a91fac315f71062f8521cc239f1366280";
+      };
+    }
+
+    {
+      name = "jsonpointer.js___jsonpointer.js_0.4.0.tgz";
+      path = fetchurl {
+        name = "jsonpointer.js___jsonpointer.js_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonpointer.js/-/jsonpointer.js-0.4.0.tgz";
+        sha1 = "002cb123f767aafdeb0196132ce5c4f9941ccaba";
+      };
+    }
+
+    {
+      name = "jsonpointer___jsonpointer_4.0.1.tgz";
+      path = fetchurl {
+        name = "jsonpointer___jsonpointer_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz";
+        sha1 = "4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9";
+      };
+    }
+
+    {
+      name = "jsonschema_draft4___jsonschema_draft4_1.0.0.tgz";
+      path = fetchurl {
+        name = "jsonschema_draft4___jsonschema_draft4_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz";
+        sha1 = "f0af2005054f0f0ade7ea2118614b69dc512d865";
+      };
+    }
+
+    {
+      name = "jsonschema___jsonschema_1.2.4.tgz";
+      path = fetchurl {
+        name = "jsonschema___jsonschema_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz";
+        sha1 = "a46bac5d3506a254465bc548876e267c6d0d6464";
+      };
+    }
+
+    {
+      name = "jsprim___jsprim_1.4.1.tgz";
+      path = fetchurl {
+        name = "jsprim___jsprim_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    }
+
+    {
+      name = "junk___junk_2.1.0.tgz";
+      path = fetchurl {
+        name = "junk___junk_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/junk/-/junk-2.1.0.tgz";
+        sha1 = "f431b4b7f072dc500a5f10ce7f4ec71930e70134";
+      };
+    }
+
+    {
+      name = "jwa___jwa_1.1.6.tgz";
+      path = fetchurl {
+        name = "jwa___jwa_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz";
+        sha1 = "87240e76c9808dbde18783cf2264ef4929ee50e6";
+      };
+    }
+
+    {
+      name = "jws___jws_3.1.5.tgz";
+      path = fetchurl {
+        name = "jws___jws_3.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz";
+        sha1 = "80d12d05b293d1e841e7cb8b4e69e561adcf834f";
+      };
+    }
+
+    {
+      name = "k_bucket___k_bucket_4.0.1.tgz";
+      path = fetchurl {
+        name = "k_bucket___k_bucket_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz";
+        sha1 = "3fc2e5693f0b7bff90d7b6b476edd6087955d542";
+      };
+    }
+
+    {
+      name = "k_bucket___k_bucket_5.0.0.tgz";
+      path = fetchurl {
+        name = "k_bucket___k_bucket_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.0.0.tgz";
+        sha1 = "ef7a401fcd4c37cd31dceaa6ae4440ca91055e01";
+      };
+    }
+
+    {
+      name = "k_rpc_socket___k_rpc_socket_1.8.0.tgz";
+      path = fetchurl {
+        name = "k_rpc_socket___k_rpc_socket_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz";
+        sha1 = "9a4dd6a4f3795ed847ffa156579cc389990bd1f2";
+      };
+    }
+
+    {
+      name = "k_rpc___k_rpc_5.0.0.tgz";
+      path = fetchurl {
+        name = "k_rpc___k_rpc_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/k-rpc/-/k-rpc-5.0.0.tgz";
+        sha1 = "a72651860c96db440579e4c9f38dce8a42b481a8";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_3.2.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_4.0.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
+        sha1 = "20813df3d712928b207378691a45066fae72dd57";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_5.1.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
+        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
+      };
+    }
+
+    {
+      name = "kind_of___kind_of_6.0.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
+        sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
+      };
+    }
+
+    {
+      name = "known_css_properties___known_css_properties_0.3.0.tgz";
+      path = fetchurl {
+        name = "known_css_properties___known_css_properties_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz";
+        sha1 = "a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4";
+      };
+    }
+
+    {
+      name = "kuler___kuler_1.0.1.tgz";
+      path = fetchurl {
+        name = "kuler___kuler_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz";
+        sha1 = "ef7c784f36c9fb6e16dd3150d152677b2b0228a6";
+      };
+    }
+
+    {
+      name = "last_one_wins___last_one_wins_1.0.4.tgz";
+      path = fetchurl {
+        name = "last_one_wins___last_one_wins_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/last-one-wins/-/last-one-wins-1.0.4.tgz";
+        sha1 = "c1bfd0cbcb46790ec9156b8d1aee8fcb86cda22a";
+      };
+    }
+
+    {
+      name = "latest_version___latest_version_3.1.0.tgz";
+      path = fetchurl {
+        name = "latest_version___latest_version_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz";
+        sha1 = "a205383fea322b33b5ae3b18abee0dc2f356ee15";
+      };
+    }
+
+    {
+      name = "lazy_property___lazy_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "lazy_property___lazy_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz";
+        sha1 = "84ddc4b370679ba8bd4cdcfa4c06b43d57111147";
+      };
+    }
+
+    {
+      name = "lcid___lcid_1.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
+        sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
+      };
+    }
+
+    {
+      name = "lcid___lcid_2.0.0.tgz";
+      path = fetchurl {
+        name = "lcid___lcid_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz";
+        sha1 = "6ef5d2df60e52f82eb228a4c373e8d1f397253cf";
+      };
+    }
+
+    {
+      name = "ldap_filter___ldap_filter_0.2.2.tgz";
+      path = fetchurl {
+        name = "ldap_filter___ldap_filter_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/ldap-filter/-/ldap-filter-0.2.2.tgz";
+        sha1 = "f2b842be0b86da3352798505b31ebcae590d77d0";
+      };
+    }
+
+    {
+      name = "ldapjs___ldapjs_1.0.2.tgz";
+      path = fetchurl {
+        name = "ldapjs___ldapjs_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ldapjs/-/ldapjs-1.0.2.tgz";
+        sha1 = "544ff7032b7b83c68f0701328d9297aa694340f9";
+      };
+    }
+
+    {
+      name = "leven___leven_2.1.0.tgz";
+      path = fetchurl {
+        name = "leven___leven_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz";
+        sha1 = "c2e7a9f772094dee9d34202ae8acce4687875580";
+      };
+    }
+
+    {
+      name = "levn___levn_0.3.0.tgz";
+      path = fetchurl {
+        name = "levn___levn_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    }
+
+    {
+      name = "libcipm___libcipm_2.0.2.tgz";
+      path = fetchurl {
+        name = "libcipm___libcipm_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz";
+        sha1 = "4f38c2b37acf2ec156936cef1cbf74636568fc7b";
+      };
+    }
+
+    {
+      name = "libnpmhook___libnpmhook_4.0.1.tgz";
+      path = fetchurl {
+        name = "libnpmhook___libnpmhook_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-4.0.1.tgz";
+        sha1 = "63641654de772cbeb96a88527a7fd5456ec3c2d7";
+      };
+    }
+
+    {
+      name = "libnpx___libnpx_10.2.0.tgz";
+      path = fetchurl {
+        name = "libnpx___libnpx_10.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz";
+        sha1 = "1bf4a1c9f36081f64935eb014041da10855e3102";
+      };
+    }
+
+    {
+      name = "libxmljs___libxmljs_0.19.5.tgz";
+      path = fetchurl {
+        name = "libxmljs___libxmljs_0.19.5.tgz";
+        url  = "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.19.5.tgz";
+        sha1 = "b2f34cc12fd6a3e43670c604c42a902f339ea54d";
+      };
+    }
+
+    {
+      name = "lint_staged___lint_staged_8.1.0.tgz";
+      path = fetchurl {
+        name = "lint_staged___lint_staged_8.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.0.tgz";
+        sha1 = "dbc3ae2565366d8f20efb9f9799d076da64863f2";
+      };
+    }
+
+    {
+      name = "listr_silent_renderer___listr_silent_renderer_1.1.1.tgz";
+      path = fetchurl {
+        name = "listr_silent_renderer___listr_silent_renderer_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz";
+        sha1 = "924b5a3757153770bf1a8e3fbf74b8bbf3f9242e";
+      };
+    }
+
+    {
+      name = "listr_update_renderer___listr_update_renderer_0.5.0.tgz";
+      path = fetchurl {
+        name = "listr_update_renderer___listr_update_renderer_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz";
+        sha1 = "4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2";
+      };
+    }
+
+    {
+      name = "listr_verbose_renderer___listr_verbose_renderer_0.5.0.tgz";
+      path = fetchurl {
+        name = "listr_verbose_renderer___listr_verbose_renderer_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz";
+        sha1 = "f1132167535ea4c1261102b9f28dac7cba1e03db";
+      };
+    }
+
+    {
+      name = "listr___listr_0.14.3.tgz";
+      path = fetchurl {
+        name = "listr___listr_0.14.3.tgz";
+        url  = "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz";
+        sha1 = "2fea909604e434be464c50bddba0d496928fa586";
+      };
+    }
+
+    {
+      name = "load_ip_set___load_ip_set_2.1.0.tgz";
+      path = fetchurl {
+        name = "load_ip_set___load_ip_set_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz";
+        sha1 = "2d50b737cae41de4e413d213991d4083a3e1784b";
+      };
+    }
+
+    {
+      name = "locate_path___locate_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
+        sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
+      };
+    }
+
+    {
+      name = "locate_path___locate_path_3.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz";
+        sha1 = "dbec3b3ab759758071b58fe59fc41871af21400e";
+      };
+    }
+
+    {
+      name = "lock_verify___lock_verify_2.0.2.tgz";
+      path = fetchurl {
+        name = "lock_verify___lock_verify_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.2.tgz";
+        sha1 = "148e4f85974915c9e3c34d694b7de9ecb18ee7a8";
+      };
+    }
+
+    {
+      name = "lockfile___lockfile_1.0.4.tgz";
+      path = fetchurl {
+        name = "lockfile___lockfile_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz";
+        sha1 = "07f819d25ae48f87e538e6578b6964a4981a5609";
+      };
+    }
+
+    {
+      name = "lodash._baseuniq___lodash._baseuniq_4.6.0.tgz";
+      path = fetchurl {
+        name = "lodash._baseuniq___lodash._baseuniq_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz";
+        sha1 = "0ebb44e456814af7905c6212fa2c9b2d51b841e8";
+      };
+    }
+
+    {
+      name = "lodash._createset___lodash._createset_4.0.3.tgz";
+      path = fetchurl {
+        name = "lodash._createset___lodash._createset_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz";
+        sha1 = "0f4659fbb09d75194fa9e2b88a6644d363c9fe26";
+      };
+    }
+
+    {
+      name = "lodash._root___lodash._root_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash._root___lodash._root_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz";
+        sha1 = "fba1c4524c19ee9a5f8136b4609f017cf4ded692";
+      };
+    }
+
+    {
+      name = "lodash.assign___lodash.assign_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.assign___lodash.assign_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
+        sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
+      };
+    }
+
+    {
+      name = "lodash.bind___lodash.bind_4.2.1.tgz";
+      path = fetchurl {
+        name = "lodash.bind___lodash.bind_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz";
+        sha1 = "7ae3017e939622ac31b7d7d7dcb1b34db1690d35";
+      };
+    }
+
+    {
+      name = "lodash.capitalize___lodash.capitalize_4.2.1.tgz";
+      path = fetchurl {
+        name = "lodash.capitalize___lodash.capitalize_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz";
+        sha1 = "f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9";
+      };
+    }
+
+    {
+      name = "lodash.clone___lodash.clone_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.clone___lodash.clone_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz";
+        sha1 = "195870450f5a13192478df4bc3d23d2dea1907b6";
+      };
+    }
+
+    {
+      name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
+        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
+      };
+    }
+
+    {
+      name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+      path = fetchurl {
+        name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
+        sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
+      };
+    }
+
+    {
+      name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
+        sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
+      };
+    }
+
+    {
+      name = "lodash.difference___lodash.difference_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.difference___lodash.difference_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz";
+        sha1 = "9ccb4e505d486b91651345772885a2df27fd017c";
+      };
+    }
+
+    {
+      name = "lodash.flatten___lodash.flatten_4.4.0.tgz";
+      path = fetchurl {
+        name = "lodash.flatten___lodash.flatten_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz";
+        sha1 = "f31c22225a9632d2bbf8e4addbef240aa765a61f";
+      };
+    }
+
+    {
+      name = "lodash.foreach___lodash.foreach_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.foreach___lodash.foreach_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz";
+        sha1 = "1a6a35eace401280c7f06dddec35165ab27e3e53";
+      };
+    }
+
+    {
+      name = "lodash.get___lodash.get_4.4.2.tgz";
+      path = fetchurl {
+        name = "lodash.get___lodash.get_4.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz";
+        sha1 = "2d177f652fa31e939b4438d5341499dfa3825e99";
+      };
+    }
+
+    {
+      name = "lodash.isempty___lodash.isempty_4.4.0.tgz";
+      path = fetchurl {
+        name = "lodash.isempty___lodash.isempty_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz";
+        sha1 = "6f86cbedd8be4ec987be9aaf33c9684db1b31e7e";
+      };
+    }
+
+    {
+      name = "lodash.isequal___lodash.isequal_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.isequal___lodash.isequal_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz";
+        sha1 = "415c4478f2bcc30120c22ce10ed3226f7d3e18e0";
+      };
+    }
+
+    {
+      name = "lodash.kebabcase___lodash.kebabcase_4.1.1.tgz";
+      path = fetchurl {
+        name = "lodash.kebabcase___lodash.kebabcase_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz";
+        sha1 = "8489b1cb0d29ff88195cceca448ff6d6cc295c36";
+      };
+    }
+
+    {
+      name = "lodash.keys___lodash.keys_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.keys___lodash.keys_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz";
+        sha1 = "a08602ac12e4fb83f91fc1fb7a360a4d9ba35205";
+      };
+    }
+
+    {
+      name = "lodash.noop___lodash.noop_3.0.1.tgz";
+      path = fetchurl {
+        name = "lodash.noop___lodash.noop_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz";
+        sha1 = "38188f4d650a3a474258439b96ec45b32617133c";
+      };
+    }
+
+    {
+      name = "lodash.partial___lodash.partial_4.2.1.tgz";
+      path = fetchurl {
+        name = "lodash.partial___lodash.partial_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.partial/-/lodash.partial-4.2.1.tgz";
+        sha1 = "49f3d8cfdaa3bff8b3a91d127e923245418961d4";
+      };
+    }
+
+    {
+      name = "lodash.pick___lodash.pick_4.4.0.tgz";
+      path = fetchurl {
+        name = "lodash.pick___lodash.pick_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz";
+        sha1 = "52f05610fff9ded422611441ed1fc123a03001b3";
+      };
+    }
+
+    {
+      name = "lodash.sample___lodash.sample_4.2.1.tgz";
+      path = fetchurl {
+        name = "lodash.sample___lodash.sample_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.sample/-/lodash.sample-4.2.1.tgz";
+        sha1 = "5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d";
+      };
+    }
+
+    {
+      name = "lodash.shuffle___lodash.shuffle_4.2.0.tgz";
+      path = fetchurl {
+        name = "lodash.shuffle___lodash.shuffle_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz";
+        sha1 = "145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b";
+      };
+    }
+
+    {
+      name = "lodash.union___lodash.union_4.6.0.tgz";
+      path = fetchurl {
+        name = "lodash.union___lodash.union_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz";
+        sha1 = "48bb5088409f16f1821666641c44dd1aaae3cd88";
+      };
+    }
+
+    {
+      name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
+        sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
+      };
+    }
+
+    {
+      name = "lodash.values___lodash.values_4.3.0.tgz";
+      path = fetchurl {
+        name = "lodash.values___lodash.values_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz";
+        sha1 = "a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347";
+      };
+    }
+
+    {
+      name = "lodash.without___lodash.without_4.4.0.tgz";
+      path = fetchurl {
+        name = "lodash.without___lodash.without_4.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz";
+        sha1 = "3cd4574a00b67bae373a94b748772640507b7aac";
+      };
+    }
+
+    {
+      name = "lodash___lodash_4.17.4.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.4.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz";
+        sha1 = "78203a4d1c328ae1d86dca6460e369b57f4055ae";
+      };
+    }
+
+    {
+      name = "lodash___lodash_3.10.1.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_3.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz";
+        sha1 = "5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+      };
+    }
+
+    {
+      name = "lodash___lodash_4.17.11.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.11.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz";
+        sha1 = "b39ea6229ef607ecd89e2c8df12536891cac9b8d";
+      };
+    }
+
+    {
+      name = "log_symbols___log_symbols_1.0.2.tgz";
+      path = fetchurl {
+        name = "log_symbols___log_symbols_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz";
+        sha1 = "376ff7b58ea3086a0f09facc74617eca501e1a18";
+      };
+    }
+
+    {
+      name = "log_symbols___log_symbols_2.2.0.tgz";
+      path = fetchurl {
+        name = "log_symbols___log_symbols_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz";
+        sha1 = "5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a";
+      };
+    }
+
+    {
+      name = "log_update___log_update_2.3.0.tgz";
+      path = fetchurl {
+        name = "log_update___log_update_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz";
+        sha1 = "88328fd7d1ce7938b29283746f0b1bc126b24708";
+      };
+    }
+
+    {
+      name = "logform___logform_1.10.0.tgz";
+      path = fetchurl {
+        name = "logform___logform_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz";
+        sha1 = "c9d5598714c92b546e23f4e78147c40f1e02012e";
+      };
+    }
+
+    {
+      name = "lowercase_keys___lowercase_keys_1.0.1.tgz";
+      path = fetchurl {
+        name = "lowercase_keys___lowercase_keys_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz";
+        sha1 = "6f9e30b47084d971a7c820ff15a6c5167b74c26f";
+      };
+    }
+
+    {
+      name = "lru_cache___lru_cache_4.1.5.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_4.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz";
+        sha1 = "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
+      };
+    }
+
+    {
+      name = "lru_queue___lru_queue_0.1.0.tgz";
+      path = fetchurl {
+        name = "lru_queue___lru_queue_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz";
+        sha1 = "2738bd9f0d3cf4f84490c5736c48699ac632cda3";
+      };
+    }
+
+    {
+      name = "lru___lru_3.1.0.tgz";
+      path = fetchurl {
+        name = "lru___lru_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz";
+        sha1 = "ea7fb8546d83733396a13091d76cfeb4c06837d5";
+      };
+    }
+
+    {
+      name = "magnet_uri___magnet_uri_5.2.4.tgz";
+      path = fetchurl {
+        name = "magnet_uri___magnet_uri_5.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz";
+        sha1 = "7afe5b736af04445aff744c93a890a3710077688";
+      };
+    }
+
+    {
+      name = "maildev___maildev_1.0.0_rc3.tgz";
+      path = fetchurl {
+        name = "maildev___maildev_1.0.0_rc3.tgz";
+        url  = "https://registry.yarnpkg.com/maildev/-/maildev-1.0.0-rc3.tgz";
+        sha1 = "89429d47b07633e3269a74e484991eecdf3a3857";
+      };
+    }
+
+    {
+      name = "mailparser___mailparser_0.6.2.tgz";
+      path = fetchurl {
+        name = "mailparser___mailparser_0.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/mailparser/-/mailparser-0.6.2.tgz";
+        sha1 = "03c486039bdf4df6cd3b6adcaaac4107dfdbc068";
+      };
+    }
+
+    {
+      name = "make_dir___make_dir_1.3.0.tgz";
+      path = fetchurl {
+        name = "make_dir___make_dir_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz";
+        sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c";
+      };
+    }
+
+    {
+      name = "make_error___make_error_1.3.5.tgz";
+      path = fetchurl {
+        name = "make_error___make_error_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz";
+        sha1 = "efe4e81f6db28cadd605c70f29c831b58ef776c8";
+      };
+    }
+
+    {
+      name = "make_fetch_happen___make_fetch_happen_4.0.1.tgz";
+      path = fetchurl {
+        name = "make_fetch_happen___make_fetch_happen_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz";
+        sha1 = "141497cb878f243ba93136c83d8aba12c216c083";
+      };
+    }
+
+    {
+      name = "make_fetch_happen___make_fetch_happen_3.0.0.tgz";
+      path = fetchurl {
+        name = "make_fetch_happen___make_fetch_happen_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz";
+        sha1 = "7b661d2372fc4710ab5cc8e1fa3c290eea69a961";
+      };
+    }
+
+    {
+      name = "map_age_cleaner___map_age_cleaner_0.1.3.tgz";
+      path = fetchurl {
+        name = "map_age_cleaner___map_age_cleaner_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz";
+        sha1 = "7d583a7306434c055fe474b0f45078e6e1b4b92a";
+      };
+    }
+
+    {
+      name = "map_cache___map_cache_0.2.2.tgz";
+      path = fetchurl {
+        name = "map_cache___map_cache_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
+        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
+      };
+    }
+
+    {
+      name = "map_visit___map_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "map_visit___map_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
+        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
+      };
+    }
+
+    {
+      name = "marked_man___marked_man_0.2.1.tgz";
+      path = fetchurl {
+        name = "marked_man___marked_man_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/marked-man/-/marked-man-0.2.1.tgz";
+        sha1 = "f259271481de3b507263489f5221b7c5acfd2383";
+      };
+    }
+
+    {
+      name = "marked___marked_0.3.19.tgz";
+      path = fetchurl {
+        name = "marked___marked_0.3.19.tgz";
+        url  = "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz";
+        sha1 = "5d47f709c4c9fc3c216b6d46127280f40b39d790";
+      };
+    }
+
+    {
+      name = "matcher___matcher_1.1.1.tgz";
+      path = fetchurl {
+        name = "matcher___matcher_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz";
+        sha1 = "51d8301e138f840982b338b116bb0c09af62c1c2";
+      };
+    }
+
+    {
+      name = "md5___md5_2.2.1.tgz";
+      path = fetchurl {
+        name = "md5___md5_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz";
+        sha1 = "53ab38d5fe3c8891ba465329ea23fac0540126f9";
+      };
+    }
+
+    {
+      name = "meant___meant_1.0.1.tgz";
+      path = fetchurl {
+        name = "meant___meant_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz";
+        sha1 = "66044fea2f23230ec806fb515efea29c44d2115d";
+      };
+    }
+
+    {
+      name = "media_typer___media_typer_0.3.0.tgz";
+      path = fetchurl {
+        name = "media_typer___media_typer_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    }
+
+    {
+      name = "mediasource___mediasource_2.2.2.tgz";
+      path = fetchurl {
+        name = "mediasource___mediasource_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/mediasource/-/mediasource-2.2.2.tgz";
+        sha1 = "2fe826f14e51da97fa4bf87be7b808a0b11d3a4c";
+      };
+    }
+
+    {
+      name = "mem___mem_1.1.0.tgz";
+      path = fetchurl {
+        name = "mem___mem_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz";
+        sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76";
+      };
+    }
+
+    {
+      name = "mem___mem_4.0.0.tgz";
+      path = fetchurl {
+        name = "mem___mem_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz";
+        sha1 = "6437690d9471678f6cc83659c00cbafcd6b0cdaf";
+      };
+    }
+
+    {
+      name = "memoizee___memoizee_0.4.14.tgz";
+      path = fetchurl {
+        name = "memoizee___memoizee_0.4.14.tgz";
+        url  = "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz";
+        sha1 = "07a00f204699f9a95c2d9e77218271c7cd610d57";
+      };
+    }
+
+    {
+      name = "memory_chunk_store___memory_chunk_store_1.3.0.tgz";
+      path = fetchurl {
+        name = "memory_chunk_store___memory_chunk_store_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz";
+        sha1 = "ae99e7e3b58b52db43d49d94722930d39459d0c4";
+      };
+    }
+
+    {
+      name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+      path = fetchurl {
+        name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    }
+
+    {
+      name = "merge___merge_1.2.1.tgz";
+      path = fetchurl {
+        name = "merge___merge_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz";
+        sha1 = "38bebf80c3220a8a487b6fcfb3941bb11720c145";
+      };
+    }
+
+    {
+      name = "methods___methods_1.1.2.tgz";
+      path = fetchurl {
+        name = "methods___methods_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    }
+
+    {
+      name = "micromatch___micromatch_3.1.10.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_3.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
+        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
+      };
+    }
+
+    {
+      name = "mime_db___mime_db_1.37.0.tgz";
+      path = fetchurl {
+        name = "mime_db___mime_db_1.37.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz";
+        sha1 = "0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8";
+      };
+    }
+
+    {
+      name = "mime_types___mime_types_2.1.21.tgz";
+      path = fetchurl {
+        name = "mime_types___mime_types_2.1.21.tgz";
+        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz";
+        sha1 = "28995aa1ecb770742fe6ae7e58f9181c744b3f96";
+      };
+    }
+
+    {
+      name = "mime___mime_1.3.4.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz";
+        sha1 = "115f9e3b6b3daf2959983cb38f149a2d40eb5d53";
+      };
+    }
+
+    {
+      name = "mime___mime_1.4.1.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz";
+        sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6";
+      };
+    }
+
+    {
+      name = "mime___mime_1.6.0.tgz";
+      path = fetchurl {
+        name = "mime___mime_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
+        sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
+      };
+    }
+
+    {
+      name = "mime___mime_2.4.0.tgz";
+      path = fetchurl {
+        name = "mime___mime_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz";
+        sha1 = "e051fd881358585f3279df333fe694da0bcffdd6";
+      };
+    }
+
+    {
+      name = "mimelib___mimelib_0.3.1.tgz";
+      path = fetchurl {
+        name = "mimelib___mimelib_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/mimelib/-/mimelib-0.3.1.tgz";
+        sha1 = "787add2415d827acb3af6ec4bca1ea9596418853";
+      };
+    }
+
+    {
+      name = "mimic_fn___mimic_fn_1.2.0.tgz";
+      path = fetchurl {
+        name = "mimic_fn___mimic_fn_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
+        sha1 = "820c86a39334640e99516928bd03fca88057d022";
+      };
+    }
+
+    {
+      name = "mimic_response___mimic_response_1.0.1.tgz";
+      path = fetchurl {
+        name = "mimic_response___mimic_response_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz";
+        sha1 = "4923538878eef42063cb8a3e3b0798781487ab1b";
+      };
+    }
+
+    {
+      name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
+        sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
+      };
+    }
+
+    {
+      name = "minimatch___minimatch_3.0.4.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
+        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
+      };
+    }
+
+    {
+      name = "minimist___minimist_0.0.8.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_0.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
+      };
+    }
+
+    {
+      name = "minimist___minimist_1.1.3.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz";
+        sha1 = "3bedfd91a92d39016fcfaa1c681e8faa1a1efda8";
+      };
+    }
+
+    {
+      name = "minimist___minimist_1.2.0.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
+        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
+      };
+    }
+
+    {
+      name = "minipass___minipass_2.3.5.tgz";
+      path = fetchurl {
+        name = "minipass___minipass_2.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz";
+        sha1 = "cacebe492022497f656b0f0f51e2682a9ed2d848";
+      };
+    }
+
+    {
+      name = "minizlib___minizlib_1.1.1.tgz";
+      path = fetchurl {
+        name = "minizlib___minizlib_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz";
+        sha1 = "6734acc045a46e61d596a43bb9d9cd326e19cc42";
+      };
+    }
+
+    {
+      name = "mississippi___mississippi_2.0.0.tgz";
+      path = fetchurl {
+        name = "mississippi___mississippi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz";
+        sha1 = "3442a508fafc28500486feea99409676e4ee5a6f";
+      };
+    }
+
+    {
+      name = "mississippi___mississippi_3.0.0.tgz";
+      path = fetchurl {
+        name = "mississippi___mississippi_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz";
+        sha1 = "ea0a3291f97e0b5e8776b363d5f0a12d94c67022";
+      };
+    }
+
+    {
+      name = "mixin_deep___mixin_deep_1.3.1.tgz";
+      path = fetchurl {
+        name = "mixin_deep___mixin_deep_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
+        sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
+      };
+    }
+
+    {
+      name = "mkdirp___mkdirp_0.5.1.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
+        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
+      };
+    }
+
+    {
+      name = "mocha___mocha_5.2.0.tgz";
+      path = fetchurl {
+        name = "mocha___mocha_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz";
+        sha1 = "6d8ae508f59167f940f2b5b3c4a612ae50c90ae6";
+      };
+    }
+
+    {
+      name = "moment_timezone___moment_timezone_0.5.23.tgz";
+      path = fetchurl {
+        name = "moment_timezone___moment_timezone_0.5.23.tgz";
+        url  = "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz";
+        sha1 = "7cbb00db2c14c71b19303cb47b0fb0a6d8651463";
+      };
+    }
+
+    {
+      name = "moment___moment_2.22.2.tgz";
+      path = fetchurl {
+        name = "moment___moment_2.22.2.tgz";
+        url  = "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz";
+        sha1 = "3c257f9839fc0e93ff53149632239eb90783ff66";
+      };
+    }
+
+    {
+      name = "moment___moment_2.24.0.tgz";
+      path = fetchurl {
+        name = "moment___moment_2.24.0.tgz";
+        url  = "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz";
+        sha1 = "0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b";
+      };
+    }
+
+    {
+      name = "morgan___morgan_1.9.1.tgz";
+      path = fetchurl {
+        name = "morgan___morgan_1.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz";
+        sha1 = "0a8d16734a1d9afbc824b99df87e738e58e2da59";
+      };
+    }
+
+    {
+      name = "move_concurrently___move_concurrently_1.0.1.tgz";
+      path = fetchurl {
+        name = "move_concurrently___move_concurrently_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz";
+        sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
+      };
+    }
+
+    {
+      name = "mp4_box_encoding___mp4_box_encoding_1.3.0.tgz";
+      path = fetchurl {
+        name = "mp4_box_encoding___mp4_box_encoding_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz";
+        sha1 = "2a6f750947ff68c3a498fd76cd6424c53d995d48";
+      };
+    }
+
+    {
+      name = "mp4_stream___mp4_stream_2.0.3.tgz";
+      path = fetchurl {
+        name = "mp4_stream___mp4_stream_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/mp4-stream/-/mp4-stream-2.0.3.tgz";
+        sha1 = "30acee07709d323f8dcd87a07b3ce9c3c4bfb364";
+      };
+    }
+
+    {
+      name = "ms___ms_0.7.1.tgz";
+      path = fetchurl {
+        name = "ms___ms_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz";
+        sha1 = "9cd13c03adbff25b65effde7ce864ee952017098";
+      };
+    }
+
+    {
+      name = "ms___ms_0.7.2.tgz";
+      path = fetchurl {
+        name = "ms___ms_0.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz";
+        sha1 = "ae25cf2512b3885a1d95d7f037868d8431124765";
+      };
+    }
+
+    {
+      name = "ms___ms_2.0.0.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    }
+
+    {
+      name = "ms___ms_2.1.1.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz";
+        sha1 = "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a";
+      };
+    }
+
+    {
+      name = "multer___multer_1.4.1.tgz";
+      path = fetchurl {
+        name = "multer___multer_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/multer/-/multer-1.4.1.tgz";
+        sha1 = "24b12a416a22fec2ade810539184bf138720159e";
+      };
+    }
+
+    {
+      name = "multistream___multistream_2.1.1.tgz";
+      path = fetchurl {
+        name = "multistream___multistream_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz";
+        sha1 = "629d3a29bd76623489980d04519a2c365948148c";
+      };
+    }
+
+    {
+      name = "mute_stream___mute_stream_0.0.5.tgz";
+      path = fetchurl {
+        name = "mute_stream___mute_stream_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz";
+        sha1 = "8fbfabb0a98a253d3184331f9e8deb7372fac6c0";
+      };
+    }
+
+    {
+      name = "mute_stream___mute_stream_0.0.7.tgz";
+      path = fetchurl {
+        name = "mute_stream___mute_stream_0.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz";
+        sha1 = "3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab";
+      };
+    }
+
+    {
+      name = "mv___mv_2.1.1.tgz";
+      path = fetchurl {
+        name = "mv___mv_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz";
+        sha1 = "ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2";
+      };
+    }
+
+    {
+      name = "nan___nan_2.11.1.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz";
+        sha1 = "90e22bccb8ca57ea4cd37cc83d3819b52eea6766";
+      };
+    }
+
+    {
+      name = "nan___nan_2.10.0.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz";
+        sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f";
+      };
+    }
+
+    {
+      name = "nanomatch___nanomatch_1.2.13.tgz";
+      path = fetchurl {
+        name = "nanomatch___nanomatch_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
+        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
+      };
+    }
+
+    {
+      name = "napi_build_utils___napi_build_utils_1.0.1.tgz";
+      path = fetchurl {
+        name = "napi_build_utils___napi_build_utils_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz";
+        sha1 = "1381a0f92c39d66bf19852e7873432fc2123e508";
+      };
+    }
+
+    {
+      name = "ncp___ncp_1.0.1.tgz";
+      path = fetchurl {
+        name = "ncp___ncp_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz";
+        sha1 = "d15367e5cb87432ba117d2bf80fdf45aecfb4246";
+      };
+    }
+
+    {
+      name = "ncp___ncp_2.0.0.tgz";
+      path = fetchurl {
+        name = "ncp___ncp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz";
+        sha1 = "195a21d6c46e361d2fb1281ba38b91e9df7bdbb3";
+      };
+    }
+
+    {
+      name = "needle___needle_2.2.4.tgz";
+      path = fetchurl {
+        name = "needle___needle_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz";
+        sha1 = "51931bff82533b1928b7d1d69e01f1b00ffd2a4e";
+      };
+    }
+
+    {
+      name = "negotiator___negotiator_0.5.3.tgz";
+      path = fetchurl {
+        name = "negotiator___negotiator_0.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz";
+        sha1 = "269d5c476810ec92edbe7b6c2f28316384f9a7e8";
+      };
+    }
+
+    {
+      name = "negotiator___negotiator_0.6.1.tgz";
+      path = fetchurl {
+        name = "negotiator___negotiator_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
+        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
+      };
+    }
+
+    {
+      name = "netmask___netmask_1.0.6.tgz";
+      path = fetchurl {
+        name = "netmask___netmask_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz";
+        sha1 = "20297e89d86f6f6400f250d9f4f6b4c1945fcd35";
+      };
+    }
+
+    {
+      name = "netrc_parser___netrc_parser_3.1.6.tgz";
+      path = fetchurl {
+        name = "netrc_parser___netrc_parser_3.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/netrc-parser/-/netrc-parser-3.1.6.tgz";
+        sha1 = "7243c9ec850b8e805b9bdc7eae7b1450d4a96e72";
+      };
+    }
+
+    {
+      name = "next_event___next_event_1.0.0.tgz";
+      path = fetchurl {
+        name = "next_event___next_event_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/next-event/-/next-event-1.0.0.tgz";
+        sha1 = "e7778acde2e55802e0ad1879c39cf6f75eda61d8";
+      };
+    }
+
+    {
+      name = "next_tick___next_tick_1.0.0.tgz";
+      path = fetchurl {
+        name = "next_tick___next_tick_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
+        sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
+      };
+    }
+
+    {
+      name = "nice_try___nice_try_1.0.5.tgz";
+      path = fetchurl {
+        name = "nice_try___nice_try_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz";
+        sha1 = "a3378a7696ce7d223e88fc9b764bd7ef1089e366";
+      };
+    }
+
+    {
+      name = "nocache___nocache_2.0.0.tgz";
+      path = fetchurl {
+        name = "nocache___nocache_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz";
+        sha1 = "202b48021a0c4cbde2df80de15a17443c8b43980";
+      };
+    }
+
+    {
+      name = "node_abi___node_abi_2.5.0.tgz";
+      path = fetchurl {
+        name = "node_abi___node_abi_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-abi/-/node-abi-2.5.0.tgz";
+        sha1 = "942e1a78bce764bc0c1672d5821e492b9d032052";
+      };
+    }
+
+    {
+      name = "node_addon_api___node_addon_api_1.6.2.tgz";
+      path = fetchurl {
+        name = "node_addon_api___node_addon_api_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.2.tgz";
+        sha1 = "d8aad9781a5cfc4132cc2fecdbdd982534265217";
+      };
+    }
+
+    {
+      name = "node_fetch_npm___node_fetch_npm_2.0.2.tgz";
+      path = fetchurl {
+        name = "node_fetch_npm___node_fetch_npm_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz";
+        sha1 = "7258c9046182dca345b4208eda918daf33697ff7";
+      };
+    }
+
+    {
+      name = "node_forge___node_forge_0.7.6.tgz";
+      path = fetchurl {
+        name = "node_forge___node_forge_0.7.6.tgz";
+        url  = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz";
+        sha1 = "fdf3b418aee1f94f0ef642cd63486c77ca9724ac";
+      };
+    }
+
+    {
+      name = "node_gyp_build___node_gyp_build_3.4.0.tgz";
+      path = fetchurl {
+        name = "node_gyp_build___node_gyp_build_3.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.4.0.tgz";
+        sha1 = "f8f62507e65f152488b28aac25d04b9d79748cf7";
+      };
+    }
+
+    {
+      name = "node_gyp___node_gyp_3.8.0.tgz";
+      path = fetchurl {
+        name = "node_gyp___node_gyp_3.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz";
+        sha1 = "540304261c330e80d0d5edce253a68cb3964218c";
+      };
+    }
+
+    {
+      name = "node_pre_gyp___node_pre_gyp_0.11.0.tgz";
+      path = fetchurl {
+        name = "node_pre_gyp___node_pre_gyp_0.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz";
+        sha1 = "db1f33215272f692cd38f03238e3e9b47c5dd054";
+      };
+    }
+
+    {
+      name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+      path = fetchurl {
+        name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
+        sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
+      };
+    }
+
+    {
+      name = "nodemailer_fetch___nodemailer_fetch_1.3.0.tgz";
+      path = fetchurl {
+        name = "nodemailer_fetch___nodemailer_fetch_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz";
+        sha1 = "9f37f6a5b80c1cb5d697ca2bfbde41a6582a50b0";
+      };
+    }
+
+    {
+      name = "nodemailer_fetch___nodemailer_fetch_1.6.0.tgz";
+      path = fetchurl {
+        name = "nodemailer_fetch___nodemailer_fetch_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz";
+        sha1 = "79c4908a1c0f5f375b73fe888da9828f6dc963a4";
+      };
+    }
+
+    {
+      name = "nodemailer_shared___nodemailer_shared_1.0.4.tgz";
+      path = fetchurl {
+        name = "nodemailer_shared___nodemailer_shared_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz";
+        sha1 = "8b5c5c35bfb29a47dda7d38303f3a4fb47ba38ae";
+      };
+    }
+
+    {
+      name = "nodemailer_shared___nodemailer_shared_1.1.0.tgz";
+      path = fetchurl {
+        name = "nodemailer_shared___nodemailer_shared_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz";
+        sha1 = "cf5994e2fd268d00f5cf0fa767a08169edb07ec0";
+      };
+    }
+
+    {
+      name = "nodemailer___nodemailer_4.7.0.tgz";
+      path = fetchurl {
+        name = "nodemailer___nodemailer_4.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.7.0.tgz";
+        sha1 = "4420e06abfffd77d0618f184ea49047db84f4ad8";
+      };
+    }
+
+    {
+      name = "nodemon___nodemon_1.18.7.tgz";
+      path = fetchurl {
+        name = "nodemon___nodemon_1.18.7.tgz";
+        url  = "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.7.tgz";
+        sha1 = "716b66bf3e89ac4fcfb38a9e61887a03fc82efbb";
+      };
+    }
+
+    {
+      name = "noop_logger___noop_logger_0.1.1.tgz";
+      path = fetchurl {
+        name = "noop_logger___noop_logger_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz";
+        sha1 = "94a2b1633c4f1317553007d8966fd0e841b6a4c2";
+      };
+    }
+
+    {
+      name = "nopt___nopt_3.0.6.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_3.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
+        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
+      };
+    }
+
+    {
+      name = "nopt___nopt_4.0.1.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
+        sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
+      };
+    }
+
+    {
+      name = "nopt___nopt_1.0.10.tgz";
+      path = fetchurl {
+        name = "nopt___nopt_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz";
+        sha1 = "6ddd21bd2a31417b92727dd585f8a6f37608ebee";
+      };
+    }
+
+    {
+      name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
+        sha1 = "12f95a307d58352075a04907b84ac8be98ac012f";
+      };
+    }
+
+    {
+      name = "normalize_path___normalize_path_2.1.1.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
+        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
+      };
+    }
+
+    {
+      name = "npm_audit_report___npm_audit_report_1.3.1.tgz";
+      path = fetchurl {
+        name = "npm_audit_report___npm_audit_report_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.1.tgz";
+        sha1 = "e79ea1fcb5ffaf3031102b389d5222c2b0459632";
+      };
+    }
+
+    {
+      name = "npm_bundled___npm_bundled_1.0.5.tgz";
+      path = fetchurl {
+        name = "npm_bundled___npm_bundled_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz";
+        sha1 = "3c1732b7ba936b3a10325aef616467c0ccbcc979";
+      };
+    }
+
+    {
+      name = "npm_cache_filename___npm_cache_filename_1.0.2.tgz";
+      path = fetchurl {
+        name = "npm_cache_filename___npm_cache_filename_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz";
+        sha1 = "ded306c5b0bfc870a9e9faf823bc5f283e05ae11";
+      };
+    }
+
+    {
+      name = "npm_install_checks___npm_install_checks_3.0.0.tgz";
+      path = fetchurl {
+        name = "npm_install_checks___npm_install_checks_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz";
+        sha1 = "d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7";
+      };
+    }
+
+    {
+      name = "npm_lifecycle___npm_lifecycle_2.1.0.tgz";
+      path = fetchurl {
+        name = "npm_lifecycle___npm_lifecycle_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz";
+        sha1 = "1eda2eedb82db929e3a0c50341ab0aad140ed569";
+      };
+    }
+
+    {
+      name = "npm_logical_tree___npm_logical_tree_1.2.1.tgz";
+      path = fetchurl {
+        name = "npm_logical_tree___npm_logical_tree_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz";
+        sha1 = "44610141ca24664cad35d1e607176193fd8f5b88";
+      };
+    }
+
+    {
+      name = "npm_package_arg___npm_package_arg_6.1.0.tgz";
+      path = fetchurl {
+        name = "npm_package_arg___npm_package_arg_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
+        sha1 = "15ae1e2758a5027efb4c250554b85a737db7fcc1";
+      };
+    }
+
+    {
+      name = "npm_packlist___npm_packlist_1.1.12.tgz";
+      path = fetchurl {
+        name = "npm_packlist___npm_packlist_1.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz";
+        sha1 = "22bde2ebc12e72ca482abd67afc51eb49377243a";
+      };
+    }
+
+    {
+      name = "npm_path___npm_path_2.0.4.tgz";
+      path = fetchurl {
+        name = "npm_path___npm_path_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz";
+        sha1 = "c641347a5ff9d6a09e4d9bce5580c4f505278e64";
+      };
+    }
+
+    {
+      name = "npm_pick_manifest___npm_pick_manifest_2.2.3.tgz";
+      path = fetchurl {
+        name = "npm_pick_manifest___npm_pick_manifest_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz";
+        sha1 = "32111d2a9562638bb2c8f2bf27f7f3092c8fae40";
+      };
+    }
+
+    {
+      name = "npm_profile___npm_profile_3.0.2.tgz";
+      path = fetchurl {
+        name = "npm_profile___npm_profile_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/npm-profile/-/npm-profile-3.0.2.tgz";
+        sha1 = "58d568f1b56ef769602fd0aed8c43fa0e0de0f57";
+      };
+    }
+
+    {
+      name = "npm_registry_client___npm_registry_client_8.6.0.tgz";
+      path = fetchurl {
+        name = "npm_registry_client___npm_registry_client_8.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz";
+        sha1 = "7f1529f91450732e89f8518e0f21459deea3e4c4";
+      };
+    }
+
+    {
+      name = "npm_registry_fetch___npm_registry_fetch_1.1.1.tgz";
+      path = fetchurl {
+        name = "npm_registry_fetch___npm_registry_fetch_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-1.1.1.tgz";
+        sha1 = "710bc5947d9ee2c549375072dab6d5d17baf2eb2";
+      };
+    }
+
+    {
+      name = "npm_registry_fetch___npm_registry_fetch_3.8.0.tgz";
+      path = fetchurl {
+        name = "npm_registry_fetch___npm_registry_fetch_3.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz";
+        sha1 = "aa7d9a7c92aff94f48dba0984bdef4bd131c88cc";
+      };
+    }
+
+    {
+      name = "npm_run_path___npm_run_path_2.0.2.tgz";
+      path = fetchurl {
+        name = "npm_run_path___npm_run_path_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
+        sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
+      };
+    }
+
+    {
+      name = "npm_user_validate___npm_user_validate_1.0.0.tgz";
+      path = fetchurl {
+        name = "npm_user_validate___npm_user_validate_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz";
+        sha1 = "8ceca0f5cea04d4e93519ef72d0557a75122e951";
+      };
+    }
+
+    {
+      name = "npm_which___npm_which_3.0.1.tgz";
+      path = fetchurl {
+        name = "npm_which___npm_which_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz";
+        sha1 = "9225f26ec3a285c209cae67c3b11a6b4ab7140aa";
+      };
+    }
+
+    {
+      name = "npm___npm_6.4.1.tgz";
+      path = fetchurl {
+        name = "npm___npm_6.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/npm/-/npm-6.4.1.tgz";
+        sha1 = "4f39f9337b557a28faed4a771d5c8802d6b4288b";
+      };
+    }
+
+    {
+      name = "npmlog___npmlog_4.1.2.tgz";
+      path = fetchurl {
+        name = "npmlog___npmlog_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
+        sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
+      };
+    }
+
+    {
+      name = "number_is_nan___number_is_nan_1.0.1.tgz";
+      path = fetchurl {
+        name = "number_is_nan___number_is_nan_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    }
+
+    {
+      name = "oauth_sign___oauth_sign_0.9.0.tgz";
+      path = fetchurl {
+        name = "oauth_sign___oauth_sign_0.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha1 = "47a7b016baa68b5fa0ecf3dee08a85c679ac6455";
+      };
+    }
+
+    {
+      name = "oauth2_server___oauth2_server_3.0.0.tgz";
+      path = fetchurl {
+        name = "oauth2_server___oauth2_server_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/oauth2-server/-/oauth2-server-3.0.0.tgz";
+        sha1 = "c46276b74c3d28634d59ee981f76b58a6459cc28";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.0.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz";
+        sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
+      };
+    }
+
+    {
+      name = "object_assign___object_assign_4.1.1.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    }
+
+    {
+      name = "object_component___object_component_0.0.3.tgz";
+      path = fetchurl {
+        name = "object_component___object_component_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    }
+
+    {
+      name = "object_copy___object_copy_0.1.0.tgz";
+      path = fetchurl {
+        name = "object_copy___object_copy_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
+        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
+      };
+    }
+
+    {
+      name = "object_keys___object_keys_1.0.12.tgz";
+      path = fetchurl {
+        name = "object_keys___object_keys_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz";
+        sha1 = "09c53855377575310cca62f55bb334abff7b3ed2";
+      };
+    }
+
+    {
+      name = "object_visit___object_visit_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_visit___object_visit_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
+        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
+      };
+    }
+
+    {
+      name = "object.pick___object.pick_1.3.0.tgz";
+      path = fetchurl {
+        name = "object.pick___object.pick_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    }
+
+    {
+      name = "on_finished___on_finished_2.3.0.tgz";
+      path = fetchurl {
+        name = "on_finished___on_finished_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    }
+
+    {
+      name = "on_headers___on_headers_1.0.1.tgz";
+      path = fetchurl {
+        name = "on_headers___on_headers_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz";
+        sha1 = "928f5d0f470d49342651ea6794b0857c100693f7";
+      };
+    }
+
+    {
+      name = "once___once_1.4.0.tgz";
+      path = fetchurl {
+        name = "once___once_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    }
+
+    {
+      name = "one_time___one_time_0.0.4.tgz";
+      path = fetchurl {
+        name = "one_time___one_time_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz";
+        sha1 = "f8cdf77884826fe4dff93e3a9cc37b1e4480742e";
+      };
+    }
+
+    {
+      name = "onetime___onetime_1.1.0.tgz";
+      path = fetchurl {
+        name = "onetime___onetime_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz";
+        sha1 = "a1f7838f8314c516f05ecefcbc4ccfe04b4ed789";
+      };
+    }
+
+    {
+      name = "onetime___onetime_2.0.1.tgz";
+      path = fetchurl {
+        name = "onetime___onetime_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz";
+        sha1 = "067428230fd67443b2794b22bba528b6867962d4";
+      };
+    }
+
+    {
+      name = "ono___ono_4.0.10.tgz";
+      path = fetchurl {
+        name = "ono___ono_4.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/ono/-/ono-4.0.10.tgz";
+        sha1 = "f7f9c6d1b76270a499d8664c95a740d44175134c";
+      };
+    }
+
+    {
+      name = "open___open_0.0.5.tgz";
+      path = fetchurl {
+        name = "open___open_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz";
+        sha1 = "42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc";
+      };
+    }
+
+    {
+      name = "openapi_schema_validation___openapi_schema_validation_0.4.2.tgz";
+      path = fetchurl {
+        name = "openapi_schema_validation___openapi_schema_validation_0.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz";
+        sha1 = "895c29021be02e000f71c51f859da52118eb1e21";
+      };
+    }
+
+    {
+      name = "opener___opener_1.5.1.tgz";
+      path = fetchurl {
+        name = "opener___opener_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz";
+        sha1 = "6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed";
+      };
+    }
+
+    {
+      name = "optionator___optionator_0.8.2.tgz";
+      path = fetchurl {
+        name = "optionator___optionator_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz";
+        sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
+      };
+    }
+
+    {
+      name = "options___options_0.0.6.tgz";
+      path = fetchurl {
+        name = "options___options_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz";
+        sha1 = "ec22d312806bb53e731773e7cdaefcf1c643128f";
+      };
+    }
+
+    {
+      name = "os_homedir___os_homedir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_homedir___os_homedir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_2.1.0.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz";
+        sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2";
+      };
+    }
+
+    {
+      name = "os_locale___os_locale_3.0.1.tgz";
+      path = fetchurl {
+        name = "os_locale___os_locale_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz";
+        sha1 = "3b014fbf01d87f60a1e5348d80fe870dc82c4620";
+      };
+    }
+
+    {
+      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    }
+
+    {
+      name = "osenv___osenv_0.1.5.tgz";
+      path = fetchurl {
+        name = "osenv___osenv_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
+        sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
+      };
+    }
+
+    {
+      name = "p_defer___p_defer_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_defer___p_defer_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz";
+        sha1 = "9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c";
+      };
+    }
+
+    {
+      name = "p_finally___p_finally_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_finally___p_finally_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
+        sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
+      };
+    }
+
+    {
+      name = "p_is_promise___p_is_promise_1.1.0.tgz";
+      path = fetchurl {
+        name = "p_is_promise___p_is_promise_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz";
+        sha1 = "9c9456989e9f6588017b0434d56097675c3da05e";
+      };
+    }
+
+    {
+      name = "p_limit___p_limit_1.3.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
+        sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
+      };
+    }
+
+    {
+      name = "p_limit___p_limit_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz";
+        sha1 = "e624ed54ee8c460a778b3c9f3670496ff8a57aec";
+      };
+    }
+
+    {
+      name = "p_locate___p_locate_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
+        sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
+      };
+    }
+
+    {
+      name = "p_locate___p_locate_3.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz";
+        sha1 = "322d69a05c0264b25997d9f40cd8a891ab0064a4";
+      };
+    }
+
+    {
+      name = "p_map___p_map_1.2.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz";
+        sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b";
+      };
+    }
+
+    {
+      name = "p_map___p_map_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz";
+        sha1 = "be18c5a5adeb8e156460651421aceca56c213a50";
+      };
+    }
+
+    {
+      name = "p_try___p_try_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
+        sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
+      };
+    }
+
+    {
+      name = "p_try___p_try_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz";
+        sha1 = "85080bb87c64688fa47996fe8f7dfbe8211760b1";
+      };
+    }
+
+    {
+      name = "package_json_versionify___package_json_versionify_1.0.4.tgz";
+      path = fetchurl {
+        name = "package_json_versionify___package_json_versionify_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz";
+        sha1 = "5860587a944873a6b7e6d26e8e51ffb22315bf17";
+      };
+    }
+
+    {
+      name = "package_json___package_json_4.0.1.tgz";
+      path = fetchurl {
+        name = "package_json___package_json_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz";
+        sha1 = "8869a0401253661c4c4ca3da6c2121ed555f5eed";
+      };
+    }
+
+    {
+      name = "packet_reader___packet_reader_0.3.1.tgz";
+      path = fetchurl {
+        name = "packet_reader___packet_reader_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz";
+        sha1 = "cd62e60af8d7fea8a705ec4ff990871c46871f27";
+      };
+    }
+
+    {
+      name = "pacote___pacote_8.1.6.tgz";
+      path = fetchurl {
+        name = "pacote___pacote_8.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/pacote/-/pacote-8.1.6.tgz";
+        sha1 = "8e647564d38156367e7a9dc47a79ca1ab278d46e";
+      };
+    }
+
+    {
+      name = "parallel_transform___parallel_transform_1.1.0.tgz";
+      path = fetchurl {
+        name = "parallel_transform___parallel_transform_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz";
+        sha1 = "d410f065b05da23081fcd10f28854c29bda33b06";
+      };
+    }
+
+    {
+      name = "parse_json___parse_json_4.0.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz";
+        sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
+      };
+    }
+
+    {
+      name = "parse_numeric_range___parse_numeric_range_0.0.2.tgz";
+      path = fetchurl {
+        name = "parse_numeric_range___parse_numeric_range_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz";
+        sha1 = "b4f09d413c7adbcd987f6e9233c7b4b210c938e4";
+      };
+    }
+
+    {
+      name = "parse_torrent___parse_torrent_6.1.2.tgz";
+      path = fetchurl {
+        name = "parse_torrent___parse_torrent_6.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-6.1.2.tgz";
+        sha1 = "99da5bdd23435a1cb7e8e7a63847c4efb21b1956";
+      };
+    }
+
+    {
+      name = "parsejson___parsejson_0.0.3.tgz";
+      path = fetchurl {
+        name = "parsejson___parsejson_0.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz";
+        sha1 = "ab7e3759f209ece99437973f7d0f1f64ae0e64ab";
+      };
+    }
+
+    {
+      name = "parseqs___parseqs_0.0.5.tgz";
+      path = fetchurl {
+        name = "parseqs___parseqs_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    }
+
+    {
+      name = "parseuri___parseuri_0.0.5.tgz";
+      path = fetchurl {
+        name = "parseuri___parseuri_0.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    }
+
+    {
+      name = "parseurl___parseurl_1.3.2.tgz";
+      path = fetchurl {
+        name = "parseurl___parseurl_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
+        sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
+      };
+    }
+
+    {
+      name = "pascalcase___pascalcase_0.1.1.tgz";
+      path = fetchurl {
+        name = "pascalcase___pascalcase_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
+        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
+      };
+    }
+
+    {
+      name = "password_generator___password_generator_2.2.0.tgz";
+      path = fetchurl {
+        name = "password_generator___password_generator_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/password-generator/-/password-generator-2.2.0.tgz";
+        sha1 = "fc75cff795110923e054a5a71623433240bf5e49";
+      };
+    }
+
+    {
+      name = "path_dirname___path_dirname_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_dirname___path_dirname_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
+        sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
+      };
+    }
+
+    {
+      name = "path_exists___path_exists_3.0.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
+        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
+      };
+    }
+
+    {
+      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+      path = fetchurl {
+        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    }
+
+    {
+      name = "path_is_inside___path_is_inside_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_is_inside___path_is_inside_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
+        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
+      };
+    }
+
+    {
+      name = "path_key___path_key_2.0.1.tgz";
+      path = fetchurl {
+        name = "path_key___path_key_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
+        sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
+      };
+    }
+
+    {
+      name = "path_parse___path_parse_1.0.6.tgz";
+      path = fetchurl {
+        name = "path_parse___path_parse_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
+        sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
+      };
+    }
+
+    {
+      name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+      path = fetchurl {
+        name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    }
+
+    {
+      name = "pathval___pathval_1.1.0.tgz";
+      path = fetchurl {
+        name = "pathval___pathval_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz";
+        sha1 = "b942e6d4bde653005ef6b71361def8727d0645e0";
+      };
+    }
+
+    {
+      name = "peek_stream___peek_stream_1.1.3.tgz";
+      path = fetchurl {
+        name = "peek_stream___peek_stream_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz";
+        sha1 = "3b35d84b7ccbbd262fff31dc10da56856ead6d67";
+      };
+    }
+
+    {
+      name = "pem___pem_1.13.2.tgz";
+      path = fetchurl {
+        name = "pem___pem_1.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/pem/-/pem-1.13.2.tgz";
+        sha1 = "7b68acbb590fdc13772bca487983cb84cd7b443e";
+      };
+    }
+
+    {
+      name = "performance_now___performance_now_2.1.0.tgz";
+      path = fetchurl {
+        name = "performance_now___performance_now_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    }
+
+    {
+      name = "pfeed___pfeed_1.1.6.tgz";
+      path = fetchurl {
+        name = "pfeed___pfeed_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/pfeed/-/pfeed-1.1.6.tgz";
+        sha1 = "0de2a1c40b116fa236227237fa264c7956c185e8";
+      };
+    }
+
+    {
+      name = "pg_connection_string___pg_connection_string_0.1.3.tgz";
+      path = fetchurl {
+        name = "pg_connection_string___pg_connection_string_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz";
+        sha1 = "da1847b20940e42ee1492beaf65d49d91b245df7";
+      };
+    }
+
+    {
+      name = "pg_pool___pg_pool_2.0.4.tgz";
+      path = fetchurl {
+        name = "pg_pool___pg_pool_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.4.tgz";
+        sha1 = "05ad0f2d9437d89c94ccc4f4d0a44ac65ade865b";
+      };
+    }
+
+    {
+      name = "pg_types___pg_types_1.12.1.tgz";
+      path = fetchurl {
+        name = "pg_types___pg_types_1.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz";
+        sha1 = "d64087e3903b58ffaad279e7595c52208a14c3d2";
+      };
+    }
+
+    {
+      name = "pg___pg_7.7.1.tgz";
+      path = fetchurl {
+        name = "pg___pg_7.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/pg/-/pg-7.7.1.tgz";
+        sha1 = "546b192ff484322b69689391f885de3ba91a30d4";
+      };
+    }
+
+    {
+      name = "pgpass___pgpass_1.0.2.tgz";
+      path = fetchurl {
+        name = "pgpass___pgpass_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz";
+        sha1 = "2a7bb41b6065b67907e91da1b07c1847c877b306";
+      };
+    }
+
+    {
+      name = "piece_length___piece_length_1.0.0.tgz";
+      path = fetchurl {
+        name = "piece_length___piece_length_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/piece-length/-/piece-length-1.0.0.tgz";
+        sha1 = "4db7167157fd69fef14caf7262cd39f189b24508";
+      };
+    }
+
+    {
+      name = "pify___pify_2.3.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    }
+
+    {
+      name = "pify___pify_3.0.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
+        sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
+      };
+    }
+
+    {
+      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+      path = fetchurl {
+        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    }
+
+    {
+      name = "pinkie___pinkie_2.0.4.tgz";
+      path = fetchurl {
+        name = "pinkie___pinkie_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    }
+
+    {
+      name = "pkg_dir___pkg_dir_3.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz";
+        sha1 = "2749020f239ed990881b1f71210d51eb6523bea3";
+      };
+    }
+
+    {
+      name = "pkginfo___pkginfo_0.3.1.tgz";
+      path = fetchurl {
+        name = "pkginfo___pkginfo_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz";
+        sha1 = "5b29f6a81f70717142e09e765bbeab97b4f81e21";
+      };
+    }
+
+    {
+      name = "pkginfo___pkginfo_0.4.1.tgz";
+      path = fetchurl {
+        name = "pkginfo___pkginfo_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz";
+        sha1 = "b5418ef0439de5425fc4995042dced14fb2a84ff";
+      };
+    }
+
+    {
+      name = "platform___platform_1.3.5.tgz";
+      path = fetchurl {
+        name = "platform___platform_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz";
+        sha1 = "fb6958c696e07e2918d2eeda0f0bc9448d733444";
+      };
+    }
+
+    {
+      name = "please_upgrade_node___please_upgrade_node_3.1.1.tgz";
+      path = fetchurl {
+        name = "please_upgrade_node___please_upgrade_node_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz";
+        sha1 = "ed320051dfcc5024fae696712c8288993595e8ac";
+      };
+    }
+
+    {
+      name = "pluralize___pluralize_1.2.1.tgz";
+      path = fetchurl {
+        name = "pluralize___pluralize_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz";
+        sha1 = "d1a21483fd22bb41e58a12fa3421823140897c45";
+      };
+    }
+
+    {
+      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+      path = fetchurl {
+        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
+        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
+      };
+    }
+
+    {
+      name = "postgres_array___postgres_array_1.0.3.tgz";
+      path = fetchurl {
+        name = "postgres_array___postgres_array_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz";
+        sha1 = "c561fc3b266b21451fc6555384f4986d78ec80f5";
+      };
+    }
+
+    {
+      name = "postgres_bytea___postgres_bytea_1.0.0.tgz";
+      path = fetchurl {
+        name = "postgres_bytea___postgres_bytea_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz";
+        sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
+      };
+    }
+
+    {
+      name = "postgres_date___postgres_date_1.0.3.tgz";
+      path = fetchurl {
+        name = "postgres_date___postgres_date_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz";
+        sha1 = "e2d89702efdb258ff9d9cee0fe91bd06975257a8";
+      };
+    }
+
+    {
+      name = "postgres_interval___postgres_interval_1.1.2.tgz";
+      path = fetchurl {
+        name = "postgres_interval___postgres_interval_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz";
+        sha1 = "bf71ff902635f21cb241a013fc421d81d1db15a9";
+      };
+    }
+
+    {
+      name = "prebuild_install___prebuild_install_5.2.2.tgz";
+      path = fetchurl {
+        name = "prebuild_install___prebuild_install_5.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.2.tgz";
+        sha1 = "237888f21bfda441d0ee5f5612484390bccd4046";
+      };
+    }
+
+    {
+      name = "precond___precond_0.2.3.tgz";
+      path = fetchurl {
+        name = "precond___precond_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz";
+        sha1 = "aa9591bcaa24923f1e0f4849d240f47efc1075ac";
+      };
+    }
+
+    {
+      name = "prelude_ls___prelude_ls_1.1.2.tgz";
+      path = fetchurl {
+        name = "prelude_ls___prelude_ls_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
+      };
+    }
+
+    {
+      name = "prepend_http___prepend_http_1.0.4.tgz";
+      path = fetchurl {
+        name = "prepend_http___prepend_http_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
+        sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
+      };
+    }
+
+    {
+      name = "pretty_format___pretty_format_23.6.0.tgz";
+      path = fetchurl {
+        name = "pretty_format___pretty_format_23.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz";
+        sha1 = "5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760";
+      };
+    }
+
+    {
+      name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+      path = fetchurl {
+        name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
+        sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
+      };
+    }
+
+    {
+      name = "progress___progress_1.1.8.tgz";
+      path = fetchurl {
+        name = "progress___progress_1.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz";
+        sha1 = "e260c78f6161cdd9b0e56cc3e0a85de17c7a57be";
+      };
+    }
+
+    {
+      name = "promise_inflight___promise_inflight_1.0.1.tgz";
+      path = fetchurl {
+        name = "promise_inflight___promise_inflight_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz";
+        sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
+      };
+    }
+
+    {
+      name = "promise_retry___promise_retry_1.1.1.tgz";
+      path = fetchurl {
+        name = "promise_retry___promise_retry_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz";
+        sha1 = "6739e968e3051da20ce6497fb2b50f6911df3d6d";
+      };
+    }
+
+    {
+      name = "promisify_any___promisify_any_2.0.1.tgz";
+      path = fetchurl {
+        name = "promisify_any___promisify_any_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/promisify-any/-/promisify-any-2.0.1.tgz";
+        sha1 = "403e00a8813f175242ab50fe33a69f8eece47305";
+      };
+    }
+
+    {
+      name = "prompt___prompt_1.0.0.tgz";
+      path = fetchurl {
+        name = "prompt___prompt_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz";
+        sha1 = "8e57123c396ab988897fb327fd3aedc3e735e4fe";
+      };
+    }
+
+    {
+      name = "promzard___promzard_0.3.0.tgz";
+      path = fetchurl {
+        name = "promzard___promzard_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz";
+        sha1 = "26a5d6ee8c7dee4cb12208305acfb93ba382a9ee";
+      };
+    }
+
+    {
+      name = "proto_list___proto_list_1.2.4.tgz";
+      path = fetchurl {
+        name = "proto_list___proto_list_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz";
+        sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
+      };
+    }
+
+    {
+      name = "protoduck___protoduck_5.0.1.tgz";
+      path = fetchurl {
+        name = "protoduck___protoduck_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz";
+        sha1 = "03c3659ca18007b69a50fd82a7ebcc516261151f";
+      };
+    }
+
+    {
+      name = "proxy_addr___proxy_addr_1.0.10.tgz";
+      path = fetchurl {
+        name = "proxy_addr___proxy_addr_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.0.10.tgz";
+        sha1 = "0d40a82f801fc355567d2ecb65efe3f077f121c5";
+      };
+    }
+
+    {
+      name = "proxy_addr___proxy_addr_2.0.4.tgz";
+      path = fetchurl {
+        name = "proxy_addr___proxy_addr_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz";
+        sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93";
+      };
+    }
+
+    {
+      name = "prr___prr_1.0.1.tgz";
+      path = fetchurl {
+        name = "prr___prr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
+        sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
+      };
+    }
+
+    {
+      name = "pseudomap___pseudomap_1.0.2.tgz";
+      path = fetchurl {
+        name = "pseudomap___pseudomap_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
+        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
+      };
+    }
+
+    {
+      name = "psl___psl_1.1.29.tgz";
+      path = fetchurl {
+        name = "psl___psl_1.1.29.tgz";
+        url  = "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz";
+        sha1 = "60f580d360170bb722a797cc704411e6da850c67";
+      };
+    }
+
+    {
+      name = "pstree.remy___pstree.remy_1.1.2.tgz";
+      path = fetchurl {
+        name = "pstree.remy___pstree.remy_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz";
+        sha1 = "4448bbeb4b2af1fed242afc8dc7416a6f504951a";
+      };
+    }
+
+    {
+      name = "pump___pump_1.0.3.tgz";
+      path = fetchurl {
+        name = "pump___pump_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz";
+        sha1 = "5dfe8311c33bbf6fc18261f9f34702c47c08a954";
+      };
+    }
+
+    {
+      name = "pump___pump_2.0.1.tgz";
+      path = fetchurl {
+        name = "pump___pump_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz";
+        sha1 = "12399add6e4cf7526d973cbc8b5ce2e2908b3909";
+      };
+    }
+
+    {
+      name = "pump___pump_3.0.0.tgz";
+      path = fetchurl {
+        name = "pump___pump_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz";
+        sha1 = "b4a2116815bde2f4e1ea602354e8c75565107a64";
+      };
+    }
+
+    {
+      name = "pumpify___pumpify_1.5.1.tgz";
+      path = fetchurl {
+        name = "pumpify___pumpify_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz";
+        sha1 = "36513be246ab27570b1a374a5ce278bfd74370ce";
+      };
+    }
+
+    {
+      name = "punycode___punycode_1.4.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    }
+
+    {
+      name = "punycode___punycode_2.1.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
+        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
+      };
+    }
+
+    {
+      name = "qrcode_terminal___qrcode_terminal_0.12.0.tgz";
+      path = fetchurl {
+        name = "qrcode_terminal___qrcode_terminal_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz";
+        sha1 = "bb5b699ef7f9f0505092a3748be4464fe71b5819";
+      };
+    }
+
+    {
+      name = "qs___qs_4.0.0.tgz";
+      path = fetchurl {
+        name = "qs___qs_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz";
+        sha1 = "c31d9b74ec27df75e543a86c78728ed8d4623607";
+      };
+    }
+
+    {
+      name = "qs___qs_6.5.2.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
+        sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
+      };
+    }
+
+    {
+      name = "qs___qs_6.6.0.tgz";
+      path = fetchurl {
+        name = "qs___qs_6.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz";
+        sha1 = "a99c0f69a8d26bf7ef012f871cdabb0aee4424c2";
+      };
+    }
+
+    {
+      name = "query_string___query_string_6.2.0.tgz";
+      path = fetchurl {
+        name = "query_string___query_string_6.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/query-string/-/query-string-6.2.0.tgz";
+        sha1 = "468edeb542b7e0538f9f9b1aeb26f034f19c86e1";
+      };
+    }
+
+    {
+      name = "qw___qw_1.0.1.tgz";
+      path = fetchurl {
+        name = "qw___qw_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz";
+        sha1 = "efbfdc740f9ad054304426acb183412cc8b996d4";
+      };
+    }
+
+    {
+      name = "random_access_file___random_access_file_2.0.1.tgz";
+      path = fetchurl {
+        name = "random_access_file___random_access_file_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz";
+        sha1 = "dc22de79270e9a84cb36a2419b759725930dcaeb";
+      };
+    }
+
+    {
+      name = "random_access_storage___random_access_storage_1.3.0.tgz";
+      path = fetchurl {
+        name = "random_access_storage___random_access_storage_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/random-access-storage/-/random-access-storage-1.3.0.tgz";
+        sha1 = "d27e4d897b79dc4358afc2bbe553044e5c8cfe35";
+      };
+    }
+
+    {
+      name = "random_iterate___random_iterate_1.0.1.tgz";
+      path = fetchurl {
+        name = "random_iterate___random_iterate_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/random-iterate/-/random-iterate-1.0.1.tgz";
+        sha1 = "f7d97d92dee6665ec5f6da08c7f963cad4b2ac99";
+      };
+    }
+
+    {
+      name = "randombytes___randombytes_2.0.6.tgz";
+      path = fetchurl {
+        name = "randombytes___randombytes_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz";
+        sha1 = "d302c522948588848a8d300c932b44c24231da80";
+      };
+    }
+
+    {
+      name = "range_parser___range_parser_1.2.0.tgz";
+      path = fetchurl {
+        name = "range_parser___range_parser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz";
+        sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
+      };
+    }
+
+    {
+      name = "range_parser___range_parser_1.0.3.tgz";
+      path = fetchurl {
+        name = "range_parser___range_parser_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz";
+        sha1 = "6872823535c692e2c2a0103826afd82c2e0ff175";
+      };
+    }
+
+    {
+      name = "range_slice_stream___range_slice_stream_2.0.0.tgz";
+      path = fetchurl {
+        name = "range_slice_stream___range_slice_stream_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/range-slice-stream/-/range-slice-stream-2.0.0.tgz";
+        sha1 = "1f25fc7a2cacf9ccd140c46f9cf670a1a7fe3ce6";
+      };
+    }
+
+    {
+      name = "raw_body___raw_body_2.3.3.tgz";
+      path = fetchurl {
+        name = "raw_body___raw_body_2.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz";
+        sha1 = "1b324ece6b5706e153855bc1148c65bb7f6ea0c3";
+      };
+    }
+
+    {
+      name = "rc___rc_1.2.8.tgz";
+      path = fetchurl {
+        name = "rc___rc_1.2.8.tgz";
+        url  = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
+        sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
+      };
+    }
+
+    {
+      name = "rdf_canonize___rdf_canonize_0.2.5.tgz";
+      path = fetchurl {
+        name = "rdf_canonize___rdf_canonize_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/rdf-canonize/-/rdf-canonize-0.2.5.tgz";
+        sha1 = "dc761d42a2e9e6bf6eec7e0e352fd5b10ff4e75a";
+      };
+    }
+
+    {
+      name = "read_cmd_shim___read_cmd_shim_1.0.1.tgz";
+      path = fetchurl {
+        name = "read_cmd_shim___read_cmd_shim_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz";
+        sha1 = "2d5d157786a37c055d22077c32c53f8329e91c7b";
+      };
+    }
+
+    {
+      name = "read_installed___read_installed_4.0.3.tgz";
+      path = fetchurl {
+        name = "read_installed___read_installed_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz";
+        sha1 = "ff9b8b67f187d1e4c29b9feb31f6b223acd19067";
+      };
+    }
+
+    {
+      name = "read_package_json___read_package_json_2.0.13.tgz";
+      path = fetchurl {
+        name = "read_package_json___read_package_json_2.0.13.tgz";
+        url  = "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz";
+        sha1 = "2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a";
+      };
+    }
+
+    {
+      name = "read_package_tree___read_package_tree_5.2.1.tgz";
+      path = fetchurl {
+        name = "read_package_tree___read_package_tree_5.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz";
+        sha1 = "6218b187d6fac82289ce4387bbbaf8eef536ad63";
+      };
+    }
+
+    {
+      name = "read_pkg___read_pkg_4.0.1.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz";
+        sha1 = "963625378f3e1c4d48c85872b5a6ec7d5d093237";
+      };
+    }
+
+    {
+      name = "read___read_1.0.7.tgz";
+      path = fetchurl {
+        name = "read___read_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz";
+        sha1 = "b3da19bd052431a97671d44a42634adf710b40c4";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_2.3.6.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_2.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
+        sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_1.1.14.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.1.14.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz";
+        sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_1.0.34.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.0.34.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
+        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
+      };
+    }
+
+    {
+      name = "readable_stream___readable_stream_3.0.6.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_3.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz";
+        sha1 = "351302e4c68b5abd6a2ed55376a7f9a25be3057a";
+      };
+    }
+
+    {
+      name = "readable_wrap___readable_wrap_1.0.0.tgz";
+      path = fetchurl {
+        name = "readable_wrap___readable_wrap_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz";
+        sha1 = "3b5a211c631e12303a54991c806c17e7ae206bff";
+      };
+    }
+
+    {
+      name = "readdir_scoped_modules___readdir_scoped_modules_1.0.2.tgz";
+      path = fetchurl {
+        name = "readdir_scoped_modules___readdir_scoped_modules_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz";
+        sha1 = "9fafa37d286be5d92cbaebdee030dc9b5f406747";
+      };
+    }
+
+    {
+      name = "readdirp___readdirp_2.2.1.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
+        sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
+      };
+    }
+
+    {
+      name = "readline2___readline2_1.0.1.tgz";
+      path = fetchurl {
+        name = "readline2___readline2_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz";
+        sha1 = "41059608ffc154757b715d9989d199ffbf372e35";
+      };
+    }
+
+    {
+      name = "record_cache___record_cache_1.1.0.tgz";
+      path = fetchurl {
+        name = "record_cache___record_cache_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz";
+        sha1 = "f8a467a691a469584b26e88d36b18afdb3932037";
+      };
+    }
+
+    {
+      name = "redis_commands___redis_commands_1.4.0.tgz";
+      path = fetchurl {
+        name = "redis_commands___redis_commands_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz";
+        sha1 = "52f9cf99153efcce56a8f86af986bd04e988602f";
+      };
+    }
+
+    {
+      name = "redis_parser___redis_parser_2.6.0.tgz";
+      path = fetchurl {
+        name = "redis_parser___redis_parser_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz";
+        sha1 = "52ed09dacac108f1a631c07e9b69941e7a19504b";
+      };
+    }
+
+    {
+      name = "redis___redis_2.8.0.tgz";
+      path = fetchurl {
+        name = "redis___redis_2.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz";
+        sha1 = "202288e3f58c49f6079d97af7a10e1303ae14b02";
+      };
+    }
+
+    {
+      name = "referrer_policy___referrer_policy_1.1.0.tgz";
+      path = fetchurl {
+        name = "referrer_policy___referrer_policy_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz";
+        sha1 = "35774eb735bf50fb6c078e83334b472350207d79";
+      };
+    }
+
+    {
+      name = "reflect_metadata___reflect_metadata_0.1.12.tgz";
+      path = fetchurl {
+        name = "reflect_metadata___reflect_metadata_0.1.12.tgz";
+        url  = "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz";
+        sha1 = "311bf0c6b63cd782f228a81abe146a2bfa9c56f2";
+      };
+    }
+
+    {
+      name = "regex_not___regex_not_1.0.2.tgz";
+      path = fetchurl {
+        name = "regex_not___regex_not_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
+        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
+      };
+    }
+
+    {
+      name = "registry_auth_token___registry_auth_token_3.3.2.tgz";
+      path = fetchurl {
+        name = "registry_auth_token___registry_auth_token_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz";
+        sha1 = "851fd49038eecb586911115af845260eec983f20";
+      };
+    }
+
+    {
+      name = "registry_url___registry_url_3.1.0.tgz";
+      path = fetchurl {
+        name = "registry_url___registry_url_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz";
+        sha1 = "3d4ef870f73dde1d77f0cf9a381432444e174942";
+      };
+    }
+
+    {
+      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+      path = fetchurl {
+        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
+        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
+      };
+    }
+
+    {
+      name = "render_media___render_media_3.1.3.tgz";
+      path = fetchurl {
+        name = "render_media___render_media_3.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/render-media/-/render-media-3.1.3.tgz";
+        sha1 = "aa8c8cd3f720049370067180709b551d3c566254";
+      };
+    }
+
+    {
+      name = "repeat_element___repeat_element_1.1.3.tgz";
+      path = fetchurl {
+        name = "repeat_element___repeat_element_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
+        sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
+      };
+    }
+
+    {
+      name = "repeat_string___repeat_string_1.6.1.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    }
+
+    {
+      name = "request___request_2.88.0.tgz";
+      path = fetchurl {
+        name = "request___request_2.88.0.tgz";
+        url  = "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz";
+        sha1 = "9c2fca4f7d35b592efe57c7f0a55e81052124fef";
+      };
+    }
+
+    {
+      name = "require_directory___require_directory_2.1.1.tgz";
+      path = fetchurl {
+        name = "require_directory___require_directory_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    }
+
+    {
+      name = "require_main_filename___require_main_filename_1.0.1.tgz";
+      path = fetchurl {
+        name = "require_main_filename___require_main_filename_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
+        sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
+      };
+    }
+
+    {
+      name = "require_uncached___require_uncached_1.0.3.tgz";
+      path = fetchurl {
+        name = "require_uncached___require_uncached_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz";
+        sha1 = "4e0d56d6c9662fd31e43011c4b95aa49955421d3";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_1.0.1.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz";
+        sha1 = "26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_2.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz";
+        sha1 = "9480ab20e94ffa1d9e80a804c7ea147611966b57";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_3.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
+        sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
+      };
+    }
+
+    {
+      name = "resolve_from___resolve_from_4.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz";
+        sha1 = "4abcd852ad32dd7baabfe9b40e00a36db5f392e6";
+      };
+    }
+
+    {
+      name = "resolve_pkg___resolve_pkg_1.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_pkg___resolve_pkg_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-1.0.0.tgz";
+        sha1 = "e19a15e78aca2e124461dc92b2e3943ef93494d9";
+      };
+    }
+
+    {
+      name = "resolve_url___resolve_url_0.2.1.tgz";
+      path = fetchurl {
+        name = "resolve_url___resolve_url_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
+        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
+      };
+    }
+
+    {
+      name = "resolve___resolve_1.8.1.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz";
+        sha1 = "82f1ec19a423ac1fbd080b0bab06ba36e84a7a26";
+      };
+    }
+
+    {
+      name = "restore_cursor___restore_cursor_1.0.1.tgz";
+      path = fetchurl {
+        name = "restore_cursor___restore_cursor_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz";
+        sha1 = "34661f46886327fed2991479152252df92daa541";
+      };
+    }
+
+    {
+      name = "restore_cursor___restore_cursor_2.0.0.tgz";
+      path = fetchurl {
+        name = "restore_cursor___restore_cursor_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz";
+        sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
+      };
+    }
+
+    {
+      name = "ret___ret_0.1.15.tgz";
+      path = fetchurl {
+        name = "ret___ret_0.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
+        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+      };
+    }
+
+    {
+      name = "retry_as_promised___retry_as_promised_2.3.2.tgz";
+      path = fetchurl {
+        name = "retry_as_promised___retry_as_promised_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz";
+        sha1 = "cd974ee4fd9b5fe03cbf31871ee48221c07737b7";
+      };
+    }
+
+    {
+      name = "retry___retry_0.10.1.tgz";
+      path = fetchurl {
+        name = "retry___retry_0.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz";
+        sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
+      };
+    }
+
+    {
+      name = "retry___retry_0.12.0.tgz";
+      path = fetchurl {
+        name = "retry___retry_0.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz";
+        sha1 = "1b42a6266a21f07421d1b0b54b7dc167b01c013b";
+      };
+    }
+
+    {
+      name = "revalidator___revalidator_0.1.8.tgz";
+      path = fetchurl {
+        name = "revalidator___revalidator_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz";
+        sha1 = "fece61bfa0c1b52a206bd6b18198184bdd523a3b";
+      };
+    }
+
+    {
+      name = "rimraf___rimraf_2.6.2.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz";
+        sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36";
+      };
+    }
+
+    {
+      name = "rimraf___rimraf_2.4.5.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.4.5.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz";
+        sha1 = "ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da";
+      };
+    }
+
+    {
+      name = "run_async___run_async_0.1.0.tgz";
+      path = fetchurl {
+        name = "run_async___run_async_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz";
+        sha1 = "c8ad4a5e110661e402a7d21b530e009f25f8e389";
+      };
+    }
+
+    {
+      name = "run_node___run_node_1.0.0.tgz";
+      path = fetchurl {
+        name = "run_node___run_node_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz";
+        sha1 = "46b50b946a2aa2d4947ae1d886e9856fd9cabe5e";
+      };
+    }
+
+    {
+      name = "run_parallel_limit___run_parallel_limit_1.0.5.tgz";
+      path = fetchurl {
+        name = "run_parallel_limit___run_parallel_limit_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz";
+        sha1 = "c29a4fd17b4df358cb52a8a697811a63c984f1b7";
+      };
+    }
+
+    {
+      name = "run_parallel___run_parallel_1.1.9.tgz";
+      path = fetchurl {
+        name = "run_parallel___run_parallel_1.1.9.tgz";
+        url  = "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz";
+        sha1 = "c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679";
+      };
+    }
+
+    {
+      name = "run_queue___run_queue_1.0.3.tgz";
+      path = fetchurl {
+        name = "run_queue___run_queue_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz";
+        sha1 = "e848396f057d223f24386924618e25694161ec47";
+      };
+    }
+
+    {
+      name = "run_series___run_series_1.1.8.tgz";
+      path = fetchurl {
+        name = "run_series___run_series_1.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz";
+        sha1 = "2c4558f49221e01cd6371ff4e0a1e203e460fc36";
+      };
+    }
+
+    {
+      name = "rusha___rusha_0.8.13.tgz";
+      path = fetchurl {
+        name = "rusha___rusha_0.8.13.tgz";
+        url  = "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz";
+        sha1 = "9a084e7b860b17bff3015b92c67a6a336191513a";
+      };
+    }
+
+    {
+      name = "rx_lite___rx_lite_3.1.2.tgz";
+      path = fetchurl {
+        name = "rx_lite___rx_lite_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz";
+        sha1 = "19ce502ca572665f3b647b10939f97fd1615f102";
+      };
+    }
+
+    {
+      name = "rxjs___rxjs_6.3.3.tgz";
+      path = fetchurl {
+        name = "rxjs___rxjs_6.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz";
+        sha1 = "3c6a7fa420e844a81390fb1158a9ec614f4bad55";
+      };
+    }
+
+    {
+      name = "safe_buffer___safe_buffer_5.1.2.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
+      };
+    }
+
+    {
+      name = "safe_json_stringify___safe_json_stringify_1.2.0.tgz";
+      path = fetchurl {
+        name = "safe_json_stringify___safe_json_stringify_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz";
+        sha1 = "356e44bc98f1f93ce45df14bcd7c01cda86e0afd";
+      };
+    }
+
+    {
+      name = "safe_regex___safe_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "safe_regex___safe_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
+        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
+      };
+    }
+
+    {
+      name = "safer_buffer___safer_buffer_2.1.2.tgz";
+      path = fetchurl {
+        name = "safer_buffer___safer_buffer_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
+      };
+    }
+
+    {
+      name = "sass_lint___sass_lint_1.12.1.tgz";
+      path = fetchurl {
+        name = "sass_lint___sass_lint_1.12.1.tgz";
+        url  = "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.12.1.tgz";
+        sha1 = "630f69c216aa206b8232fb2aa907bdf3336b6d83";
+      };
+    }
+
+    {
+      name = "sax___sax_1.2.4.tgz";
+      path = fetchurl {
+        name = "sax___sax_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
+        sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
+      };
+    }
+
+    {
+      name = "scripty___scripty_1.8.0.tgz";
+      path = fetchurl {
+        name = "scripty___scripty_1.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/scripty/-/scripty-1.8.0.tgz";
+        sha1 = "951f0b4bc3e235844b7f5355f58d31e012e0b806";
+      };
+    }
+
+    {
+      name = "semver_compare___semver_compare_1.0.0.tgz";
+      path = fetchurl {
+        name = "semver_compare___semver_compare_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz";
+        sha1 = "0dee216a1c941ab37e9efb1788f6afc5ff5537fc";
+      };
+    }
+
+    {
+      name = "semver_diff___semver_diff_2.1.0.tgz";
+      path = fetchurl {
+        name = "semver_diff___semver_diff_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz";
+        sha1 = "4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36";
+      };
+    }
+
+    {
+      name = "semver___semver_5.6.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz";
+        sha1 = "7e74256fbaa49c75aa7c7a205cc22799cac80004";
+      };
+    }
+
+    {
+      name = "semver___semver_4.3.2.tgz";
+      path = fetchurl {
+        name = "semver___semver_4.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz";
+        sha1 = "c7a07158a80bedd052355b770d82d6640f803be7";
+      };
+    }
+
+    {
+      name = "semver___semver_5.3.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
+        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+      };
+    }
+
+    {
+      name = "send___send_0.13.1.tgz";
+      path = fetchurl {
+        name = "send___send_0.13.1.tgz";
+        url  = "https://registry.yarnpkg.com/send/-/send-0.13.1.tgz";
+        sha1 = "a30d5f4c82c8a9bae9ad00a1d9b1bdbe6f199ed7";
+      };
+    }
+
+    {
+      name = "send___send_0.13.2.tgz";
+      path = fetchurl {
+        name = "send___send_0.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz";
+        sha1 = "765e7607c8055452bba6f0b052595350986036de";
+      };
+    }
+
+    {
+      name = "send___send_0.16.2.tgz";
+      path = fetchurl {
+        name = "send___send_0.16.2.tgz";
+        url  = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz";
+        sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1";
+      };
+    }
+
+    {
+      name = "sequelize_typescript___sequelize_typescript_0.6.6.tgz";
+      path = fetchurl {
+        name = "sequelize_typescript___sequelize_typescript_0.6.6.tgz";
+        url  = "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-0.6.6.tgz";
+        sha1 = "926037b542dae9f4eff20609d095cc5e3a3640f3";
+      };
+    }
+
+    {
+      name = "sequelize___sequelize_4.41.2.tgz";
+      path = fetchurl {
+        name = "sequelize___sequelize_4.41.2.tgz";
+        url  = "https://registry.yarnpkg.com/sequelize/-/sequelize-4.41.2.tgz";
+        sha1 = "bb9ba30d72e9eeb883c9861cd0e2cac672010883";
+      };
+    }
+
+    {
+      name = "serve_static___serve_static_1.13.2.tgz";
+      path = fetchurl {
+        name = "serve_static___serve_static_1.13.2.tgz";
+        url  = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz";
+        sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1";
+      };
+    }
+
+    {
+      name = "serve_static___serve_static_1.10.3.tgz";
+      path = fetchurl {
+        name = "serve_static___serve_static_1.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz";
+        sha1 = "ce5a6ecd3101fed5ec09827dac22a9c29bfb0535";
+      };
+    }
+
+    {
+      name = "set_blocking___set_blocking_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_blocking___set_blocking_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    }
+
+    {
+      name = "set_value___set_value_0.4.3.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_0.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
+        sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
+      };
+    }
+
+    {
+      name = "set_value___set_value_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
+        sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
+      };
+    }
+
+    {
+      name = "setprototypeof___setprototypeof_1.1.0.tgz";
+      path = fetchurl {
+        name = "setprototypeof___setprototypeof_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
+        sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
+      };
+    }
+
+    {
+      name = "sha___sha_2.0.1.tgz";
+      path = fetchurl {
+        name = "sha___sha_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz";
+        sha1 = "6030822fbd2c9823949f8f72ed6411ee5cf25aae";
+      };
+    }
+
+    {
+      name = "sharp___sharp_0.21.0.tgz";
+      path = fetchurl {
+        name = "sharp___sharp_0.21.0.tgz";
+        url  = "https://registry.yarnpkg.com/sharp/-/sharp-0.21.0.tgz";
+        sha1 = "e3cf2e4cb9382caf78efb3d45252381730e899c4";
+      };
+    }
+
+    {
+      name = "shebang_command___shebang_command_1.2.0.tgz";
+      path = fetchurl {
+        name = "shebang_command___shebang_command_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
+        sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
+      };
+    }
+
+    {
+      name = "shebang_regex___shebang_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_regex___shebang_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
+        sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
+      };
+    }
+
+    {
+      name = "shelljs___shelljs_0.6.1.tgz";
+      path = fetchurl {
+        name = "shelljs___shelljs_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz";
+        sha1 = "ec6211bed1920442088fe0f70b2837232ed2c8a8";
+      };
+    }
+
+    {
+      name = "shimmer___shimmer_1.2.0.tgz";
+      path = fetchurl {
+        name = "shimmer___shimmer_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz";
+        sha1 = "f966f7555789763e74d8841193685a5e78736665";
+      };
+    }
+
+    {
+      name = "signal_exit___signal_exit_3.0.2.tgz";
+      path = fetchurl {
+        name = "signal_exit___signal_exit_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
+        sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
+      };
+    }
+
+    {
+      name = "simple_concat___simple_concat_1.0.0.tgz";
+      path = fetchurl {
+        name = "simple_concat___simple_concat_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz";
+        sha1 = "7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6";
+      };
+    }
+
+    {
+      name = "simple_get___simple_get_2.8.1.tgz";
+      path = fetchurl {
+        name = "simple_get___simple_get_2.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz";
+        sha1 = "0e22e91d4575d87620620bc91308d57a77f44b5d";
+      };
+    }
+
+    {
+      name = "simple_get___simple_get_3.0.3.tgz";
+      path = fetchurl {
+        name = "simple_get___simple_get_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz";
+        sha1 = "924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa";
+      };
+    }
+
+    {
+      name = "simple_git___simple_git_1.107.0.tgz";
+      path = fetchurl {
+        name = "simple_git___simple_git_1.107.0.tgz";
+        url  = "https://registry.yarnpkg.com/simple-git/-/simple-git-1.107.0.tgz";
+        sha1 = "12cffaf261c14d6f450f7fdb86c21ccee968b383";
+      };
+    }
+
+    {
+      name = "simple_peer___simple_peer_9.1.2.tgz";
+      path = fetchurl {
+        name = "simple_peer___simple_peer_9.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.1.2.tgz";
+        sha1 = "f8afa5eb83f8a17d66e437e5ac54c1221eca4b39";
+      };
+    }
+
+    {
+      name = "simple_sha1___simple_sha1_2.1.1.tgz";
+      path = fetchurl {
+        name = "simple_sha1___simple_sha1_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/simple-sha1/-/simple-sha1-2.1.1.tgz";
+        sha1 = "93f3b7f2e8dfdc056c32793e5d47b58d311b140d";
+      };
+    }
+
+    {
+      name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
+      path = fetchurl {
+        name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
+        sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
+      };
+    }
+
+    {
+      name = "simple_websocket___simple_websocket_7.2.0.tgz";
+      path = fetchurl {
+        name = "simple_websocket___simple_websocket_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/simple-websocket/-/simple-websocket-7.2.0.tgz";
+        sha1 = "c3190555d74399372b96b51435f2d8c4b04611df";
+      };
+    }
+
+    {
+      name = "sitemap___sitemap_2.1.0.tgz";
+      path = fetchurl {
+        name = "sitemap___sitemap_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/sitemap/-/sitemap-2.1.0.tgz";
+        sha1 = "1633cb88c196d755ad94becfb1c1bcacc6d3425a";
+      };
+    }
+
+    {
+      name = "slash___slash_1.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
+        sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+      };
+    }
+
+    {
+      name = "slash___slash_2.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz";
+        sha1 = "de552851a1759df3a8f206535442f5ec4ddeab44";
+      };
+    }
+
+    {
+      name = "slice_ansi___slice_ansi_0.0.4.tgz";
+      path = fetchurl {
+        name = "slice_ansi___slice_ansi_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz";
+        sha1 = "edbf8903f66f7ce2f8eafd6ceed65e264c831b35";
+      };
+    }
+
+    {
+      name = "slide___slide_1.1.6.tgz";
+      path = fetchurl {
+        name = "slide___slide_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz";
+        sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
+      };
+    }
+
+    {
+      name = "smart_buffer___smart_buffer_1.1.15.tgz";
+      path = fetchurl {
+        name = "smart_buffer___smart_buffer_1.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz";
+        sha1 = "7f114b5b65fab3e2a35aa775bb12f0d1c649bf16";
+      };
+    }
+
+    {
+      name = "smart_buffer___smart_buffer_4.0.1.tgz";
+      path = fetchurl {
+        name = "smart_buffer___smart_buffer_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz";
+        sha1 = "07ea1ca8d4db24eb4cac86537d7d18995221ace3";
+      };
+    }
+
+    {
+      name = "smtp_connection___smtp_connection_2.3.1.tgz";
+      path = fetchurl {
+        name = "smtp_connection___smtp_connection_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.3.1.tgz";
+        sha1 = "d169c8f1c9a73854134cdabe6fb818237dfc4fba";
+      };
+    }
+
+    {
+      name = "smtp_server___smtp_server_1.16.1.tgz";
+      path = fetchurl {
+        name = "smtp_server___smtp_server_1.16.1.tgz";
+        url  = "https://registry.yarnpkg.com/smtp-server/-/smtp-server-1.16.1.tgz";
+        sha1 = "91d2dbd5e8bb9ed395b1a1774e8b60dd7b24e453";
+      };
+    }
+
+    {
+      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
+        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
+      };
+    }
+
+    {
+      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
+        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
+      };
+    }
+
+    {
+      name = "snapdragon___snapdragon_0.8.2.tgz";
+      path = fetchurl {
+        name = "snapdragon___snapdragon_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
+        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
+      };
+    }
+
+    {
+      name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
+      path = fetchurl {
+        name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz";
+        sha1 = "cb6d4bb8bec81e1078b99677f9ced0046066bb8b";
+      };
+    }
+
+    {
+      name = "socket.io_adapter___socket.io_adapter_1.1.1.tgz";
+      path = fetchurl {
+        name = "socket.io_adapter___socket.io_adapter_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz";
+        sha1 = "2a805e8a14d6372124dd9159ad4502f8cb07f06b";
+      };
+    }
+
+    {
+      name = "socket.io_client___socket.io_client_1.7.3.tgz";
+      path = fetchurl {
+        name = "socket.io_client___socket.io_client_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz";
+        sha1 = "b30e86aa10d5ef3546601c09cde4765e381da377";
+      };
+    }
+
+    {
+      name = "socket.io_client___socket.io_client_2.2.0.tgz";
+      path = fetchurl {
+        name = "socket.io_client___socket.io_client_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz";
+        sha1 = "84e73ee3c43d5020ccc1a258faeeb9aec2723af7";
+      };
+    }
+
+    {
+      name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
+      path = fetchurl {
+        name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz";
+        sha1 = "dd532025103ce429697326befd64005fcfe5b4a0";
+      };
+    }
+
+    {
+      name = "socket.io_parser___socket.io_parser_3.3.0.tgz";
+      path = fetchurl {
+        name = "socket.io_parser___socket.io_parser_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz";
+        sha1 = "2b52a96a509fdf31440ba40fed6094c7d4f1262f";
+      };
+    }
+
+    {
+      name = "socket.io___socket.io_1.7.3.tgz";
+      path = fetchurl {
+        name = "socket.io___socket.io_1.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz";
+        sha1 = "b8af9caba00949e568e369f1327ea9be9ea2461b";
+      };
+    }
+
+    {
+      name = "socket.io___socket.io_2.2.0.tgz";
+      path = fetchurl {
+        name = "socket.io___socket.io_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz";
+        sha1 = "f0f633161ef6712c972b307598ecd08c9b1b4d5b";
+      };
+    }
+
+    {
+      name = "socks_proxy_agent___socks_proxy_agent_3.0.1.tgz";
+      path = fetchurl {
+        name = "socks_proxy_agent___socks_proxy_agent_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz";
+        sha1 = "2eae7cf8e2a82d34565761539a7f9718c5617659";
+      };
+    }
+
+    {
+      name = "socks_proxy_agent___socks_proxy_agent_4.0.1.tgz";
+      path = fetchurl {
+        name = "socks_proxy_agent___socks_proxy_agent_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz";
+        sha1 = "5936bf8b707a993079c6f37db2091821bffa6473";
+      };
+    }
+
+    {
+      name = "socks___socks_1.1.10.tgz";
+      path = fetchurl {
+        name = "socks___socks_1.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz";
+        sha1 = "5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a";
+      };
+    }
+
+    {
+      name = "socks___socks_2.2.2.tgz";
+      path = fetchurl {
+        name = "socks___socks_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/socks/-/socks-2.2.2.tgz";
+        sha1 = "f061219fc2d4d332afb4af93e865c84d3fa26e2b";
+      };
+    }
+
+    {
+      name = "sorted_object___sorted_object_2.0.1.tgz";
+      path = fetchurl {
+        name = "sorted_object___sorted_object_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz";
+        sha1 = "7d631f4bd3a798a24af1dffcfbfe83337a5df5fc";
+      };
+    }
+
+    {
+      name = "sorted_union_stream___sorted_union_stream_2.1.3.tgz";
+      path = fetchurl {
+        name = "sorted_union_stream___sorted_union_stream_2.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz";
+        sha1 = "c7794c7e077880052ff71a8d4a2dbb4a9a638ac7";
+      };
+    }
+
+    {
+      name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+      path = fetchurl {
+        name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
+        sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
+      };
+    }
+
+    {
+      name = "source_map_support___source_map_support_0.5.9.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.5.9.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz";
+        sha1 = "41bc953b2534267ea2d605bccfa7bfa3111ced5f";
+      };
+    }
+
+    {
+      name = "source_map_url___source_map_url_0.4.0.tgz";
+      path = fetchurl {
+        name = "source_map_url___source_map_url_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
+        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.5.7.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    }
+
+    {
+      name = "source_map___source_map_0.6.1.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
+        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
+      };
+    }
+
+    {
+      name = "spawn_command___spawn_command_0.0.2_1.tgz";
+      path = fetchurl {
+        name = "spawn_command___spawn_command_0.0.2_1.tgz";
+        url  = "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz";
+        sha1 = "62f5e9466981c1b796dc5929937e11c9c6921bd0";
+      };
+    }
+
+    {
+      name = "spdx_correct___spdx_correct_3.0.2.tgz";
+      path = fetchurl {
+        name = "spdx_correct___spdx_correct_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz";
+        sha1 = "19bb409e91b47b1ad54159243f7312a858db3c2e";
+      };
+    }
+
+    {
+      name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+      path = fetchurl {
+        name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
+        sha1 = "2ea450aee74f2a89bfb94519c07fcd6f41322977";
+      };
+    }
+
+    {
+      name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+      path = fetchurl {
+        name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
+        sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
+      };
+    }
+
+    {
+      name = "spdx_license_ids___spdx_license_ids_3.0.2.tgz";
+      path = fetchurl {
+        name = "spdx_license_ids___spdx_license_ids_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz";
+        sha1 = "a59efc09784c2a5bada13cfeaf5c75dd214044d2";
+      };
+    }
+
+    {
+      name = "speedometer___speedometer_1.1.0.tgz";
+      path = fetchurl {
+        name = "speedometer___speedometer_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/speedometer/-/speedometer-1.1.0.tgz";
+        sha1 = "a30b13abda45687a1a76977012c060f2ac8a7934";
+      };
+    }
+
+    {
+      name = "split_string___split_string_3.1.0.tgz";
+      path = fetchurl {
+        name = "split_string___split_string_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
+        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
+      };
+    }
+
+    {
+      name = "split2___split2_0.2.1.tgz";
+      path = fetchurl {
+        name = "split2___split2_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz";
+        sha1 = "02ddac9adc03ec0bb78c1282ec079ca6e85ae900";
+      };
+    }
+
+    {
+      name = "split___split_1.0.1.tgz";
+      path = fetchurl {
+        name = "split___split_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz";
+        sha1 = "605bd9be303aa59fb35f9229fbea0ddec9ea07d9";
+      };
+    }
+
+    {
+      name = "sprintf_js___sprintf_js_1.0.3.tgz";
+      path = fetchurl {
+        name = "sprintf_js___sprintf_js_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    }
+
+    {
+      name = "srt_to_vtt___srt_to_vtt_1.1.3.tgz";
+      path = fetchurl {
+        name = "srt_to_vtt___srt_to_vtt_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/srt-to-vtt/-/srt-to-vtt-1.1.3.tgz";
+        sha1 = "a9bc16cde5412e000e59ffda469f3e9befed5dde";
+      };
+    }
+
+    {
+      name = "sshpk___sshpk_1.15.2.tgz";
+      path = fetchurl {
+        name = "sshpk___sshpk_1.15.2.tgz";
+        url  = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz";
+        sha1 = "c946d6bd9b1a39d0e8635763f5242d6ed6dcb629";
+      };
+    }
+
+    {
+      name = "ssri___ssri_5.3.0.tgz";
+      path = fetchurl {
+        name = "ssri___ssri_5.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz";
+        sha1 = "ba3872c9c6d33a0704a7d71ff045e5ec48999d06";
+      };
+    }
+
+    {
+      name = "ssri___ssri_6.0.1.tgz";
+      path = fetchurl {
+        name = "ssri___ssri_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz";
+        sha1 = "2a3c41b28dd45b62b63676ecb74001265ae9edd8";
+      };
+    }
+
+    {
+      name = "stack_trace___stack_trace_0.0.10.tgz";
+      path = fetchurl {
+        name = "stack_trace___stack_trace_0.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz";
+        sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
+      };
+    }
+
+    {
+      name = "staged_git_files___staged_git_files_1.1.2.tgz";
+      path = fetchurl {
+        name = "staged_git_files___staged_git_files_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz";
+        sha1 = "4326d33886dc9ecfa29a6193bf511ba90a46454b";
+      };
+    }
+
+    {
+      name = "static_extend___static_extend_0.1.2.tgz";
+      path = fetchurl {
+        name = "static_extend___static_extend_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
+        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.5.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.3.1.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz";
+        sha1 = "faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.2.1.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz";
+        sha1 = "dded45cc18256d51ed40aec142489d5c61026d28";
+      };
+    }
+
+    {
+      name = "statuses___statuses_1.4.0.tgz";
+      path = fetchurl {
+        name = "statuses___statuses_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz";
+        sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087";
+      };
+    }
+
+    {
+      name = "stream_each___stream_each_1.2.3.tgz";
+      path = fetchurl {
+        name = "stream_each___stream_each_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz";
+        sha1 = "ebe27a0c389b04fbcc233642952e10731afa9bae";
+      };
+    }
+
+    {
+      name = "stream_iterate___stream_iterate_1.2.0.tgz";
+      path = fetchurl {
+        name = "stream_iterate___stream_iterate_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz";
+        sha1 = "2bd7c77296c1702a46488b8ad41f79865eecd4e1";
+      };
+    }
+
+    {
+      name = "stream_shift___stream_shift_1.0.0.tgz";
+      path = fetchurl {
+        name = "stream_shift___stream_shift_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz";
+        sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
+      };
+    }
+
+    {
+      name = "stream_splicer___stream_splicer_1.3.2.tgz";
+      path = fetchurl {
+        name = "stream_splicer___stream_splicer_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz";
+        sha1 = "3c0441be15b9bf4e226275e6dc83964745546661";
+      };
+    }
+
+    {
+      name = "stream_to_blob_url___stream_to_blob_url_2.1.1.tgz";
+      path = fetchurl {
+        name = "stream_to_blob_url___stream_to_blob_url_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz";
+        sha1 = "e1ac97f86ca8e9f512329a48e7830ce9a50beef2";
+      };
+    }
+
+    {
+      name = "stream_to_blob___stream_to_blob_1.0.1.tgz";
+      path = fetchurl {
+        name = "stream_to_blob___stream_to_blob_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-to-blob/-/stream-to-blob-1.0.1.tgz";
+        sha1 = "2dc1e09b71677a234d00445f8eb7ff70c4fe9948";
+      };
+    }
+
+    {
+      name = "stream_with_known_length_to_buffer___stream_with_known_length_to_buffer_1.0.2.tgz";
+      path = fetchurl {
+        name = "stream_with_known_length_to_buffer___stream_with_known_length_to_buffer_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz";
+        sha1 = "b8ea5a92086a1ed5d27fc4c529636682118c945b";
+      };
+    }
+
+    {
+      name = "streamify___streamify_0.2.9.tgz";
+      path = fetchurl {
+        name = "streamify___streamify_0.2.9.tgz";
+        url  = "https://registry.yarnpkg.com/streamify/-/streamify-0.2.9.tgz";
+        sha1 = "8938b14db491e2b6be4f8d99cc4133c9f0384f0b";
+      };
+    }
+
+    {
+      name = "streamsearch___streamsearch_0.1.2.tgz";
+      path = fetchurl {
+        name = "streamsearch___streamsearch_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz";
+        sha1 = "808b9d0e56fc273d809ba57338e929919a1a9f1a";
+      };
+    }
+
+    {
+      name = "strict_uri_encode___strict_uri_encode_2.0.0.tgz";
+      path = fetchurl {
+        name = "strict_uri_encode___strict_uri_encode_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz";
+        sha1 = "b9c7330c7042862f6b142dc274bbcc5866ce3546";
+      };
+    }
+
+    {
+      name = "string_argv___string_argv_0.0.2.tgz";
+      path = fetchurl {
+        name = "string_argv___string_argv_0.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz";
+        sha1 = "dac30408690c21f3c3630a3ff3a05877bdcbd736";
+      };
+    }
+
+    {
+      name = "string_width___string_width_1.0.2.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    }
+
+    {
+      name = "string_width___string_width_2.1.1.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
+        sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
+      };
+    }
+
+    {
+      name = "string2compact___string2compact_1.3.0.tgz";
+      path = fetchurl {
+        name = "string2compact___string2compact_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/string2compact/-/string2compact-1.3.0.tgz";
+        sha1 = "22d946127b082d1203c51316af60117a337423c3";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.2.0.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz";
+        sha1 = "fe86e738b19544afe70469243b2a1ee9240eae8d";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_0.10.31.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_0.10.31.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    }
+
+    {
+      name = "string_decoder___string_decoder_1.1.1.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
+      };
+    }
+
+    {
+      name = "stringify_object___stringify_object_3.3.0.tgz";
+      path = fetchurl {
+        name = "stringify_object___stringify_object_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz";
+        sha1 = "703065aefca19300d3ce88af4f5b3956d7556629";
+      };
+    }
+
+    {
+      name = "stringify_package___stringify_package_1.0.0.tgz";
+      path = fetchurl {
+        name = "stringify_package___stringify_package_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz";
+        sha1 = "e02828089333d7d45cd8c287c30aa9a13375081b";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    }
+
+    {
+      name = "strip_ansi___strip_ansi_4.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    }
+
+    {
+      name = "strip_eof___strip_eof_1.0.0.tgz";
+      path = fetchurl {
+        name = "strip_eof___strip_eof_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
+        sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
+      };
+    }
+
+    {
+      name = "strip_json_comments___strip_json_comments_1.0.4.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz";
+        sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
+      };
+    }
+
+    {
+      name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
+      };
+    }
+
+    {
+      name = "summon_install___summon_install_0.4.6.tgz";
+      path = fetchurl {
+        name = "summon_install___summon_install_0.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/summon-install/-/summon-install-0.4.6.tgz";
+        sha1 = "25673446e8b92f8bc0afabc464aa7b73fe946bd5";
+      };
+    }
+
+    {
+      name = "superagent___superagent_3.8.3.tgz";
+      path = fetchurl {
+        name = "superagent___superagent_3.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz";
+        sha1 = "460ea0dbdb7d5b11bc4f78deba565f86a178e128";
+      };
+    }
+
+    {
+      name = "supertest___supertest_3.3.0.tgz";
+      path = fetchurl {
+        name = "supertest___supertest_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/supertest/-/supertest-3.3.0.tgz";
+        sha1 = "79b27bd7d34392974ab33a31fa51a3e23385987e";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_5.4.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_5.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz";
+        sha1 = "1c6b337402c2137605efe19f10fec390f6faab54";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_2.0.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_4.5.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz";
+        sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b";
+      };
+    }
+
+    {
+      name = "supports_color___supports_color_5.5.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_5.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz";
+        sha1 = "e2e69a44ac8772f78a1ec0b35b689df6530efc8f";
+      };
+    }
+
+    {
+      name = "swagger_cli___swagger_cli_2.2.0.tgz";
+      path = fetchurl {
+        name = "swagger_cli___swagger_cli_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/swagger-cli/-/swagger-cli-2.2.0.tgz";
+        sha1 = "837b01e1fd6cc6aa324f8884ec1151a3c17ca007";
+      };
+    }
+
+    {
+      name = "swagger_methods___swagger_methods_1.0.6.tgz";
+      path = fetchurl {
+        name = "swagger_methods___swagger_methods_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.6.tgz";
+        sha1 = "b91c2e4f7f9e5e2c4cd3b285b8be06ca76b3cc6a";
+      };
+    }
+
+    {
+      name = "swagger_parser___swagger_parser_6.0.2.tgz";
+      path = fetchurl {
+        name = "swagger_parser___swagger_parser_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-6.0.2.tgz";
+        sha1 = "ef3fe95ae17eab2ba04d2646007df106c7b542b9";
+      };
+    }
+
+    {
+      name = "swagger_schema_official___swagger_schema_official_2.0.0_bab6bed.tgz";
+      path = fetchurl {
+        name = "swagger_schema_official___swagger_schema_official_2.0.0_bab6bed.tgz";
+        url  = "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz";
+        sha1 = "70070468d6d2977ca5237b2e519ca7d06a2ea3fd";
+      };
+    }
+
+    {
+      name = "symbol_observable___symbol_observable_1.2.0.tgz";
+      path = fetchurl {
+        name = "symbol_observable___symbol_observable_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz";
+        sha1 = "c22688aed4eab3cdc2dfeacbb561660560a00804";
+      };
+    }
+
+    {
+      name = "table___table_3.8.3.tgz";
+      path = fetchurl {
+        name = "table___table_3.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz";
+        sha1 = "2bbc542f0fda9861a755d3947fefd8b3f513855f";
+      };
+    }
+
+    {
+      name = "tar_fs___tar_fs_1.16.3.tgz";
+      path = fetchurl {
+        name = "tar_fs___tar_fs_1.16.3.tgz";
+        url  = "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz";
+        sha1 = "966a628841da2c4010406a82167cbd5e0c72d509";
+      };
+    }
+
+    {
+      name = "tar_stream___tar_stream_1.6.2.tgz";
+      path = fetchurl {
+        name = "tar_stream___tar_stream_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz";
+        sha1 = "8ea55dab37972253d9a9af90fdcd559ae435c555";
+      };
+    }
+
+    {
+      name = "tar___tar_2.2.1.tgz";
+      path = fetchurl {
+        name = "tar___tar_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz";
+        sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
+      };
+    }
+
+    {
+      name = "tar___tar_4.4.8.tgz";
+      path = fetchurl {
+        name = "tar___tar_4.4.8.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz";
+        sha1 = "b19eec3fde2a96e64666df9fdb40c5ca1bc3747d";
+      };
+    }
+
+    {
+      name = "term_size___term_size_1.2.0.tgz";
+      path = fetchurl {
+        name = "term_size___term_size_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz";
+        sha1 = "458b83887f288fc56d6fffbfad262e26638efa69";
+      };
+    }
+
+    {
+      name = "terraformer_wkt_parser___terraformer_wkt_parser_1.2.0.tgz";
+      path = fetchurl {
+        name = "terraformer_wkt_parser___terraformer_wkt_parser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz";
+        sha1 = "c9d6ac3dff25f4c0bd344e961f42694961834c34";
+      };
+    }
+
+    {
+      name = "terraformer___terraformer_1.0.9.tgz";
+      path = fetchurl {
+        name = "terraformer___terraformer_1.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz";
+        sha1 = "77851fef4a49c90b345dc53cf26809fdf29dcda6";
+      };
+    }
+
+    {
+      name = "text_hex___text_hex_1.0.0.tgz";
+      path = fetchurl {
+        name = "text_hex___text_hex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz";
+        sha1 = "69dc9c1b17446ee79a92bf5b884bb4b9127506f5";
+      };
+    }
+
+    {
+      name = "text_table___text_table_0.2.0.tgz";
+      path = fetchurl {
+        name = "text_table___text_table_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz";
+        sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+      };
+    }
+
+    {
+      name = "thirty_two___thirty_two_1.0.2.tgz";
+      path = fetchurl {
+        name = "thirty_two___thirty_two_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz";
+        sha1 = "4ca2fffc02a51290d2744b9e3f557693ca6b627a";
+      };
+    }
+
+    {
+      name = "through2___through2_0.6.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_0.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz";
+        sha1 = "41ab9c67b29d57209071410e1d7a7a968cd3ad48";
+      };
+    }
+
+    {
+      name = "through2___through2_1.1.1.tgz";
+      path = fetchurl {
+        name = "through2___through2_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz";
+        sha1 = "0847cbc4449f3405574dbdccd9bb841b83ac3545";
+      };
+    }
+
+    {
+      name = "through2___through2_2.0.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
+        sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
+      };
+    }
+
+    {
+      name = "through___through_2.3.8.tgz";
+      path = fetchurl {
+        name = "through___through_2.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    }
+
+    {
+      name = "thunky___thunky_1.0.3.tgz";
+      path = fetchurl {
+        name = "thunky___thunky_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz";
+        sha1 = "f5df732453407b09191dae73e2a8cc73f381a826";
+      };
+    }
+
+    {
+      name = "timed_out___timed_out_4.0.1.tgz";
+      path = fetchurl {
+        name = "timed_out___timed_out_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz";
+        sha1 = "f32eacac5a175bea25d7fab565ab3ed8741ef56f";
+      };
+    }
+
+    {
+      name = "timers_ext___timers_ext_0.1.7.tgz";
+      path = fetchurl {
+        name = "timers_ext___timers_ext_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz";
+        sha1 = "6f57ad8578e07a3fb9f91d9387d65647555e25c6";
+      };
+    }
+
+    {
+      name = "tiny_relative_date___tiny_relative_date_1.3.0.tgz";
+      path = fetchurl {
+        name = "tiny_relative_date___tiny_relative_date_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz";
+        sha1 = "fa08aad501ed730f31cc043181d995c39a935e07";
+      };
+    }
+
+    {
+      name = "tmp___tmp_0.0.33.tgz";
+      path = fetchurl {
+        name = "tmp___tmp_0.0.33.tgz";
+        url  = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz";
+        sha1 = "6d34335889768d21b2bcda0aa277ced3b1bfadf9";
+      };
+    }
+
+    {
+      name = "to_array___to_array_0.1.4.tgz";
+      path = fetchurl {
+        name = "to_array___to_array_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    }
+
+    {
+      name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+      path = fetchurl {
+        name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
+        sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
+      };
+    }
+
+    {
+      name = "to_buffer___to_buffer_1.1.1.tgz";
+      path = fetchurl {
+        name = "to_buffer___to_buffer_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz";
+        sha1 = "493bd48f62d7c43fcded313a03dcadb2e1213a80";
+      };
+    }
+
+    {
+      name = "to_object_path___to_object_path_0.3.0.tgz";
+      path = fetchurl {
+        name = "to_object_path___to_object_path_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
+        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
+      };
+    }
+
+    {
+      name = "to_regex_range___to_regex_range_2.1.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
+        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
+      };
+    }
+
+    {
+      name = "to_regex___to_regex_3.0.2.tgz";
+      path = fetchurl {
+        name = "to_regex___to_regex_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
+        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
+      };
+    }
+
+    {
+      name = "to_utf_8___to_utf_8_1.3.0.tgz";
+      path = fetchurl {
+        name = "to_utf_8___to_utf_8_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-utf-8/-/to-utf-8-1.3.0.tgz";
+        sha1 = "b2af7be9e003f4c3817cc116d3baed2a054993c9";
+      };
+    }
+
+    {
+      name = "toposort_class___toposort_class_1.0.1.tgz";
+      path = fetchurl {
+        name = "toposort_class___toposort_class_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz";
+        sha1 = "7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988";
+      };
+    }
+
+    {
+      name = "torrent_discovery___torrent_discovery_9.1.1.tgz";
+      path = fetchurl {
+        name = "torrent_discovery___torrent_discovery_9.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/torrent-discovery/-/torrent-discovery-9.1.1.tgz";
+        sha1 = "56704e6747b24fe00dbb75b442d202051f78d37d";
+      };
+    }
+
+    {
+      name = "torrent_piece___torrent_piece_2.0.0.tgz";
+      path = fetchurl {
+        name = "torrent_piece___torrent_piece_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz";
+        sha1 = "6598ae67d93699e887f178db267ba16d89d7ec9b";
+      };
+    }
+
+    {
+      name = "touch___touch_3.1.0.tgz";
+      path = fetchurl {
+        name = "touch___touch_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz";
+        sha1 = "fe365f5f75ec9ed4e56825e0bb76d24ab74af83b";
+      };
+    }
+
+    {
+      name = "tough_cookie___tough_cookie_2.4.3.tgz";
+      path = fetchurl {
+        name = "tough_cookie___tough_cookie_2.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz";
+        sha1 = "53f36da3f47783b0925afa06ff9f3b165280f781";
+      };
+    }
+
+    {
+      name = "traverse___traverse_0.6.6.tgz";
+      path = fetchurl {
+        name = "traverse___traverse_0.6.6.tgz";
+        url  = "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz";
+        sha1 = "cbdf560fd7b9af632502fed40f918c157ea97137";
+      };
+    }
+
+    {
+      name = "tree_kill___tree_kill_1.2.1.tgz";
+      path = fetchurl {
+        name = "tree_kill___tree_kill_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz";
+        sha1 = "5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a";
+      };
+    }
+
+    {
+      name = "triple_beam___triple_beam_1.3.0.tgz";
+      path = fetchurl {
+        name = "triple_beam___triple_beam_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz";
+        sha1 = "a595214c7298db8339eeeee083e4d10bd8cb8dd9";
+      };
+    }
+
+    {
+      name = "ts_node___ts_node_7.0.1.tgz";
+      path = fetchurl {
+        name = "ts_node___ts_node_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz";
+        sha1 = "9562dc2d1e6d248d24bc55f773e3f614337d9baf";
+      };
+    }
+
+    {
+      name = "tslib___tslib_1.9.0.tgz";
+      path = fetchurl {
+        name = "tslib___tslib_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz";
+        sha1 = "e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8";
+      };
+    }
+
+    {
+      name = "tslib___tslib_1.9.3.tgz";
+      path = fetchurl {
+        name = "tslib___tslib_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz";
+        sha1 = "d7e4dd79245d85428c4d7e4822a79917954ca286";
+      };
+    }
+
+    {
+      name = "tslint_config_standard___tslint_config_standard_8.0.1.tgz";
+      path = fetchurl {
+        name = "tslint_config_standard___tslint_config_standard_8.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz";
+        sha1 = "e4dd3128e84b0e34b51990b68715a641f2b417e4";
+      };
+    }
+
+    {
+      name = "tslint_eslint_rules___tslint_eslint_rules_5.4.0.tgz";
+      path = fetchurl {
+        name = "tslint_eslint_rules___tslint_eslint_rules_5.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz";
+        sha1 = "e488cc9181bf193fe5cd7bfca213a7695f1737b5";
+      };
+    }
+
+    {
+      name = "tslint___tslint_5.11.0.tgz";
+      path = fetchurl {
+        name = "tslint___tslint_5.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz";
+        sha1 = "98f30c02eae3cde7006201e4c33cb08b48581eed";
+      };
+    }
+
+    {
+      name = "tsutils___tsutils_2.29.0.tgz";
+      path = fetchurl {
+        name = "tsutils___tsutils_2.29.0.tgz";
+        url  = "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz";
+        sha1 = "32b488501467acbedd4b85498673a0812aca0b99";
+      };
+    }
+
+    {
+      name = "tsutils___tsutils_3.5.2.tgz";
+      path = fetchurl {
+        name = "tsutils___tsutils_3.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.2.tgz";
+        sha1 = "6fd3c2d5a731e83bb21b070a173ec0faf3a8f6d3";
+      };
+    }
+
+    {
+      name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+      path = fetchurl {
+        name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    }
+
+    {
+      name = "tv4___tv4_1.2.7.tgz";
+      path = fetchurl {
+        name = "tv4___tv4_1.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/tv4/-/tv4-1.2.7.tgz";
+        sha1 = "bd29389afc73ade49ae5f48142b5d544bf68d120";
+      };
+    }
+
+    {
+      name = "tweetnacl___tweetnacl_0.14.5.tgz";
+      path = fetchurl {
+        name = "tweetnacl___tweetnacl_0.14.5.tgz";
+        url  = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    }
+
+    {
+      name = "type_check___type_check_0.3.2.tgz";
+      path = fetchurl {
+        name = "type_check___type_check_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    }
+
+    {
+      name = "type_detect___type_detect_0.1.1.tgz";
+      path = fetchurl {
+        name = "type_detect___type_detect_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz";
+        sha1 = "0ba5ec2a885640e470ea4e8505971900dac58822";
+      };
+    }
+
+    {
+      name = "type_detect___type_detect_4.0.8.tgz";
+      path = fetchurl {
+        name = "type_detect___type_detect_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz";
+        sha1 = "7646fb5f18871cfbb7749e69bd39a6388eb7450c";
+      };
+    }
+
+    {
+      name = "type_is___type_is_1.6.15.tgz";
+      path = fetchurl {
+        name = "type_is___type_is_1.6.15.tgz";
+        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz";
+        sha1 = "cab10fb4909e441c82842eafe1ad646c81804410";
+      };
+    }
+
+    {
+      name = "type_is___type_is_1.6.16.tgz";
+      path = fetchurl {
+        name = "type_is___type_is_1.6.16.tgz";
+        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
+        sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
+      };
+    }
+
+    {
+      name = "typedarray_to_buffer___typedarray_to_buffer_3.1.5.tgz";
+      path = fetchurl {
+        name = "typedarray_to_buffer___typedarray_to_buffer_3.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz";
+        sha1 = "a97ee7a9ff42691b9f783ff1bc5112fe3fca9080";
+      };
+    }
+
+    {
+      name = "typedarray___typedarray_0.0.6.tgz";
+      path = fetchurl {
+        name = "typedarray___typedarray_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz";
+        sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
+      };
+    }
+
+    {
+      name = "typescript___typescript_3.2.1.tgz";
+      path = fetchurl {
+        name = "typescript___typescript_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz";
+        sha1 = "0b7a04b8cf3868188de914d9568bd030f0c56192";
+      };
+    }
+
+    {
+      name = "uid_number___uid_number_0.0.6.tgz";
+      path = fetchurl {
+        name = "uid_number___uid_number_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz";
+        sha1 = "0ea10e8035e8eb5b8e4449f06da1c730663baa81";
+      };
+    }
+
+    {
+      name = "uint64be___uint64be_2.0.2.tgz";
+      path = fetchurl {
+        name = "uint64be___uint64be_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz";
+        sha1 = "ef4a179752fe8f9ddaa29544ecfc13490031e8e5";
+      };
+    }
+
+    {
+      name = "ultron___ultron_1.0.2.tgz";
+      path = fetchurl {
+        name = "ultron___ultron_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz";
+        sha1 = "ace116ab557cd197386a4e88f4685378c8b2e4fa";
+      };
+    }
+
+    {
+      name = "umask___umask_1.1.0.tgz";
+      path = fetchurl {
+        name = "umask___umask_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz";
+        sha1 = "f29cebf01df517912bb58ff9c4e50fde8e33320d";
+      };
+    }
+
+    {
+      name = "undefsafe___undefsafe_2.0.2.tgz";
+      path = fetchurl {
+        name = "undefsafe___undefsafe_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz";
+        sha1 = "225f6b9e0337663e0d8e7cfd686fc2836ccace76";
+      };
+    }
+
+    {
+      name = "underscore_keypath___underscore_keypath_0.0.22.tgz";
+      path = fetchurl {
+        name = "underscore_keypath___underscore_keypath_0.0.22.tgz";
+        url  = "https://registry.yarnpkg.com/underscore-keypath/-/underscore-keypath-0.0.22.tgz";
+        sha1 = "48a528392bb6efc424be1caa56da4b5faccf264d";
+      };
+    }
+
+    {
+      name = "underscore___underscore_1.9.1.tgz";
+      path = fetchurl {
+        name = "underscore___underscore_1.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz";
+        sha1 = "06dce34a0e68a7babc29b365b8e74b8925203961";
+      };
+    }
+
+    {
+      name = "union_value___union_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "union_value___union_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
+        sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
+      };
+    }
+
+    {
+      name = "uniq___uniq_1.0.1.tgz";
+      path = fetchurl {
+        name = "uniq___uniq_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
+        sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
+      };
+    }
+
+    {
+      name = "unique_filename___unique_filename_1.1.1.tgz";
+      path = fetchurl {
+        name = "unique_filename___unique_filename_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz";
+        sha1 = "1d69769369ada0583103a1e6ae87681b56573230";
+      };
+    }
+
+    {
+      name = "unique_slug___unique_slug_2.0.1.tgz";
+      path = fetchurl {
+        name = "unique_slug___unique_slug_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz";
+        sha1 = "5e9edc6d1ce8fb264db18a507ef9bd8544451ca6";
+      };
+    }
+
+    {
+      name = "unique_string___unique_string_1.0.0.tgz";
+      path = fetchurl {
+        name = "unique_string___unique_string_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz";
+        sha1 = "9e1057cca851abb93398f8b33ae187b99caec11a";
+      };
+    }
+
+    {
+      name = "universalify___universalify_0.1.2.tgz";
+      path = fetchurl {
+        name = "universalify___universalify_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz";
+        sha1 = "b646f69be3942dabcecc9d6639c80dc105efaa66";
+      };
+    }
+
+    {
+      name = "unordered_array_remove___unordered_array_remove_1.0.2.tgz";
+      path = fetchurl {
+        name = "unordered_array_remove___unordered_array_remove_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz";
+        sha1 = "c546e8f88e317a0cf2644c97ecb57dba66d250ef";
+      };
+    }
+
+    {
+      name = "unpipe___unpipe_1.0.0.tgz";
+      path = fetchurl {
+        name = "unpipe___unpipe_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    }
+
+    {
+      name = "unset_value___unset_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "unset_value___unset_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
+        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
+      };
+    }
+
+    {
+      name = "unzip_response___unzip_response_2.0.1.tgz";
+      path = fetchurl {
+        name = "unzip_response___unzip_response_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz";
+        sha1 = "d2f0f737d16b0615e72a6935ed04214572d56f97";
+      };
+    }
+
+    {
+      name = "upath___upath_1.1.0.tgz";
+      path = fetchurl {
+        name = "upath___upath_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz";
+        sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd";
+      };
+    }
+
+    {
+      name = "update_notifier___update_notifier_2.5.0.tgz";
+      path = fetchurl {
+        name = "update_notifier___update_notifier_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz";
+        sha1 = "d0744593e13f161e406acb1d9408b72cad08aff6";
+      };
+    }
+
+    {
+      name = "uri_js___uri_js_4.2.2.tgz";
+      path = fetchurl {
+        name = "uri_js___uri_js_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
+        sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
+      };
+    }
+
+    {
+      name = "urix___urix_0.1.0.tgz";
+      path = fetchurl {
+        name = "urix___urix_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
+        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
+      };
+    }
+
+    {
+      name = "url_join___url_join_4.0.0.tgz";
+      path = fetchurl {
+        name = "url_join___url_join_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz";
+        sha1 = "4d3340e807d3773bda9991f8305acdcc2a665d2a";
+      };
+    }
+
+    {
+      name = "url_parse_lax___url_parse_lax_1.0.0.tgz";
+      path = fetchurl {
+        name = "url_parse_lax___url_parse_lax_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz";
+        sha1 = "7af8f303645e9bd79a272e7a14ac68bc0609da73";
+      };
+    }
+
+    {
+      name = "use___use_3.1.1.tgz";
+      path = fetchurl {
+        name = "use___use_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
+        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
+      };
+    }
+
+    {
+      name = "user_home___user_home_2.0.0.tgz";
+      path = fetchurl {
+        name = "user_home___user_home_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz";
+        sha1 = "9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f";
+      };
+    }
+
+    {
+      name = "useragent___useragent_2.3.0.tgz";
+      path = fetchurl {
+        name = "useragent___useragent_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz";
+        sha1 = "217f943ad540cb2128658ab23fc960f6a88c9972";
+      };
+    }
+
+    {
+      name = "ut_metadata___ut_metadata_3.3.0.tgz";
+      path = fetchurl {
+        name = "ut_metadata___ut_metadata_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/ut_metadata/-/ut_metadata-3.3.0.tgz";
+        sha1 = "a0e0e861ebc39ed96e506601d1463ade3b548a7e";
+      };
+    }
+
+    {
+      name = "ut_pex___ut_pex_1.2.1.tgz";
+      path = fetchurl {
+        name = "ut_pex___ut_pex_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ut_pex/-/ut_pex-1.2.1.tgz";
+        sha1 = "472ed0ea5e9bbc9148b833339d56d7b17cf3dad0";
+      };
+    }
+
+    {
+      name = "utf_8_validate___utf_8_validate_5.0.1.tgz";
+      path = fetchurl {
+        name = "utf_8_validate___utf_8_validate_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.1.tgz";
+        sha1 = "cef1f9011ba4b216f4d7c6ddf5189d750599ff8b";
+      };
+    }
+
+    {
+      name = "util_deprecate___util_deprecate_1.0.2.tgz";
+      path = fetchurl {
+        name = "util_deprecate___util_deprecate_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    }
+
+    {
+      name = "util_extend___util_extend_1.0.3.tgz";
+      path = fetchurl {
+        name = "util_extend___util_extend_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz";
+        sha1 = "a7c216d267545169637b3b6edc6ca9119e2ff93f";
+      };
+    }
+
+    {
+      name = "util___util_0.10.4.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
+        sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
+      };
+    }
+
+    {
+      name = "utile___utile_0.3.0.tgz";
+      path = fetchurl {
+        name = "utile___utile_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz";
+        sha1 = "1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a";
+      };
+    }
+
+    {
+      name = "utils_merge___utils_merge_1.0.0.tgz";
+      path = fetchurl {
+        name = "utils_merge___utils_merge_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz";
+        sha1 = "0294fb922bb9375153541c4f7096231f287c8af8";
+      };
+    }
+
+    {
+      name = "utils_merge___utils_merge_1.0.1.tgz";
+      path = fetchurl {
+        name = "utils_merge___utils_merge_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    }
+
+    {
+      name = "uue___uue_3.1.2.tgz";
+      path = fetchurl {
+        name = "uue___uue_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/uue/-/uue-3.1.2.tgz";
+        sha1 = "e99368414e87200012eb37de4dbaebaa1c742ad2";
+      };
+    }
+
+    {
+      name = "uuid___uuid_3.3.2.tgz";
+      path = fetchurl {
+        name = "uuid___uuid_3.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
+        sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
+      };
+    }
+
+    {
+      name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
+        sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
+      };
+    }
+
+    {
+      name = "validate_npm_package_name___validate_npm_package_name_3.0.0.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_name___validate_npm_package_name_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
+        sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
+      };
+    }
+
+    {
+      name = "validator___validator_10.9.0.tgz";
+      path = fetchurl {
+        name = "validator___validator_10.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/validator/-/validator-10.9.0.tgz";
+        sha1 = "d10c11673b5061fb7ccf4c1114412411b2bac2a8";
+      };
+    }
+
+    {
+      name = "vary___vary_1.1.2.tgz";
+      path = fetchurl {
+        name = "vary___vary_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    }
+
+    {
+      name = "vary___vary_1.0.1.tgz";
+      path = fetchurl {
+        name = "vary___vary_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz";
+        sha1 = "99e4981566a286118dfb2b817357df7993376d10";
+      };
+    }
+
+    {
+      name = "vasync___vasync_1.6.4.tgz";
+      path = fetchurl {
+        name = "vasync___vasync_1.6.4.tgz";
+        url  = "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz";
+        sha1 = "dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f";
+      };
+    }
+
+    {
+      name = "verror___verror_1.10.0.tgz";
+      path = fetchurl {
+        name = "verror___verror_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    }
+
+    {
+      name = "verror___verror_1.6.0.tgz";
+      path = fetchurl {
+        name = "verror___verror_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/verror/-/verror-1.6.0.tgz";
+        sha1 = "7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5";
+      };
+    }
+
+    {
+      name = "videostream___videostream_2.6.0.tgz";
+      path = fetchurl {
+        name = "videostream___videostream_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/videostream/-/videostream-2.6.0.tgz";
+        sha1 = "7f0b2b84bc457c12cfe599aa2345f5cc06241ab6";
+      };
+    }
+
+    {
+      name = "wcwidth___wcwidth_1.0.1.tgz";
+      path = fetchurl {
+        name = "wcwidth___wcwidth_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz";
+        sha1 = "f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
+      };
+    }
+
+    {
+      name = "webfinger.js___webfinger.js_2.7.0.tgz";
+      path = fetchurl {
+        name = "webfinger.js___webfinger.js_2.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.7.0.tgz";
+        sha1 = "403354a14a65aeeba64c1408c18a387487cea106";
+      };
+    }
+
+    {
+      name = "webtorrent___webtorrent_0.102.4.tgz";
+      path = fetchurl {
+        name = "webtorrent___webtorrent_0.102.4.tgz";
+        url  = "https://registry.yarnpkg.com/webtorrent/-/webtorrent-0.102.4.tgz";
+        sha1 = "0902f5dddb244c4ca8137d5d678546b733adeb2f";
+      };
+    }
+
+    {
+      name = "which_module___which_module_2.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
+        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
+      };
+    }
+
+    {
+      name = "which_pm_runs___which_pm_runs_1.0.0.tgz";
+      path = fetchurl {
+        name = "which_pm_runs___which_pm_runs_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz";
+        sha1 = "670b3afbc552e0b55df6b7780ca74615f23ad1cb";
+      };
+    }
+
+    {
+      name = "which___which_1.3.1.tgz";
+      path = fetchurl {
+        name = "which___which_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
+        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
+      };
+    }
+
+    {
+      name = "wide_align___wide_align_1.1.3.tgz";
+      path = fetchurl {
+        name = "wide_align___wide_align_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
+        sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
+      };
+    }
+
+    {
+      name = "widest_line___widest_line_2.0.1.tgz";
+      path = fetchurl {
+        name = "widest_line___widest_line_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz";
+        sha1 = "7438764730ec7ef4381ce4df82fb98a53142a3fc";
+      };
+    }
+
+    {
+      name = "wildstring___wildstring_1.0.8.tgz";
+      path = fetchurl {
+        name = "wildstring___wildstring_1.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.8.tgz";
+        sha1 = "80b5f85b7f8aa98bc19cc230e60ac7f5e0dd226d";
+      };
+    }
+
+    {
+      name = "winston_transport___winston_transport_4.2.0.tgz";
+      path = fetchurl {
+        name = "winston_transport___winston_transport_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.2.0.tgz";
+        sha1 = "a20be89edf2ea2ca39ba25f3e50344d73e6520e5";
+      };
+    }
+
+    {
+      name = "winston___winston_2.1.1.tgz";
+      path = fetchurl {
+        name = "winston___winston_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz";
+        sha1 = "3c9349d196207fd1bdff9d4bc43ef72510e3a12e";
+      };
+    }
+
+    {
+      name = "winston___winston_3.1.0.tgz";
+      path = fetchurl {
+        name = "winston___winston_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/winston/-/winston-3.1.0.tgz";
+        sha1 = "80724376aef164e024f316100d5b178d78ac5331";
+      };
+    }
+
+    {
+      name = "wkx___wkx_0.4.5.tgz";
+      path = fetchurl {
+        name = "wkx___wkx_0.4.5.tgz";
+        url  = "https://registry.yarnpkg.com/wkx/-/wkx-0.4.5.tgz";
+        sha1 = "a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0";
+      };
+    }
+
+    {
+      name = "wordwrap___wordwrap_1.0.0.tgz";
+      path = fetchurl {
+        name = "wordwrap___wordwrap_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz";
+        sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
+      };
+    }
+
+    {
+      name = "worker_farm___worker_farm_1.6.0.tgz";
+      path = fetchurl {
+        name = "worker_farm___worker_farm_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz";
+        sha1 = "aecc405976fab5a95526180846f0dba288f3a4a0";
+      };
+    }
+
+    {
+      name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
+        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
+      };
+    }
+
+    {
+      name = "wrap_ansi___wrap_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz";
+        sha1 = "288a04d87eda5c286e060dfe8f135ce8d007f8ba";
+      };
+    }
+
+    {
+      name = "wrappy___wrappy_1.0.2.tgz";
+      path = fetchurl {
+        name = "wrappy___wrappy_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    }
+
+    {
+      name = "write_file_atomic___write_file_atomic_2.3.0.tgz";
+      path = fetchurl {
+        name = "write_file_atomic___write_file_atomic_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz";
+        sha1 = "1ff61575c2e2a4e8e510d6fa4e243cce183999ab";
+      };
+    }
+
+    {
+      name = "write___write_0.2.1.tgz";
+      path = fetchurl {
+        name = "write___write_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz";
+        sha1 = "5fc03828e264cea3fe91455476f7a3c566cb0757";
+      };
+    }
+
+    {
+      name = "ws___ws_1.1.2.tgz";
+      path = fetchurl {
+        name = "ws___ws_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz";
+        sha1 = "8a244fa052401e08c9886cf44a85189e1fd4067f";
+      };
+    }
+
+    {
+      name = "ws___ws_6.1.2.tgz";
+      path = fetchurl {
+        name = "ws___ws_6.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz";
+        sha1 = "3cc7462e98792f0ac679424148903ded3b9c3ad8";
+      };
+    }
+
+    {
+      name = "wtf_8___wtf_8_1.0.0.tgz";
+      path = fetchurl {
+        name = "wtf_8___wtf_8_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz";
+        sha1 = "392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
+      };
+    }
+
+    {
+      name = "x_xss_protection___x_xss_protection_1.1.0.tgz";
+      path = fetchurl {
+        name = "x_xss_protection___x_xss_protection_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz";
+        sha1 = "4f1898c332deb1e7f2be1280efb3e2c53d69c1a7";
+      };
+    }
+
+    {
+      name = "xdg_basedir___xdg_basedir_3.0.0.tgz";
+      path = fetchurl {
+        name = "xdg_basedir___xdg_basedir_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz";
+        sha1 = "496b2cc109eca8dbacfe2dc72b603c17c5870ad4";
+      };
+    }
+
+    {
+      name = "xhr2___xhr2_0.1.4.tgz";
+      path = fetchurl {
+        name = "xhr2___xhr2_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz";
+        sha1 = "7f87658847716db5026323812f818cadab387a5f";
+      };
+    }
+
+    {
+      name = "xliff___xliff_4.1.2.tgz";
+      path = fetchurl {
+        name = "xliff___xliff_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/xliff/-/xliff-4.1.2.tgz";
+        sha1 = "eb6fae21346d82653febd44d478f5748ad79fbd2";
+      };
+    }
+
+    {
+      name = "xml_js___xml_js_1.6.8.tgz";
+      path = fetchurl {
+        name = "xml_js___xml_js_1.6.8.tgz";
+        url  = "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.8.tgz";
+        sha1 = "e06419c54235f18f4c2cdda824cbd65a782330de";
+      };
+    }
+
+    {
+      name = "xml2js___xml2js_0.4.19.tgz";
+      path = fetchurl {
+        name = "xml2js___xml2js_0.4.19.tgz";
+        url  = "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz";
+        sha1 = "686c20f213209e94abf0d1bcf1efaa291c7827a7";
+      };
+    }
+
+    {
+      name = "xml___xml_1.0.1.tgz";
+      path = fetchurl {
+        name = "xml___xml_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz";
+        sha1 = "78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5";
+      };
+    }
+
+    {
+      name = "xmlbuilder___xmlbuilder_10.1.1.tgz";
+      path = fetchurl {
+        name = "xmlbuilder___xmlbuilder_10.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz";
+        sha1 = "8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0";
+      };
+    }
+
+    {
+      name = "xmlbuilder___xmlbuilder_9.0.7.tgz";
+      path = fetchurl {
+        name = "xmlbuilder___xmlbuilder_9.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz";
+        sha1 = "132ee63d2ec5565c557e20f4c22df9aca686b10d";
+      };
+    }
+
+    {
+      name = "xmldom___xmldom_0.1.19.tgz";
+      path = fetchurl {
+        name = "xmldom___xmldom_0.1.19.tgz";
+        url  = "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz";
+        sha1 = "631fc07776efd84118bf25171b37ed4d075a0abc";
+      };
+    }
+
+    {
+      name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
+      path = fetchurl {
+        name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz";
+        sha1 = "185a888c04eca46c3e4070d99f7b49de3528992d";
+      };
+    }
+
+    {
+      name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.5.tgz";
+      path = fetchurl {
+        name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.5.tgz";
+        url  = "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz";
+        sha1 = "c2876b06168aadc40e57d97e81191ac8f4398b3e";
+      };
+    }
+
+    {
+      name = "xtend___xtend_4.0.1.tgz";
+      path = fetchurl {
+        name = "xtend___xtend_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+    }
+
+    {
+      name = "y18n___y18n_3.2.1.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
+        sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
+      };
+    }
+
+    {
+      name = "y18n___y18n_4.0.0.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz";
+        sha1 = "95ef94f85ecc81d007c264e190a120f0a3c8566b";
+      };
+    }
+
+    {
+      name = "yallist___yallist_2.1.2.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
+        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
+      };
+    }
+
+    {
+      name = "yallist___yallist_3.0.3.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz";
+        sha1 = "b4b049e314be545e3ce802236d6cd22cd91c3de9";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_11.1.1.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_11.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz";
+        sha1 = "879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_8.1.0.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_8.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz";
+        sha1 = "f1376a33b6629a5d063782944da732631e966950";
+      };
+    }
+
+    {
+      name = "yargs_parser___yargs_parser_9.0.2.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_9.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz";
+        sha1 = "9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077";
+      };
+    }
+
+    {
+      name = "yargs___yargs_11.1.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_11.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz";
+        sha1 = "90b869934ed6e871115ea2ff58b03f4724ed2d77";
+      };
+    }
+
+    {
+      name = "yargs___yargs_12.0.5.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_12.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz";
+        sha1 = "05f5997b609647b64f66b81e3b4b10a368e7ad13";
+      };
+    }
+
+    {
+      name = "yeast___yeast_0.1.2.tgz";
+      path = fetchurl {
+        name = "yeast___yeast_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    }
+
+    {
+      name = "yn___yn_2.0.0.tgz";
+      path = fetchurl {
+        name = "yn___yn_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz";
+        sha1 = "e5adabc8acf408f6385fc76495684c88e6af689a";
+      };
+    }
+
+    {
+      name = "youtube_dl___youtube_dl_1.12.2.tgz";
+      path = fetchurl {
+        name = "youtube_dl___youtube_dl_1.12.2.tgz";
+        url  = "https://registry.yarnpkg.com/youtube-dl/-/youtube-dl-1.12.2.tgz";
+        sha1 = "11985268564c92b229f62b43d97374f86a605d1d";
+      };
+    }
+
+    {
+      name = "z_schema___z_schema_3.24.2.tgz";
+      path = fetchurl {
+        name = "z_schema___z_schema_3.24.2.tgz";
+        url  = "https://registry.yarnpkg.com/z-schema/-/z-schema-3.24.2.tgz";
+        sha1 = "193560e718812d98fdc190c38871b634b92f2386";
+      };
+    }
+
+    {
+      name = "zero_fill___zero_fill_2.2.3.tgz";
+      path = fetchurl {
+        name = "zero_fill___zero_fill_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/zero-fill/-/zero-fill-2.2.3.tgz";
+        sha1 = "a3def06ba5e39ae644850bb4ca2ad4112b4855e9";
+      };
+    }
+  ];
+}
diff --git a/pkgs/webapps/peertube/yarn_fix_bluebird.patch b/pkgs/webapps/peertube/yarn_fix_bluebird.patch
new file mode 100644 (file)
index 0000000..8ac987d
--- /dev/null
@@ -0,0 +1,53 @@
+--- a/yarn.lock        2019-05-09 11:59:32.199273420 +0200
++++ b/yarn.lock        2019-05-09 12:02:46.270581238 +0200
+@@ -45,11 +45,16 @@
+   dependencies:
+     "@types/node" "*"
+-"@types/bluebird@*", "@types/bluebird@3.5.18", "@types/bluebird@3.5.21":
++"@types/bluebird@*", "@types/bluebird@^3.5.18", "@types/bluebird@3.5.21":
+   version "3.5.21"
+   resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634"
+   integrity sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==
++"@types/bluebird@3.5.18":
++  version "3.5.18"
++  resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6"
++  integrity sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==
++
+ "@types/body-parser@*", "@types/body-parser@^1.16.3":
+   version "1.17.0"
+   resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
+@@ -4334,9 +4339,9 @@
+   resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+   integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+-"jsonld-signatures@https://github.com/Chocobozzz/jsonld-signatures#rsa2017":
+-  version "1.2.2-2"
+-  resolved "https://github.com/Chocobozzz/jsonld-signatures#77660963e722eb4541d2d255f9d9d4216329665f"
++jsonld-signatures@^1.2.2:
++  version "1.2.2"
++  resolved "https://github.com/Chocobozzz/jsonld-signatures/archive/77660963e722eb4541d2d255f9d9d4216329665f.tar.gz"
+   dependencies:
+     bitcore-message "github:CoMakery/bitcore-message#dist"
+     jsonld "^0.5.12"
+@@ -7331,7 +7331,7 @@
+   resolved "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-0.6.6.tgz#926037b542dae9f4eff20609d095cc5e3a3640f3"
+   integrity sha512-WGJTaNuHyYwUM8itxZvMVLeNEb7xSjisbVN1Q5rxLaIf2w67Xaf1GX6Jb+9840bjcNPvMsKgC2aR88zmw7UlcQ==
+   dependencies:
+-    "@types/bluebird" "3.5.18"
++    "@types/bluebird" "^3.5.18"
+     "@types/node" "6.0.41"
+     "@types/sequelize" "4.27.24"
+     es6-shim "0.35.3"
+--- a/package.json     2019-05-09 13:26:34.784870603 +0200
++++ b/package.json     2019-05-09 13:26:52.941348635 +0200
+@@ -124,7 +124,7 @@
+     "iso-639-3": "^1.0.1",
+     "js-yaml": "^3.5.4",
+     "jsonld": "^1.0.1",
+-    "jsonld-signatures": "https://github.com/Chocobozzz/jsonld-signatures#rsa2017",
++    "jsonld-signatures": "^1.2.2",
+     "lodash": "^4.17.10",
+     "magnet-uri": "^5.1.4",
+     "memoizee": "^0.4.14",
diff --git a/pkgs/webapps/peertube/yarn_fix_bluebird_ldap.patch b/pkgs/webapps/peertube/yarn_fix_bluebird_ldap.patch
new file mode 100644 (file)
index 0000000..4e780cf
--- /dev/null
@@ -0,0 +1,53 @@
+--- a/yarn.lock        2019-05-09 11:59:32.199273420 +0200
++++ b/yarn.lock        2019-05-09 12:02:46.270581238 +0200
+@@ -45,11 +45,16 @@
+   dependencies:
+     "@types/node" "*"
+-"@types/bluebird@*", "@types/bluebird@3.5.18", "@types/bluebird@3.5.21":
++"@types/bluebird@*", "@types/bluebird@^3.5.18", "@types/bluebird@3.5.21":
+   version "3.5.21"
+   resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634"
+   integrity sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==
++"@types/bluebird@3.5.18":
++  version "3.5.18"
++  resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6"
++  integrity sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==
++
+ "@types/body-parser@*", "@types/body-parser@^1.16.3":
+   version "1.17.0"
+   resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
+@@ -4384,9 +4389,9 @@
+   resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+   integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+-"jsonld-signatures@https://github.com/Chocobozzz/jsonld-signatures#rsa2017":
+-  version "1.2.2-2"
+-  resolved "https://github.com/Chocobozzz/jsonld-signatures#77660963e722eb4541d2d255f9d9d4216329665f"
++jsonld-signatures@^1.2.2:
++  version "1.2.2"
++  resolved "https://github.com/Chocobozzz/jsonld-signatures/archive/77660963e722eb4541d2d255f9d9d4216329665f.tar.gz"
+   dependencies:
+     bitcore-message "github:CoMakery/bitcore-message#dist"
+     jsonld "^0.5.12"
+@@ -7441,7 +7441,7 @@
+   resolved "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-0.6.6.tgz#926037b542dae9f4eff20609d095cc5e3a3640f3"
+   integrity sha512-WGJTaNuHyYwUM8itxZvMVLeNEb7xSjisbVN1Q5rxLaIf2w67Xaf1GX6Jb+9840bjcNPvMsKgC2aR88zmw7UlcQ==
+   dependencies:
+-    "@types/bluebird" "3.5.18"
++    "@types/bluebird" "^3.5.18"
+     "@types/node" "6.0.41"
+     "@types/sequelize" "4.27.24"
+     es6-shim "0.35.3"
+--- a/package.json     2019-05-09 13:26:34.784870603 +0200
++++ b/package.json     2019-05-09 13:26:52.941348635 +0200
+@@ -124,7 +124,7 @@
+     "iso-639-3": "^1.0.1",
+     "js-yaml": "^3.5.4",
+     "jsonld": "^1.0.1",
+-    "jsonld-signatures": "https://github.com/Chocobozzz/jsonld-signatures#rsa2017",
++    "jsonld-signatures": "^1.2.2",
+     "ldapjs": "^1.0.2",
+     "lodash": "^4.17.10",
+     "magnet-uri": "^5.1.4",
diff --git a/pkgs/webapps/phpldapadmin/default.nix b/pkgs/webapps/phpldapadmin/default.nix
new file mode 100644 (file)
index 0000000..70fd19a
--- /dev/null
@@ -0,0 +1,24 @@
+{ config ? "/etc/phpldapadmin/config.php", fetchurl, stdenv, optipng }:
+stdenv.mkDerivation rec {
+  version = "1.2.3";
+  name = "phpldapadmin-${version}";
+  src = fetchurl {
+    url = "https://downloads.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/${version}/${name}.tgz";
+    sha256 = "0n7dhp2a7n1krmnik3pb969jynsmhghmxviivnckifkprv1zijmf";
+  };
+  patches = [
+    ./ldap-php5_5.patch
+    ./ldap-disable-mcrypt.patch
+    ./ldap-php7_2.patch
+    ./ldap-sort-in-templates.patch
+    ./ldap-align-button.patch
+    ];
+  buildInputs = [ optipng ];
+  buildPhase = ''
+    find -name '*.png' -exec optipng -quiet -force -fix {} \;
+  '';
+  installPhase = ''
+    cp -a . $out
+    ln -sf ${config} $out/config/config.php
+  '';
+}
diff --git a/pkgs/webapps/phpldapadmin/ldap-align-button.patch b/pkgs/webapps/phpldapadmin/ldap-align-button.patch
new file mode 100644 (file)
index 0000000..d9a5504
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/htdocs/update_confirm.php        2012-10-01 08:54:14.000000000 +0200
++++ b/htdocs/update_confirm.php        2018-06-06 15:47:44.122398888 +0200
+@@ -187,7 +187,7 @@
+       echo '</table>';
+-      echo '<div style="text-align: center;">';
++      echo '<div style="text-align: left;">';
+       echo '<br />';
+       // @todo cant use AJAX here, it affects file uploads.
+       printf('<input type="submit" value="%s" />',
diff --git a/pkgs/webapps/phpldapadmin/ldap-disable-mcrypt.patch b/pkgs/webapps/phpldapadmin/ldap-disable-mcrypt.patch
new file mode 100644 (file)
index 0000000..8bc4e7b
--- /dev/null
@@ -0,0 +1,36 @@
+diff -wbBur phpldapadmin-1.2.3/lib/functions.php phpldapadmin-1.2.3.my/lib/functions.php
+--- phpldapadmin-1.2.3/lib/functions.php       2012-10-01 10:54:14.000000000 +0400
++++ phpldapadmin-1.2.3.my/lib/functions.php    2017-02-02 20:02:14.424245233 +0300
+@@ -745,6 +745,7 @@
+       if (! trim($secret))
+               return $data;
++/*
+       if (function_exists('mcrypt_module_open') && ! empty($data)) {
+               $td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_ECB,'');
+               $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_DEV_URANDOM);
+@@ -754,7 +755,7 @@
+               return $encrypted_data;
+       }
+-
++*/
+       if (file_exists(LIBDIR.'blowfish.php'))
+               require_once LIBDIR.'blowfish.php';
+       else
+@@ -801,6 +802,7 @@
+       if (! trim($secret))
+               return $encdata;
++/*
+       if (function_exists('mcrypt_module_open') && ! empty($encdata)) {
+               $td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_ECB,'');
+               $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_DEV_URANDOM);
+@@ -810,6 +812,7 @@
+               return $decrypted_data;
+       }
++*/
+       if (file_exists(LIBDIR.'blowfish.php'))
+               require_once LIBDIR.'blowfish.php';
diff --git a/pkgs/webapps/phpldapadmin/ldap-php5_5.patch b/pkgs/webapps/phpldapadmin/ldap-php5_5.patch
new file mode 100644 (file)
index 0000000..8545ad2
--- /dev/null
@@ -0,0 +1,88 @@
+diff -Nrbu phpldapadmin-1.2.3/lib/PageRender.php phpldapadmin-1.2.3-OK/lib/PageRender.php
+--- phpldapadmin-1.2.3/lib/PageRender.php      2012-10-01 10:54:14.000000000 +0400
++++ phpldapadmin-1.2.3-OK/lib/PageRender.php   2013-11-12 03:44:40.518144839 +0400
+@@ -287,7 +287,7 @@
+                                               break;
+                                       default:
+-                                              $vals[$i] = password_hash($passwordvalue,$enc);
++                                              $vals[$i] = pla_password_hash($passwordvalue,$enc);
+                               }
+                               $vals = array_unique($vals);
+diff -Nrbu phpldapadmin-1.2.3/lib/ds_ldap.php phpldapadmin-1.2.3-OK/lib/ds_ldap.php
+--- phpldapadmin-1.2.3/lib/ds_ldap.php 2012-10-01 10:54:14.000000000 +0400
++++ phpldapadmin-1.2.3-OK/lib/ds_ldap.php      2013-11-12 03:40:56.638343739 +0400
+@@ -1117,12 +1117,14 @@
+               if (is_array($dn)) {
+                       $a = array();
+                       foreach ($dn as $key => $rdn)
+-                              $a[$key] = preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$rdn);
++                              $a[$key] = preg_replace_callback('/\\\([0-9A-Fa-f]{2})/',
++                                      function ($matches) { return chr(hexdec($matches[1])); }, $rdn);
+                       return $a;
+               } else
+-                      return preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$dn);
++                      return preg_replace_callback('/\\\([0-9A-Fa-f]{2})/',
++                                      function ($matches) { return chr(hexdec($matches[1])); }, $dn);
+       }
+       public function getRootDSE($method=null) {
+diff -Nrbu phpldapadmin-1.2.3/lib/functions.php phpldapadmin-1.2.3-OK/lib/functions.php
+--- phpldapadmin-1.2.3/lib/functions.php       2012-10-01 10:54:14.000000000 +0400
++++ phpldapadmin-1.2.3-OK/lib/functions.php    2013-11-12 03:44:17.298065264 +0400
+@@ -2127,7 +2127,7 @@
+  *        crypt, ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, sha512, or clear.
+  * @return string The hashed password.
+  */
+-function password_hash($password_clear,$enc_type) {
++function pla_password_hash($password_clear,$enc_type) {
+       if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+               debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
+@@ -2318,7 +2318,7 @@
+               # SHA crypted passwords
+               case 'sha':
+-                      if (strcasecmp(password_hash($plainpassword,'sha'),'{SHA}'.$cryptedpassword) == 0)
++                      if (strcasecmp(pla_password_hash($plainpassword,'sha'),'{SHA}'.$cryptedpassword) == 0)
+                               return true;
+                       else
+                               return false;
+@@ -2327,7 +2327,7 @@
+               # MD5 crypted passwords
+               case 'md5':
+-                      if( strcasecmp(password_hash($plainpassword,'md5'),'{MD5}'.$cryptedpassword) == 0)
++                      if( strcasecmp(pla_password_hash($plainpassword,'md5'),'{MD5}'.$cryptedpassword) == 0)
+                               return true;
+                       else
+                               return false;
+@@ -2392,7 +2392,7 @@
+               # SHA512 crypted passwords
+               case 'sha512':
+-                      if (strcasecmp(password_hash($plainpassword,'sha512'),'{SHA512}'.$cryptedpassword) == 0)
++                      if (strcasecmp(pla_password_hash($plainpassword,'sha512'),'{SHA512}'.$cryptedpassword) == 0)
+                               return true;
+                       else
+                               return false;
+@@ -2565,12 +2565,14 @@
+               $a = array();
+               foreach ($dn as $key => $rdn)
+-                      $a[$key] = preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$rdn);
++                      $a[$key] = preg_replace_callback('/\\\([0-9A-Fa-f]{2})/', 
++                              function ($matches) { return chr(hexdec($matches[1])); }, $rdn );
+               return $a;
+       } else {
+-              return preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$dn);
++              return preg_replace_callback('/\\\([0-9A-Fa-f]{2})/',
++                              function ($matches) { return chr(hexdec($matches[1])); }, $dn);
+       }
+ }
diff --git a/pkgs/webapps/phpldapadmin/ldap-php7_2.patch b/pkgs/webapps/phpldapadmin/ldap-php7_2.patch
new file mode 100644 (file)
index 0000000..40ee055
--- /dev/null
@@ -0,0 +1,30 @@
+diff -wbBur phpldapadmin.org/lib/functions.php phpldapadmin/lib/functions.php
+--- phpldapadmin.org/lib/functions.php 2017-02-02 10:03:58.000000000 -0700
++++ phpldapadmin/lib/functions.php     2018-01-23 06:18:31.118312887 -0700
+@@ -51,7 +51,7 @@
+ /**
+  * Loads class definition
+  */
+-function __autoload($className) {
++spl_autoload_register(function($className) {
+       if (file_exists(HOOKSDIR."classes/$className.php"))
+               require_once(HOOKSDIR."classes/$className.php");
+       elseif (file_exists(LIBDIR."$className.php"))
+@@ -64,7 +64,7 @@
+                       'body'=>sprintf('%s: %s [%s]',
+                               __METHOD__,_('Called to load a class that cant be found'),$className),
+                       'type'=>'error'));
+-}
++});
+ /**
+  * Strips all slashes from the specified array in place (pass by ref).
+@@ -1083,7 +1083,7 @@
+               $code .= 'return $c;';
+-              $CACHE[$sortby] = create_function('$a, $b',$code);
++              eval("\$CACHE[\$sortby] = function(\$a, \$b) { $code; };");
+       }
+       uasort($data,$CACHE[$sortby]);
diff --git a/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch b/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch
new file mode 100644 (file)
index 0000000..55a1974
--- /dev/null
@@ -0,0 +1,12 @@
+diff -wbBur phpldapadmin-1.2.3.org/lib/TemplateRender.php phpldapadmin-1.2.3/lib/TemplateRender.php
+--- phpldapadmin-1.2.3.org/lib/TemplateRender.php      2012-10-01 10:54:14.000000000 +0400
++++ phpldapadmin-1.2.3/lib/TemplateRender.php  2018-02-02 19:06:45.674760057 +0300
+@@ -321,6 +321,8 @@
+                               $vals = array();
++                              asort($picklistvalues);
++
+                               foreach ($picklistvalues as $key => $values) {
+                                       $display = $args[3];
diff --git a/pkgs/webapps/rompr/default.nix b/pkgs/webapps/rompr/default.nix
new file mode 100644 (file)
index 0000000..2accf00
--- /dev/null
@@ -0,0 +1,8 @@
+{ varDir ? "/var/lib/rompr", stdenv, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./rompr.json // {
+  installPhase = ''
+        cp -a . $out
+        ln -sf ${varDir}/prefs $out/prefs
+        ln -sf ${varDir}/albumart $out/albumart
+  '';
+})
diff --git a/pkgs/webapps/rompr/rompr.json b/pkgs/webapps/rompr/rompr.json
new file mode 100644 (file)
index 0000000..778d915
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "1.24",
+  "meta": {
+    "name": "rompr",
+    "url": "https://github.com/fatg3erman/RompR",
+    "branch": "refs/tags/1.24"
+  },
+  "github": {
+    "owner": "fatg3erman",
+    "repo": "RompR",
+    "rev": "0d8f597027ac71b320963fe3f33f461a136312ad",
+    "sha256": "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/roundcubemail/default.nix b/pkgs/webapps/roundcubemail/default.nix
new file mode 100644 (file)
index 0000000..ba85f37
--- /dev/null
@@ -0,0 +1,61 @@
+{ varDir ? "/var/lib/roundcubemail"
+, roundcube_config ? "/etc/roundcube/config.php"
+, stdenv, fetchurl }:
+let
+  defaultInstall = ''
+    mkdir -p $out
+    cp -R . $out/
+    cd $out
+    if [ -d skins -a -d skins/larry -a ! -d skins/elastic ]; then
+      ln -s larry skins/elastic
+    fi
+    '';
+  buildPlugin = { appName, version, url, sha256, installPhase ? defaultInstall }:
+    stdenv.mkDerivation rec {
+      name = "roundcube-${appName}-${version}";
+      inherit version;
+      phases = "unpackPhase installPhase";
+      inherit installPhase;
+      src = fetchurl { inherit url sha256; };
+      passthru.pluginName = appName;
+    };
+  withPlugins = plugins: skins: package.overrideAttrs(old: {
+    name = "${old.name}${if builtins.length skins > 0 then "-with-skins" else ""}${if builtins.length plugins > 0 then "-with-plugins" else ""}";
+    installPhase = old.installPhase +
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -s ${value} $out/plugins/${value.pluginName}") plugins
+      ) +
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -s ${value} $out/skins/${value.skinName}") skins
+      );
+    passthru = old.passthru // {
+      inherit plugins skins;
+      withPlugins = morePlugins: moreSkins: old.withPlugins (morePlugins ++ plugins) (morePlugins ++ skins);
+    };
+  });
+  package = stdenv.mkDerivation rec {
+    version = "1.4-rc1";
+    name = "roundcubemail-${version}";
+    src= fetchurl {
+      url = "https://github.com/roundcube/roundcubemail/releases/download/${version}/${name}-complete.tar.gz";
+      sha256 = "0p18wffwi2prh6vxhx1bc69qd1vwybggm8gvg3shahfdknxci9i4";
+    };
+    buildPhase = ''
+      sed -i \
+        -e "s|RCUBE_INSTALL_PATH . 'temp.*|'${varDir}/cache';|" \
+        config/defaults.inc.php
+      sed -i \
+        -e "s|RCUBE_INSTALL_PATH . 'logs.*|'${varDir}/logs';|" \
+        config/defaults.inc.php
+    '';
+    installPhase = ''
+      cp -a . $out
+      ln -s ${roundcube_config} $out/config/config.inc.php
+    '';
+    passthru = {
+      plugins = [];
+      skins = [];
+      inherit withPlugins buildPlugin;
+    };
+  };
+in package
diff --git a/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix b/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix
new file mode 100644 (file)
index 0000000..cd9efee
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "automatic_addressbook";
+  version = "0.4.3";
+  url = "https://github.com/sblaisot/${appName}/archive/${version}.tar.gz";
+  sha256 = "0bx5qjzp3a3wc72fr295bvgsy5n15949c041hq76n6c7sqdn7inc";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/carddav/default.nix b/pkgs/webapps/roundcubemail/plugins/carddav/default.nix
new file mode 100644 (file)
index 0000000..ad6856b
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "carddav";
+  version = "3.0.3";
+  url = "https://github.com/blind-coder/rcmcarddav/releases/download/v${version}/${appName}-${version}.tar.bz2";
+  sha256 = "0cf5rnqkhhag2vdy808zfpr4l5586fn43nvcia8ac1ha58azrxal";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix b/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix
new file mode 100644 (file)
index 0000000..c970007
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "contextmenu";
+  version = "2.3";
+  url = "https://github.com/johndoh/roundcube-${appName}/archive/${version}.tar.gz";
+  sha256 = "1rb8n821ylfniiiccfskc534vd6rczhk3g82455ks3m09q6l8hif";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix b/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix
new file mode 100644 (file)
index 0000000..e5cb46d
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "contextmenu_folder";
+  version = "1.3.3";
+  url = "https://github.com/random-cuber/${appName}/archive/${version}.tar.gz";
+  sha256 = "1ngfws1v8qrpa52rjh7kirc98alchk2vbqwra86h00agyjjlcc57";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix b/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix
new file mode 100644 (file)
index 0000000..35bff06
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "html5_notifier";
+  version = "v0.6.2";
+  url = "https://github.com/stremlau/${appName}/archive/${version}.tar.gz";
+  sha256 = "0s1wq9ira4bcd8jvhn93nhxiqzpp92i0za2kw37kf7ksyhr0xslq";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix b/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix
new file mode 100644 (file)
index 0000000..1dfc402
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "ident_switch";
+  version = "4.0.1";
+  url = "https://bitbucket.org/BoresExpress/${appName}/get/${version}.tar.gz";
+  sha256 = "1zyy40lfq2kn7hkghbl8lgp18fb634zr4fxmmxvb1wqyvqdpdpyk";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix b/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix
new file mode 100644 (file)
index 0000000..dc7138a
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "message_highlight";
+  version = "4.4";
+  url = "https://github.com/corbosman/${appName}/archive/${version}.tar.gz";
+  sha256 = "12c4x47y70xdl5pgm8csh5i4yiyhpi232lvjbixmca6di4lkhh9j";
+}
diff --git a/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix b/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix
new file mode 100644 (file)
index 0000000..ca7245f
--- /dev/null
@@ -0,0 +1,7 @@
+{ buildPlugin }:
+buildPlugin rec {
+  appName = "thunderbird_labels";
+  version = "v1.3.2";
+  url = "https://github.com/mike-kfed/roundcube-${appName}/archive/${version}.tar.gz";
+  sha256 = "1q4x30w66m02v3lw2n8020g0158rmyfzs6gydfk89pa1hs28k9bg";
+}
diff --git a/pkgs/webapps/spip/default.nix b/pkgs/webapps/spip/default.nix
new file mode 100644 (file)
index 0000000..8099f53
--- /dev/null
@@ -0,0 +1,32 @@
+{ siteName ? "spip"
+, siteDir ? runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out"
+, environment ? "prod"
+, ldap ? false
+, varDir ? "/var/lib/${siteName}_${environment}"
+, lib, fetchzip, runCommand, stdenv }:
+let
+  app = stdenv.mkDerivation rec {
+    name = "${siteName}-${environment}-spip-${version}";
+    version = "3.2.3";
+    src = fetchzip {
+      url = "https://files.spip.net/spip/archives/SPIP-v${version}.zip";
+      sha256 = "1r1mjvsnrp6mvkgjakvi3x4ms8m8k5mp93micbbg8r99fj7qlfkq";
+    };
+    paches = lib.optionals ldap [ ./spip_ldap_patch.patch ];
+    buildPhase = ''
+      rm -rf IMG local tmp config/remove.txt
+      ln -sf ${./spip_mes_options.php} config/mes_options.php
+      echo "Require all denied" > "config/.htaccess"
+      ln -sf ${varDir}/{IMG,local} .
+    '';
+    installPhase = ''
+      cp -a . $out
+      cp -a ${siteDir}/* $out
+    '';
+    passthru = {
+      inherit siteName siteDir environment varDir;
+      webRoot = app;
+      spipConfig = ./spip_mes_options.php;
+    };
+  };
+in app
diff --git a/pkgs/webapps/spip/spip_ldap_patch.patch b/pkgs/webapps/spip/spip_ldap_patch.patch
new file mode 100644 (file)
index 0000000..653c909
--- /dev/null
@@ -0,0 +1,60 @@
+--- old/ecrire/auth/ldap.php   2017-06-08 21:58:17.000000000 +0200
++++ new/ecrire/auth/ldap.php   2017-06-10 02:54:02.687954143 +0200
+@@ -171,24 +171,41 @@
+       $desc = isset($ldap['attributes']) && $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ;
+       $logins = is_array($desc['login']) ? $desc['login'] : array($desc['login']);
++        if (isset($GLOBALS['ldap_search'])) {
++          $search_query = str_replace("%user%", $login_search, $GLOBALS['ldap_search']);
++          $result = @ldap_search($ldap_link, $ldap_base, $search_query, array("dn"));
++          $info = @ldap_get_entries($ldap_link, $result);
++          // Ne pas accepter les resultats si plus d'une entree
++          // (on veut un attribut unique)
+-      // Tenter une recherche pour essayer de retrouver le DN
+-      foreach ($logins as $att) {
+-              $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", array("dn"));
+-              $info = @ldap_get_entries($ldap_link, $result);
+-              // Ne pas accepter les resultats si plus d'une entree
+-              // (on veut un attribut unique)
++          if (is_array($info) and $info['count'] == 1) {
++            $dn = $info[0]['dn'];
++            if (!$checkpass) {
++              return $dn;
++            }
++            if (@ldap_bind($ldap_link, $dn, $pass)) {
++              return $dn;
++            }
++          }
++        } else {
++          // Tenter une recherche pour essayer de retrouver le DN
++          foreach ($logins as $att) {
++                  $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", array("dn"));
++                  $info = @ldap_get_entries($ldap_link, $result);
++                  // Ne pas accepter les resultats si plus d'une entree
++                  // (on veut un attribut unique)
+-              if (is_array($info) and $info['count'] == 1) {
+-                      $dn = $info[0]['dn'];
+-                      if (!$checkpass) {
+-                              return $dn;
+-                      }
+-                      if (@ldap_bind($ldap_link, $dn, $pass)) {
+-                              return $dn;
+-                      }
+-              }
+-      }
++                  if (is_array($info) and $info['count'] == 1) {
++                          $dn = $info[0]['dn'];
++                          if (!$checkpass) {
++                                  return $dn;
++                          }
++                          if (@ldap_bind($ldap_link, $dn, $pass)) {
++                                  return $dn;
++                          }
++                  }
++          }
++        }
+       if ($checkpass and !isset($dn)) {
+               // Si echec, essayer de deviner le DN
diff --git a/pkgs/webapps/spip/spip_mes_options.php b/pkgs/webapps/spip/spip_mes_options.php
new file mode 100644 (file)
index 0000000..8db8389
--- /dev/null
@@ -0,0 +1,18 @@
+<?php // /!\ Important: There must be no blank space before &lt;?php or after ?&gt;
+// This file was inspired from the spip contrib website
+// http://www.spip.net/fr_article3811.html
+
+$config_dir = getenv('SPIP_CONFIG_DIR') . '/';
+$var_dir = getenv('SPIP_VAR_DIR') . '/';
+
+$cookie_prefix = str_replace('.', '_', getenv("SPIP_SITE"));
+$table_prefix = 'spip';
+
+spip_initialisation(
+        $config_dir,
+        _DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES,
+        $var_dir . _NOM_TEMPORAIRES_INACCESSIBLES,
+        _DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES
+);
+
+?>
diff --git a/pkgs/webapps/taskwarrior-web/Gemfile.lock b/pkgs/webapps/taskwarrior-web/Gemfile.lock
new file mode 100644 (file)
index 0000000..1b2f5ba
--- /dev/null
@@ -0,0 +1,139 @@
+PATH
+  remote: .
+  specs:
+    taskwarrior-web (1.1.12)
+      activesupport (~> 3)
+      json (~> 1.8)
+      parseconfig
+      rack-flash3
+      rinku
+      sinatra
+      sinatra-simple-navigation
+      vegas
+      versionomy
+
+GEM
+  remote: http://rubygems.org/
+  specs:
+    activesupport (3.2.22.5)
+      i18n (~> 0.6, >= 0.6.4)
+      multi_json (~> 1.0)
+    blockenspiel (0.5.0)
+    coderay (1.1.2)
+    concurrent-ruby (1.1.4)
+    daemons (1.3.1)
+    diff-lcs (1.3)
+    docile (1.3.1)
+    eventmachine (1.2.7)
+    ffi (1.10.0)
+    formatador (0.2.5)
+    growl (1.0.3)
+    guard (2.15.0)
+      formatador (>= 0.2.4)
+      listen (>= 2.7, < 4.0)
+      lumberjack (>= 1.0.12, < 2.0)
+      nenv (~> 0.1)
+      notiffany (~> 0.0)
+      pry (>= 0.9.12)
+      shellany (~> 0.0)
+      thor (>= 0.18.1)
+    guard-bundler (2.2.1)
+      bundler (>= 1.3.0, < 3)
+      guard (~> 2.2)
+      guard-compat (~> 1.1)
+    guard-compat (1.2.1)
+    guard-rspec (4.7.3)
+      guard (~> 2.1)
+      guard-compat (~> 1.1)
+      rspec (>= 2.99.0, < 4.0)
+    i18n (0.9.5)
+      concurrent-ruby (~> 1.0)
+    json (1.8.6)
+    listen (3.1.5)
+      rb-fsevent (~> 0.9, >= 0.9.4)
+      rb-inotify (~> 0.9, >= 0.9.7)
+      ruby_dep (~> 1.2)
+    lumberjack (1.0.13)
+    method_source (0.9.2)
+    mini_portile2 (2.4.0)
+    multi_json (1.13.1)
+    mustermann (1.0.3)
+    nenv (0.3.0)
+    nokogiri (1.10.1)
+      mini_portile2 (~> 2.4.0)
+    notiffany (0.1.1)
+      nenv (~> 0.1)
+      shellany (~> 0.0)
+    parseconfig (1.0.8)
+    pry (0.12.2)
+      coderay (~> 1.1.0)
+      method_source (~> 0.9.0)
+    rack (2.0.6)
+    rack-flash3 (1.0.5)
+      rack
+    rack-protection (2.0.5)
+      rack
+    rack-test (1.1.0)
+      rack (>= 1.0, < 3)
+    rake (10.5.0)
+    rb-fsevent (0.10.3)
+    rb-inotify (0.10.0)
+      ffi (~> 1.0)
+    rinku (2.0.5)
+    rspec (2.99.0)
+      rspec-core (~> 2.99.0)
+      rspec-expectations (~> 2.99.0)
+      rspec-mocks (~> 2.99.0)
+    rspec-core (2.99.2)
+    rspec-expectations (2.99.2)
+      diff-lcs (>= 1.1.3, < 2.0)
+    rspec-html-matchers (0.5.0)
+      nokogiri (~> 1)
+      rspec (~> 2, >= 2.11.0)
+    rspec-mocks (2.99.4)
+    ruby_dep (1.5.0)
+    shellany (0.0.1)
+    simple-navigation (4.0.5)
+      activesupport (>= 2.3.2)
+    simplecov (0.16.1)
+      docile (~> 1.1)
+      json (>= 1.8, < 3)
+      simplecov-html (~> 0.10.0)
+    simplecov-html (0.10.2)
+    sinatra (2.0.5)
+      mustermann (~> 1.0)
+      rack (~> 2.0)
+      rack-protection (= 2.0.5)
+      tilt (~> 2.0)
+    sinatra-simple-navigation (4.1.0)
+      simple-navigation (~> 4.0)
+      sinatra (>= 1.0, < 3.0)
+    thin (1.7.2)
+      daemons (~> 1.0, >= 1.0.9)
+      eventmachine (~> 1.0, >= 1.0.4)
+      rack (>= 1, < 3)
+    thor (0.20.3)
+    tilt (2.0.9)
+    vegas (0.1.11)
+      rack (>= 1.0.0)
+    versionomy (0.5.0)
+      blockenspiel (~> 0.5)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  growl
+  guard-bundler
+  guard-rspec
+  rack-test
+  rake (< 11)
+  rb-fsevent
+  rspec (~> 2)
+  rspec-html-matchers
+  simplecov
+  taskwarrior-web!
+  thin
+
+BUNDLED WITH
+   1.16.2
diff --git a/pkgs/webapps/taskwarrior-web/default.nix b/pkgs/webapps/taskwarrior-web/default.nix
new file mode 100644 (file)
index 0000000..d5368c5
--- /dev/null
@@ -0,0 +1,22 @@
+{ ruby_2_6, bundlerEnv, mylibs, stdenv }:
+let
+  gems = bundlerEnv {
+    name = "taskwarrior-web-env";
+    ruby = ruby_2_6;
+    pname = "taskwarrior-web";
+    gemset = ./gemset.nix;
+    gemdir = package.out;
+    groups = [ "default" "local" "development" ];
+  };
+  package = stdenv.mkDerivation (mylibs.fetchedGithub ./taskwarrior-web.json // rec {
+    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+    patches = [ ./fixes.patch ./thin.patch ];
+    installPhase = ''
+      cp -a . $out
+      cp ${./Gemfile.lock} $out/Gemfile.lock
+      '';
+    passthru = {
+      inherit gems;
+    };
+  });
+in package
diff --git a/pkgs/webapps/taskwarrior-web/fixes.patch b/pkgs/webapps/taskwarrior-web/fixes.patch
new file mode 100644 (file)
index 0000000..851f9f0
--- /dev/null
@@ -0,0 +1,56 @@
+diff --git a/lib/taskwarrior-web/helpers.rb b/lib/taskwarrior-web/helpers.rb
+index 212aed7..94c57df 100644
+--- a/lib/taskwarrior-web/helpers.rb
++++ b/lib/taskwarrior-web/helpers.rb
+@@ -1,6 +1,8 @@
+ require 'active_support/core_ext/date/calculations'
+ module TaskwarriorWeb::App::Helpers
++  include ERB::Util
++
+   def format_date(timestamp)
+     format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y'
+     Time.parse(timestamp).localtime.strftime(format)
+diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb
+index 58d246e..8f716ac 100644
+--- a/lib/taskwarrior-web/services/builder/base.rb
++++ b/lib/taskwarrior-web/services/builder/base.rb
+@@ -10,7 +10,7 @@ module TaskwarriorWeb::CommandBuilder::Base
+     :complete => ':id done',
+     :annotate => ':id annotate',
+     :denotate => ':id denotate',
+-    :projects => '_projects',
++    :projects => '_unique project',
+     :tags => '_tags',
+     :sync => 'sync'
+   }
+diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
+index 789e7a1..fa08698 100644
+--- a/lib/taskwarrior-web/views/tasks/_form.erb
++++ b/lib/taskwarrior-web/views/tasks/_form.erb
+@@ -1,14 +1,14 @@
+ <div class="control-group">
+   <label for="task-description" class="control-label">Description</label>
+   <div class="controls">
+-    <input type="text" required="required" id="task-description" name="task[description]" value="<%= @task.description unless @task.nil? %>" />
++    <input type="text" required="required" id="task-description" name="task[description]" value="<%=h @task.description unless @task.nil? %>" />
+   </div>
+ </div>
+ <div class="control-group">
+   <label for="task-project" class="control-label">Project</label>
+   <div class="controls">
+-    <input type="text" id="task-project" name="task[project]" value="<%= @task.project unless @task.nil? %>" autocomplete="off" />
++    <input type="text" id="task-project" name="task[project]" value="<%=h @task.project unless @task.nil? %>" autocomplete="off" />
+   </div>
+ </div>
+@@ -45,7 +45,7 @@
+ <div class="control-group">
+   <label for="task-tags" class="control-label">Tags</label>
+   <div class="controls">
+-    <input type="text" id="task-tags" name="task[tags]" value="<%= @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
++    <input type="text" id="task-tags" name="task[tags]" value="<%=h @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
+     <span class="help-block">Enter tags separated by commas or spaces (e.g. <em>each, word will,be a tag</em>)</span>
+   </div>
+ </div>
diff --git a/pkgs/webapps/taskwarrior-web/gemset.nix b/pkgs/webapps/taskwarrior-web/gemset.nix
new file mode 100644 (file)
index 0000000..35d13c6
--- /dev/null
@@ -0,0 +1,567 @@
+{
+  activesupport = {
+    dependencies = ["i18n" "multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0fyxqkkws4px4lzkbcqzp0bwai7nn7jk4p0bgfy0dny9cwm0qc9r";
+      type = "gem";
+    };
+    version = "3.2.22.5";
+  };
+  blockenspiel = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1h701s45n5qprvcpc7fnr45n88p56x07pznkxqnhz1dbdbhb7xx8";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  coderay = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "15vav4bhcc2x3jmi3izb11l4d9f3xv8hp2fszb7iqmpsccv1pz4y";
+      type = "gem";
+    };
+    version = "1.1.2";
+  };
+  concurrent-ruby = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1ixcx9pfissxrga53jbdpza85qd5f6b5nq1sfqa9rnfq82qnlbp1";
+      type = "gem";
+    };
+    version = "1.1.4";
+  };
+  daemons = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0l5gai3vd4g7aqff0k1mp41j9zcsvm2rbwmqn115a325k9r7pf4w";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  diff-lcs = {
+    groups = ["default" "development" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "18w22bjz424gzafv6nzv98h0aqkwz3d9xhm7cbr1wfbyas8zayza";
+      type = "gem";
+    };
+    version = "1.3";
+  };
+  docile = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "04d2izkna3ahfn6fwq4xrcafa715d3bbqczxm16fq40fqy87xn17";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  eventmachine = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0wh9aqb0skz80fhfn66lbpr4f86ya2z5rx6gm5xlfhd05bj1ch4r";
+      type = "gem";
+    };
+    version = "1.2.7";
+  };
+  ffi = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0j8pzj8raxbir5w5k6s7a042sb5k02pg0f8s4na1r5lan901j00p";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  formatador = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  growl = {
+    groups = ["local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0s0y7maljnalpbv2q1j5j5hvb4wcc31y9af0n7x1q2l0fzxgc9n9";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  guard = {
+    dependencies = ["formatador" "listen" "lumberjack" "nenv" "notiffany" "pry" "shellany" "thor"];
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0h84ja6qvii3hx86w9l4vjpbgl4m8ma8fbawwp7s8l791cgkdcmk";
+      type = "gem";
+    };
+    version = "2.15.0";
+  };
+  guard-bundler = {
+    dependencies = ["guard" "guard-compat"];
+    groups = ["local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0lji8f8w7y4prmpr2lqmlljvkqgkgnlsiwqgwvq7b1y3sxlsvy62";
+      type = "gem";
+    };
+    version = "2.2.1";
+  };
+  guard-compat = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1zj6sr1k8w59mmi27rsii0v8xyy2rnsi09nqvwpgj1q10yq1mlis";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  guard-rspec = {
+    dependencies = ["guard" "guard-compat" "rspec"];
+    groups = ["local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1jkm5xp90gm4c5s51pmf92i9hc10gslwwic6mvk72g0yplya0yx4";
+      type = "gem";
+    };
+    version = "4.7.3";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "038qvz7kd3cfxk8bvagqhakx68pfbnmghpdkx7573wbf0maqp9a3";
+      type = "gem";
+    };
+    version = "0.9.5";
+  };
+  json = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0qmj7fypgb9vag723w1a49qihxrcf5shzars106ynw2zk352gbv5";
+      type = "gem";
+    };
+    version = "1.8.6";
+  };
+  listen = {
+    dependencies = ["rb-fsevent" "rb-inotify" "ruby_dep"];
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "01v5mrnfqm6sgm8xn2v5swxsn1wlmq7rzh2i48d4jzjsc7qvb6mx";
+      type = "gem";
+    };
+    version = "3.1.5";
+  };
+  lumberjack = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "06im7gcg42x77yhz2w5da2ly9xz0n0c36y5ks7xs53v0l9g0vf5n";
+      type = "gem";
+    };
+    version = "1.0.13";
+  };
+  method_source = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1pviwzvdqd90gn6y7illcdd9adapw8fczml933p5vl739dkvl3lq";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+  mini_portile2 = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  multi_json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1rl0qy4inf1mp8mybfk56dfga0mvx97zwpmq5xmiwl5r770171nv";
+      type = "gem";
+    };
+    version = "1.13.1";
+  };
+  mustermann = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0lycgkmnyy0bf29nnd2zql5a6pcf8sp69g9v4xw0gcfcxgpwp7i1";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  nenv = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0r97jzknll9bhd8yyg2bngnnkj8rjhal667n7d32h8h7ny7nvpnr";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "09zll7c6j7xr6wyvh5mm5ncj6pkryp70ybcsxdbw1nyphx5dh184";
+      type = "gem";
+    };
+    version = "1.10.1";
+  };
+  notiffany = {
+    dependencies = ["nenv" "shellany"];
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0x838fa5il0dd9zbm3lxkpbfxcf5fxv9556mayc2mxsdl5ghv8nx";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  parseconfig = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0br2g9k6zc4ygah52aa8cwvpnnkszia29bnvnr8bhpk3rdzi2vmq";
+      type = "gem";
+    };
+    version = "1.0.8";
+  };
+  pry = {
+    dependencies = ["coderay" "method_source"];
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "00rm71x0r1jdycwbs83lf9l6p494m99asakbvqxh8rz7zwnlzg69";
+      type = "gem";
+    };
+    version = "0.12.2";
+  };
+  rack = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1pcgv8dv4vkaczzlix8q3j68capwhk420cddzijwqgi2qb4lm1zm";
+      type = "gem";
+    };
+    version = "2.0.6";
+  };
+  rack-flash3 = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0rim9afrns6s8zc4apiymncysyvijpdg18k57kdpz66p55jf4mqz";
+      type = "gem";
+    };
+    version = "1.0.5";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "15167q25rmxipqwi6hjqj3i1byi9iwl3xq9b7mdar7qiz39pmjsk";
+      type = "gem";
+    };
+    version = "2.0.5";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  rake = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0jcabbgnjc788chx31sihc5pgbqnlc1c75wakmqlbjdm8jns2m9b";
+      type = "gem";
+    };
+    version = "10.5.0";
+  };
+  rb-fsevent = {
+    groups = ["local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1lm1k7wpz69jx7jrc92w3ggczkjyjbfziq5mg62vjnxmzs383xx8";
+      type = "gem";
+    };
+    version = "0.10.3";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1fs7hxm9g6ywv2yih83b879klhc4fs8i0p9166z795qmd77dk0a4";
+      type = "gem";
+    };
+    version = "0.10.0";
+  };
+  rinku = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1smkk299v18brk98gqbdnqrfwm3143kikl30scidqb5j3pzlbz91";
+      type = "gem";
+    };
+    version = "2.0.5";
+  };
+  rspec = {
+    dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
+    groups = ["development" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "14q3hxvngk4ks8h41yw50d5fqbf2dhzwi9rz5ccxvh5a53ak2as3";
+      type = "gem";
+    };
+    version = "2.99.0";
+  };
+  rspec-core = {
+    groups = ["default" "development" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1wwz21lcz2lwd2jcp2pvq7n1677v23acf7wxsyszp8msb47mw38i";
+      type = "gem";
+    };
+    version = "2.99.2";
+  };
+  rspec-expectations = {
+    dependencies = ["diff-lcs"];
+    groups = ["default" "development" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "11a5pph3anp4xr591dnlcy8xfkdf54qi2lvg4ykpqhxk37si1py3";
+      type = "gem";
+    };
+    version = "2.99.2";
+  };
+  rspec-html-matchers = {
+    dependencies = ["nokogiri" "rspec"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "148grzvk0cvh24avhl0shjzz7ldhj138svf48pc5h1fdsb0pnqcv";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  rspec-mocks = {
+    groups = ["default" "development" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0bzhqahbiswq41nqi6y2dka1k42n0hl14jb6bldb206zp4hikz8r";
+      type = "gem";
+    };
+    version = "2.99.4";
+  };
+  ruby_dep = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1c1bkl97i9mkcvkn1jks346ksnvnnp84cs22gwl0vd7radybrgy5";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  shellany = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1ryyzrj1kxmnpdzhlv4ys3dnl2r5r3d2rs2jwzbnd1v96a8pl4hf";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  simple-navigation = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "08a2s18an3br3xj5j86r33q0hrkai0y157xg67h1khdskb08yylk";
+      type = "gem";
+    };
+    version = "4.0.5";
+  };
+  simplecov = {
+    dependencies = ["docile" "json" "simplecov-html"];
+    groups = ["local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1sfyfgf7zrp2n42v7rswkqgk3bbwk1bnsphm24y7laxv3f8z0947";
+      type = "gem";
+    };
+    version = "0.16.1";
+  };
+  simplecov-html = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1lihraa4rgxk8wbfl77fy9sf0ypk31iivly8vl3w04srd7i0clzn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  sinatra = {
+    dependencies = ["mustermann" "rack" "rack-protection" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1gasgn5f15myv08k10i16p326pchxjsy37pgqfw0xm66kcc5d7ry";
+      type = "gem";
+    };
+    version = "2.0.5";
+  };
+  sinatra-simple-navigation = {
+    dependencies = ["simple-navigation" "sinatra"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1gishxd23qw6bwsk7fkagkfc7ihqyvvvb98j9bmwc6wwpsfs4prs";
+      type = "gem";
+    };
+    version = "4.1.0";
+  };
+  taskwarrior-web = {
+    dependencies = ["activesupport" "json" "parseconfig" "rack-flash3" "rinku" "sinatra" "sinatra-simple-navigation" "vegas" "versionomy"];
+    groups = ["default"];
+    platforms = [];
+    bundledByPath = true;
+    path = ./.;
+    source = {
+      path = ./.;
+      type = "path";
+    };
+    version = "1.1.12";
+  };
+  thin = {
+    dependencies = ["daemons" "eventmachine" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0nagbf9pwy1vg09k6j4xqhbjjzrg5dwzvkn4ffvlj76fsn6vv61f";
+      type = "gem";
+    };
+    version = "1.7.2";
+  };
+  thor = {
+    groups = ["default" "local"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "1yhrnp9x8qcy5vc7g438amd5j9sw83ih7c30dr6g6slgw9zj3g29";
+      type = "gem";
+    };
+    version = "0.20.3";
+  };
+  tilt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0ca4k0clwf0rkvy7726x4nxpjxkpv67w043i39saxgldxd97zmwz";
+      type = "gem";
+    };
+    version = "2.0.9";
+  };
+  vegas = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0kzv0v1zb8vvm188q4pqwahb6468bmiamn6wpsbiq6r5i69s1bs5";
+      type = "gem";
+    };
+    version = "0.1.11";
+  };
+  versionomy = {
+    dependencies = ["blockenspiel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["http://rubygems.org"];
+      sha256 = "0i0l4pzrl1vyp4lpg2cxhgkk56spki3lld943d6h7168fj8qyv33";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+}
diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json
new file mode 100644 (file)
index 0000000..70f396d
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "a79cfe2-master",
+  "meta": {
+    "name": "taskwarrior-web",
+    "url": "https://github.com/theunraveler/taskwarrior-web",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "theunraveler",
+    "repo": "taskwarrior-web",
+    "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+    "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/taskwarrior-web/thin.patch b/pkgs/webapps/taskwarrior-web/thin.patch
new file mode 100644 (file)
index 0000000..a7df3e3
--- /dev/null
@@ -0,0 +1,23 @@
+diff --git a/Gemfile b/Gemfile
+index 8544e15..9c4279c 100644
+--- a/Gemfile
++++ b/Gemfile
+@@ -3,6 +3,8 @@ source "http://rubygems.org"
+ # Specify your gem's dependencies in taskwarrior-web.gemspec
+ gemspec
++gem 'thin'
++
+ group :local do
+   gem 'rb-fsevent', :require => false
+   gem 'growl', :require => false
+diff --git a/config.ru b/config.ru
+index c3050c6..52387d8 100644
+--- a/config.ru
++++ b/config.ru
+@@ -1,5 +1,4 @@
+ require File.join(File.dirname(__FILE__), 'lib', 'taskwarrior-web')
+-disable :run
+ TaskwarriorWeb::App.set({ :environment => :production })
+ run TaskwarriorWeb::App
diff --git a/pkgs/webapps/ttrss/default.nix b/pkgs/webapps/ttrss/default.nix
new file mode 100644 (file)
index 0000000..0ce2f94
--- /dev/null
@@ -0,0 +1,30 @@
+{ ttrss_config ? "/etc/ttrss/config.php"
+, varDir ? "/var/lib/ttrss"
+, stdenv, mylibs }:
+let
+  withPlugins = plugins: package.overrideAttrs(old: rec {
+    name = "${old.name}-with-plugins";
+    installPhase = old.installPhase +
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -s ${value} $out/plugins/${value.pluginName}") plugins
+      );
+    passthru = old.passthru // {
+      inherit plugins;
+      withPlugins = morePlugins: old.withPlugins (morePlugins ++ plugins);
+    };
+  });
+  package = stdenv.mkDerivation (mylibs.fetchedGit ./tt-rss.json // rec {
+    buildPhase = ''
+      rm -rf lock feed-icons cache
+      ln -sf ${varDir}/{lock,feed-icons,cache} .
+      '';
+      installPhase = ''
+        cp -a . $out
+        ln -s ${ttrss_config} $out/config.php
+      '';
+    passthru = {
+      plugins = [];
+      inherit withPlugins;
+    };
+  });
+in package
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json b/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json
new file mode 100644 (file)
index 0000000..e57fcce
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "0ea2092-master",
+  "meta": {
+    "name": "ttrss-af_feedmod",
+    "url": "https://github.com/mbirth/ttrss_plugin-af_feedmod",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "mbirth",
+    "repo": "ttrss_plugin-af_feedmod",
+    "rev": "0ea2092dd34067ecd898802cfca3570023d1ecfe",
+    "sha256": "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
new file mode 100644 (file)
index 0000000..8512be3
--- /dev/null
@@ -0,0 +1,9 @@
+{ patched ? false, stdenv, mylibs, lib }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./af_feedmod.json // {
+  patches = lib.optionals patched [ ./type_replace.patch ];
+  installPhase = ''
+    mkdir $out
+    cp init.php $out
+    '';
+  passthru.pluginName = "af_feedmod";
+})
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch b/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch
new file mode 100644 (file)
index 0000000..d622577
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/init.php 2014-06-16 14:21:06.995480038 +0200
++++ b/init.php 2014-06-16 14:22:00.151027654 +0200
+@@ -147,6 +147,9 @@
+                         }
+                     }
+                     break;
++                case 'replace':
++                    $article['content'] = preg_replace("/".$config['pattern']."/",$config['replacement'],$article['content']);
++                    break;
+                 default:
+                     // unknown type or invalid config
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json b/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json
new file mode 100644 (file)
index 0000000..c8aaab5
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "4d751b0-master",
+  "meta": {
+    "name": "ttrss-auth-ldap",
+    "url": "https://github.com/hydrian/TTRSS-Auth-LDAP",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "hydrian",
+    "repo": "TTRSS-Auth-LDAP",
+    "rev": "4d751b095c29a8dbe2dc7bb07777742956136e94",
+    "sha256": "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
new file mode 100644 (file)
index 0000000..424a9f7
--- /dev/null
@@ -0,0 +1,8 @@
+{ stdenv, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // {
+  installPhase = ''
+    mkdir $out
+    cp plugins/auth_ldap/init.php $out
+    '';
+  passthru.pluginName = "auth_ldap";
+})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/default.nix b/pkgs/webapps/ttrss/plugins/feediron/default.nix
new file mode 100644 (file)
index 0000000..80bfda4
--- /dev/null
@@ -0,0 +1,9 @@
+{ patched ? false, stdenv, mylibs, lib }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./feediron.json // {
+  patches = lib.optionals patched [ ./json_reformat.patch ];
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "feediron";
+})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/feediron.json b/pkgs/webapps/ttrss/plugins/feediron/feediron.json
new file mode 100644 (file)
index 0000000..5dbec92
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "407168c-master",
+  "meta": {
+    "name": "ttrss-feediron",
+    "url": "https://github.com/m42e/ttrss_plugin-feediron",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "m42e",
+    "repo": "ttrss_plugin-feediron",
+    "rev": "407168c628880b5ced572cc549db6d50e866d3c8",
+    "sha256": "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch b/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch
new file mode 100644 (file)
index 0000000..e1c44d9
--- /dev/null
@@ -0,0 +1,18 @@
+diff --git a/init.php b/init.php
+index 3c0f2f9..1aad146 100644
+--- a/init.php
++++ b/init.php
+@@ -600,10 +600,11 @@ class Feediron extends Plugin implements IHandler
+                       return false;
+               }
+-              $this->host->set($this, 'json_conf', Feediron_Json::format($json_conf));
++                $new_conf = json_encode(json_decode($json_conf), JSON_PRETTY_PRINT);
++                $this->host->set($this, 'json_conf', $new_conf);
+               $json_reply['success'] = true;
+               $json_reply['message'] = __('Configuration saved.');
+-              $json_reply['json_conf'] = Feediron_Json::format($json_conf);
++                $json_reply['json_conf'] = $new_conf;
+               echo json_encode($json_reply);
+       }
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
new file mode 100644 (file)
index 0000000..3540f73
--- /dev/null
@@ -0,0 +1,8 @@
+{ stdenv, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // {
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "ff_instagram";
+})
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json b/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json
new file mode 100644 (file)
index 0000000..1f241b9
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "0366ffb-master",
+  "meta": {
+    "name": "ttrss-ff_instagram",
+    "url": "https://github.com/wltb/ff_instagram",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "wltb",
+    "repo": "ff_instagram",
+    "rev": "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8",
+    "sha256": "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
new file mode 100644 (file)
index 0000000..2cf3e05
--- /dev/null
@@ -0,0 +1,8 @@
+{ stdenv, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // {
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "tumblr_gdpr_ua";
+})
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json
new file mode 100644 (file)
index 0000000..eafbcfe
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "287c584-master",
+  "meta": {
+    "name": "ttrss-tumblr_gdpr_ua",
+    "url": "https://github.com/hkockerbeck/ttrss-tumblr-gdpr-ua",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "hkockerbeck",
+    "repo": "ttrss-tumblr-gdpr-ua",
+    "rev": "287c584e68845d524f920156bff0b2eaa6f65117",
+    "sha256": "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/ttrss/tt-rss.json b/pkgs/webapps/ttrss/tt-rss.json
new file mode 100644 (file)
index 0000000..e2731b0
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "tag": "986ca25-master",
+  "meta": {
+    "name": "tt-rss",
+    "url": "https://git.tt-rss.org/fox/tt-rss.git",
+    "branch": "master"
+  },
+  "git": {
+    "url": "https://git.tt-rss.org/fox/tt-rss.git",
+    "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+    "sha256": "0xkafkh7l9zazm5d6snlq03kdfxfhkb4c8fdsb32wn8b9bhdzf5s",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/wallabag/default.nix b/pkgs/webapps/wallabag/default.nix
new file mode 100644 (file)
index 0000000..a437a31
--- /dev/null
@@ -0,0 +1,54 @@
+{ varDir ? "/var/lib/wallabag"
+, wallabag_config ? "/etc/wallabag/parameters.yml"
+, ldap ? false
+, composerEnv, fetchurl, lib }:
+composerEnv.buildPackage rec {
+  packages = {
+    "fr3d/ldap-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fr3d-ldap-bundle-5a8927c11af45fa06331b97221c6da1a4a237475";
+        src = fetchurl {
+          url = https://api.github.com/repos/Maks3w/FR3DLdapBundle/zipball/5a8927c11af45fa06331b97221c6da1a4a237475;
+          sha256 = "168zkd82j200wd6h0a3lq81g5s2pifg889rv27q2g429nppsbfxc";
+        };
+      };
+    };
+    "zendframework/zend-ldap" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-ldap-b63c7884a08d3a6bda60ebcf7d6238cf8ad89f49";
+        src = fetchurl {
+          url = https://api.github.com/repos/zendframework/zend-ldap/zipball/b63c7884a08d3a6bda60ebcf7d6238cf8ad89f49;
+          sha256 = "0mn4yqnb5prqhrbbybmw1i2rx7xf4s4wagbdq9qi55fa0vk3jgw9";
+        };
+      };
+    };
+  };
+  noDev = true;
+  doRemoveVendor = false;
+  # Beware when upgrading, I probably messed up with the migrations table
+  # (due to a psql bug in wallabag)
+  version = "2.3.6";
+  name = "wallabag-${version}";
+  src = fetchurl {
+    url = "https://static.wallabag.org/releases/wallabag-release-${version}.tar.gz";
+    sha256 = "0m0dy3r94ks5pfxyb9vbgrsm0vrwdl3jd5wqwg4f5vd107lq90q1";
+  };
+  unpackPhase = ''
+    unpackFile "$src"
+    sourceRoot=${version}
+    src=$PWD/${version}
+    '';
+  patches = lib.optionals ldap [ ./ldap.patch ];
+  preInstall = ''
+    export SYMFONY_ENV="prod"
+  '';
+  postInstall = ''
+    rm -rf web/assets var/{cache,logs,sessions} app/config/parameters.yml data
+    ln -sf ${wallabag_config} app/config/parameters.yml
+    ln -sf ${varDir}/var/{cache,logs,sessions} var
+    ln -sf ${varDir}/data data
+    ln -sf ${varDir}/assets web/assets
+  '';
+}
diff --git a/pkgs/webapps/wallabag/ldap.patch b/pkgs/webapps/wallabag/ldap.patch
new file mode 100644 (file)
index 0000000..9caf7da
--- /dev/null
@@ -0,0 +1,698 @@
+diff --git a/.travis.yml b/.travis.yml
+index 04cea258..56b1f576 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -58,6 +58,7 @@ install:
+ before_script:
+     - PHP=$TRAVIS_PHP_VERSION
++    - echo "extension=ldap.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
+     - if [[ ! $PHP = hhvm* ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
+     # xdebug isn't enable for PHP 7.1
+     - if [[ ! $PHP = hhvm* ]]; then phpenv config-rm xdebug.ini || echo "xdebug not available"; fi
+diff --git a/app/AppKernel.php b/app/AppKernel.php
+index 40726f05..c4f465dc 100644
+--- a/app/AppKernel.php
++++ b/app/AppKernel.php
+@@ -42,6 +42,10 @@ class AppKernel extends Kernel
+             new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),
+         ];
++        if (class_exists('FR3D\\LdapBundle\\FR3DLdapBundle')) {
++          $bundles[] = new FR3D\LdapBundle\FR3DLdapBundle();
++        }
++
+         if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
+             $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
+             $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
+diff --git a/app/DoctrineMigrations/Version20170710113900.php b/app/DoctrineMigrations/Version20170710113900.php
+new file mode 100644
+index 00000000..7be83110
+--- /dev/null
++++ b/app/DoctrineMigrations/Version20170710113900.php
+@@ -0,0 +1,54 @@
++<?php
++
++namespace Application\Migrations;
++
++use Doctrine\DBAL\Migrations\AbstractMigration;
++use Doctrine\DBAL\Schema\Schema;
++use Symfony\Component\DependencyInjection\ContainerAwareInterface;
++use Symfony\Component\DependencyInjection\ContainerInterface;
++
++/**
++ * Added dn field on wallabag_users
++ */
++class Version20170710113900 extends AbstractMigration implements ContainerAwareInterface
++{
++    /**
++     * @var ContainerInterface
++     */
++    private $container;
++
++    public function setContainer(ContainerInterface $container = null)
++    {
++        $this->container = $container;
++    }
++
++    private function getTable($tableName)
++    {
++        return $this->container->getParameter('database_table_prefix').$tableName;
++    }
++
++    /**
++     * @param Schema $schema
++     */
++    public function up(Schema $schema)
++    {
++        $usersTable = $schema->getTable($this->getTable('user'));
++
++        $this->skipIf($usersTable->hasColumn('dn'), 'It seems that you already played this migration.');
++
++        $usersTable->addColumn('dn', 'text', [
++            'default' => null,
++            'notnull' => false,
++        ]);
++    }
++
++    /**
++     * @param Schema $schema
++     */
++    public function down(Schema $schema)
++    {
++        $usersTable = $schema->getTable($this->getTable('user'));
++        $usersTable->dropColumn('dn');
++    }
++}
++
+diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist
+index 6b0cb8e8..cfd41b69 100644
+--- a/app/config/parameters.yml.dist
++++ b/app/config/parameters.yml.dist
+@@ -62,3 +62,23 @@ parameters:
+     redis_port: 6379
+     redis_path: null
+     redis_password: null
++
++    # ldap configuration
++    # To enable, you need to require fr3d/ldap-bundle
++    ldap_enabled: false
++    ldap_host: localhost
++    ldap_port: 389
++    ldap_tls:  false
++    ldap_ssl:  false
++    ldap_bind_requires_dn: true
++    ldap_base: dc=example,dc=com
++    ldap_manager_dn: ou=Manager,dc=example,dc=com
++    ldap_manager_pw: password
++    ldap_filter: (&(ObjectClass=Person))
++    # optional (if null: no ldap user is admin)
++    ldap_admin_filter: (&(memberOf=ou=admins,dc=example,dc=com)(uid=%s))
++    ldap_username_attribute: uid
++    ldap_email_attribute: mail
++    ldap_name_attribute: cn
++    # optional (default sets user as enabled unconditionally)
++    ldap_enabled_attribute: ~
+diff --git a/app/config/security.yml b/app/config/security.yml
+index 02afc9ea..48fbb553 100644
+--- a/app/config/security.yml
++++ b/app/config/security.yml
+@@ -6,6 +6,7 @@ security:
+         ROLE_ADMIN: ROLE_USER
+         ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]
++    # /!\ This list is modified in WallabagUserBundle when LDAP is enabled
+     providers:
+         administrators:
+             entity:
+@@ -36,6 +37,7 @@ security:
+             pattern: ^/login$
+             anonymous:  ~
++        # /!\ This section is modified in WallabagUserBundle when LDAP is enabled
+         secured_area:
+             pattern: ^/
+             form_login:
+diff --git a/composer.json b/composer.json
+index 68cfad05..32a3d1a4 100644
+--- a/composer.json
++++ b/composer.json
+@@ -85,7 +85,11 @@
+         "friendsofsymfony/jsrouting-bundle": "^1.6.3",
+         "bdunogier/guzzle-site-authenticator": "^1.0.0",
+         "defuse/php-encryption": "^2.1",
+-        "html2text/html2text": "^4.1"
++        "html2text/html2text": "^4.1",
++        "fr3d/ldap-bundle": "^3.0"
++    },
++    "suggest": {
++      "fr3d/ldap-bundle": "If you want to authenticate via LDAP"
+     },
+     "require-dev": {
+         "doctrine/doctrine-fixtures-bundle": "~2.2",
+diff --git a/composer.lock b/composer.lock
+index 251ee081..37795e0b 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": "d2a0bd8408dccdeb7a7455996519829b",
++    "content-hash": "4699d166d03a8e5f70d802d0bc3e6a20",
+     "packages": [
+         {
+             "name": "bdunogier/guzzle-site-authenticator",
+@@ -1346,6 +1346,65 @@
+             ],
+             "time": "2018-12-14T19:44:53+00:00"
+         },
++        {
++            "name": "fr3d/ldap-bundle",
++            "version": "v3.0.0",
++            "source": {
++                "type": "git",
++                "url": "https://github.com/Maks3w/FR3DLdapBundle.git",
++                "reference": "5a8927c11af45fa06331b97221c6da1a4a237475"
++            },
++            "dist": {
++                "type": "zip",
++                "url": "https://api.github.com/repos/Maks3w/FR3DLdapBundle/zipball/5a8927c11af45fa06331b97221c6da1a4a237475",
++                "reference": "5a8927c11af45fa06331b97221c6da1a4a237475",
++                "shasum": ""
++            },
++            "require": {
++                "php": ">=5.5",
++                "psr/log": "~1.0",
++                "symfony/config": "2.3 - 3",
++                "symfony/dependency-injection": "2.3 - 3",
++                "symfony/polyfill-php56": "^1.1",
++                "symfony/security": "2.3 - 3",
++                "symfony/security-bundle": "2.3 - 3",
++                "zendframework/zend-ldap": "2.5 - 3"
++            },
++            "require-dev": {
++                "fabpot/php-cs-fixer": "1.11.*",
++                "fr3d/psr3-message-assertions": "0.1.*",
++                "friendsofsymfony/user-bundle": "~1.3",
++                "maks3w/phpunit-methods-trait": "^4.6",
++                "phpunit/phpunit": "^4.6",
++                "symfony/validator": "2.3 - 3"
++            },
++            "suggest": {
++                "friendsofsymfony/user-bundle": "Integrate authentication and management for DB users, useful for unmanned LDAP servers",
++                "symfony/validator": "Allow pre-validate for existing users before register new ones"
++            },
++            "type": "symfony-bundle",
++            "autoload": {
++                "psr-4": {
++                    "FR3D\\LdapBundle\\": ""
++                }
++            },
++            "notification-url": "https://packagist.org/downloads/",
++            "license": [
++                "MIT"
++            ],
++            "authors": [
++                {
++                    "name": "Maks3w"
++                }
++            ],
++            "description": "This package provide users and authentication services based on LDAP directories for Symfony2 framework",
++            "homepage": "https://github.com/Maks3w/FR3DLdapBundle",
++            "keywords": [
++                "Authentication",
++                "ldap"
++            ],
++            "time": "2016-02-12T17:45:14+00:00"
++        },
+         {
+             "name": "friendsofsymfony/jsrouting-bundle",
+             "version": "1.6.3",
+@@ -7027,6 +7086,59 @@
+                 "zf2"
+             ],
+             "time": "2018-04-25T15:33:34+00:00"
++        },
++        {
++            "name": "zendframework/zend-ldap",
++            "version": "2.10.0",
++            "source": {
++                "type": "git",
++                "url": "https://github.com/zendframework/zend-ldap.git",
++                "reference": "b63c7884a08d3a6bda60ebcf7d6238cf8ad89f49"
++            },
++            "dist": {
++                "type": "zip",
++                "url": "https://api.github.com/repos/zendframework/zend-ldap/zipball/b63c7884a08d3a6bda60ebcf7d6238cf8ad89f49",
++                "reference": "b63c7884a08d3a6bda60ebcf7d6238cf8ad89f49",
++                "shasum": ""
++            },
++            "require": {
++                "ext-ldap": "*",
++                "php": "^5.6 || ^7.0"
++            },
++            "require-dev": {
++                "php-mock/php-mock-phpunit": "^1.1.2 || ^2.1.1",
++                "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
++                "zendframework/zend-coding-standard": "~1.0.0",
++                "zendframework/zend-config": "^2.5",
++                "zendframework/zend-eventmanager": "^2.6.3 || ^3.0.1",
++                "zendframework/zend-stdlib": "^2.7 || ^3.0"
++            },
++            "suggest": {
++                "zendframework/zend-eventmanager": "Zend\\EventManager component"
++            },
++            "type": "library",
++            "extra": {
++                "branch-alias": {
++                    "dev-master": "2.10.x-dev",
++                    "dev-develop": "2.11.x-dev"
++                }
++            },
++            "autoload": {
++                "psr-4": {
++                    "Zend\\Ldap\\": "src/"
++                }
++            },
++            "notification-url": "https://packagist.org/downloads/",
++            "license": [
++                "BSD-3-Clause"
++            ],
++            "description": "Provides support for LDAP operations including but not limited to binding, searching and modifying entries in an LDAP directory",
++            "keywords": [
++                "ZendFramework",
++                "ldap",
++                "zf"
++            ],
++            "time": "2018-07-05T05:05:12+00:00"
+         }
+     ],
+     "packages-dev": [
+@@ -7561,12 +7673,12 @@
+             "source": {
+                 "type": "git",
+                 "url": "https://github.com/symfony/phpunit-bridge.git",
+-                "reference": "5dab0d4b2ac99ab22b447b615fdfdc10ec4af3d5"
++                "reference": "d61ec438634e0f234c6bda1c6ee97016bbb0e7a1"
+             },
+             "dist": {
+                 "type": "zip",
+-                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/5dab0d4b2ac99ab22b447b615fdfdc10ec4af3d5",
+-                "reference": "5dab0d4b2ac99ab22b447b615fdfdc10ec4af3d5",
++                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/d61ec438634e0f234c6bda1c6ee97016bbb0e7a1",
++                "reference": "d61ec438634e0f234c6bda1c6ee97016bbb0e7a1",
+                 "shasum": ""
+             },
+             "require": {
+@@ -7619,7 +7731,7 @@
+             ],
+             "description": "Symfony PHPUnit Bridge",
+             "homepage": "https://symfony.com",
+-            "time": "2019-01-01T13:45:19+00:00"
++            "time": "2019-01-16T13:27:11+00:00"
+         },
+         {
+             "name": "symfony/polyfill-php72",
+diff --git a/scripts/install.sh b/scripts/install.sh
+index 8b7ea03f..3a4a33ab 100755
+--- a/scripts/install.sh
++++ b/scripts/install.sh
+@@ -26,5 +26,8 @@ ENV=$1
+ TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
+ git checkout $TAG
++if [ -n "$LDAP_ENABLED" ]; then
++  SYMFONY_ENV=$ENV $COMPOSER_COMMAND require --no-update fr3d/ldap-bundle
++fi
+ SYMFONY_ENV=$ENV $COMPOSER_COMMAND install --no-dev -o --prefer-dist
+ php bin/console wallabag:install --env=$ENV
+diff --git a/scripts/update.sh b/scripts/update.sh
+index c62d104a..6259a431 100755
+--- a/scripts/update.sh
++++ b/scripts/update.sh
+@@ -32,6 +32,9 @@ git fetch origin
+ git fetch --tags
+ TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
+ git checkout $TAG --force
++if [ -n "$LDAP_ENABLED" ]; then
++  SYMFONY_ENV=$ENV $COMPOSER_COMMAND require --no-update fr3d/ldap-bundle
++fi
+ SYMFONY_ENV=$ENV $COMPOSER_COMMAND install --no-dev -o --prefer-dist
+ php bin/console doctrine:migrations:migrate --no-interaction --env=$ENV
+ php bin/console cache:clear --env=$ENV
+diff --git a/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php b/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php
+index 5ca3482e..904a6af1 100644
+--- a/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php
++++ b/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php
+@@ -6,9 +6,34 @@ use Symfony\Component\Config\FileLocator;
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
+ use Symfony\Component\DependencyInjection\Loader;
+ use Symfony\Component\HttpKernel\DependencyInjection\Extension;
++use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
+-class WallabagUserExtension extends Extension
++class WallabagUserExtension extends Extension implements PrependExtensionInterface
+ {
++    public function prepend(ContainerBuilder $container)
++    {
++        $ldap = $container->getParameter('ldap_enabled');
++
++        if ($ldap) {
++            $container->prependExtensionConfig('security', array(
++              'providers' => array(
++                'chain_provider' => array(),
++              ),
++            ));
++            $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
++            $loader->load('ldap.yml');
++        } elseif ($container->hasExtension('fr3d_ldap')) {
++            $container->prependExtensionConfig('fr3_d_ldap', array(
++            'driver' => array(
++              'host' => 'localhost',
++            ),
++            'user' => array(
++              'baseDn' => 'dc=example,dc=com',
++            ),
++          ));
++        }
++    }
++
+     public function load(array $configs, ContainerBuilder $container)
+     {
+         $configuration = new Configuration();
+@@ -16,6 +41,9 @@ class WallabagUserExtension extends Extension
+         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
+         $loader->load('services.yml');
++        if ($container->getParameter('ldap_enabled')) {
++            $loader->load('ldap_services.yml');
++        }
+         $container->setParameter('wallabag_user.registration_enabled', $config['registration_enabled']);
+     }
+diff --git a/src/Wallabag/UserBundle/Entity/User.php b/src/Wallabag/UserBundle/Entity/User.php
+index 48446e3c..f93c59c7 100644
+--- a/src/Wallabag/UserBundle/Entity/User.php
++++ b/src/Wallabag/UserBundle/Entity/User.php
+@@ -1,5 +1,15 @@
+ <?php
++// This permits to have the LdapUserInterface even when fr3d/ldap-bundle is not
++// in the packages
++namespace FR3D\LdapBundle\Model;
++
++interface LdapUserInterface
++{
++    public function setDn($dn);
++    public function getDn();
++}
++
+ namespace Wallabag\UserBundle\Entity;
+ use Doctrine\Common\Collections\ArrayCollection;
+@@ -16,6 +26,7 @@ use Wallabag\ApiBundle\Entity\Client;
+ use Wallabag\CoreBundle\Entity\Config;
+ use Wallabag\CoreBundle\Entity\Entry;
+ use Wallabag\CoreBundle\Helper\EntityTimestampsTrait;
++use FR3D\LdapBundle\Model\LdapUserInterface;
+ /**
+  * User.
+@@ -28,7 +39,7 @@ use Wallabag\CoreBundle\Helper\EntityTimestampsTrait;
+  * @UniqueEntity("email")
+  * @UniqueEntity("username")
+  */
+-class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterface
++class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterface, LdapUserInterface
+ {
+     use EntityTimestampsTrait;
+@@ -67,6 +78,13 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
+      */
+     protected $email;
++    /**
++     * @var string
++     *
++     * @ORM\Column(name="dn", type="text", nullable=true)
++     */
++    protected $dn;
++
+     /**
+      * @var \DateTime
+      *
+@@ -309,4 +327,33 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
+             return $this->clients->first();
+         }
+     }
++
++    /**
++     * Set dn.
++     *
++     * @param string $dn
++     *
++     * @return User
++     */
++    public function setDn($dn)
++    {
++        $this->dn = $dn;
++
++        return $this;
++    }
++
++    /**
++     * Get dn.
++     *
++     * @return string
++     */
++    public function getDn()
++    {
++        return $this->dn;
++    }
++
++    public function isLdapUser()
++    {
++        return $this->dn !== null;
++    }
+ }
+diff --git a/src/Wallabag/UserBundle/LdapHydrator.php b/src/Wallabag/UserBundle/LdapHydrator.php
+new file mode 100644
+index 00000000..cea2450f
+--- /dev/null
++++ b/src/Wallabag/UserBundle/LdapHydrator.php
+@@ -0,0 +1,103 @@
++<?php
++
++namespace Wallabag\UserBundle;
++
++use FR3D\LdapBundle\Hydrator\HydratorInterface;
++use FOS\UserBundle\FOSUserEvents;
++use FOS\UserBundle\Event\UserEvent;
++
++class LdapHydrator implements HydratorInterface
++{
++    private $userManager;
++    private $eventDispatcher;
++    private $attributesMap;
++    private $enabledAttribute;
++    private $ldapBaseDn;
++    private $ldapAdminFilter;
++    private $ldapDriver;
++
++    public function __construct(
++      $user_manager,
++      $event_dispatcher,
++      array $attributes_map,
++      $ldap_base_dn,
++      $ldap_admin_filter,
++      $ldap_driver
++    ) {
++        $this->userManager = $user_manager;
++        $this->eventDispatcher = $event_dispatcher;
++
++        $this->attributesMap = array(
++        'setUsername' => $attributes_map[0],
++        'setEmail' => $attributes_map[1],
++        'setName' => $attributes_map[2],
++      );
++        $this->enabledAttribute = $attributes_map[3];
++
++        $this->ldapBaseDn = $ldap_base_dn;
++        $this->ldapAdminFilter = $ldap_admin_filter;
++        $this->ldapDriver = $ldap_driver;
++    }
++
++    public function hydrate(array $ldapEntry)
++    {
++        $user = $this->userManager->findUserBy(array('dn' => $ldapEntry['dn']));
++
++        if (!$user) {
++            $user = $this->userManager->createUser();
++            $user->setDn($ldapEntry['dn']);
++            $user->setPassword('');
++            $user->setSalt('');
++            $this->updateUserFields($user, $ldapEntry);
++
++            $event = new UserEvent($user);
++            $this->eventDispatcher->dispatch(FOSUserEvents::USER_CREATED, $event);
++
++            $this->userManager->reloadUser($user);
++        } else {
++            $this->updateUserFields($user, $ldapEntry);
++        }
++
++        return $user;
++    }
++
++    private function updateUserFields($user, $ldapEntry)
++    {
++        foreach ($this->attributesMap as $key => $value) {
++            if (is_array($ldapEntry[$value])) {
++                $ldap_value = $ldapEntry[$value][0];
++            } else {
++                $ldap_value = $ldapEntry[$value];
++            }
++
++            call_user_func([$user, $key], $ldap_value);
++        }
++
++        if ($this->enabledAttribute !== null) {
++            $user->setEnabled($ldapEntry[$this->enabledAttribute]);
++        } else {
++            $user->setEnabled(true);
++        }
++
++        if ($this->isAdmin($user)) {
++            $user->addRole('ROLE_SUPER_ADMIN');
++        } else {
++            $user->removeRole('ROLE_SUPER_ADMIN');
++        }
++
++        $this->userManager->updateUser($user, true);
++    }
++
++    private function isAdmin($user)
++    {
++        if ($this->ldapAdminFilter === null) {
++            return false;
++        }
++
++        $escaped_username = ldap_escape($user->getUsername(), '', LDAP_ESCAPE_FILTER);
++        $filter = sprintf($this->ldapAdminFilter, $escaped_username);
++        $entries = $this->ldapDriver->search($this->ldapBaseDn, $filter);
++
++        return $entries['count'] == 1;
++    }
++}
+diff --git a/src/Wallabag/UserBundle/OAuthStorageLdapWrapper.php b/src/Wallabag/UserBundle/OAuthStorageLdapWrapper.php
+new file mode 100644
+index 00000000..8a851f12
+--- /dev/null
++++ b/src/Wallabag/UserBundle/OAuthStorageLdapWrapper.php
+@@ -0,0 +1,43 @@
++<?php
++
++namespace Wallabag\UserBundle;
++
++use FOS\OAuthServerBundle\Storage\OAuthStorage;
++use OAuth2\Model\IOAuth2Client;
++use Symfony\Component\Security\Core\Exception\AuthenticationException;
++
++class OAuthStorageLdapWrapper extends OAuthStorage
++{
++    private $ldapManager;
++
++    public function setLdapManager($ldap_manager)
++    {
++        $this->ldapManager = $ldap_manager;
++    }
++
++    public function checkUserCredentials(IOAuth2Client $client, $username, $password)
++    {
++        try {
++            $user = $this->userProvider->loadUserByUsername($username);
++        } catch (AuthenticationException $e) {
++            return false;
++        }
++
++        if ($user->isLdapUser()) {
++            return $this->checkLdapUserCredentials($user, $password);
++        } else {
++            return parent::checkUserCredentials($client, $username, $password);
++        }
++    }
++
++    private function checkLdapUserCredentials($user, $password)
++    {
++        if ($this->ldapManager->bind($user, $password)) {
++            return array(
++        'data' => $user,
++      );
++        } else {
++            return false;
++        }
++    }
++}
+diff --git a/src/Wallabag/UserBundle/Resources/config/ldap.yml b/src/Wallabag/UserBundle/Resources/config/ldap.yml
+new file mode 100644
+index 00000000..5ec16088
+--- /dev/null
++++ b/src/Wallabag/UserBundle/Resources/config/ldap.yml
+@@ -0,0 +1,28 @@
++fr3d_ldap:
++    service:
++        user_hydrator: ldap_user_hydrator
++    driver:
++        host: "%ldap_host%"
++        port: "%ldap_port%"
++        useSsl: "%ldap_ssl%"
++        useStartTls: "%ldap_tls%"
++        bindRequiresDn: "%ldap_bind_requires_dn%"
++        username: "%ldap_manager_dn%"
++        password: "%ldap_manager_pw%"
++    user:
++        baseDn: "%ldap_base%"
++        filter: "%ldap_filter%"
++        usernameAttribute: "%ldap_username_attribute%"
++security:
++    providers:
++        chain_provider:
++            chain:
++                providers: [ fr3d_ldapbundle, fos_userbundle ]
++        fr3d_ldapbundle:
++            id: fr3d_ldap.security.user.provider
++    firewalls:
++        secured_area:
++            fr3d_ldap: ~
++            form_login:
++                provider: chain_provider
++
+diff --git a/src/Wallabag/UserBundle/Resources/config/ldap_services.yml b/src/Wallabag/UserBundle/Resources/config/ldap_services.yml
+new file mode 100644
+index 00000000..b3e3fd8a
+--- /dev/null
++++ b/src/Wallabag/UserBundle/Resources/config/ldap_services.yml
+@@ -0,0 +1,22 @@
++services:
++    fos_oauth_server.server:
++        class: OAuth2\OAuth2
++        arguments:
++            - "@oauth_storage_ldap_wrapper"
++            - "%fos_oauth_server.server.options%"
++    oauth_storage_ldap_wrapper:
++        class: Wallabag\UserBundle\OAuthStorageLdapWrapper
++        parent: fos_oauth_server.storage
++        calls:
++            - [setLdapManager, ["@fr3d_ldap.ldap_manager"]]
++
++    ldap_user_hydrator:
++        class: Wallabag\UserBundle\LdapHydrator
++        arguments:
++            - "@fos_user.user_manager"
++            - "@event_dispatcher"
++            - [ "%ldap_username_attribute%", "%ldap_email_attribute%", "%ldap_name_attribute%", "%ldap_enabled_attribute%" ]
++            - "%ldap_base%"
++            - "%ldap_admin_filter%"
++            - "@fr3d_ldap.ldap_driver"
++
diff --git a/pkgs/webapps/yourls/default.nix b/pkgs/webapps/yourls/default.nix
new file mode 100644 (file)
index 0000000..4bcfa4c
--- /dev/null
@@ -0,0 +1,26 @@
+{ yourls_config ? "/etc/yourls/config.php", mylibs, stdenv }:
+let
+  withPlugins = plugins: package.overrideAttrs(old: {
+    name = "${old.name}-with-plugins";
+    installPhase = old.installPhase +
+      builtins.concatStringsSep "\n" (
+        map (value: "ln -s ${value} $out/user/plugins/${value.pluginName}") plugins
+      );
+    passthru = old.passthru // {
+      inherit plugins;
+      withPlugins = morePlugins: old.withPlugins (morePlugins ++ plugins);
+    };
+  });
+  package = stdenv.mkDerivation (mylibs.fetchedGithub ./yourls.json // rec {
+    installPhase = ''
+      mkdir -p $out
+      cp -a */ *.php $out/
+      cp sample-robots.txt $out/robots.txt
+      ln -sf ${yourls_config} $out/includes/config.php
+    '';
+    passthru = {
+      plugins = [];
+      inherit withPlugins;
+    };
+  });
+in package
diff --git a/pkgs/webapps/yourls/plugins/ldap/default.nix b/pkgs/webapps/yourls/plugins/ldap/default.nix
new file mode 100644 (file)
index 0000000..01dc6fb
--- /dev/null
@@ -0,0 +1,8 @@
+{ stdenv, mylibs }:
+stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec {
+  installPhase = ''
+    mkdir -p $out
+    cp plugin.php $out
+    '';
+  passthru.pluginName = "ldap";
+})
diff --git a/pkgs/webapps/yourls/plugins/ldap/ldap.json b/pkgs/webapps/yourls/plugins/ldap/ldap.json
new file mode 100644 (file)
index 0000000..9411e4a
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "2a3cb03-master",
+  "meta": {
+    "name": "yourls-ldap-plugin",
+    "url": "https://github.com/k3a/yourls-ldap-plugin",
+    "branch": "master"
+  },
+  "github": {
+    "owner": "k3a",
+    "repo": "yourls-ldap-plugin",
+    "rev": "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615",
+    "sha256": "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh",
+    "fetchSubmodules": true
+  }
+}
diff --git a/pkgs/webapps/yourls/yourls.json b/pkgs/webapps/yourls/yourls.json
new file mode 100644 (file)
index 0000000..0a79b18
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "1.7.3",
+  "meta": {
+    "name": "yourls",
+    "url": "https://github.com/YOURLS/YOURLS",
+    "branch": "refs/tags/1.7.3"
+  },
+  "github": {
+    "owner": "YOURLS",
+    "repo": "YOURLS",
+    "rev": "077018822d3594229daa8343310d0b40804b9ddc",
+    "sha256": "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd",
+    "fetchSubmodules": true
+  }
+}
diff --git a/scripts/make-env b/scripts/make-env
new file mode 100755 (executable)
index 0000000..ebb1eed
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+
+source $(dirname $DIR)/nix_path_env
+nix-env -r -i -A myEnvironments.immae-eu -f "<nixpkgs>" "$@"
+
+cat >> $(dirname $DIR)/versions_log <<EOF
+# Ran $(date) with args "$@"
+$($DIR/nix_infos | sed -e "s/^/#   /")
+EOF
diff --git a/scripts/nix_infos b/scripts/nix_infos
new file mode 100755 (executable)
index 0000000..f824305
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+
+source $(dirname $DIR)/nix_path_env
+version=$(nix eval --raw nixpkgs.lib.version)
+mainversion=$(echo $version | cut -d"." -f -2)
+
+echo "https://releases.nixos.org/nixos/$mainversion/nixos-$version/nixexprs.tar.xz"
+nix eval --raw nixpkgs.bc.meta.position | cut -d"/" -f-4