]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Nicecoop installation
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Thu, 5 Aug 2021 23:35:06 +0000 (01:35 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 9 Apr 2023 15:14:20 +0000 (17:14 +0200)
16 files changed:
modules/private/buildbot/projects/nicecoop/__init__.py [new file with mode: 0644]
modules/private/databases/postgresql.nix
modules/private/default.nix
modules/private/environment.nix
modules/private/mail/sympa.nix
modules/private/websites/default.nix
modules/private/websites/nicecoop/gestion-compte.nix [new file with mode: 0644]
modules/private/websites/nicecoop/gestion-compte/default.nix [new file with mode: 0644]
modules/private/websites/nicecoop/gestion-compte/php-packages.nix [new file with mode: 0644]
modules/private/websites/nicecoop/gestion-compte_integration.nix [new file with mode: 0644]
modules/private/websites/nicecoop/odoo.nix [new file with mode: 0644]
modules/private/websites/nicecoop/odoo/default.nix [new file with mode: 0644]
modules/private/websites/nicecoop/odoo/odoo.patch [new file with mode: 0644]
modules/private/websites/nicecoop/odoo/poetry.lock [new file with mode: 0644]
modules/private/websites/nicecoop/odoo/pyproject.toml [new file with mode: 0644]
modules/private/websites/nicecoop/odoo/shell_generate_poetry.nix [new file with mode: 0644]

diff --git a/modules/private/buildbot/projects/nicecoop/__init__.py b/modules/private/buildbot/projects/nicecoop/__init__.py
new file mode 100644 (file)
index 0000000..b2c02ee
--- /dev/null
@@ -0,0 +1,70 @@
+from buildbot.plugins import *
+from buildbot_common.build_helpers import *
+import os
+from buildbot.util import bytes2unicode
+import json
+from functools import partial
+
+__all__ = [ "configure", "E" ]
+
+class E():
+    PROJECT       = "nicecoop"
+    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)
+    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
+    SSH_HOST_KEY  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
+
+    GESTION_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Projets/Nicecoop/GestionCompte"
+    GESTION_RELEASE_PATH = "/var/lib/buildbot/outputs/nicecoop/gestion"
+
+    # 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=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
+    TITLE_URL          = "https://www.immae.eu"
+    TITLE              = "Nicecoop"
+
+def configure(c):
+    c["buildbotURL"] = E.BUILDBOT_URL
+    c["www"]["port"] = E.SOCKET
+
+    worker_name = "generic-worker-nicecoop"
+    c['workers'].append(worker.LocalWorker(worker_name))
+
+    c['schedulers'].append(git_hook_scheduler("Gestion", ["GestionProduction", "GestionSandbox"]))
+    c['schedulers'].append(force_scheduler("force_nicecoop", ["GestionProduction", "GestionSandbox"]))
+    c['builders'].append(util.BuilderConfig(name="GestionProduction", workernames=[worker_name], factory=gestion_factory("production")))
+    c['builders'].append(util.BuilderConfig(name="GestionSandbox", workernames=[worker_name], factory=gestion_factory("sandbox")))
+
+def gestion_factory(env):
+    path_env = {
+            "PATH": os.environ["BUILDBOT_PATH_Gestion"] + ":${PATH}",
+            }
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.Git(logEnviron=False, repourl=E.GESTION_GIT_URL,
+        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
+        sshHostKey=E.SSH_HOST_KEY, mode="full", method="fresh"))
+    factory.addStep(steps.FileDownload(mastersrc="/run/current-system/nicecoop/gestion/{}.tar.gz".format(env), workerdest="{}.tar.gz".format(env)))
+    factory.addStep(steps.ShellCommand(name="cleanup files",
+        logEnviron=False, haltOnFailure=False, command="rm -rf ../{}_app".format(env)))
+    factory.addStep(steps.ShellCommand(name="extract files",
+        logEnviron=False, haltOnFailure=True, env=path_env, command="tar -C .. -xzf {}.tar.gz".format(env)))
+    factory.addStep(steps.ShellCommand(name="make files writeable",
+        logEnviron=False, haltOnFailure=True, workdir="{}_app".format(env), command="chmod -R u+w ."))
+    factory.addStep(steps.ShellCommand(name="remove symlinks",
+        logEnviron=False, haltOnFailure=True, workdir="{}_app".format(env),
+        command="rm var app/config/parameters.yml"))
+    factory.addStep(steps.ShellCommand(name="copy parameters",
+        logEnviron=False, haltOnFailure=True, env=path_env,
+        command="cat {0}/parameters.yml | gucci -f /var/secrets/buildbot/nicecoop/{0}.yml > ../{0}_app/app/config/parameters.yml".format(env)))
+    factory.addStep(steps.ShellCommand(name="test configuration",
+        logEnviron=False, haltOnFailure=True, workdir="{}_app".format(env),  command="./bin/console --env=prod -q"))
+    factory.addStep(steps.FileUpload(workersrc="../{}_app/app/config/parameters.yml".format(env),
+        masterdest=E.GESTION_RELEASE_PATH + "/{}/parameters.yml".format(env)))
+
+    return factory
index a6c4cc998fdb138ccf53671992a916794b6eff95..fdab2f0bd6427c99b4a6e02d93630ba2b5c7b586 100644 (file)
@@ -159,7 +159,7 @@ in {
       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 (ip6: "hostssl ${v.database}   ${v.username}   ${ip6}  ${v.method}") v.ip6
             ++ map (ip4: "hostssl      ${v.database}   ${v.username}   ${ip4}/32               ${v.method}") v.ip4
           ) vs) cfg.authorizedHosts
         ));
index 9108a92f4b2a538bc44719210e1687eb5ea028ca..d005de48df232b5d3ddf0caefae10c3561267c9c 100644 (file)
@@ -65,6 +65,10 @@ set = {
 
   nathVillon = ./websites/nath/villon.nix;
 
+  nicecoopGestionCompte = ./websites/nicecoop/gestion-compte.nix;
+  nicecoopGestionCompteIntegration = ./websites/nicecoop/gestion-compte_integration.nix;
+  nicecoopOdoo = ./websites/nicecoop/odoo.nix;
+
   papaMaisonBbc = ./websites/papa/maison_bbc.nix;
   papaSurveillance = ./websites/papa/surveillance.nix;
 
index 837d24be95e65a9251ba93b54163fc48b6f4a113..1b4721074804adf10d5ec0818ed81c7fefbb7de1 100644 (file)
@@ -1379,6 +1379,30 @@ in
                   };
                 };
           };
+          nicecoop = mkOption {
+            description = "Nicecoop configuration";
+            type = submodule {
+              options = {
+                odoo = {
+                  port = mkOption { description = "Port to listen to"; type = port; };
+                  longpoll_port = mkOption { description = "Port to listen to"; type = port; };
+                  postgresql = mkPsqlOptions "Odoo";
+                  admin_password = mkOption { type = str; description = "Admin password"; };
+                };
+                gestion-compte = {
+                  mysql = mkMysqlOptions "gestion-compte" {};
+                  secret = mkOption { type = str; description = "Application secret"; };
+                  adminpassword = mkOption { type = str; description = "Admin password"; };
+                };
+                gestion-compte-integration = {
+                  smtp = mkSmtpOptions "GestionCompte";
+                  mysql = mkMysqlOptions "gestion-compte" {};
+                  secret = mkOption { type = str; description = "Application secret"; };
+                  adminpassword = mkOption { type = str; description = "Admin password"; };
+                };
+              };
+            };
+          };
           emilia = mkOption {
             description = "Emilia configuration";
             type = submodule {
index 0626ac0c4611f24f8cae211975eb5de5b8cefd87..a0903bec3016d29886e77e506bbd119df51f8893 100644 (file)
@@ -11,7 +11,7 @@ in
           username = "sympa";
           database = "sympa";
           ip4 = [config.myEnv.servers.backup-2.ips.main.ip4];
-          ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
+          ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6;
         }
       ];
     };
index 4864034990d81cefb848fc5042a039fb401dc145..fde459e5a08ea250802b1bd609105a711a8f632a 100644 (file)
@@ -275,6 +275,11 @@ in
 
       nath.villon.enable = true;
 
+      nicecoop = {
+        gestion-compte.enable = true;
+        gestion-compte-integration.enable = true;
+        odoo.enable = true;
+      };
       papa = {
         surveillance.enable = true;
         maison_bbc.enable = true;
diff --git a/modules/private/websites/nicecoop/gestion-compte.nix b/modules/private/websites/nicecoop/gestion-compte.nix
new file mode 100644 (file)
index 0000000..0d86297
--- /dev/null
@@ -0,0 +1,261 @@
+{ lib, pkgs, config, ... }:
+let
+  secrets = config.myEnv.websites.nicecoop.gestion-compte;
+  varDir = "/var/lib/nicecoop_gestion-compte/var";
+  parametersPath = "/var/lib/buildbot/outputs/nicecoop/gestion/production/parameters.yml";
+  app = pkgs.callPackage ./gestion-compte {
+    inherit varDir;
+    secretsPath = parametersPath;
+  };
+  cfg = config.myServices.websites.nicecoop.gestion-compte;
+in {
+  options.myServices.websites.nicecoop.gestion-compte.enable = lib.mkEnableOption "enable nicecoop's gestion-compte website";
+
+  config = lib.mkIf cfg.enable {
+    services.phpfpm.pools.nicecoop_gestion-compte = {
+      user = config.services.httpd.Prod.user;
+      group = config.services.httpd.Prod.group;
+      settings = {
+        "listen.owner" = config.services.httpd.Prod.user;
+        "listen.group" = config.services.httpd.Prod.group;
+        "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
+          app
+          varDir
+          parametersPath
+          "/tmp"
+        ];
+        "php_admin_value[upload_max_filesize]" = "20M";
+        "php_admin_value[post_max_size]" = "20M";
+        "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
+        "pm" = "dynamic";
+        "pm.max_children" = "20";
+        "pm.start_servers" = "2";
+        "pm.min_spare_servers" = "1";
+        "pm.max_spare_servers" = "3";
+      };
+    };
+    system.extraSystemBuilderCmds = let
+      tarball = pkgs.runCommand "production.tar.gz" {} ''
+        tar -P --transform="s@${app}@production_app@" -czf $out ${app}
+      '';
+    in ''
+      mkdir -p $out/nicecoop/gestion
+      ln -s ${tarball} $out/nicecoop/gestion/production.tar.gz
+    '';
+    systemd.services.phpfpm-nicecoop_gestion-compte = {
+      after = lib.mkAfter ["mysql.service"];
+      wants = ["mysql.service"];
+      preStart = lib.mkAfter ''
+        /run/wrappers/bin/sudo chown wwwrun:wwwrun ${parametersPath}
+        watchFilesChanged() {
+          [ ! -f "${varDir}"/watchedFiles ] \
+            || ! sha512sum -c --status ${varDir}/watchedFiles
+        }
+        appDirChanged() {
+          [ ! -f "${varDir}/currentWebappDir" -o \
+            "${app}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ]
+        }
+        updateWatchFiles() {
+          sha512sum ${parametersPath} > ${varDir}/watchedFiles
+        }
+
+        if watchFilesChanged || appDirChanged; then
+          pushd ${app} > /dev/null
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:database:create -n --if-not-exists
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate -n
+          popd > /dev/null
+          echo -n "${app}" > ${varDir}/currentWebappDir
+          updateWatchFiles
+        fi
+      '';
+    };
+
+    services.cron = {
+      systemCronJobs = let
+        prefix = "${config.services.httpd.Prod.user} cd ${app} && ./bin/console --env=prod";
+      in [
+        ''
+          # generate shifts in 27 days (same weekday as yesterday)
+          55 5 * * * ${prefix} app:shift:generate $(date -d "+27 days" +\%Y-\%m-\%d)
+
+          # free pre-booked shifts
+          55 5 * * * ${prefix} app:shift:free $(date -d "+21 days" +\%Y-\%m-\%d)
+
+          # send reminder 2 days before shift
+          #0 6 * * * ${prefix} app:shift:reminder $(date -d "+2 days" +\%Y-\%m-\%d)
+
+          # execute routine for cycle_end/cycle_start, everyday
+          5 6 * * * ${prefix} app:user:cycle_start
+
+          # send alert on shifts booking (low)
+          #0 10 * * * ${prefix} app:shift:send_alerts --emails creneaux@nicecoop.fr $(date -d "+2 days" +\%Y-\%m-\%d) 1
+
+          # send a reminder mail to the user who generate the last code but did not validate the change.
+          #45 21 * * * ${prefix} app:code:verify_change --last_run 24
+        ''
+      ];
+    };
+
+    system.activationScripts.nicecoop_gestion-compte = {
+      deps = [];
+      text = ''
+        install -m 0700 -o wwwrun -g wwwrun -d ${varDir} ${varDir}/phpSessions ${varDir}/var
+      '';
+    };
+
+    services.filesWatcher.phpfpm-nicecoop_gestion-compte = {
+      restart = true;
+      paths = [
+        parametersPath
+      ];
+    };
+
+    secrets.keys."buildbot/nicecoop/production.yml" = {
+      user = "buildbot";
+      group = "buildbot";
+      permissions = "0400";
+      text = builtins.toJSON {
+        database = {
+          host = secrets.mysql.host;
+          port = secrets.mysql.port;
+          name = secrets.mysql.database;
+          user = secrets.mysql.user;
+          password = secrets.mysql.password;
+          version = pkgs.mariadb.mysqlVersion;
+        };
+        admipassword = secrets.adminpassword;
+        smtp = {
+          host = secrets.smtp.host;
+          port = secrets.smtp.port;
+          email = secrets.smtp.email;
+          password = secrets.smtp.password;
+        };
+        secret = secrets.secret;
+      };
+    };
+
+    # secrets.keys."websites/nicecoop/gestion-compte" = {
+    #   user = config.services.httpd.Prod.user;
+    #   group = config.services.httpd.Prod.group;
+    #   permissions = "0400";
+    #   text = ''
+    #     # This file is auto-generated during the composer install
+    #     parameters:
+    #         database_host: ${secrets.mysql.host}
+    #         database_port: ${secrets.mysql.port}
+    #         database_name: ${secrets.mysql.database}
+    #         database_user: ${secrets.mysql.user}
+    #         database_password: ${secrets.mysql.password}
+    #         database_version: ${pkgs.mariadb.mysqlVersion}
+    #         super_admin.username: admin
+    #         super_admin.initial_password: ${secrets.adminpassword}
+    #         mailer_transport: smtp
+    #         mailer_host: ${secrets.smtp.host}
+    #         mailer_port: ${secrets.smtp.port}
+    #         mailer_user: ${secrets.smtp.email}
+    #         mailer_password: ${secrets.smtp.password}
+    #         mailer_encryption: tls
+    #         transactional_mailer_user: ${secrets.smtp.email}
+    #         transactional_mailer_user_name: 'espace membre'
+    #         emails.base_domain: tools.immae.eu
+    #         emails.contact:
+    #             from_name: 'Contact Nicecoop'
+    #             address: ${secrets.smtp.email}
+    #         emails.member:
+    #             from_name: 'Membres Nicecoop'
+    #             address: ${secrets.smtp.email}
+    #         emails.shift:
+    #             from_name: 'Créneaux Nicecoop'
+    #             address: ${secrets.smtp.email}
+    #         emails.formation:
+    #             from_name: 'Formation Nicecoop'
+    #             address: ${secrets.smtp.email}
+    #         emails.admin:
+    #             from_name: 'Admin Nicecoop'
+    #             address: ${secrets.smtp.email}
+    #         emails.noreply:
+    #             from_name: 'Ne pas répondre'
+    #             address: ${secrets.smtp.email}
+    #         emails.sendable:
+    #             - '%emails.contact%'
+    #             - '%emails.member%'
+    #             - '%emails.shift%'
+    #             - '%emails.formation%'
+    #             - '%emails.admin%'
+    #             - '%emails.noreply%'
+    #         shift_mailer_user: null
+    #         secret: ${secrets.secret}
+    #         router.request_context.host: membre.nicecoop.fr
+    #         router.request_context.scheme: https
+    #         router.request_context.base_url: null
+    #         site_name: 'Espace membre @ Nicecoop'
+    #         project_name: 'Nicecoop'
+    #         project_url: 'https://membre.nicecoop.fr/'
+    #         project_url_display: membre.nicecoop.fr
+    #         main_color: null
+    #         local_currency_name: 'monnaie locale'
+    #         place_local_ip_address: '127.0.0.1,192.168.0.x'
+    #         wiki_keys_url: null
+    #         registration_duration: '1 year'
+    #         registration_every_civil_year: false
+    #         helloasso_registration_campaign_url: 'https://www.helloasso.com/associations/my-local-coop/adhesions/re-adhesion'
+    #         helloasso_campaign_id: null
+    #         helloasso_api_key: null
+    #         helloasso_api_password: null
+    #         helloasso_api_base_url: 'https://api.helloasso.com/v3/'
+    #         due_duration_by_cycle: 180
+    #         min_shift_duration: 90
+    #         cycle_duration: '28 days'
+    #         maximum_nb_of_beneficiaries_in_membership: 2
+    #         new_users_start_as_beginner: true
+    #         allow_extra_shifts: true
+    #         max_time_in_advance_to_book_extra_shifts: '3 days'
+    #         display_gauge: true
+    #         use_fly_and_fixed: false
+    #         time_after_which_members_are_late_with_shifts: -9
+    #         reserve_new_shift_to_prior_shifter: true
+    #         forbid_shift_overlap_time: 30
+    #         display_name_shifters: false
+    #         use_card_reader_to_validate_shifts: false
+    #         max_time_at_end_of_shift: 0
+    #         swipe_card_logging: true
+    #         display_swipe_cards_settings: true
+    #         logging.mattermost.enabled: false
+    #         logging.mattermost.level: critical
+    #         logging.mattermost.url: 'http://mattermost.yourcoop.local'
+    #         logging.mattermost.channel: null
+    #         logging.swiftmailer.enabled: false
+    #         logging.swiftmailer.level: critical
+    #         logging.swiftmailer.recipient: null
+    #         code_generation_enabled: true
+    #         display_freeze_account: true
+    #         display_keys_shop: true
+    #     services:
+    #       swiftmailer.mailer.default.transport:
+    #           class:     Swift_SendmailTransport
+    #           arguments: ['/run/wrappers/bin/sendmail -bs']
+    #   '';
+    # };
+
+    services.websites.env.production.vhostConfs.nicecoop_gestion-compte = {
+      certName     = "nicecoop";
+      certMainHost = "membre.nicecoop.fr";
+      hosts        = ["membre.nicecoop.fr"];
+      root         = app.webRoot;
+      extraConfig  = [
+        ''
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${config.services.phpfpm.pools.nicecoop_gestion-compte.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        <Directory ${app.webRoot}>
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride All
+          Require all granted
+        </Directory>
+        ''
+      ];
+    };
+  };
+}
diff --git a/modules/private/websites/nicecoop/gestion-compte/default.nix b/modules/private/websites/nicecoop/gestion-compte/default.nix
new file mode 100644 (file)
index 0000000..2b33e7e
--- /dev/null
@@ -0,0 +1,39 @@
+{ varDir
+, secretsPath
+, composerEnv, fetchFromGitHub, fetchurl, fetchgit }:
+let
+  app = composerEnv.buildPackage (
+    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+    rec {
+      version = "1.32.3";
+      pname = "gestion-compte";
+      name = "${pname}-${version}";
+      src = fetchFromGitHub {
+        owner = "elefan-grenoble";
+        repo = "gestion-compte";
+        rev = "v${version}";
+        sha256 = "16pwp4pqdf85ziryzvcj9ryk9jlz56ja07p8kj7pldghnk9pmkwm";
+      };
+      noDev = true;
+      preInstall = ''
+        sed -i -e "/^    charset: utf8mb4/a\    server_version: '%database_version%'" app/config/config.yml
+        sed -i -e "/database_password: /a\    database_version: 5.5" app/config/parameters.yml.dist
+        export APP_ENV="prod"
+        export SYMFONY_ENV="prod"
+      '';
+      postInstall = ''
+        cd $out
+        patchShebangs bin/console
+        ./bin/console assetic:dump
+        rm -rf var
+        ln -sf ${varDir} var
+        rm -f app/config/parameters.yml
+        ln -sf ${secretsPath} app/config/parameters.yml
+      '';
+      passthru = {
+        inherit varDir secretsPath;
+        webRoot = "${app}/web";
+      };
+    }
+  );
+in app
diff --git a/modules/private/websites/nicecoop/gestion-compte/php-packages.nix b/modules/private/websites/nicecoop/gestion-compte/php-packages.nix
new file mode 100644 (file)
index 0000000..dce22d3
--- /dev/null
@@ -0,0 +1,1018 @@
+{composerEnv, fetchurl, fetchgit ? null, fetchhg ? null, fetchsvn ? null, noDev ? false}:
+
+{
+  packages = {
+    "asmshaon/easy-barcode-generator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "asmshaon-easy-barcode-generator-44c08da6f8ee1585d41f71ebd48b9b920031b22e";
+        src = fetchurl {
+          url = "https://api.github.com/repos/asmshaon/easy-barcode-generator/zipball/44c08da6f8ee1585d41f71ebd48b9b920031b22e";
+          sha256 = "0yzw9ln7hlqncd97w5qk6nxq95sivam3q8c68lhpwqnmcy4353n1";
+        };
+      };
+    };
+    "behat/transliterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "behat-transliterator-baac5873bac3749887d28ab68e2f74db3a4408af";
+        src = fetchurl {
+          url = "https://api.github.com/repos/Behat/Transliterator/zipball/baac5873bac3749887d28ab68e2f74db3a4408af";
+          sha256 = "04dk371h448wjgdk9x9g2mpqwcnx71dfclvspkj23rn3znq964rh";
+        };
+      };
+    };
+    "composer/package-versions-deprecated" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-package-versions-deprecated-b4f54f74ef3453349c24a845d22392cd31e65f1d";
+        src = fetchurl {
+          url = "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d";
+          sha256 = "1hrjxvk8i14pw9gi7j3qc0gljjy74hwdkv8zwsrg5brgyzhqfwam";
+        };
+      };
+    };
+    "doctrine/annotations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-annotations-648b0343343565c4a056bfc8392201385e8d89f0";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0";
+          sha256 = "0mkxq1yaqp6an2gjcgsmg7hq37mrwcj27f94sfkfxq9x6qh02k57";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-56cd022adb5514472cb144c087393c1821911d09";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/cache/zipball/56cd022adb5514472cb144c087393c1821911d09";
+          sha256 = "1ri5pwrnq8pxjv8ljscvlaqzjj7ii87420af4dq133qm35jn4ffr";
+        };
+      };
+    };
+    "doctrine/collections" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-collections-2b44dd4cbca8b5744327de78bafef5945c7e7b5e";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e";
+          sha256 = "0ch52jxr7kpv64dmg4xbzlnsspsc0ykm227h2hvr40clalhdw6n8";
+        };
+      };
+    };
+    "doctrine/common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-common-f3812c026e557892c34ef37f6ab808a6b567da7f";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f";
+          sha256 = "16jf1wzs6ccpw2ny7rkzpf0asdwr1cfzcyw8g5x88i4j9jazn8xa";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-c480849ca3ad6706a39c970cdfe6888fa8a058b8";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8";
+          sha256 = "15j98h80li6m1aj53p8ddy0lkbkanc5kdy6xrikpdd6zhmsfgq9k";
+        };
+      };
+    };
+    "doctrine/deprecations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-deprecations-0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de";
+          sha256 = "1sk1f020n0w7p7r4rsi7wnww85vljrim1i5h9wb0qiz2c4l8jj09";
+        };
+      };
+    };
+    "doctrine/doctrine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-bundle-85460b85edd8f61a16ad311e7ffc5d255d3c937c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/85460b85edd8f61a16ad311e7ffc5d255d3c937c";
+          sha256 = "027gkkr8jdcbk82gw42wyrq4d36ar52cmg6yl7qka6h8albhlmja";
+        };
+      };
+    };
+    "doctrine/doctrine-cache-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-cache-bundle-6bee2f9b339847e8a984427353670bad4e7bdccb";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/6bee2f9b339847e8a984427353670bad4e7bdccb";
+          sha256 = "0gc2h6nqdx9iw6xs2zwyssgw1di1x37a7a8hq31fnac1n5j3xbl1";
+        };
+      };
+    };
+    "doctrine/doctrine-migrations-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-doctrine-migrations-bundle-0a081b55a88259a887af7be654743a8c5f703e99";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/0a081b55a88259a887af7be654743a8c5f703e99";
+          sha256 = "0xzy052liqmmzf675w25ahdwbrrq9zx7djm5f2741za91qcravpw";
+        };
+      };
+    };
+    "doctrine/event-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-event-manager-95aa4cb529f1e96576f3fda9f5705ada4056a520";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520";
+          sha256 = "0xi2s28jmmvrndg1yd0r5s10d9a0q6j2dxdbazvcbws9waf0yrvj";
+        };
+      };
+    };
+    "doctrine/inflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-inflector-4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9";
+          sha256 = "0390gkbk3vdjd98h7wjpdv0579swbavrdb6yrlslfdr068g4bmbf";
+        };
+      };
+    };
+    "doctrine/instantiator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-instantiator-10dcfce151b967d20fde1b34ae6640712c3891bc";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc";
+          sha256 = "1m6pw3bb8v04wqsysj8ma4db8vpm9jnd7ddh8ihdqyfpz8pawjp7";
+        };
+      };
+    };
+    "doctrine/lexer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-lexer-c268e882d4dbdd85e36e4ad69e02dc284f89d229";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229";
+          sha256 = "12g069nljl3alyk15884nd1jc4mxk87isqsmfj7x6j2vxvk9qchs";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-af915024d41669600354efe78664ee86dfca62e1";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/migrations/zipball/af915024d41669600354efe78664ee86dfca62e1";
+          sha256 = "15sgn10x5hfaj057vx2l7ilrwsdmw3j6rqa1d9wli31brb7mxvj0";
+        };
+      };
+    };
+    "doctrine/orm" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-orm-01187c9260cd085529ddd1273665217cae659640";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640";
+          sha256 = "0c5swnkk3zgz5rcj4a7mai0i786w7h86i2pamv9zqkya0nv5h17x";
+        };
+      };
+    };
+    "doctrine/persistence" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-persistence-7a6eac9fb6f61bba91328f15aa7547f4806ca288";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288";
+          sha256 = "0mszkf7lxdhbr5b3ibpn7ipyrf6a6kfj283fvh83akyv1mplsl0h";
+        };
+      };
+    };
+    "doctrine/reflection" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-reflection-1034e5e71f89978b80f9c1570e7226f6c3b9b6fb";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/reflection/zipball/1034e5e71f89978b80f9c1570e7226f6c3b9b6fb";
+          sha256 = "08n0m6z8b66b0v8awl1w8s8ncg61sa25273ba42fbjmn24b3h6mp";
+        };
+      };
+    };
+    "egulias/email-validator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "egulias-email-validator-f88dcf4b14af14a98ad96b14b2b317969eab6715";
+        src = fetchurl {
+          url = "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715";
+          sha256 = "1w0440d8ifasx647wci5ydbqsgxyxpf4z9ksvl999604lj0zr7di";
+        };
+      };
+    };
+    "fig/link-util" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "fig-link-util-5d7b8d04ed3393b4b59968ca1e906fb7186d81e8";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-fig/link-util/zipball/5d7b8d04ed3393b4b59968ca1e906fb7186d81e8";
+          sha256 = "0rzg5y8gk4g6nnjmf70c4zqqddqs4hggjkdyv60qfyim8vzcvnbb";
+        };
+      };
+    };
+    "friendsofsymfony/oauth-server-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "friendsofsymfony-oauth-server-bundle-fcaa25cc49474bdb0db7894f880976fe76ffed23";
+        src = fetchurl {
+          url = "https://api.github.com/repos/FriendsOfSymfony/FOSOAuthServerBundle/zipball/fcaa25cc49474bdb0db7894f880976fe76ffed23";
+          sha256 = "1vn7yrq1h6gqq4gxsja66w8f07klrk6m3mkv79kl7gbikib4syk6";
+        };
+      };
+    };
+    "friendsofsymfony/oauth2-php" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "friendsofsymfony-oauth2-php-546f869d68fb79b284752e6787263d797165dba4";
+        src = fetchurl {
+          url = "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/546f869d68fb79b284752e6787263d797165dba4";
+          sha256 = "0xy8k1hh2gmcpzvfw57jllcsqa1prrh0a962ysayak4b9viq3vf6";
+        };
+      };
+    };
+    "friendsofsymfony/user-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "friendsofsymfony-user-bundle-1049935edd24ec305cc6cfde1875372fa9600446";
+        src = fetchurl {
+          url = "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/1049935edd24ec305cc6cfde1875372fa9600446";
+          sha256 = "1vajl1nlhydd18dx61llqwyl0cdn84yhfviafyfybagr2iwwmihz";
+        };
+      };
+    };
+    "imagine/imagine" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "imagine-imagine-a9a702a946073cbca166718f1b02a1e72d742daa";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-imagine/Imagine/zipball/a9a702a946073cbca166718f1b02a1e72d742daa";
+          sha256 = "1spb4pzzv732jl90x46h5ywrw96n60gj8x22yv24rqyn32dw7djn";
+        };
+      };
+    };
+    "incenteev/composer-parameter-handler" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "incenteev-composer-parameter-handler-e1dd118763503f7fd766f907013e1d76d525fcc4";
+        src = fetchurl {
+          url = "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/e1dd118763503f7fd766f907013e1d76d525fcc4";
+          sha256 = "0b2xp7psyzzyss0fy4gx9bpn7m27wq5cagag880k4l04zl30bf48";
+        };
+      };
+    };
+    "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";
+        };
+      };
+    };
+    "jms/metadata" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "jms-metadata-283c714831d272d78ddd6e52e08ac16d76be30fd";
+        src = fetchurl {
+          url = "https://api.github.com/repos/schmittjoh/metadata/zipball/283c714831d272d78ddd6e52e08ac16d76be30fd";
+          sha256 = "1k4hx6lzp2kz7md036kvfq3bz53fl286qh1fp43cpj6zqqpwnddy";
+        };
+      };
+    };
+    "kriswallsmith/assetic" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
+        src = fetchurl {
+          url = "https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
+          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
+        };
+      };
+    };
+    "liip/imagine-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "liip-imagine-bundle-3084c77e984ec669e0d645250a3cb1077d8b92f6";
+        src = fetchurl {
+          url = "https://api.github.com/repos/liip/LiipImagineBundle/zipball/3084c77e984ec669e0d645250a3cb1077d8b92f6";
+          sha256 = "0qifrgmy7gnj4izcbnx2dx4q4029mnbwvyzidvvm45hnnqqb2dfx";
+        };
+      };
+    };
+    "michelf/php-markdown" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "michelf-php-markdown-5024d623c1a057dcd2d076d25b7d270a1d0d55f3";
+        src = fetchurl {
+          url = "https://api.github.com/repos/michelf/php-markdown/zipball/5024d623c1a057dcd2d076d25b7d270a1d0d55f3";
+          sha256 = "1zhaiqfzvcf36vq2wvqx0gyyj4d1rs9i8vxn8191cyxhkxap3zfw";
+        };
+      };
+    };
+    "monolog/monolog" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "monolog-monolog-904713c5929655dc9b97288b69cfeedad610c9a1";
+        src = fetchurl {
+          url = "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1";
+          sha256 = "17fjd5dk45b6dbfx15vxqk6mnm3fsn2kd8nsjfjd2zk3zfihq4jj";
+        };
+      };
+    };
+    "nesbot/carbon" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "nesbot-carbon-01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a";
+          sha256 = "1czgfiimnf0fs19fjwwwpv4d3wk1ab9v7dxagz0ii8vz5gpz0vwv";
+        };
+      };
+    };
+    "ocramius/proxy-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "ocramius-proxy-manager-2d7cd2a79cd3ade90c46211baae1b88d47683917";
+        src = fetchurl {
+          url = "https://api.github.com/repos/Ocramius/ProxyManager/zipball/2d7cd2a79cd3ade90c46211baae1b88d47683917";
+          sha256 = "0bm6iwvbj665kmfrn5h89zk07w7icwax11cnblzsfxb3idmgswyz";
+        };
+      };
+    };
+    "ornicar/gravatar-bundle" = {
+      targetDir = "Ornicar/GravatarBundle";
+      src = composerEnv.buildZipPackage {
+        name = "ornicar-gravatar-bundle-5a4e3619f0654eaa3ad4e4a45d927bd0bf044e7c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/henrikbjorn/GravatarBundle/zipball/5a4e3619f0654eaa3ad4e4a45d927bd0bf044e7c";
+          sha256 = "17a9ljhqjwkd7apkfndykjwkq1as7xv0vjz4di3dg1aii06ixnjh";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-96c132c7f2f7bc3230723b66e89f8f150b29d5ae";
+        src = fetchurl {
+          url = "https://api.github.com/repos/paragonie/random_compat/zipball/96c132c7f2f7bc3230723b66e89f8f150b29d5ae";
+          sha256 = "0qjzwklm1gfxsqalmpbg3ll7f0dasn56frgl5jdlmy8g6x09hql2";
+        };
+      };
+    };
+    "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-8622567409010282b7aeebe4bb841fe98b58dcaf";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf";
+          sha256 = "0qfvyfp3mli776kb9zda5cpc8cazj3prk0bg0gm254kwxyfkfrwn";
+        };
+      };
+    };
+    "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-d49695b909c3b7628b6289db5479a1c204601f11";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11";
+          sha256 = "0sb0mq30dvmzdgsnqvw3xh4fb4bqjncx72kf8n622f94dd48amln";
+        };
+      };
+    };
+    "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-80a38234bde8321fb92aa0b8c27978a272bb4baf";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/80a38234bde8321fb92aa0b8c27978a272bb4baf";
+          sha256 = "0y1as1r5l5j7474jdqla3hk6s7d3ac5aa8b6whlw37r8qvglqf5c";
+        };
+      };
+    };
+    "sensio/framework-extra-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensio-framework-extra-bundle-585f4b3a1c54f24d1a8431c729fc8f5acca20c8a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/585f4b3a1c54f24d1a8431c729fc8f5acca20c8a";
+          sha256 = "1pyw3x5s4bhvf06xnjyana4f4g5jcal3n8p56vlrik0gczpgbq5n";
+        };
+      };
+    };
+    "sensiolabs/security-checker" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sensiolabs-security-checker-a576c01520d9761901f269c4934ba55448be4a54";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sensiolabs/security-checker/zipball/a576c01520d9761901f269c4934ba55448be4a54";
+          sha256 = "0zlylw1gr1g32yzg35jkmavxj8m5mxyl9iyfxmisna5y74f07l6s";
+        };
+      };
+    };
+    "spipu/html2pdf" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "spipu-html2pdf-c002749cf21733d53fb9e50d082ca3d1bde06c85";
+        src = fetchurl {
+          url = "https://api.github.com/repos/spipu/html2pdf/zipball/c002749cf21733d53fb9e50d082ca3d1bde06c85";
+          sha256 = "0xkyx2pr3py6jbzsl16z2prszwfmmk3w5djrg8vq8m45jlr85paq";
+        };
+      };
+    };
+    "swiftmailer/swiftmailer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "swiftmailer-swiftmailer-8a5d5072dca8f48460fce2f4131fcc495eec654c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c";
+          sha256 = "1p9m4fw9y9md9a7msbmnc0hpdrky8dwrllnyg1qf1cdyp9d70x1d";
+        };
+      };
+    };
+    "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/deprecation-contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-deprecation-contracts-e8b495ea28c1d97b5e0c121748d6f9b53d075c66";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66";
+          sha256 = "09k869asjb7cd3xh8i5ps824k5y6v510sbpzfalndwy3knig9fig";
+        };
+      };
+    };
+    "symfony/http-client" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-http-client-8a3929c814cba77db93de61c22759e0dbeaa4c87";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/http-client/zipball/8a3929c814cba77db93de61c22759e0dbeaa4c87";
+          sha256 = "1x6s8d7wlms3krhz60mspj4f618s2n5gdnyja18mxmlcr7nm2i34";
+        };
+      };
+    };
+    "symfony/http-client-contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-http-client-contracts-ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70";
+          sha256 = "13256s0x0kicrb1sr0gmp8pbcmccx8a65h58kvfg670xzwrdklb2";
+        };
+      };
+    };
+    "symfony/mime" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-mime-bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/mime/zipball/bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd";
+          sha256 = "0y5jpx21x5l083pma0g1wv3if84vmid36cclg4m7j2g0sj7azwpw";
+        };
+      };
+    };
+    "symfony/monolog-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-monolog-bundle-dd80460fcfe1fa2050a7103ad818e9d0686ce6fd";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/monolog-bundle/zipball/dd80460fcfe1fa2050a7103ad818e9d0686ce6fd";
+          sha256 = "03bd66gcbaq8mnpj4gzz0z8l9lyj25wr6r9ynhnwl5x1rqw04591";
+        };
+      };
+    };
+    "symfony/polyfill-apcu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-apcu-43273a33c46f9d5a08dac76859f63d6814242e81";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-apcu/zipball/43273a33c46f9d5a08dac76859f63d6814242e81";
+          sha256 = "00my23k2xlrsrvpwdn8wcr0jfgsfb9yhmx8gjx2sq5krvnfzg47v";
+        };
+      };
+    };
+    "symfony/polyfill-ctype" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-ctype-6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4";
+          sha256 = "18235xiqpjx9nzx3pzylm5yzqr6n1j8wnnrzgab1hpbvixfrbqba";
+        };
+      };
+    };
+    "symfony/polyfill-iconv" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-iconv-143f1881e655bebca1312722af8068de235ae5dc";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc";
+          sha256 = "19v4r40vx62a181l6zfs7n40w9f7npy7jw5x6dssg40hl4a0i3p2";
+        };
+      };
+    };
+    "symfony/polyfill-intl-icu" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-icu-e407643d610e5f2c8a4b14189150f68934bf5e48";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e407643d610e5f2c8a4b14189150f68934bf5e48";
+          sha256 = "0dkdrjpb2msqzpkp38ssaj7qmphq3j7qynyvd8i9xry0rkdgbmh7";
+        };
+      };
+    };
+    "symfony/polyfill-intl-idn" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-idn-59a8d271f00dd0e4c2e518104cc7963f655a1aa8";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8";
+          sha256 = "1bcdl48ji0dmswwvw2b66qxdxxawbx8bgicc02la92gacps08n5v";
+        };
+      };
+    };
+    "symfony/polyfill-intl-normalizer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-normalizer-219aa369ceff116e673852dce47c3a41794c14bd";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd";
+          sha256 = "1cwckrazq4p4i9ysjh8wjqw8qfnp0rx48pkwysch6z7vkgcif22w";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e";
+          sha256 = "0y289x91c9lgr8vlixj5blayf9lsgi4nn2gyn3a99brvn2jnh6q8";
+        };
+      };
+    };
+    "symfony/polyfill-php56" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php56-54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675";
+          sha256 = "0gbw33finml181s3gbvamrsav368rysa8fx69fbq0ff9cvn2lmc6";
+        };
+      };
+    };
+    "symfony/polyfill-php70" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php70-5f03a781d984aae42cebd18e7912fa80f02ee644";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644";
+          sha256 = "0yzw1gp2q46pk8fmgvz4nyiz34m6d4kiardyr9ajdmfrlqsiy202";
+        };
+      };
+    };
+    "symfony/polyfill-php72" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php72-bf44a9fd41feaac72b074de600314a93e2ae78e2";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2";
+          sha256 = "11knb688wcf8yvrprgp4z02z3nb6s5xj3wrv77n2qjkc7nc8q7l7";
+        };
+      };
+    };
+    "symfony/polyfill-php73" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php73-e440d35fa0286f77fb45b79a03fedbeda9307e85";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85";
+          sha256 = "1c7w7j375a1fxq5m4ldy72jg5x4dpijs8q9ryqxvd6gmj1lvncqy";
+        };
+      };
+    };
+    "symfony/polyfill-php80" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php80-cfa0ae98841b9e461207c13ab093d76b0fa7bace";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace";
+          sha256 = "1kbh4j01kxxc39ls9kzkg7dj13cdlzwy599b96harisysn47jw2n";
+        };
+      };
+    };
+    "symfony/service-contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-service-contracts-4b426aac47d6427cc1a1d0f7e2ac724627f5966c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c";
+          sha256 = "0lh0vxy0h4wsjmnlf42s950bicsvkzz6brqikfnfb5kmvi0xhcm6";
+        };
+      };
+    };
+    "symfony/swiftmailer-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-swiftmailer-bundle-defa9bdfc0191ed70b389cb93c550c6c82cf1745";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/defa9bdfc0191ed70b389cb93c550c6c82cf1745";
+          sha256 = "07jbf1x6im6vysh73is4vj5jzjkj6ywns1dk440j21gq7m8bcrkx";
+        };
+      };
+    };
+    "symfony/symfony" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-symfony-ba0e346e3ad11de4a307fe4fa2452a3656dcc17b";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/symfony/zipball/ba0e346e3ad11de4a307fe4fa2452a3656dcc17b";
+          sha256 = "0mkp0729wkz3qwf5j8xn37v2sji7dp3s1dpr41syg325fv6z42j0";
+        };
+      };
+    };
+    "tecnickcom/tcpdf" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "tecnickcom-tcpdf-cc54c1503685e618b23922f53635f46e87653662";
+        src = fetchurl {
+          url = "https://api.github.com/repos/tecnickcom/TCPDF/zipball/cc54c1503685e618b23922f53635f46e87653662";
+          sha256 = "1rb1hbw0mr313wsffp9m8b6friyas93ihl52q04r9azy8x9igf2v";
+        };
+      };
+    };
+    "twig/twig" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "twig-twig-ab402673db8746cb3a4c46f3869d6253699f614a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/twigphp/Twig/zipball/ab402673db8746cb3a4c46f3869d6253699f614a";
+          sha256 = "1xy4dziysc4b7md1i9r4s3rcw0vr5sj06nl0n6qdj0hq5g856sgp";
+        };
+      };
+    };
+    "vich/uploader-bundle" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "vich-uploader-bundle-8ef4935f5535bb4e967f30ee95dff358c7c0705e";
+        src = fetchurl {
+          url = "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/8ef4935f5535bb4e967f30ee95dff358c7c0705e";
+          sha256 = "075mgj1zb7n50h6fj5sjyb6fnc92akk4x83fsyb9sfc7kjami1d6";
+        };
+      };
+    };
+    "zendframework/zend-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "zendframework-zend-code-268040548f92c2bfcba164421c1add2ba43abaaa";
+        src = fetchurl {
+          url = "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa";
+          sha256 = "1jhz4xr5a3j2r6n9l5pnmdblkf67fyd0kmwm9k1bcrmph4fs63j0";
+        };
+      };
+    };
+    "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 = {
+    "myclabs/deep-copy" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "myclabs-deep-copy-14daed4296fae74d9e3201d2c4925d1acb7aa614";
+        src = fetchurl {
+          url = "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614";
+          sha256 = "11593chczjw8k5jix2mj9v31lg5jgpxqrkhp27bxd96aajapqd9w";
+        };
+      };
+    };
+    "phar-io/manifest" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phar-io-manifest-7761fcacf03b4d4f16e7ccb606d4879ca431fcf4";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4";
+          sha256 = "1n59a0gnk43ryl54bc37hlsi1spvi8280bq64zddxrpagyjyp15a";
+        };
+      };
+    };
+    "phar-io/version" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phar-io-version-45a2ec53a73c70ce41d55cedef9063630abaf1b6";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6";
+          sha256 = "0syr7v2b3lsdavfa22z55sdkg5awc3jlzpgn0qk0d3vf6x96hvzp";
+        };
+      };
+    };
+    "phpdocumentor/reflection-common" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-common-1d01c49d4ed62f25aa84a747ad35d5a16924662b";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b";
+          sha256 = "1wx720a17i24471jf8z499dnkijzb4b8xra11kvw9g9hhzfadz1r";
+        };
+      };
+    };
+    "phpdocumentor/reflection-docblock" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-reflection-docblock-622548b623e81ca6d78b721c5e029f4ce664f170";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170";
+          sha256 = "1vs0fhpqk8s9bc0sqyfhpbs63q14lfjg1f0c1dw4jz97145j6r1n";
+        };
+      };
+    };
+    "phpdocumentor/type-resolver" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpdocumentor-type-resolver-77a32518733312af16a44300404e945338981de3";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3";
+          sha256 = "0y6byv5psmrcy6ga7nghzblv61rjbni046h0pgjda8r8qmz26yr4";
+        };
+      };
+    };
+    "phpspec/prophecy" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpspec-prophecy-bbcd7380b0ebf3961ee21409db7b38bc31d69a13";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13";
+          sha256 = "1xw7x12lws8qdrryhbgjiih48gxwlq99ayhhsy0q2ls9i9p6mw0w";
+        };
+      };
+    };
+    "phpunit/php-code-coverage" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-code-coverage-807e6013b00af69b6c5d9ceb4282d0393dbb9d8d";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d";
+          sha256 = "04l5piavahvxp5j3f6s1cx85b3lnjidnlw3nixk24nwqx4bdfk10";
+        };
+      };
+    };
+    "phpunit/php-file-iterator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-file-iterator-42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5";
+          sha256 = "1mqbdc4xdawv3w591ri9spa8rqric0rzp7bfx751r87cfqgi3lay";
+        };
+      };
+    };
+    "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-2454ae1765516d20c4ffe103d85a58a9a3bd5662";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662";
+          sha256 = "12gaqzvgh5y212zmp253z03w0f040v00zqafymilzkc9l0m2fsxd";
+        };
+      };
+    };
+    "phpunit/php-token-stream" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-php-token-stream-9c1da83261628cb24b6a6df371b6e312b3954768";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768";
+          sha256 = "1q0gbd9hz6psa0a78cdxdw9xavfy1r2ilp88spbrps761081wmr5";
+        };
+      };
+    };
+    "phpunit/phpunit" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpunit-phpunit-9467db479d1b0487c99733bb1e7944d32deded2c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c";
+          sha256 = "192mri9ikbcc8ix4pwiwyyw8jc9xfg77il4wjbadycw4k4f43944";
+        };
+      };
+    };
+    "sebastian/code-unit-reverse-lookup" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-code-unit-reverse-lookup-1de8cd5c010cb153fcd68b8d0f64606f523f7619";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619";
+          sha256 = "17690sqmhdabhvgalrf2ypbx4nll4g4cwdbi51w5p6w9n8cxch1a";
+        };
+      };
+    };
+    "sebastian/comparator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-comparator-1dc7ceb4a24aede938c7af2a9ed1de09609ca770";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770";
+          sha256 = "0acdcv5dfzrxkpi3nhqd5w2zwj96rpgwx0wkj01qixvas45jmfzf";
+        };
+      };
+    };
+    "sebastian/diff" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-diff-14f72dd46eaf2f2293cbe79c93cc0bc43161a211";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211";
+          sha256 = "0planffhifwhxgml9r3ma89c83jvbrqilj517a5ps9x8vc6kk312";
+        };
+      };
+    };
+    "sebastian/environment" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-environment-d47bbbad83711771f167c72d4e3f25f7fcc1f8b0";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0";
+          sha256 = "1s5wfp79bx2diw9jxfdm6l54286pr9b1rhs7s2j71rvj4y7pycgp";
+        };
+      };
+    };
+    "sebastian/exporter" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-exporter-73a9676f2833b9a7c36968f9d882589cd75511e6";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6";
+          sha256 = "1v7fmy6l3mnl7kl8a842v5j1fl6xjlmnn6w6fvvgcw813ab5xgax";
+        };
+      };
+    };
+    "sebastian/global-state" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-global-state-e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4";
+          sha256 = "1489kfvz0gg6jprakr43mjkminlhpsimcdrrxkmsm6mmhahbgjnf";
+        };
+      };
+    };
+    "sebastian/object-enumerator" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-object-enumerator-e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2";
+          sha256 = "10g778j02h3kywvz4ldhin64zbypxpl0l39rm2ycsr7iin8q904w";
+        };
+      };
+    };
+    "sebastian/object-reflector" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-object-reflector-9b8772b9cbd456ab45d4a598d2dd1a1bced6363d";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d";
+          sha256 = "010g9mkf3s1hcbwn1wvd9s72xcyjzrb6csx472xs69yln1mr11z8";
+        };
+      };
+    };
+    "sebastian/recursion-context" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-recursion-context-367dcba38d6e1977be014dc4b22f47a484dac7fb";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb";
+          sha256 = "1zpq0qk2mgwnbyhjnj05dz2n2v8hvj2g4jy68fd5klxxkdr92ps7";
+        };
+      };
+    };
+    "sebastian/resource-operations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-resource-operations-31d35ca87926450c44eae7e2611d45a7a65ea8b3";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3";
+          sha256 = "10im8r899k4jdch1r4n6nbfvxbqnndg3bqrzlvxi03w501pcsxfd";
+        };
+      };
+    };
+    "sebastian/version" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "sebastian-version-99732be0ddb3361e16ad77b68ba41efc8e979019";
+        src = fetchurl {
+          url = "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019";
+          sha256 = "0wrw5hskz2hg5aph9r1fhnngfrcvhws1pgs0lfrwindy066z6fj7";
+        };
+      };
+    };
+    "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-75857fc94e9cb68e7ab32e7a962750f73ce40396";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/phpunit-bridge/zipball/75857fc94e9cb68e7ab32e7a962750f73ce40396";
+          sha256 = "17x05cxf9kcjim474v56g7wgvm84bvixljra6kfv3hljxlr0sdqd";
+        };
+      };
+    };
+    "theseer/tokenizer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "theseer-tokenizer-34a41e998c2183e22995f158c581e7b5e755ab9e";
+        src = fetchurl {
+          url = "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e";
+          sha256 = "1za4a017kjb4rw2ydglip4bp5q2y7mfiycj3fvnp145i84jc7n0q";
+        };
+      };
+    };
+    "webmozart/assert" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "webmozart-assert-11cb2199493b2f8a3b53e7f19068fc6aac760991";
+        src = fetchurl {
+          url = "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991";
+          sha256 = "18qiza1ynwxpi6731jx1w5qsgw98prld1lgvfk54z92b1nc7psix";
+        };
+      };
+    };
+  };
+}
diff --git a/modules/private/websites/nicecoop/gestion-compte_integration.nix b/modules/private/websites/nicecoop/gestion-compte_integration.nix
new file mode 100644 (file)
index 0000000..8c5d270
--- /dev/null
@@ -0,0 +1,158 @@
+{ lib, pkgs, config, ... }:
+let
+  secrets = config.myEnv.websites.nicecoop.gestion-compte-integration;
+  varDir = "/var/lib/nicecoop_gestion-compte_integration/var";
+  parametersPath = "/var/lib/buildbot/outputs/nicecoop/gestion/sandbox/parameters.yml";
+  app = pkgs.callPackage ./gestion-compte {
+    inherit varDir;
+    secretsPath = parametersPath;
+  };
+  cfg = config.myServices.websites.nicecoop.gestion-compte-integration;
+in {
+  options.myServices.websites.nicecoop.gestion-compte-integration.enable = lib.mkEnableOption "enable nicecoop's gestion-compte website";
+
+  config = lib.mkIf cfg.enable {
+    services.phpfpm.pools.nicecoop_gestion-compte_integration = {
+      user = config.services.httpd.Inte.user;
+      group = config.services.httpd.Inte.group;
+      settings = {
+        "listen.owner" = config.services.httpd.Inte.user;
+        "listen.group" = config.services.httpd.Inte.group;
+        "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
+          app
+          varDir
+          parametersPath
+          "/tmp"
+        ];
+        "php_admin_value[upload_max_filesize]" = "20M";
+        "php_admin_value[post_max_size]" = "20M";
+        "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
+        "pm" = "dynamic";
+        "pm.max_children" = "20";
+        "pm.start_servers" = "2";
+        "pm.min_spare_servers" = "1";
+        "pm.max_spare_servers" = "3";
+      };
+    };
+    services.cron = {
+      systemCronJobs = let
+        prefix = "${config.services.httpd.Prod.user} cd ${app} && ./bin/console --env=prod";
+      in [
+        ''
+          # generate shifts in 80 to 90 days
+          55 5 * * * ${prefix} app:shift:generate --quiet $(date -d "+80 days" +\%Y-\%m-\%d) --to $(date -d "+90 days" +\%Y-\%m-\%d)
+
+          # free pre-booked shifts
+          55 5 * * * ${prefix} app:shift:free --quiet $(date -d "+21 days" +\%Y-\%m-\%d)
+
+          # send reminder 2 days before shift
+          0 6 * * * ${prefix} app:shift:reminder --quiet $(date -d "+2 days" +\%Y-\%m-\%d)
+
+          # execute routine for cycle_end/cycle_start, everyday
+          5 6 * * * ${prefix} app:user:cycle_start --quiet
+
+          # send alert on shifts booking (low)
+          0 10 * * * ${prefix} app:shift:send_alerts --quiet --emails creneaux@nicecoop.fr $(date -d "+2 days" +\%Y-\%m-\%d) 1
+
+          # send a reminder mail to the user who generate the last code but did not validate the change.
+          45 21 * * * ${prefix} app:code:verify_change --quiet --last_run 24
+        ''
+      ];
+    };
+    system.extraSystemBuilderCmds = let
+      tarball = pkgs.runCommand "sandbox.tar.gz" {} ''
+        tar -P --transform="s@${app}@sandbox_app@" -czf $out ${app}
+      '';
+    in ''
+      mkdir -p $out/nicecoop/gestion
+      ln -s ${tarball} $out/nicecoop/gestion/sandbox.tar.gz
+    '';
+    systemd.services.phpfpm-nicecoop_gestion-compte_integration = {
+      after = lib.mkAfter ["mysql.service"];
+      wants = ["mysql.service"];
+      preStart = lib.mkAfter ''
+        /run/wrappers/bin/sudo chown wwwrun:wwwrun ${parametersPath}
+        watchFilesChanged() {
+          [ ! -f "${varDir}"/watchedFiles ] \
+            || ! sha512sum -c --status ${varDir}/watchedFiles
+        }
+        appDirChanged() {
+          [ ! -f "${varDir}/currentWebappDir" -o \
+            "${app}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ]
+        }
+        updateWatchFiles() {
+          sha512sum ${parametersPath} > ${varDir}/watchedFiles
+        }
+
+        if watchFilesChanged || appDirChanged; then
+          pushd ${app} > /dev/null
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:database:create -n --if-not-exists
+          /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate -n
+          popd > /dev/null
+          echo -n "${app}" > ${varDir}/currentWebappDir
+          updateWatchFiles
+        fi
+      '';
+    };
+
+    system.activationScripts.nicecoop_gestion-compte_integration = {
+      deps = [];
+      text = ''
+        install -m 0700 -o wwwrun -g wwwrun -d ${varDir} ${varDir}/phpSessions ${varDir}/var
+      '';
+    };
+
+    services.filesWatcher.phpfpm-nicecoop_gestion-compte_integration = {
+      restart = true;
+      paths = [
+        parametersPath
+      ];
+    };
+
+    secrets.keys."buildbot/nicecoop/sandbox.yml" = {
+      user = "buildbot";
+      group = "buildbot";
+      permissions = "0400";
+      text = builtins.toJSON {
+        database = {
+          host = secrets.mysql.host;
+          port = secrets.mysql.port;
+          name = secrets.mysql.database;
+          user = secrets.mysql.user;
+          password = secrets.mysql.password;
+          version = pkgs.mariadb.mysqlVersion;
+        };
+        admipassword = secrets.adminpassword;
+        smtp = {
+          host = secrets.smtp.host;
+          port = secrets.smtp.port;
+          email = secrets.smtp.email;
+          password = secrets.smtp.password;
+        };
+        secret = secrets.secret;
+      };
+    };
+
+    services.websites.env.integration.vhostConfs.nicecoop_gestion-compte = {
+      certName     = "integration";
+      addToCerts   = true;
+      hosts        = ["gestion-compte.nc.immae.dev"];
+      root         = app.webRoot;
+      extraConfig  = [
+        ''
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${config.services.phpfpm.pools.nicecoop_gestion-compte_integration.socket}|fcgi://localhost"
+        </FilesMatch>
+
+        <Directory ${app.webRoot}>
+          Options Indexes FollowSymLinks MultiViews Includes
+          AllowOverride All
+          Require all granted
+        </Directory>
+        ''
+      ];
+    };
+  };
+}
+
diff --git a/modules/private/websites/nicecoop/odoo.nix b/modules/private/websites/nicecoop/odoo.nix
new file mode 100644 (file)
index 0000000..f8f44e6
--- /dev/null
@@ -0,0 +1,127 @@
+{ lib, config, pkgs, ... }:
+let
+  cfg = config.myServices.websites.nicecoop.odoo;
+  pcfg = config.myEnv.websites.nicecoop.odoo;
+  odoo = pkgs.callPackage ./odoo {};
+  hostname = "odoo.nc.immae.dev";
+  download-bundles = let
+    nix-bundle = import (builtins.fetchTarball "https://github.com/matthewbauer/nix-bundle/archive/master.tar.gz") {};
+    extraTargets = {
+      wkhtmltopdf = (import <nixpkgs> { overlays = []; }).wkhtmltopdf;
+    };
+    odoo-bundle = nix-bundle.nix-bootstrap { target = odoo; run = "/bin/odoo"; extraTargets = builtins.attrValues extraTargets; };
+  in
+    pkgs.runCommand "download-bundles" {} ''
+      mkdir -p $out
+      cp ${odoo-bundle} $out/odoo
+      chmod +x $out/*
+      cd $out
+      sha256sum * > sha256sums.txt
+      cat > extra-paths.json <<"EOF"
+      ${builtins.toJSON extraTargets}
+      EOF
+    '';
+in {
+  options.myServices.websites.nicecoop.odoo.enable = lib.mkEnableOption "enable nicecoop's odoo website";
+
+  config = lib.mkIf cfg.enable {
+    myServices.databases.postgresql.authorizedHosts = {
+      nicecoop = [
+        {
+          username = "bucardo";
+          database = "nicecoop_odoo";
+          ip4 = ["82.65.251.137"];
+          ip6 = ["2a01:e0a:58d:55f0::/64"];
+        }
+      ];
+    };
+    secrets.keys."websites/nicecoop/odoo.conf" = {
+      user = config.services.httpd.Inte.user;
+      group = config.services.httpd.Inte.group;
+      permissions = "0400";
+      text = ''
+        [options]
+        ; This is the password that allows database operations:
+        admin_passwd = ${pcfg.admin_password}
+        db_host = ${pcfg.postgresql.socket}
+        db_port = ${pcfg.postgresql.port}
+        db_user = ${pcfg.postgresql.user}
+        db_password = ${pcfg.postgresql.password}
+        db_name = ${pcfg.postgresql.database}
+        db_maxconn = 64
+
+        workers = 5
+        max_cron_threads = 2
+        limit_time_cpu = 60
+        limit_time_real = 170
+        limit_memory_soft = 471974428
+        limit_memory_hard = 1395864371
+        limit_request = 8196
+        osv_memory_count_limit = False
+        osv_memory_age_limit = 1.0
+        without_demo = ['all']
+
+        proxy_mode = True
+        http_interface = 127.0.0.1
+        http_port = ${builtins.toString pcfg.port}
+        longpolling_port = ${builtins.toString pcfg.longpoll_port}
+      '';
+    };
+
+    services.websites.env.integration.modules = [ "remoteip" ];
+    services.websites.env.integration.vhostConfs.nicecoop_odoo = {
+      certName     = "integration";
+      addToCerts   = true;
+      hosts        = [ hostname ];
+      root         = null;
+      extraConfig  = [
+        ''
+        Alias /download-bundles ${download-bundles}
+        RewriteEngine On
+        ProxyPreserveHost on
+        ProxyVia On
+        ProxyRequests Off
+        ProxyPass /download-bundles !
+        ProxyPassMatch ^/.well-known/acme-challenge !
+        ProxyPass /longpoll http://localhost:${builtins.toString pcfg.longpoll_port}/
+        ProxyPassReverse /longpoll http://localhost:${builtins.toString pcfg.longpoll_port}/
+        ProxyPass / http://localhost:${builtins.toString pcfg.port}/
+        ProxyPassReverse / http://localhost:${builtins.toString pcfg.port}/
+        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
+        RemoteIPHeader X-Real-IP
+
+        <Directory ${download-bundles}>
+          Require all granted
+        </Directory>
+        ''
+      ];
+    };
+
+    services.filesWatcher.nicecoop-odoo = {
+      restart = true;
+      paths = [ config.secrets.fullPaths."websites/nicecoop/odoo.conf" ];
+    };
+    systemd.services.nicecoop-odoo = {
+      description = "Nicecoop Odoo website";
+      after = [ "network.target" ];
+      wantedBy = [ "multi-user.target" ];
+
+      path = [ (import <nixpkgs> { overlays = []; }).wkhtmltopdf ];
+      serviceConfig = {
+        Environment = [
+          "HOME=%S/nicecoop_odoo"
+        ];
+        Type = "simple";
+        ExecStart = "${odoo}/bin/odoo -c ${config.secrets.fullPaths."websites/nicecoop/odoo.conf"}";
+        User = "wwwrun";
+        Restart = "always";
+        RestartSec = "5s";
+        StandardOutput = "journal";
+        StandardError = "inherit";
+        StateDirectory = "nicecoop_odoo";
+        WorkingDirectory = "%S/nicecoop_odoo";
+      };
+    };
+
+  };
+}
diff --git a/modules/private/websites/nicecoop/odoo/default.nix b/modules/private/websites/nicecoop/odoo/default.nix
new file mode 100644 (file)
index 0000000..3479f6f
--- /dev/null
@@ -0,0 +1,37 @@
+{ poetry2nix, runCommand, fetchFromGitHub, openldap, cyrus_sasl, pkg-config, python36 }:
+let
+  version = "13.0";
+  commit = "8353c069529030bddf4bff071c13906565ddc7f1";
+  poetryApp = poetry2nix.mkPoetryApplication rec {
+    src = fetchFromGitHub {
+      owner = "odoo";
+      repo = "odoo";
+      rev = commit;
+      sha256 = "0lyq7bylb4xnry7vn1k39k0w9i064hpm1d3fq2h9lsyakhxdnb1p";
+    };
+    overrides = poetry2nix.overrides.withDefaults (self: super: {
+      pyldap = super.pyldap.overridePythonAttrs (old: {
+        buildInputs = old.buildInputs ++ [ openldap cyrus_sasl ];
+        nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ];
+        preConfigure = old.preConfigure or "" + ''
+          export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -isystem ${cyrus_sasl.dev}/include/sasl"
+        '';
+      });
+    });
+    pyproject = ./pyproject.toml;
+    poetrylock = ./poetry.lock;
+    python = python36;
+    nativeBuildInputs = [ openldap ];
+    preBuild = ''
+      mv addons/* odoo/addons
+      '';
+  };
+in
+  runCommand "python3.6-odoo-${version}" {} ''
+    mkdir -p $out
+    cp -a ${poetryApp}/* $out/
+    chmod -R u+w $out
+    find $out -type f -exec sed -i -e "s@${poetryApp}@$out@g" {} \;
+    cd $out/lib/python3.6/site-packages/odoo
+    patch -p2 < ${./odoo.patch}
+  ''
diff --git a/modules/private/websites/nicecoop/odoo/odoo.patch b/modules/private/websites/nicecoop/odoo/odoo.patch
new file mode 100644 (file)
index 0000000..a921ed4
--- /dev/null
@@ -0,0 +1,26 @@
+diff --git a/odoo/service/server.py b/odoo/service/server.py
+index 421de812ba5..94f551b025d 100644
+--- a/odoo/service/server.py
++++ b/odoo/service/server.py
+@@ -701,7 +701,7 @@ class PreforkServer(CommonServer):
+     def long_polling_spawn(self):
+         nargs = stripped_sys_argv()
+-        cmd = [sys.executable, sys.argv[0], 'gevent'] + nargs[1:]
++        cmd = [sys.argv[0], 'gevent'] + nargs[1:]
+         popen = subprocess.Popen(cmd)
+         self.long_polling_pid = popen.pid
+diff --git a/odoo/addons/base/models/ir_attachment.py b/odoo/addons/base/models/ir_attachment.py
+index abbbe7826a3..7e31edf21d3 100644
+--- a/odoo/addons/base/models/ir_attachment.py
++++ b/odoo/addons/base/models/ir_attachment.py
+@@ -46,7 +46,7 @@ class IrAttachment(models.Model):
+     @api.model
+     def _storage(self):
+-        return self.env['ir.config_parameter'].sudo().get_param('ir_attachment.location', 'file')
++        return self.env['ir.config_parameter'].sudo().get_param('ir_attachment.location', 'db')
+     @api.model
+     def _filestore(self):
diff --git a/modules/private/websites/nicecoop/odoo/poetry.lock b/modules/private/websites/nicecoop/odoo/poetry.lock
new file mode 100644 (file)
index 0000000..92782c3
--- /dev/null
@@ -0,0 +1,1085 @@
+[[package]]
+category = "main"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+name = "appdirs"
+optional = false
+python-versions = "*"
+version = "1.4.4"
+
+[[package]]
+category = "main"
+description = "Classes Without Boilerplate"
+name = "attrs"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "21.2.0"
+
+[package.extras]
+dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+
+[[package]]
+category = "main"
+description = "Internationalization utilities"
+name = "babel"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.6.0"
+
+[package.dependencies]
+pytz = ">=0a"
+
+[[package]]
+category = "main"
+description = "Screen-scraping library"
+name = "beautifulsoup4"
+optional = false
+python-versions = "*"
+version = "4.9.3"
+
+[package.dependencies]
+[package.dependencies.soupsieve]
+python = ">=3.0"
+version = ">1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
+[[package]]
+category = "main"
+description = "A decorator for caching properties in classes."
+name = "cached-property"
+optional = false
+python-versions = "*"
+version = "1.5.2"
+
+[[package]]
+category = "main"
+description = "Python package for providing Mozilla's CA Bundle."
+name = "certifi"
+optional = false
+python-versions = "*"
+version = "2021.5.30"
+
+[[package]]
+category = "main"
+description = "Universal encoding detector for Python 2 and 3"
+name = "chardet"
+optional = false
+python-versions = "*"
+version = "3.0.4"
+
+[[package]]
+category = "main"
+description = "Cross-platform colored terminal text."
+marker = "platform_system == \"Windows\""
+name = "colorama"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "0.4.4"
+
+[[package]]
+category = "main"
+description = "Better living through Python with decorators"
+name = "decorator"
+optional = false
+python-versions = "*"
+version = "4.3.0"
+
+[[package]]
+category = "main"
+description = "XML bomb protection for Python stdlib modules"
+name = "defusedxml"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "0.7.1"
+
+[[package]]
+category = "main"
+description = "Docutils -- Python Documentation Utilities"
+name = "docutils"
+optional = false
+python-versions = "*"
+version = "0.14"
+
+[[package]]
+category = "main"
+description = "eBay SDK for Python"
+name = "ebaysdk"
+optional = false
+python-versions = "*"
+version = "2.1.5"
+
+[package.dependencies]
+lxml = "*"
+requests = "*"
+
+[[package]]
+category = "main"
+description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds"
+name = "feedparser"
+optional = false
+python-versions = "*"
+version = "5.2.1"
+
+[[package]]
+category = "main"
+description = "Coroutine-based network library (python 2.6 - 3.5)"
+name = "gevent"
+optional = false
+python-versions = "*"
+version = "1.1.2"
+
+[package.dependencies]
+greenlet = ">=0.4.9"
+
+[[package]]
+category = "main"
+description = "Lightweight in-process concurrent programming"
+name = "greenlet"
+optional = false
+python-versions = "*"
+version = "0.4.10"
+
+[[package]]
+category = "main"
+description = "Turn HTML into equivalent Markdown-structured text."
+name = "html2text"
+optional = false
+python-versions = "*"
+version = "2018.1.9"
+
+[[package]]
+category = "main"
+description = "Internationalized Domain Names in Applications (IDNA)"
+name = "idna"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.8"
+
+[[package]]
+category = "main"
+description = "An ISO 8601 date/time/duration parser and formatter"
+name = "isodate"
+optional = false
+python-versions = "*"
+version = "0.6.0"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+category = "main"
+description = "A small but fast and easy to use stand-alone template engine written in pure python."
+name = "jinja2"
+optional = false
+python-versions = "*"
+version = "2.10.1"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[package.extras]
+i18n = ["Babel (>=0.8)"]
+
+[[package]]
+category = "main"
+description = "Sass for Python: A straightforward binding of libsass for Python."
+name = "libsass"
+optional = false
+python-versions = "*"
+version = "0.17.0"
+
+[package.dependencies]
+six = "*"
+
+[package.extras]
+upload_appveyor_builds = ["twine (1.11.0)"]
+
+[[package]]
+category = "main"
+description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
+name = "lxml"
+optional = false
+python-versions = "*"
+version = "3.7.1"
+
+[package.extras]
+cssselect = ["cssselect (>=0.7)"]
+html5 = ["html5lib"]
+htmlsoup = ["beautifulsoup4"]
+source = ["Cython (>=0.20)"]
+
+[[package]]
+category = "main"
+description = "A super-fast templating language that borrows the  best ideas from the existing templating languages."
+name = "mako"
+optional = false
+python-versions = "*"
+version = "1.0.7"
+
+[package.dependencies]
+MarkupSafe = ">=0.9.2"
+
+[[package]]
+category = "main"
+description = "Safely add untrusted strings to HTML/XML markup."
+name = "markupsafe"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "1.1.0"
+
+[[package]]
+category = "main"
+description = "Rolling backport of unittest.mock for all Pythons"
+name = "mock"
+optional = false
+python-versions = "*"
+version = "2.0.0"
+
+[package.dependencies]
+pbr = ">=0.11"
+six = ">=1.9"
+
+[package.extras]
+docs = ["sphinx", "Pygments (<2)", "jinja2 (<2.7)", "sphinx (<1.3)"]
+test = ["unittest2 (>=1.1.0)"]
+
+[[package]]
+category = "main"
+description = "Modules to convert numbers to words. Easily extensible."
+name = "num2words"
+optional = false
+python-versions = "*"
+version = "0.5.6"
+
+[[package]]
+category = "main"
+description = "Tools for working with the OFX (Open Financial Exchange) file format"
+name = "ofxparse"
+optional = false
+python-versions = "*"
+version = "0.19"
+
+[package.dependencies]
+beautifulsoup4 = "*"
+lxml = "*"
+six = "*"
+
+[[package]]
+category = "main"
+description = "comprehensive password hashing framework supporting over 30 schemes"
+name = "passlib"
+optional = false
+python-versions = "*"
+version = "1.7.1"
+
+[package.extras]
+argon2 = ["argon2-cffi (>=16.2)"]
+bcrypt = ["bcrypt (>=3.1.0)"]
+totp = ["cryptography"]
+
+[[package]]
+category = "main"
+description = "Python Build Reasonableness"
+name = "pbr"
+optional = false
+python-versions = ">=2.6"
+version = "5.6.0"
+
+[[package]]
+category = "main"
+description = "Python Imaging Library (Fork)"
+name = "pillow"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "5.4.1"
+
+[[package]]
+category = "main"
+description = "A library to manipulate gettext files (po and mo files)."
+name = "polib"
+optional = false
+python-versions = "*"
+version = "1.1.0"
+
+[[package]]
+category = "main"
+description = "Cross-platform lib for process and system monitoring in Python."
+name = "psutil"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "5.6.6"
+
+[package.extras]
+enum = ["enum34"]
+
+[[package]]
+category = "main"
+description = "psycopg2 - Python-PostgreSQL Database Adapter"
+name = "psycopg2"
+optional = false
+python-versions = "*"
+version = "2.7.7"
+
+[[package]]
+category = "main"
+description = "ASN.1 types and codecs"
+name = "pyasn1"
+optional = false
+python-versions = "*"
+version = "0.4.8"
+
+[[package]]
+category = "main"
+description = "A collection of ASN.1-based protocols modules."
+name = "pyasn1-modules"
+optional = false
+python-versions = "*"
+version = "0.2.8"
+
+[package.dependencies]
+pyasn1 = ">=0.4.6,<0.5.0"
+
+[[package]]
+category = "main"
+description = "Python interface to Graphviz's Dot"
+name = "pydot"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.4.1"
+
+[package.dependencies]
+pyparsing = ">=2.1.4"
+
+[[package]]
+category = "main"
+description = "Python parsing module"
+name = "pyparsing"
+optional = false
+python-versions = "*"
+version = "2.2.0"
+
+[[package]]
+category = "main"
+description = "PDF toolkit"
+name = "pypdf2"
+optional = false
+python-versions = "*"
+version = "1.26.0"
+
+[[package]]
+category = "main"
+description = "Python Serial Port Extension"
+name = "pyserial"
+optional = false
+python-versions = "*"
+version = "3.4"
+
+[[package]]
+category = "main"
+description = "Extensions to the standard Python datetime module"
+name = "python-dateutil"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "2.7.3"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+category = "main"
+description = "Python modules for implementing LDAP clients"
+name = "python-ldap"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "3.1.0"
+
+[package.dependencies]
+pyasn1 = ">=0.3.7"
+pyasn1_modules = ">=0.1.5"
+
+[[package]]
+category = "main"
+description = "Python module to handle standardized numbers and codes"
+name = "python-stdnum"
+optional = false
+python-versions = "*"
+version = "1.16"
+
+[package.extras]
+soap = ["zeep"]
+soap-alt = ["suds"]
+soap-fallback = ["pysimplesoap"]
+
+[[package]]
+category = "main"
+description = "World timezone definitions, modern and historical"
+name = "pytz"
+optional = false
+python-versions = "*"
+version = "2019.1"
+
+[[package]]
+category = "main"
+description = "Python USB access module"
+name = "pyusb"
+optional = false
+python-versions = "*"
+version = "1.0.2"
+
+[[package]]
+category = "main"
+description = "QR Code image generator"
+name = "qrcode"
+optional = false
+python-versions = "*"
+version = "6.1"
+
+[package.dependencies]
+colorama = "*"
+six = "*"
+
+[package.extras]
+dev = ["tox", "pytest", "mock"]
+maintainer = ["zest.releaser"]
+pil = ["pillow"]
+test = ["pytest", "pytest-cov", "mock"]
+
+[[package]]
+category = "main"
+description = "The Reportlab Toolkit"
+name = "reportlab"
+optional = false
+python-versions = "*"
+version = "3.5.13"
+
+[package.dependencies]
+pillow = ">=4.0.0"
+
+[[package]]
+category = "main"
+description = "Python HTTP for Humans."
+name = "requests"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.21.0"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<3.1.0"
+idna = ">=2.5,<2.9"
+urllib3 = ">=1.21.1,<1.25"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
+
+[[package]]
+category = "main"
+description = "A utility belt for advanced users of python-requests"
+name = "requests-toolbelt"
+optional = false
+python-versions = "*"
+version = "0.9.1"
+
+[package.dependencies]
+requests = ">=2.0.1,<3.0.0"
+
+[[package]]
+category = "main"
+description = "Python 2 and 3 compatibility utilities"
+name = "six"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "1.16.0"
+
+[[package]]
+category = "main"
+description = "A modern CSS selector implementation for Beautiful Soup."
+marker = "python_version >= \"3.0\""
+name = "soupsieve"
+optional = false
+python-versions = ">=3.6"
+version = "2.2.1"
+
+[[package]]
+category = "main"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+name = "urllib3"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4"
+version = "1.24.3"
+
+[package.extras]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
+
+[[package]]
+category = "main"
+description = "[UNMAINTAINED] Python module to validate VAT numbers"
+name = "vatnumber"
+optional = false
+python-versions = "*"
+version = "1.2"
+
+[package.dependencies]
+python-stdnum = "*"
+
+[package.extras]
+suds = ["suds"]
+
+[[package]]
+category = "main"
+description = "A full-featured Python package for parsing and creating iCalendar and vCard files"
+name = "vobject"
+optional = false
+python-versions = "*"
+version = "0.9.6.1"
+
+[package.dependencies]
+python-dateutil = ">=2.4.0"
+
+[[package]]
+category = "main"
+description = "The comprehensive WSGI web application library."
+name = "werkzeug"
+optional = false
+python-versions = "*"
+version = "0.14.1"
+
+[package.extras]
+dev = ["coverage", "pytest", "sphinx", "tox"]
+termcolor = ["termcolor"]
+watchdog = ["watchdog"]
+
+[[package]]
+category = "main"
+description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
+name = "xlrd"
+optional = false
+python-versions = "*"
+version = "1.1.0"
+
+[[package]]
+category = "main"
+description = "A Python module for creating Excel XLSX files."
+name = "xlsxwriter"
+optional = false
+python-versions = "*"
+version = "1.1.2"
+
+[[package]]
+category = "main"
+description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+"
+name = "xlwt"
+optional = false
+python-versions = "*"
+version = "1.3.0"
+
+[[package]]
+category = "main"
+description = "A modern/fast Python SOAP client based on lxml / requests"
+name = "zeep"
+optional = false
+python-versions = "*"
+version = "3.2.0"
+
+[package.dependencies]
+appdirs = ">=1.4.0"
+attrs = ">=17.2.0"
+cached-property = ">=1.3.0"
+defusedxml = ">=0.4.1"
+isodate = ">=0.5.4"
+lxml = ">=3.1.0"
+pytz = "*"
+requests = ">=2.7.0"
+requests-toolbelt = ">=0.7.1"
+six = ">=1.9.0"
+
+[package.extras]
+async = ["aiohttp (>=1.0)"]
+docs = ["sphinx (>=1.4.0)"]
+test = ["freezegun (0.3.8)", "mock (2.0.0)", "pretend (1.0.8)", "pytest-cov (2.5.1)", "pytest (3.1.3)", "requests-mock (>=0.7.0)", "pytest-tornado (0.4.5)", "isort (4.2.15)", "flake8 (3.3.0)", "flake8-blind-except (0.1.1)", "flake8-debugger (1.4.0)", "flake8-imports (0.1.1)", "aioresponses (>=0.4.1)"]
+tornado = ["tornado (>=4.0.2,<5)"]
+xmlsec = ["xmlsec (>=0.6.1)"]
+
+[metadata]
+content-hash = "885e8d8d411460ab489d46959ce536810ac940753beb0a12ebaa70ae732d61ca"
+lock-version = "1.0"
+python-versions = "^3.6"
+
+[metadata.files]
+appdirs = [
+    {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
+    {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
+]
+attrs = [
+    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+]
+babel = [
+    {file = "Babel-2.6.0-py2.py3-none-any.whl", hash = "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669"},
+    {file = "Babel-2.6.0.tar.gz", hash = "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"},
+]
+beautifulsoup4 = [
+    {file = "beautifulsoup4-4.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"},
+    {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"},
+    {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"},
+]
+cached-property = [
+    {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
+    {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
+]
+certifi = [
+    {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
+    {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
+]
+chardet = [
+    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
+    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
+]
+colorama = [
+    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+decorator = [
+    {file = "decorator-4.3.0-py2.py3-none-any.whl", hash = "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82"},
+    {file = "decorator-4.3.0.tar.gz", hash = "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c"},
+]
+defusedxml = [
+    {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
+    {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
+]
+docutils = [
+    {file = "docutils-0.14-py2-none-any.whl", hash = "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"},
+    {file = "docutils-0.14-py3-none-any.whl", hash = "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6"},
+    {file = "docutils-0.14.tar.gz", hash = "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274"},
+]
+ebaysdk = [
+    {file = "ebaysdk-2.1.5-py3.7.egg", hash = "sha256:55360edc239037c3a0aaaf3f39889ddea666b8b1d97c893b2c3fd2269d868b45"},
+    {file = "ebaysdk-2.1.5.tar.gz", hash = "sha256:78458e1ea4a0fc7d693c26de363069696393767e4aa9689fd38efbfb08409acd"},
+]
+feedparser = [
+    {file = "feedparser-5.2.1.tar.bz2", hash = "sha256:ce875495c90ebd74b179855449040003a1beb40cd13d5f037a0654251e260b02"},
+    {file = "feedparser-5.2.1.tar.gz", hash = "sha256:bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9"},
+    {file = "feedparser-5.2.1.zip", hash = "sha256:cd2485472e41471632ed3029d44033ee420ad0b57111db95c240c9160a85831c"},
+]
+gevent = [
+    {file = "gevent-1.1.2-cp26-cp26m-macosx_10_11_intel.whl", hash = "sha256:ca934dc30f26e84c79e483db4de433702283ff02344d029635730ff9e7c1d416"},
+    {file = "gevent-1.1.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:f42de31de5f29a11f5480f76c05f3afce80e030333295718efd64bfb823e4e82"},
+    {file = "gevent-1.1.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a24fb153e3c65d025c065b140e39998d483d4df6887b02503ba66debf32b49d6"},
+    {file = "gevent-1.1.2-cp27-cp27m-win32.whl", hash = "sha256:a51f414f22f31a110823ff0365cb088dc3317a06227c85033d8523dd619ada72"},
+    {file = "gevent-1.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:a4ce00048808d3c2ee7e8c83860595b0d2090724770e499056aec1c8947bd2d1"},
+    {file = "gevent-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d072a29ca28bb84d9433434e2675c44ca29635c0aa0ed51b1eecf216991fd204"},
+    {file = "gevent-1.1.2-cp33-cp33m-manylinux1_x86_64.whl", hash = "sha256:2cb985038826eb353f5759dda2ec7bca581abf4e5c2e90b95ddb5d976dc785e6"},
+    {file = "gevent-1.1.2-cp33-cp33m-win32.whl", hash = "sha256:9ce82526317a1279de2997e5da2744342ff0bd1459a14d75e749350966ae1e17"},
+    {file = "gevent-1.1.2-cp33-cp33m-win_amd64.whl", hash = "sha256:2af2b6eae04ccfa0766a135c31056c92a127ebcb172858880d8309a9e57f52d8"},
+    {file = "gevent-1.1.2-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:bd0c6dcc30ec8014426e61a2cc429c7fcbcc26bd7b682bd590d31fce2d2bd843"},
+    {file = "gevent-1.1.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:720574505391b0f0817b092edfcbb97938d6d407ce912444a92267dab763eb8e"},
+    {file = "gevent-1.1.2-cp34-cp34m-win32.whl", hash = "sha256:7188cbec74276e42ea0671ad479e4209f9f12d82bc542d21217a09f759e647e3"},
+    {file = "gevent-1.1.2-cp34-cp34m-win_amd64.whl", hash = "sha256:c7f86e297b8ffff7e101993980062f053ebda92ed8c40ab3a9c53c50ff9ef408"},
+    {file = "gevent-1.1.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:26a622ad8da282b0fea17f3800bfc4eae9be89a53c22ffba5a2b357278b8f8e8"},
+    {file = "gevent-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4552cc8ffefd4c5301ba75ac2720befb0001bc134e4e8c28475e96992e513300"},
+    {file = "gevent-1.1.2-cp35-cp35m-win32.whl", hash = "sha256:468bc2aea02aa1963bd0c73803f0378530f60af8fc93a576d0ca79285d60e833"},
+    {file = "gevent-1.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:58bdc8d1ca56e3dab833c2e2098a9afa98d0ff0f738c63e896138289c2a08b5e"},
+    {file = "gevent-1.1.2-pp253-pypy_41-macosx_10_11_x86_64.whl", hash = "sha256:3963faca1c5e175fdcfeec3ee7116f3d8082be2f94e096871e9b08da10fa4c25"},
+    {file = "gevent-1.1.2.tar.gz", hash = "sha256:cb15cf73d69a2eeefed330858f09634e2c50bf46da9f9e7635730fcfb872c02c"},
+    {file = "gevent-1.1.2.win-amd64-py2.7.exe", hash = "sha256:911ebb03dee09e841d0f7ee367b1b8380f8918b3e30c3a822bc41599ae74d2a3"},
+    {file = "gevent-1.1.2.win-amd64-py3.3.exe", hash = "sha256:f403a6b18b3cdb6de4c0140711de690071783433cd0f325c9e46c585497e580c"},
+    {file = "gevent-1.1.2.win-amd64-py3.4.exe", hash = "sha256:3c43de92658eb4723572cd7e543340943e96bf4666f92a819d36f93653c39d15"},
+    {file = "gevent-1.1.2.win-amd64-py3.5.exe", hash = "sha256:2feb3fddc0240373bfc0176d7625cb667132beef18009bf7101216baafd136e9"},
+    {file = "gevent-1.1.2.win32-py2.7.exe", hash = "sha256:2f578b4469cbd2c5a59f353dacb81f8435b54afe4ec706c6155900aff39e8a12"},
+    {file = "gevent-1.1.2.win32-py3.4.exe", hash = "sha256:7d8e8ff35decff1c70fd55959e74e5067505862828d875250a840d8031bf48c2"},
+    {file = "gevent-1.1.2.win32-py3.5.exe", hash = "sha256:192439e55f6f99215ba98f95c53cf990b8380858d195d8c84ad60eb55ef4161b"},
+]
+greenlet = [
+    {file = "greenlet-0.4.10-cp26-cp26m-manylinux1_x86_64.whl", hash = "sha256:1f8bf39807016d97778e12c45510addc6996f965a0b40aa7ecbb28a73ed9861c"},
+    {file = "greenlet-0.4.10-cp26-cp26m-win32.whl", hash = "sha256:d0e071a6fd2314447827285d33958b76b98090a78267bd7074f5bc10057db3d5"},
+    {file = "greenlet-0.4.10-cp26-cp26m-win_amd64.whl", hash = "sha256:d32efa985042147e87bc08b6f9bcf5335e0adefefdaf391484c38192e8a707f7"},
+    {file = "greenlet-0.4.10-cp26-cp26mu-manylinux1_x86_64.whl", hash = "sha256:3cd07825d98ed834a74821fcd8f1c40d8410b6cf92726dcaaad4b46b440da852"},
+    {file = "greenlet-0.4.10-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:1b6642acde2889c8cef00ef237e28cfdb1e928ea1c7e08d06d67b4a42a73fcff"},
+    {file = "greenlet-0.4.10-cp27-cp27m-win32.whl", hash = "sha256:f97758ca465fd2cf9b3335881b073b3463558e985078f4d8f27941d9626615ea"},
+    {file = "greenlet-0.4.10-cp27-cp27m-win_amd64.whl", hash = "sha256:12efc20be79d6f5a61257758b0d926ea083e0e93ca9a3f07bd6ebfac37327a9b"},
+    {file = "greenlet-0.4.10-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5682764e893e5e6621dd70f11b72993f723953ee3d374650bf9dcea99c04f9c2"},
+    {file = "greenlet-0.4.10-cp33-cp33m-manylinux1_x86_64.whl", hash = "sha256:1b537b3144ef518586f7935e3671f0f8195056288936dcd200744f285b7e24ae"},
+    {file = "greenlet-0.4.10-cp33-cp33m-win32.whl", hash = "sha256:7e5b804e011d605c24662d30cc2e4c8f4896ee4c1d5f2ed5b73accbc3613af5f"},
+    {file = "greenlet-0.4.10-cp33-cp33m-win_amd64.whl", hash = "sha256:5a8a7402f28f2d7d3829d0e62bb370749bd6e013b6eb40cfe2637b298b2fd25f"},
+    {file = "greenlet-0.4.10-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d9be3514f22439a3fb468aa1b026654f5eafb1b65bd6b0ffe109439ad77adffc"},
+    {file = "greenlet-0.4.10-cp34-cp34m-win32.whl", hash = "sha256:1017efcb7c2078f081dc9b505f2fff606e683e672ddea9a7dbd332222c6a0a7c"},
+    {file = "greenlet-0.4.10-cp34-cp34m-win_amd64.whl", hash = "sha256:c6428e6086535231d99c1de464c8a8e2face60d255c4c20dd84379760beb9307"},
+    {file = "greenlet-0.4.10-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:37bcb3e2cf8f67ce6b735b1c50f098c6774f5cf47258de58561e05c639dad356"},
+    {file = "greenlet-0.4.10-cp35-cp35m-win32.whl", hash = "sha256:4d89f536490e74691e6e1e232c72d112863d8597f894873c3f452e08f21843e4"},
+    {file = "greenlet-0.4.10-cp35-cp35m-win_amd64.whl", hash = "sha256:af5fd9bfac0eef3875d6dc4496ba83ed1fb3f802045409a005d08c1ca98cad22"},
+    {file = "greenlet-0.4.10-py2.6-win-amd64.egg", hash = "sha256:a9c2e9ded2ee4d6e17c70d52109a97392a64400b1568108825d1cabf26710b35"},
+    {file = "greenlet-0.4.10-py2.6-win32.egg", hash = "sha256:58b07295a5085cff7773d2866510701d5cd955156e5368d7b6c823811e62da9b"},
+    {file = "greenlet-0.4.10-py2.7-win-amd64.egg", hash = "sha256:3d46c7841477136bcdafa1b343c0849d9886845848bd563279608f0644b2598a"},
+    {file = "greenlet-0.4.10-py2.7-win32.egg", hash = "sha256:f4d77939b392bbafbf3eea01169aefe85cb5ffbbd5b9a9d7ef012b01c384df5c"},
+    {file = "greenlet-0.4.10-py3.3-win-amd64.egg", hash = "sha256:d0cc137ca44e3664d3d97d7bbba8c77f10b411bdbbe2215c5e7f00f7d5c2af08"},
+    {file = "greenlet-0.4.10-py3.3-win32.egg", hash = "sha256:97ee513db7c13ec21ec9b9657e257c2beb491ae8199b058c68d7451a2f6cc27b"},
+    {file = "greenlet-0.4.10-py3.4-win-amd64.egg", hash = "sha256:d549332dbb7351301d081db92c27d5f0f3d4803bd92c415c65c30bf98fbe8fb4"},
+    {file = "greenlet-0.4.10-py3.4-win32.egg", hash = "sha256:4c5f4908f7c9fb1c4316b45ceabe35985ea79e79336ffe300ddd3f49bf57cbec"},
+    {file = "greenlet-0.4.10-py3.5-win-amd64.egg", hash = "sha256:6c717e5fbe2bba8cb885031883dcb55c609ffadb84ef395f91915050d3c84343"},
+    {file = "greenlet-0.4.10-py3.5-win32.egg", hash = "sha256:134ec264699eeb76a5fee5d73a3c8766f8d4c5edc12464bb438cb6f3f3bd23e4"},
+    {file = "greenlet-0.4.10.tar.gz", hash = "sha256:c4417624aa88380cdf0fe110a8a6e0dbcc26f80887197fe5df0427dfa348ae62"},
+    {file = "greenlet-0.4.10.zip", hash = "sha256:9a98d49f63259b16d3627976b69dd856888a376c498b091c8e9ead56d5098ca8"},
+]
+html2text = [
+    {file = "html2text-2018.1.9-py3-none-any.whl", hash = "sha256:490db40fe5b2cd79c461cf56be4d39eb8ca68191ae41ba3ba79f6cb05b7dd662"},
+    {file = "html2text-2018.1.9.tar.gz", hash = "sha256:627514fb30e7566b37be6900df26c2c78a030cc9e6211bda604d8181233bcdd4"},
+]
+idna = [
+    {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"},
+    {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"},
+]
+isodate = [
+    {file = "isodate-0.6.0-py2.py3-none-any.whl", hash = "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81"},
+    {file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"},
+]
+jinja2 = [
+    {file = "Jinja2-2.10.1-py2.py3-none-any.whl", hash = "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"},
+    {file = "Jinja2-2.10.1.tar.gz", hash = "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013"},
+]
+libsass = [
+    {file = "libsass-0.17.0-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:bf6b7ad08f287695338f050c80f79d258a405e5c349cdaeb9be5d5376c09e37a"},
+    {file = "libsass-0.17.0-cp27-cp27m-win32.whl", hash = "sha256:411833c623288138744865d882f5226f6db52afce1e19f42722c416df9d308dc"},
+    {file = "libsass-0.17.0-cp27-cp27m-win_amd64.whl", hash = "sha256:66e3062ff508c81928e35c66702f0cc4f70fb12eb76ba23eeb0ff87a6340cc13"},
+    {file = "libsass-0.17.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0da943e00e028211cb4bb91496a20becab9fe82407bb75266ec4212af04acb45"},
+    {file = "libsass-0.17.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b3e4abf50ad3a6bec25acd0c67495301cab6137aa79b8640364276f7f3712586"},
+    {file = "libsass-0.17.0-cp35-cp35m-win32.whl", hash = "sha256:75605a97f4b2f47fafc5a372f09efec210c7f33908c6de726362f85489fd53aa"},
+    {file = "libsass-0.17.0-cp35-cp35m-win_amd64.whl", hash = "sha256:7c7a531b8cd786c35170e97338be2e73a74806f95539366a8ee837df94b8a8cf"},
+    {file = "libsass-0.17.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a19041e78d5bb7c5d72e010e893c29119693628b6ee06025503ab2584cf24edd"},
+    {file = "libsass-0.17.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:107591ba2c0d173bb1705bef0e9fd04a5b6f482f3584f4ea51b28ab8b137fbb2"},
+    {file = "libsass-0.17.0-cp36-cp36m-win32.whl", hash = "sha256:4bf7a80a956da9de9715436b85343a179da4ff399a6e9a1694e70bff93d43099"},
+    {file = "libsass-0.17.0-cp36-cp36m-win_amd64.whl", hash = "sha256:55b77204cfa363142ab02c49ee871321a396b8e51f6361ebc226c3953c780541"},
+    {file = "libsass-0.17.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:1aeadc155594af23879e27792667dc06e7f248c2c599c40ff2a7335193abdf05"},
+    {file = "libsass-0.17.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:53be1c6cea9458fc0b59fafff5307d63cbde4d6f8a4413fb52ae467566273357"},
+    {file = "libsass-0.17.0-cp37-cp37m-win32.whl", hash = "sha256:747e1cb3624b25ce9104315cf98b080246c5112d008cba6536a7dd2edb16fcc2"},
+    {file = "libsass-0.17.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcbc861a001ffd68c4df00164b41c6152d5451185d06c654ac240d811be9f7e2"},
+    {file = "libsass-0.17.0.tar.gz", hash = "sha256:953ebe810f09d81b84ccafdca0fb6171d1b58c8f0147cb650184a41e124e296f"},
+]
+lxml = [
+    {file = "lxml-3.7.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:474793adc51e0187478106523e867ad4f21bc1bdf0dd5d1d157976761a543ca1"},
+    {file = "lxml-3.7.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7b31befd08b7b874515458725f62e186ab4da4ede92d74f9135e3e938f3bece0"},
+    {file = "lxml-3.7.1-cp33-cp33m-manylinux1_x86_64.whl", hash = "sha256:f05d28c0094cb381a5d531cbda8a80618e8d0323b0bf91ba5a996267461be209"},
+    {file = "lxml-3.7.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:35fe32835725e3b68454549f3efc4e05c96b353f7bc1e098b04d90adeb733144"},
+    {file = "lxml-3.7.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ee56165f28da6abe480d4b740548c89a5f1d0687f37c0684ea98b0e614f0aff"},
+    {file = "lxml-3.7.1-cp35-cp35m-win32.whl", hash = "sha256:c8fd33bea8f25c55af6d497d7f1c475db78f972afcab360714fd449dafc2d6d1"},
+    {file = "lxml-3.7.1-cp35-cp35m-win_amd64.whl", hash = "sha256:7d2312098ee58dcc2ce84e9767b12fce286b1a6ea081a4f25f4b27e15e9e1eaf"},
+    {file = "lxml-3.7.1.tar.gz", hash = "sha256:1c7f6771838300787cfa1bb3ed6512e9dc78e60ecb308a8ed49ac956569c1cca"},
+    {file = "lxml-3.7.1.win-amd64-py2.7.exe", hash = "sha256:7ae45ce747344f2e4065ed5353853a82ceb51e78465ac4060dc670bfa5fe5ce7"},
+    {file = "lxml-3.7.1.win-amd64-py3.2.exe", hash = "sha256:a42b5214945e77f3aaea1588094eaba3256d0b87e9c6092a10ff1a46b879f82e"},
+    {file = "lxml-3.7.1.win-amd64-py3.3.exe", hash = "sha256:a5ec568a33eb727527d0121bed1386b4c786bb11c849f9317c2f0b5192105fb7"},
+    {file = "lxml-3.7.1.win-amd64-py3.4.exe", hash = "sha256:db8f7a9db45822a734178b43cb3958e5fdddf0863b69cf9d1941829cf2237334"},
+    {file = "lxml-3.7.1.win32-py2.7.exe", hash = "sha256:e576f7c786e56ca3d0cdb9a1cf92f533dd13dabaa2a2b5f688a6db98f41dbdff"},
+    {file = "lxml-3.7.1.win32-py3.2.exe", hash = "sha256:d4c7f11ce6e6162210f5a2f43fd028e664f19f850703aefd559654c0d989b2f6"},
+    {file = "lxml-3.7.1.win32-py3.3.exe", hash = "sha256:47f0dd2fd55ca8fbc0582280a4e8b7db4c56bf72a89d449a0ad4e4898c88fd7e"},
+    {file = "lxml-3.7.1.win32-py3.4.exe", hash = "sha256:06287300f38d450fded69eb8164b200a3b0a1939ca882ea79594df3f2ad35ace"},
+]
+mako = [
+    {file = "Mako-1.0.7.tar.gz", hash = "sha256:4e02fde57bd4abb5ec400181e4c314f56ac3e49ba4fb8b0d50bba18cb27d25ae"},
+]
+markupsafe = [
+    {file = "MarkupSafe-1.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27m-win32.whl", hash = "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36"},
+    {file = "MarkupSafe-1.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd"},
+    {file = "MarkupSafe-1.1.0-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9"},
+    {file = "MarkupSafe-1.1.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550"},
+    {file = "MarkupSafe-1.1.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1"},
+    {file = "MarkupSafe-1.1.0-cp34-cp34m-win32.whl", hash = "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d"},
+    {file = "MarkupSafe-1.1.0-cp34-cp34m-win_amd64.whl", hash = "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401"},
+    {file = "MarkupSafe-1.1.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1"},
+    {file = "MarkupSafe-1.1.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c"},
+    {file = "MarkupSafe-1.1.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b"},
+    {file = "MarkupSafe-1.1.0-cp35-cp35m-win32.whl", hash = "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e"},
+    {file = "MarkupSafe-1.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856"},
+    {file = "MarkupSafe-1.1.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492"},
+    {file = "MarkupSafe-1.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432"},
+    {file = "MarkupSafe-1.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c"},
+    {file = "MarkupSafe-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b"},
+    {file = "MarkupSafe-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2"},
+    {file = "MarkupSafe-1.1.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd"},
+    {file = "MarkupSafe-1.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af"},
+    {file = "MarkupSafe-1.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672"},
+    {file = "MarkupSafe-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834"},
+    {file = "MarkupSafe-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1"},
+    {file = "MarkupSafe-1.1.0.tar.gz", hash = "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3"},
+]
+mock = [
+    {file = "mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1"},
+    {file = "mock-2.0.0.tar.gz", hash = "sha256:b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba"},
+]
+num2words = [
+    {file = "num2words-0.5.6-py2.py3-none-any.whl", hash = "sha256:529017394eef84daf63bb57e837fe2fb81363d1b06f6114e86608dae7ceb11ee"},
+    {file = "num2words-0.5.6.tar.gz", hash = "sha256:aea26c2d11d636f0e9da094f2bf55ac94cb1c380ff1f86e8db22c210e5a6a05f"},
+]
+ofxparse = [
+    {file = "ofxparse-0.19-py2.7.egg", hash = "sha256:dbfb406691116c28a7733280f66de86644230067fa6a874e90d5422b9a20a39d"},
+    {file = "ofxparse-0.19-py3.6.egg", hash = "sha256:1ab2674d95c8860edb1494484fed96271d1e73d03ed729b3cad86669ba6fdbe4"},
+    {file = "ofxparse-0.19.tar.gz", hash = "sha256:d8c81fd5089332106da1a2e8919c412c7c677f08af04d557ca767701a04e0918"},
+]
+passlib = [
+    {file = "passlib-1.7.1-py2.py3-none-any.whl", hash = "sha256:43526aea08fa32c6b6dbbbe9963c4c767285b78147b7437597f992812f69d280"},
+    {file = "passlib-1.7.1.tar.gz", hash = "sha256:3d948f64138c25633613f303bcc471126eae67c04d5e3f6b7b8ce6242f8653e0"},
+]
+pbr = [
+    {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"},
+    {file = "pbr-5.6.0.tar.gz", hash = "sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd"},
+]
+pillow = [
+    {file = "Pillow-5.4.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1"},
+    {file = "Pillow-5.4.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7"},
+    {file = "Pillow-5.4.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e"},
+    {file = "Pillow-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c"},
+    {file = "Pillow-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f"},
+    {file = "Pillow-5.4.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c"},
+    {file = "Pillow-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc"},
+    {file = "Pillow-5.4.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1"},
+    {file = "Pillow-5.4.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8"},
+    {file = "Pillow-5.4.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055"},
+    {file = "Pillow-5.4.1-cp34-cp34m-win32.whl", hash = "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6"},
+    {file = "Pillow-5.4.1-cp34-cp34m-win_amd64.whl", hash = "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf"},
+    {file = "Pillow-5.4.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239"},
+    {file = "Pillow-5.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3"},
+    {file = "Pillow-5.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697"},
+    {file = "Pillow-5.4.1-cp35-cp35m-win32.whl", hash = "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7"},
+    {file = "Pillow-5.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe"},
+    {file = "Pillow-5.4.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca"},
+    {file = "Pillow-5.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e"},
+    {file = "Pillow-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad"},
+    {file = "Pillow-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a"},
+    {file = "Pillow-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356"},
+    {file = "Pillow-5.4.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1"},
+    {file = "Pillow-5.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9"},
+    {file = "Pillow-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3"},
+    {file = "Pillow-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f"},
+    {file = "Pillow-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3"},
+    {file = "Pillow-5.4.1-pp260-pypy_41-win32.whl", hash = "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494"},
+    {file = "Pillow-5.4.1-pp360-pp360-win32.whl", hash = "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000"},
+    {file = "Pillow-5.4.1-py2.7-macosx-10.13-x86_64.egg", hash = "sha256:634209852cc06c0c1243cc74f8fdc8f7444d866221de51125f7b696d775ec5ca"},
+    {file = "Pillow-5.4.1-py2.7-win-amd64.egg", hash = "sha256:0cf0208500df8d0c3cad6383cd98a2d038b0678fd4f777a8f7e442c5faeee81d"},
+    {file = "Pillow-5.4.1-py2.7-win32.egg", hash = "sha256:f71ff657e63a9b24cac254bb8c9bd3c89c7a1b5e00ee4b3997ca1c18100dac28"},
+    {file = "Pillow-5.4.1-py3.4-win-amd64.egg", hash = "sha256:01a501be4ae05fd714d269cb9c9f145518e58e73faa3f140ddb67fae0c2607b1"},
+    {file = "Pillow-5.4.1-py3.4-win32.egg", hash = "sha256:4baab2d2da57b0d9d544a2ce0f461374dd90ccbcf723fe46689aff906d43a964"},
+    {file = "Pillow-5.4.1-py3.5-win-amd64.egg", hash = "sha256:f62b1aeb5c2ced8babd4fbba9c74cbef9de309f5ed106184b12d9778a3971f15"},
+    {file = "Pillow-5.4.1-py3.5-win32.egg", hash = "sha256:e9f13711780c981d6eadd6042af40e172548c54b06266a1aabda7de192db0838"},
+    {file = "Pillow-5.4.1-py3.6-win-amd64.egg", hash = "sha256:07c35919f983c2c593498edcc126ad3a94154184899297cc9d27a6587672cbaa"},
+    {file = "Pillow-5.4.1-py3.6-win32.egg", hash = "sha256:87fe838f9dac0597f05f2605c0700b1926f9390c95df6af45d83141e0c514bd9"},
+    {file = "Pillow-5.4.1-py3.7-win-amd64.egg", hash = "sha256:c8939dba1a37960a502b1a030a4465c46dd2c2bca7adf05fa3af6bea594e720e"},
+    {file = "Pillow-5.4.1-py3.7-win32.egg", hash = "sha256:5337ac3280312aa065ed0a8ec1e4b6142e9f15c31baed36b5cd964745853243f"},
+    {file = "Pillow-5.4.1.tar.gz", hash = "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f"},
+    {file = "Pillow-5.4.1.win-amd64-py2.7.exe", hash = "sha256:e1555d4fda1db8005de72acf2ded1af660febad09b4708430091159e8ae1963e"},
+    {file = "Pillow-5.4.1.win-amd64-py3.4.exe", hash = "sha256:52e2e56fc3706d8791761a157115dc8391319720ad60cc32992350fda74b6be2"},
+    {file = "Pillow-5.4.1.win-amd64-py3.5.exe", hash = "sha256:ba6ef2bd62671c7fb9cdb3277414e87a5cd38b86721039ada1464f7452ad30b2"},
+    {file = "Pillow-5.4.1.win-amd64-py3.6.exe", hash = "sha256:39fbd5d62167197318a0371b2a9c699ce261b6800bb493eadde2ba30d868fe8c"},
+    {file = "Pillow-5.4.1.win-amd64-py3.7.exe", hash = "sha256:5ccd97e0f01f42b7e35907272f0f8ad2c3660a482d799a0c564c7d50e83604d4"},
+    {file = "Pillow-5.4.1.win32-py2.7.exe", hash = "sha256:db418635ea20528f247203bf131b40636f77c8209a045b89fa3badb89e1fcea0"},
+    {file = "Pillow-5.4.1.win32-py3.4.exe", hash = "sha256:ac036b6a6bac7010c58e643d78c234c2f7dc8bb7e591bd8bc3555cf4b1527c28"},
+    {file = "Pillow-5.4.1.win32-py3.5.exe", hash = "sha256:f0e3288b92ca5dbb1649bd00e80ef652a72b657dc94989fa9c348253d179054b"},
+    {file = "Pillow-5.4.1.win32-py3.6.exe", hash = "sha256:4132c78200372045bb348fcad8d52518c8f5cfc077b1089949381ee4a61f1c6d"},
+    {file = "Pillow-5.4.1.win32-py3.7.exe", hash = "sha256:75d1f20bd8072eff92c5f457c266a61619a02d03ece56544195c56d41a1a0522"},
+]
+polib = [
+    {file = "polib-1.1.0-py2.py3-none-any.whl", hash = "sha256:93b730477c16380c9a96726c54016822ff81acfa553977fdd131f2b90ba858d7"},
+    {file = "polib-1.1.0.tar.gz", hash = "sha256:fad87d13696127ffb27ea0882d6182f1a9cf8a5e2b37a587751166c51e5a332a"},
+]
+psutil = [
+    {file = "psutil-5.6.6-cp27-none-win32.whl", hash = "sha256:06660136ab88762309775fd47290d7da14094422d915f0466e0adf8e4b22214e"},
+    {file = "psutil-5.6.6-cp27-none-win_amd64.whl", hash = "sha256:f21a7bb4b207e4e7c60b3c40ffa89d790997619f04bbecec9db8e3696122bc78"},
+    {file = "psutil-5.6.6-cp35-cp35m-win32.whl", hash = "sha256:5e8dbf31871b0072bcba8d1f2861c0ec6c84c78f13c723bb6e981bce51b58f12"},
+    {file = "psutil-5.6.6-cp35-cp35m-win_amd64.whl", hash = "sha256:724390895cff80add7a1c4e7e0a04d9c94f3ee61423a2dcafd83784fabbd1ee9"},
+    {file = "psutil-5.6.6-cp36-cp36m-win32.whl", hash = "sha256:6d81b9714791ef9a3a00b2ca846ee547fc5e53d259e2a6258c3d2054928039ff"},
+    {file = "psutil-5.6.6-cp36-cp36m-win_amd64.whl", hash = "sha256:3004361c6b93dbad71330d992c1ae409cb8314a6041a0b67507cc882357f583e"},
+    {file = "psutil-5.6.6-cp37-cp37m-win32.whl", hash = "sha256:0fc7a5619b47f74331add476fbc6022d7ca801c22865c7069ec0867920858963"},
+    {file = "psutil-5.6.6-cp37-cp37m-win_amd64.whl", hash = "sha256:f60042bef7dc50a78c06334ca8e25580455948ba2fa98f240d034a4fed9141a5"},
+    {file = "psutil-5.6.6-cp38-cp38-win32.whl", hash = "sha256:0c11adde31011a286197630ba2671e34651f004cc418d30ae06d2033a43c9e20"},
+    {file = "psutil-5.6.6-cp38-cp38-win_amd64.whl", hash = "sha256:0c211eec4185725847cb6c28409646c7cfa56fdb531014b35f97b5dc7fe04ff9"},
+    {file = "psutil-5.6.6.tar.gz", hash = "sha256:ad21281f7bd6c57578dd53913d2d44218e9e29fd25128d10ff7819ef16fa46e7"},
+]
+psycopg2 = [
+    {file = "psycopg2-2.7.7-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:5d222983847b40af989ad96c07fc3f07e47925e463baa5de716be8f805b41d9b"},
+    {file = "psycopg2-2.7.7-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:36b60201b6d215d7658a71493fdf6bd5e60ad9a0cffed39906627ff9f4f3afd3"},
+    {file = "psycopg2-2.7.7-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:3f9d532bce54c4234161176ff3b8688ff337575ca441ea27597e112dfcd0ee0c"},
+    {file = "psycopg2-2.7.7-cp27-cp27m-win32.whl", hash = "sha256:6757a6d2fc58f7d8f5d471ad180a0bd7b4dd3c7d681f051504fbea7ae29c8d6f"},
+    {file = "psycopg2-2.7.7-cp27-cp27m-win_amd64.whl", hash = "sha256:02445ebbb3a11a3fe8202c413d5e6faf38bb75b4e336203ee144ca2c46529f94"},
+    {file = "psycopg2-2.7.7-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:6a0e0f1e74edb0ab57d89680e59e7bfefad2bfbdf7c80eb38304d897d43674bb"},
+    {file = "psycopg2-2.7.7-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6ca703ccdf734e886a1cf53eb702261110f6a8b0ed74bcad15f1399f74d3f189"},
+    {file = "psycopg2-2.7.7-cp33-cp33m-win32.whl", hash = "sha256:a07feade155eb8e69b54dd6774cf6acf2d936660c61d8123b8b6b1f9247b67d6"},
+    {file = "psycopg2-2.7.7-cp33-cp33m-win_amd64.whl", hash = "sha256:b360ffd17659491f1a6ad7c928350e229c7b7bd83a2b922b6ee541245c7a776f"},
+    {file = "psycopg2-2.7.7-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:314a74302d4737a3865d40ea50e430ce1543c921ba10f39d562e807cfe2edf2a"},
+    {file = "psycopg2-2.7.7-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:8513b953d8f443c446aa79a4cc8a898bd415fc5e29349054f03a7d696d495542"},
+    {file = "psycopg2-2.7.7-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d1b61999d15c79cf7f4f7cc9021477aef35277fc52452cf50fd13b713c84424d"},
+    {file = "psycopg2-2.7.7-cp34-cp34m-win32.whl", hash = "sha256:9262a5ce2038570cb81b4d6413720484cb1bc52c064b2f36228d735b1f98b794"},
+    {file = "psycopg2-2.7.7-cp34-cp34m-win_amd64.whl", hash = "sha256:97441f851d862a0c844d981cbee7ee62566c322ebb3d68f86d66aa99d483985b"},
+    {file = "psycopg2-2.7.7-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:1148a5eb29073280bf9057c7fc45468592c1bb75a28f6df1591adb93c8cb63d0"},
+    {file = "psycopg2-2.7.7-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b90758e49d5e6b152a460d10b92f8a6ccf318fcc0ee814dcf53f3a6fc5328789"},
+    {file = "psycopg2-2.7.7-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c669ea986190ed05fb289d0c100cc88064351f2b85177cbfd3564c4f4847d18c"},
+    {file = "psycopg2-2.7.7-cp35-cp35m-win32.whl", hash = "sha256:28dffa9ed4595429e61bacac41d3f9671bb613d1442ff43bcbec63d4f73ed5e8"},
+    {file = "psycopg2-2.7.7-cp35-cp35m-win_amd64.whl", hash = "sha256:0e9873e60f98f0c52339abf8f0339d1e22bfe5aae0bcf7aabd40c055175035ec"},
+    {file = "psycopg2-2.7.7-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ae88216f94728d691b945983140bf40d51a1ff6c7fe57def93949bf9339ed54a"},
+    {file = "psycopg2-2.7.7-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f36b333e9f86a2fba960c72b90c34be6ca71819e300f7b1fc3d2b0f0b2c546cd"},
+    {file = "psycopg2-2.7.7-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ed7e0849337bd37d89f2c2b0216a0de863399ee5d363d31b1e5330a99044737b"},
+    {file = "psycopg2-2.7.7-cp36-cp36m-win32.whl", hash = "sha256:a9b9c02c91b1e3ec1f1886b2d0a90a0ea07cc529cb7e6e472b556bc20ce658f3"},
+    {file = "psycopg2-2.7.7-cp36-cp36m-win_amd64.whl", hash = "sha256:e393568e288d884b94d263f2669215197840d097c7e5b0acd1a51c1ea7d1aba8"},
+    {file = "psycopg2-2.7.7-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:f153f71c3164665d269a5d03c7fa76ba675c7a8de9dc09a4e2c2cdc9936a7b41"},
+    {file = "psycopg2-2.7.7-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:259a8324e109d4922b0fcd046e223e289830e2568d6f4132a3702439e5fd532b"},
+    {file = "psycopg2-2.7.7-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:de7bb043d1adaaf46e38d47e7a5f703bb3dab01376111e522b07d25e1a79c1e1"},
+    {file = "psycopg2-2.7.7-cp37-cp37m-win32.whl", hash = "sha256:b4221957ceccf14b2abdabef42d806e791350be10e21b260d7c9ce49012cc19e"},
+    {file = "psycopg2-2.7.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f1fb5a8427af099beb7f65093cbdb52e021b8e6dbdfaf020402a623f4181baf5"},
+    {file = "psycopg2-2.7.7.tar.gz", hash = "sha256:f4526d078aedd5187d0508aa5f9a01eae6a48a470ed678406da94b4cd6524b7e"},
+]
+pyasn1 = [
+    {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"},
+    {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"},
+    {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"},
+    {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"},
+    {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"},
+    {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"},
+    {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"},
+    {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"},
+    {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"},
+    {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"},
+    {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"},
+    {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"},
+    {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"},
+]
+pyasn1-modules = [
+    {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"},
+    {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"},
+    {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"},
+    {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"},
+    {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"},
+    {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"},
+    {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"},
+    {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"},
+    {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"},
+    {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"},
+    {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"},
+    {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"},
+    {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"},
+]
+pydot = [
+    {file = "pydot-1.4.1-py2.py3-none-any.whl", hash = "sha256:67be714300c78fda5fd52f79ec994039e3f76f074948c67b5ff539b433ad354f"},
+    {file = "pydot-1.4.1.tar.gz", hash = "sha256:d49c9d4dd1913beec2a997f831543c8cbd53e535b1a739e921642fe416235f01"},
+]
+pyparsing = [
+    {file = "pyparsing-2.2.0-py2.py3-none-any.whl", hash = "sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010"},
+    {file = "pyparsing-2.2.0.tar.gz", hash = "sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04"},
+    {file = "pyparsing-2.2.0.win32-py2.6.exe", hash = "sha256:9e8143a3e15c13713506886badd96ca4b579a87fbdf49e550dbfc057d6cb218e"},
+    {file = "pyparsing-2.2.0.win32-py2.7.exe", hash = "sha256:281683241b25fe9b80ec9d66017485f6deff1af5cde372469134b56ca8447a07"},
+    {file = "pyparsing-2.2.0.win32-py3.3.exe", hash = "sha256:b8b3117ed9bdf45e14dcc89345ce638ec7e0e29b2b579fa1ecf32ce45ebac8a5"},
+    {file = "pyparsing-2.2.0.win32-py3.4.exe", hash = "sha256:8f1e18d3fd36c6795bb7e02a39fd05c611ffc2596c1e0d995d34d67630426c18"},
+    {file = "pyparsing-2.2.0.win32-py3.5.exe", hash = "sha256:e4d45427c6e20a59bf4f88c639dcc03ce30d193112047f94012102f235853a58"},
+]
+pypdf2 = [
+    {file = "PyPDF2-1.26.0.tar.gz", hash = "sha256:e28f902f2f0a1603ea95ebe21dff311ef09be3d0f0ef29a3e44a932729564385"},
+]
+pyserial = [
+    {file = "pyserial-3.4-py2.py3-none-any.whl", hash = "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"},
+    {file = "pyserial-3.4.tar.gz", hash = "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.7.3.tar.gz", hash = "sha256:e27001de32f627c22380a688bcc43ce83504a7bc5da472209b4c70f02829f0b8"},
+    {file = "python_dateutil-2.7.3-py2.py3-none-any.whl", hash = "sha256:1adb80e7a782c12e52ef9a8182bebeb73f1d7e24e374397af06fb4956c8dc5c0"},
+]
+python-ldap = [
+    {file = "python-ldap-3.1.0.tar.gz", hash = "sha256:41975e79406502c092732c57ef0c2c2eb318d91e8e765f81f5d4ab6c1db727c5"},
+]
+python-stdnum = [
+    {file = "python-stdnum-1.16.tar.gz", hash = "sha256:4248d898042a801fc4eff96fbfe4bf63a43324854efe3b5534718c1c195c6f43"},
+    {file = "python_stdnum-1.16-py2.py3-none-any.whl", hash = "sha256:2e2c56c548ca166b95547a8d748f4d71320a5b4896960717c8e6380e08d993a5"},
+]
+pytz = [
+    {file = "pytz-2019.1-py2.py3-none-any.whl", hash = "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda"},
+    {file = "pytz-2019.1.tar.gz", hash = "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141"},
+]
+pyusb = [
+    {file = "pyusb-1.0.2.tar.gz", hash = "sha256:4e9b72cc4a4205ca64fbf1f3fff39a335512166c151ad103e55c8223ac147362"},
+]
+qrcode = [
+    {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"},
+    {file = "qrcode-6.1.tar.gz", hash = "sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"},
+]
+reportlab = [
+    {file = "reportlab-3.5.13-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d476edc831bb3e9ebd04d1403abaf3ea57b3e4c2276c91a54fdfb6efbd3f9d97"},
+    {file = "reportlab-3.5.13-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:233196cf25e97cfe7c452524ea29d9a4909f1cb66599299233be1efaaaa7a7a3"},
+    {file = "reportlab-3.5.13-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2b5e4533f3e5b962835a5ce44467e66d1ecc822761d1b508077b5087a06be338"},
+    {file = "reportlab-3.5.13-cp27-cp27m-win32.whl", hash = "sha256:4452b93f9c73b6b70311e7d69082d64da81b38e91bfb4766397630092e6da6fd"},
+    {file = "reportlab-3.5.13-cp27-cp27m-win_amd64.whl", hash = "sha256:74c24a3ec0a3d4f8acb13a07192f45bdb54a1cc3c2286241677e7e8bcd5011fa"},
+    {file = "reportlab-3.5.13-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c7ec4ae2393beab584921b1287a04e94fd98c28315e348362d89b85f4b464546"},
+    {file = "reportlab-3.5.13-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f3463f2cb40a1b515ac0133ba859eca58f53b56760da9abb27ed684c565f853c"},
+    {file = "reportlab-3.5.13-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ed9b7c0d71ce6fe2b31c6cde530ad8238632b876a5d599218739bda142a77f7c"},
+    {file = "reportlab-3.5.13-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:a5905aa567946bc938b489a7249c7890c3fd3c9b7b5680dece5bc551c2ddbe0d"},
+    {file = "reportlab-3.5.13-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:acbb7f676b8586b770719e9683eda951fdb38eb7970d46fcbf3cdda88d912a64"},
+    {file = "reportlab-3.5.13-cp34-cp34m-win32.whl", hash = "sha256:f0a2465af4006f97b05e1f1546d67d3a3213d414894bf28be7f87f550a7f4a55"},
+    {file = "reportlab-3.5.13-cp34-cp34m-win_amd64.whl", hash = "sha256:facc3c9748ab1525fb8401a1223bce4f24f0d6aa1a9db86c55db75777ccf40f9"},
+    {file = "reportlab-3.5.13-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:069f684cd0aaa518a27dc9124aed29cee8998e21ddf19604e53214ec8462bdd7"},
+    {file = "reportlab-3.5.13-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:98ccd2f8b4f8636db05f3f14db0b471ad6bb4b66ae0dc9052c4822b3bd5d6a7d"},
+    {file = "reportlab-3.5.13-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2e860bcdace5a558356802a92ae8658d7e5fdaa00ded82e83a3f2987c562cb66"},
+    {file = "reportlab-3.5.13-cp35-cp35m-win32.whl", hash = "sha256:dd423a6753509ab14a0ac1b5be39d219c8f8d3781cce3deb4f45eda31969b5e8"},
+    {file = "reportlab-3.5.13-cp35-cp35m-win_amd64.whl", hash = "sha256:0c32be9a406172c29ea20ff55a709ccac1e7fb09f15aba67cb7b455fd1d3dbe0"},
+    {file = "reportlab-3.5.13-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:528c74a1c6527d1859c2c7a64a94a1cba485b00175162ea23699ae58a1e94939"},
+    {file = "reportlab-3.5.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b5e30f865add48cf880f1c363eb505b97f2f7baaa88c155f87a335a76515a3e5"},
+    {file = "reportlab-3.5.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f20bfe26e57e8e1f575a9e0325be04dd3562db9f247ffdd73b5d4df6dec53bc2"},
+    {file = "reportlab-3.5.13-cp36-cp36m-win32.whl", hash = "sha256:09b68ec01d86b4b120456b3f3202570ec96f57624e3a4fc36f3829323391daa4"},
+    {file = "reportlab-3.5.13-cp36-cp36m-win_amd64.whl", hash = "sha256:db059e1a0691c872784062421ec51848539eb4f5210142682e61059a5ca7cc55"},
+    {file = "reportlab-3.5.13-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:727b5f2bed08552d143fc99649b1863c773729f580a416844f9d9967bb0a1ae8"},
+    {file = "reportlab-3.5.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:be2a7c33a2c28bbd3f453ffe4f0e5200b88c803a097f4cf52d69c6b53fad7a8f"},
+    {file = "reportlab-3.5.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c356bb600f59ac64955813d6497a08bfd5d0c451cb5829b61e3913d0ac084e26"},
+    {file = "reportlab-3.5.13-cp37-cp37m-win32.whl", hash = "sha256:6b2b3580c647d75ef129172cb3da648cdb24566987b0b59c5ebb80ab770748d6"},
+    {file = "reportlab-3.5.13-cp37-cp37m-win_amd64.whl", hash = "sha256:3546029e63a9a9dc24ee38959eb417678c2425b96cd27b31e09e216dafc94666"},
+    {file = "reportlab-3.5.13.tar.gz", hash = "sha256:6116e750f98018febc08dfee6df20446cf954adbcfa378d2c703d56c8864aff3"},
+]
+requests = [
+    {file = "requests-2.21.0-py2.py3-none-any.whl", hash = "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"},
+    {file = "requests-2.21.0.tar.gz", hash = "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e"},
+]
+requests-toolbelt = [
+    {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"},
+    {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+soupsieve = [
+    {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"},
+    {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"},
+]
+urllib3 = [
+    {file = "urllib3-1.24.3-py2.py3-none-any.whl", hash = "sha256:a637e5fae88995b256e3409dc4d52c2e2e0ba32c42a6365fee8bbd2238de3cfb"},
+    {file = "urllib3-1.24.3.tar.gz", hash = "sha256:2393a695cd12afedd0dcb26fe5d50d0cf248e5a66f75dbd89a3d4eb333a61af4"},
+]
+vatnumber = [
+    {file = "vatnumber-1.2.tar.gz", hash = "sha256:4e9e9cabcff6076d8deb8a347edfd5d0ab8cab1ed344fdbe5dd4a6110a2f2c7b"},
+]
+vobject = [
+    {file = "vobject-0.9.6.1.tar.gz", hash = "sha256:96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101"},
+]
+werkzeug = [
+    {file = "Werkzeug-0.14.1-py2.py3-none-any.whl", hash = "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b"},
+    {file = "Werkzeug-0.14.1.tar.gz", hash = "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c"},
+]
+xlrd = [
+    {file = "xlrd-1.1.0-py2.py3-none-any.whl", hash = "sha256:83a1d2f1091078fb3f65876753b5302c5cfb6a41de64b9587b74cefa75157148"},
+    {file = "xlrd-1.1.0.tar.gz", hash = "sha256:8a21885513e6d915fe33a8ee5fdfa675433b61405ba13e2a69e62ee36828d7e2"},
+]
+xlsxwriter = [
+    {file = "XlsxWriter-1.1.2-py2.py3-none-any.whl", hash = "sha256:7cc07619760641b67112dbe0df938399d4d915d9b9924bb58eb5c17384d29cc6"},
+    {file = "XlsxWriter-1.1.2.tar.gz", hash = "sha256:ae22658a0fc5b9e875fa97c213d1ffd617d86dc49bf08be99ebdac814db7bf36"},
+]
+xlwt = [
+    {file = "xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e"},
+    {file = "xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88"},
+]
+zeep = [
+    {file = "zeep-3.2.0-py2.py3-none-any.whl", hash = "sha256:c8a2f12228b18c5db1feec0814907048d3c77eb6bbed419d567fe87fd9f0e530"},
+    {file = "zeep-3.2.0.tar.gz", hash = "sha256:e5feb8b261c7e271e20c191bd346d80705d53b90af3c1e6f214aa108876fd72d"},
+]
diff --git a/modules/private/websites/nicecoop/odoo/pyproject.toml b/modules/private/websites/nicecoop/odoo/pyproject.toml
new file mode 100644 (file)
index 0000000..accbd0d
--- /dev/null
@@ -0,0 +1,54 @@
+[tool.poetry]
+name = "Odoo"
+version = "13.0"
+description = "Odoo is a suite of web based open source business apps."
+authors = ["Odoo SA"]
+
+[tool.poetry.dependencies]
+python = "^3.6"
+Babel = "2.6.0"
+chardet = "3.0.4"
+decorator = "4.3.0"
+docutils = "0.14"
+ebaysdk = "2.1.5"
+feedparser = "5.2.1"
+gevent = "1.1.2"
+greenlet = "0.4.10"
+html2text = "2018.1.9"
+Jinja2 = "2.10.1"
+libsass = "0.17.0"
+lxml = "3.7.1"
+Mako = "1.0.7"
+MarkupSafe = "1.1.0"
+mock = "2.0.0"
+num2words = "0.5.6"
+ofxparse = "0.19"
+passlib = "1.7.1"
+Pillow = "5.4.1"
+polib = "1.1.0"
+psutil = "5.6.6"
+psycopg2 = "2.7.7"
+pydot = "1.4.1"
+python-ldap = "3.1.0"
+pyparsing = "2.2.0"
+PyPDF2 = "1.26.0"
+pyserial = "3.4"
+python-dateutil = "2.7.3"
+pytz = "2019.1"
+pyusb = "1.0.2"
+qrcode = "6.1"
+reportlab = "3.5.13"
+requests = "2.21.0"
+zeep = "3.2.0"
+vatnumber = "1.2"
+vobject = "0.9.6.1"
+Werkzeug = "0.14.1"
+XlsxWriter = "1.1.2"
+xlwt = "1.3.*"
+xlrd = "1.1.0"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/modules/private/websites/nicecoop/odoo/shell_generate_poetry.nix b/modules/private/websites/nicecoop/odoo/shell_generate_poetry.nix
new file mode 100644 (file)
index 0000000..1a63b4a
--- /dev/null
@@ -0,0 +1,52 @@
+{ pkgs ? import <nixpkgs> {} }:
+let
+  odoo_version = "13.0";
+  python_version = "3.6";
+  pyproject = pkgs.writeText "pyproject.toml" ''
+    [tool.poetry]
+    name = "Odoo"
+    version = "${odoo_version}"
+    description = "Odoo is a suite of web based open source business apps."
+    authors = ["Odoo SA"]
+
+    [tool.poetry.dependencies]
+    python = "^${python_version}"
+
+    [tool.poetry.dev-dependencies]
+
+    [build-system]
+    requires = ["poetry-core>=1.0.0"]
+    build-backend = "poetry.core.masonry.api"
+  '';
+  newPoetry = pkgs.poetry.override { python = pkgs.python36; };
+in
+pkgs.mkShell {
+  buildInputs = [ pkgs.perl pkgs.gcc pkgs.libjpeg pkgs.libxslt pkgs.pkg-config pkgs.postgresql_11 pkgs.cyrus_sasl pkgs.openldap pkgs.zlib pkgs.file pkgs.libxml2 newPoetry ];
+  shellHook = ''
+    NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -isystem ${pkgs.cyrus_sasl.dev}/include/sasl -isystem ${pkgs.libxml2.dev}/include/libxml2/"
+    check_valid() {
+      expression="$1"
+      expression=''${expression/sys_platform/\$sys_platform}
+      expression=''${expression/python_version/\$python_version}
+      expression=''${expression/"== '"/"eq '"}
+      expression=''${expression/"!= '"/"ne '"}
+      #echo "my \$python_version='${python_version}' ; my \$sys_platform='linux'; exit !($expression)"
+      perl -e "my \$python_version='${python_version}' ; my \$sys_platform='linux'; exit !($expression)"
+    }
+    buildPoetry() {
+      cat "${pyproject}" > pyproject.toml
+      rm -f poetry.lock
+
+      requirements=$(cat requirements.txt | while read i; do
+        if echo "$i" | grep -q ";"; then
+          a="$(echo $i | sed -e "s/.*; *//")"
+          check_valid "$a" && echo "$i" | sed -e "s/ *;.*//";
+        else
+          echo "$i"
+        fi
+      done)
+
+      poetry add $requirements
+    }
+    '';
+}