]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Fix some etherpad-lite modules and packaging
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 3 May 2020 22:12:46 +0000 (00:12 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 3 May 2020 22:12:46 +0000 (00:12 +0200)
The upgrade to 1.8.3 broke many modules, which were patched to continue
working correctly.

This commit also reworks the module system, making it similar to
python’s withPackages.

25 files changed:
modules/private/websites/tools/ether/default.nix
modules/webapps/etherpad-lite.nix
pkgs/webapps/default.nix
pkgs/webapps/etherpad-lite/default.nix
pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix
pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix
pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix
pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch
pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch [new file with mode: 0644]
pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix

index a0329ef6f881fe8d85458d5196273e0ea1be2aa6..3350a4a1bd802599c88d1f4a767d8aba22a99bd1 100644 (file)
@@ -125,6 +125,10 @@ in {
                 "defaultLang": "fr"
               }
             },
+            "ep_comments_page": {
+              "displayCommentAsIcon": true,
+              "highlightSelectedText": true
+            },
             "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
             "loadTest": false,
             "indentationOnNewLine": false,
@@ -152,7 +156,16 @@ in {
     ];
     services.etherpad-lite = {
       enable = true;
-      modules = builtins.attrValues pkgs.webapps.etherpad-lite-modules;
+      package = pkgs.webapps.etherpad-lite.withModules (p: [
+        p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page
+        p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia
+        p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth
+        p.ep_line_height p.ep_markdown p.ep_mypads p.ep_page_view
+        p.ep_previewimages p.ep_ruler p.ep_scrollto
+        p.ep_set_title_on_pad p.ep_subscript_and_superscript
+        p.ep_timesliderdiff
+      ]);
+      modules = [];
       sessionKeyFile = "/var/secrets/webapps/tools-etherpad-sessionkey";
       apiKeyFile = "/var/secrets/webapps/tools-etherpad-apikey";
       configFile = "/var/secrets/webapps/tools-etherpad";
index 7f0e2ed4afbc41c303b887e367af78ccb845e689..2e0995287e7f07074ebc7dfdf1694f383a851aa3 100644 (file)
@@ -57,18 +57,22 @@ in
       description = ''
         Etherpad lite package to use.
         '';
+      example = lib.literalExample ''
+        pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
+      '';
     };
     modules = lib.mkOption {
       type = lib.types.listOf lib.types.package;
       default = [];
       description = ''
         Etherpad lite modules to use.
+        DEPRECATED: use package directly
         '';
     };
     # Output variables
     workdir = lib.mkOption {
       type = lib.types.package;
-      default = cfg.package.withModules cfg.modules;
+      default = cfg.package.withModules (_: cfg.modules);
       description = ''
       Adjusted Etherpad lite package with plugins
       '';
index 05172a93a0c9dd0cf7566a84483b8ca32b3872b9..fdf26515e81664125afaa1fc52e9ef2af88777e6 100644 (file)
@@ -15,23 +15,6 @@ rec {
       (name: callPackage (./dokuwiki/plugins + "/${name}.nix") {});
 
   etherpad-lite = callPackage ./etherpad-lite {};
-  etherpad-lite-with-modules = etherpad-lite.withModules (builtins.attrValues etherpad-lite-modules);
-  etherpad-lite-modules = let
-    nodeEnv = callPackage mylibs.nodeEnv {};
-    names = [
-      "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
-      "ep_clear_formatting" "ep_colors" "ep_copy_paste_select_all"
-      "ep_cursortrace" "ep_embedmedia" "ep_font_family" "ep_font_size"
-      "ep_headings2" "ep_ldapauth" "ep_line_height" "ep_markdown"
-      "ep_previewimages" "ep_ruler" "ep_scrollto" "ep_set_title_on_pad"
-      "ep_subscript_and_superscript" "ep_timesliderdiff"
-      "ep_delete_empty_pads" "ep_mypads"
-    ];
-  in
-    # nix files are built using node2nix -i node-packages.json
-    lib.attrsets.genAttrs names
-    (name: (callPackage (./etherpad-lite/modules + "/${name}/node-packages.nix") { inherit nodeEnv; })
-      .${name}.overrideAttrs(old: { passthru = (old.passthru or {}) // { moduleName = name; }; }));
 
   grocy = callPackage ./grocy { inherit mylibs composerEnv; };
 
index 5cd1cfb008f1adc7cb4ce8a25222a83b6ebdf0e5..4327384840be37ad7dc8ec812c368bcf2a5e9e27 100644 (file)
@@ -1,31 +1,43 @@
 { varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
-, stdenv, callPackage, mylibs, fetchurl }:
+, stdenv, callPackage, mylibs, lib }:
 let
-  jquery = fetchurl {
-    url = https://code.jquery.com/jquery-1.9.1.js;
-    sha256 = "0h4dk67yc9d0kadqxb6b33585f3x3559p6qmp70l00qwq030vn3v";
+  nodeEnv = callPackage mylibs.nodeEnv {};
+  moduleNames = [
+    "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
+    "ep_clear_formatting" "ep_colors" "ep_comments_page"
+    "ep_copy_paste_select_all" "ep_cursortrace" "ep_delete_empty_pads"
+    "ep_embedmedia" "ep_font_family" "ep_font_size" "ep_headings2"
+    "ep_immae_buttons" "ep_ldapauth" "ep_line_height" "ep_markdown"
+    "ep_mypads" "ep_page_view" "ep_previewimages" "ep_ruler"
+    "ep_scrollto" "ep_set_title_on_pad" "ep_subscript_and_superscript"
+    "ep_timesliderdiff"
+  ];
+  # nix files are built using node2nix -i node-packages.json
+  allModules = lib.attrsets.genAttrs moduleNames
+    (name: (callPackage (./modules + "/${name}/node-packages.nix") { inherit nodeEnv; }).${name});
+  toPassthru = pkg: {
+    inherit varDir allModules;
+    withModules = withModules pkg;
   };
-  withModules = modules: package.overrideAttrs(old: {
-    installPhase = let
-      modInst = n:
-      let n' = n.override {
-        postInstall = ''
-          if [ ! -f $out/lib/node_modules/${n.moduleName}/.ep_initialized ]; then
-            ln -s ${varDir}/ep_initialized/${n.moduleName} $out/lib/node_modules/${n.moduleName}/.ep_initialized
-          fi
-        '';
-      };
-        in "cp -a ${n'}/lib/node_modules/${n.moduleName} $out/node_modules";
-    in old.installPhase + builtins.concatStringsSep "\n" (map modInst modules);
-    passthru = old.passthru // {
-      inherit modules;
-      withModules = moreModules: old.withModules (moreModules ++ modules);
-    };
-  });
+  withModules = pkg: toModules:
+    let
+      modules = toModules allModules;
+      toInstallModule = n: ''
+        cp -a ${n}/lib/node_modules/${n.packageName} $out/node_modules
+        if [ ! -f $out/node_modules/${n.packageName}/.ep_initialized ]; then
+          chmod u+w $out/node_modules/${n.packageName}/
+          ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized
+        fi
+      '';
+      newEtherpad = pkg.overrideAttrs(old: {
+        installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules);
+        passthru = toPassthru newEtherpad;
+      });
+    in newEtherpad;
   # built using node2nix -l package-lock.json
   # and changing "./." to "src"
   node-environment = (callPackage ./node-packages.nix {
-    nodeEnv = callPackage mylibs.nodeEnv {};
+    inherit nodeEnv;
     src = stdenv.mkDerivation (mylibs.fetchedGithub ./etherpad-lite.json // rec {
       patches = [ ./libreoffice_patch.diff ];
       buildPhase = ''
@@ -44,12 +56,8 @@ let
       mkdir $out/node_modules
       cp -a lib/node_modules/ep_etherpad-lite $out/src
       chmod u+w $out/src/static/js/
-      #cp ${jquery} $out/src/static/js/jquery.js
       ln -s ../src $out/node_modules/ep_etherpad-lite
       '';
-    passthru = {
-      modules = [];
-      inherit varDir withModules;
-    };
+    passthru = toPassthru package;
   };
 in package
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json
new file mode 100644 (file)
index 0000000..ae32884
--- /dev/null
@@ -0,0 +1 @@
+["ep_comments_page"]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix
new file mode 100644 (file)
index 0000000..8d7c85a
--- /dev/null
@@ -0,0 +1,342 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "after-0.8.2" = {
+      name = "after";
+      packageName = "after";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    };
+    "arraybuffer.slice-0.0.7" = {
+      name = "arraybuffer.slice";
+      packageName = "arraybuffer.slice";
+      version = "0.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz";
+        sha512 = "wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==";
+      };
+    };
+    "async-limiter-1.0.1" = {
+      name = "async-limiter";
+      packageName = "async-limiter";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz";
+        sha512 = "csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==";
+      };
+    };
+    "backo2-1.0.2" = {
+      name = "backo2";
+      packageName = "backo2";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    };
+    "base64-arraybuffer-0.1.5" = {
+      name = "base64-arraybuffer";
+      packageName = "base64-arraybuffer";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    };
+    "better-assert-1.0.2" = {
+      name = "better-assert";
+      packageName = "better-assert";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    };
+    "blob-0.0.5" = {
+      name = "blob";
+      packageName = "blob";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz";
+        sha512 = "gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==";
+      };
+    };
+    "callsite-1.0.0" = {
+      name = "callsite";
+      packageName = "callsite";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    };
+    "component-bind-1.0.0" = {
+      name = "component-bind";
+      packageName = "component-bind";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    };
+    "component-emitter-1.2.1" = {
+      name = "component-emitter";
+      packageName = "component-emitter";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    };
+    "component-inherit-0.0.3" = {
+      name = "component-inherit";
+      packageName = "component-inherit";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    };
+    "debug-3.1.0" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz";
+        sha512 = "OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==";
+      };
+    };
+    "debug-4.1.1" = {
+      name = "debug";
+      packageName = "debug";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
+        sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
+      };
+    };
+    "engine.io-client-3.4.1" = {
+      name = "engine.io-client";
+      packageName = "engine.io-client";
+      version = "3.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz";
+        sha512 = "RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==";
+      };
+    };
+    "engine.io-parser-2.2.0" = {
+      name = "engine.io-parser";
+      packageName = "engine.io-parser";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz";
+        sha512 = "6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==";
+      };
+    };
+    "formidable-1.2.2" = {
+      name = "formidable";
+      packageName = "formidable";
+      version = "1.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz";
+        sha512 = "V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==";
+      };
+    };
+    "has-binary2-1.0.3" = {
+      name = "has-binary2";
+      packageName = "has-binary2";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz";
+        sha512 = "G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==";
+      };
+    };
+    "has-cors-1.1.0" = {
+      name = "has-cors";
+      packageName = "has-cors";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    };
+    "indexof-0.0.1" = {
+      name = "indexof";
+      packageName = "indexof";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    };
+    "isarray-2.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz";
+        sha1 = "a37d94ed9cda2d59865c9f76fe596ee1f338741e";
+      };
+    };
+    "ms-2.0.0" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "ms-2.1.2" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
+        sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
+      };
+    };
+    "object-component-0.0.3" = {
+      name = "object-component";
+      packageName = "object-component";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    };
+    "parseqs-0.0.5" = {
+      name = "parseqs";
+      packageName = "parseqs";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    };
+    "parseuri-0.0.5" = {
+      name = "parseuri";
+      packageName = "parseuri";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    };
+    "socket.io-client-2.3.0" = {
+      name = "socket.io-client";
+      packageName = "socket.io-client";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz";
+        sha512 = "cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==";
+      };
+    };
+    "socket.io-parser-3.3.0" = {
+      name = "socket.io-parser";
+      packageName = "socket.io-parser";
+      version = "3.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz";
+        sha512 = "hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==";
+      };
+    };
+    "to-array-0.1.4" = {
+      name = "to-array";
+      packageName = "to-array";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    };
+    "ws-6.1.4" = {
+      name = "ws";
+      packageName = "ws";
+      version = "6.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz";
+        sha512 = "eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==";
+      };
+    };
+    "xmlhttprequest-ssl-1.5.5" = {
+      name = "xmlhttprequest-ssl";
+      packageName = "xmlhttprequest-ssl";
+      version = "1.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz";
+        sha1 = "c2876b06168aadc40e57d97e81191ac8f4398b3e";
+      };
+    };
+    "yeast-0.1.2" = {
+      name = "yeast";
+      packageName = "yeast";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    };
+  };
+in
+{
+  ep_comments_page = nodeEnv.buildNodePackage {
+    name = "ep_comments_page";
+    packageName = "ep_comments_page";
+    version = "0.1.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_comments_page/-/ep_comments_page-0.1.0.tgz";
+      sha512 = "aHUfyR3HZ677wgL1hJEeaa1yIabW3PjaFXHhWnlEXdIDXL3WmgkGQ4Y1ccHp057EmquCwNb595HADQO+QUK/lw==";
+    };
+    dependencies = [
+      sources."after-0.8.2"
+      sources."arraybuffer.slice-0.0.7"
+      sources."async-limiter-1.0.1"
+      sources."backo2-1.0.2"
+      sources."base64-arraybuffer-0.1.5"
+      sources."better-assert-1.0.2"
+      sources."blob-0.0.5"
+      sources."callsite-1.0.0"
+      sources."component-bind-1.0.0"
+      sources."component-emitter-1.2.1"
+      sources."component-inherit-0.0.3"
+      sources."debug-4.1.1"
+      sources."engine.io-client-3.4.1"
+      sources."engine.io-parser-2.2.0"
+      sources."formidable-1.2.2"
+      sources."has-binary2-1.0.3"
+      sources."has-cors-1.1.0"
+      sources."indexof-0.0.1"
+      sources."isarray-2.0.1"
+      sources."ms-2.1.2"
+      sources."object-component-0.0.3"
+      sources."parseqs-0.0.5"
+      sources."parseuri-0.0.5"
+      sources."socket.io-client-2.3.0"
+      (sources."socket.io-parser-3.3.0" // {
+        dependencies = [
+          sources."debug-3.1.0"
+          sources."ms-2.0.0"
+        ];
+      })
+      sources."to-array-0.1.4"
+      sources."ws-6.1.4"
+      sources."xmlhttprequest-ssl-1.5.5"
+      sources."yeast-0.1.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds comments on sidebar and link it to the text.  Support for Page View, requires ep_page_view";
+      homepage = "https://github.com/ether/ep_comments#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch b/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch
new file mode 100644 (file)
index 0000000..162f1b0
--- /dev/null
@@ -0,0 +1,85 @@
+diff --git a/ep.json b/ep.json
+index 083d484..6803475 100644
+--- a/ep.json
++++ b/ep.json
+@@ -5,6 +5,7 @@
+       "hooks": {
+       "eejsBlock_editbarMenuLeft": "ep_embedmedia/hooks:eejsBlock_editbarMenuLeft",
+       "eejsBlock_scripts": "ep_embedmedia/hooks:eejsBlock_scripts",
++      "eejsBlock_timesliderBody": "ep_embedmedia/hooks:eejsBlock_scripts",
+       "eejsBlock_styles": "ep_embedmedia/hooks:eejsBlock_styles",
+       "eejsBlock_body": "ep_embedmedia/hooks:eejsBlock_body"
+       },
+diff --git a/static/css/main.css b/static/css/main.css
+index 72a460f..3b66d8e 100644
+--- a/static/css/main.css
++++ b/static/css/main.css
+@@ -6,10 +6,18 @@
+   z-index:999999;
+ }
++#embedMediaSrc {
++  max-width: 100%;
++}
++
+ .embedMediaButton {
+   padding:10px;
+ }
++#doEmbedMedia{
++  color:blue;
++} 
++
+ #cancelEmbedMedia{
+   color:red;
+ } 
+@@ -19,6 +27,6 @@
+ }
+ .buttonicon-embed-media:before{
+-  content:"\e80b";
++  content:"\e83b";
+   top: 2px !important;
+ }
+diff --git a/static/js/main.js b/static/js/main.js
+index 8c94767..19415d5 100644
+--- a/static/js/main.js
++++ b/static/js/main.js
+@@ -10,22 +10,25 @@ $(document).ready(function () {
+     } else {
+       module.slideDown("fast");
+     }
++    module.toggleClass("popup-show");
+   });
+   $("#doEmbedMedia").click(function () {
+     var padeditor = require('ep_etherpad-lite/static/js/pad_editor').padeditor;
+     $("#embedMediaModal").slideUp("fast");
++    $("#embedMediaModal").removeClass("popup-show");
+     return padeditor.ace.callWithAce(function (ace) {
+-      rep = ace.ace_getRep();
++      var rep = ace.ace_getRep();
+       ace.ace_replaceRange(rep.selStart, rep.selEnd, "E");
+       ace.ace_performSelectionChange([rep.selStart[0],rep.selStart[1]-1], rep.selStart, false);
+-        ace.ace_performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, [["embedMedia", escape($("#embedMediaSrc")[0].value)]]);
++      ace.ace_performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, [["embedMedia", escape($("#embedMediaSrc")[0].value)]]);
+     }, "embedMedia");
+   });
+   $("#cancelEmbedMedia").click(function () {
+     $("#embedMediaModal").slideUp("fast");
++    $("#embedMediaModal").removeClass("popup-show");
+   });
+ });
+diff --git a/templates/modals.ejs b/templates/modals.ejs
+index 9340698..8915a3b 100644
+--- a/templates/modals.ejs
++++ b/templates/modals.ejs
+@@ -1,4 +1,4 @@
+-<div id="embedMediaModal" class="popup">
++<div id="embedMediaModal" class="popup popup-content">
+     <% e.begin_block("embedMediaPopup"); %>
+         <h1>Embed media into this pad</h1>
+         <p>Paste a link or "embed code" here:</p>
index 9ded27dc701fb41a898df5022a79b50e9c30ec2f..80ba484588d23abf0d49028bcb41dc9f337babc2 100644 (file)
@@ -15,6 +15,9 @@ in
       sha1 = "b24bf0fe9702d21aa73079890e93183efc6a0975";
     };
     buildInputs = globalBuildInputs;
+    preRebuild = ''
+      patch -p1 < ${./fix.patch}
+    '';
     meta = {
       description = "Embed media (youtube, vimeo etc)";
       homepage = https://github.com/JohnMcLear/ep_embedmedia;
@@ -23,4 +26,4 @@ in
     bypassCache = true;
     reconstructLock = true;
   };
-}
\ No newline at end of file
+}
index dc414e99cdb2718dbcb65496641ed3a1c6c70043..ba6392c294c39cabb06d539bc2f6f21351c4d94d 100644 (file)
@@ -9,10 +9,10 @@ in
   ep_headings2 = nodeEnv.buildNodePackage {
     name = "ep_headings2";
     packageName = "ep_headings2";
-    version = "0.1.0";
+    version = "0.1.1";
     src = fetchurl {
-      url = "https://registry.npmjs.org/ep_headings2/-/ep_headings2-0.1.0.tgz";
-      sha512 = "evfM+wZgPF3PSrXoFMFGXf8ETXVu6fiUQFpRsgedrNtbVsbPLW5wNnMRpPR0DBUEJLq+xuNLRR9ZzUsIe60p+Q==";
+      url = "https://registry.npmjs.org/ep_headings2/-/ep_headings2-0.1.1.tgz";
+      sha512 = "DcHRUMzTsTFbTNH4wY43HI7LJ1Xk85J4Lv54fI5pVTXjqkfOC3p5CHoTWwmrCP288i4aMOcDP9Xru5qv/41vqQ==";
     };
     buildInputs = globalBuildInputs;
     meta = {
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json
new file mode 100644 (file)
index 0000000..10db4ef
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "parts": [
+    {
+      "name": "immae_buttons",
+      "hooks": {
+        "eejsBlock_editbarMenuLeft": "ep_immae_buttons/hooks:eejsBlock_editbarMenuLeft"
+      },
+      "client_hooks": {
+        "postAceInit": "ep_immae_buttons/static/js/main:postAceInit"
+      }
+    }
+  ]
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js
new file mode 100644 (file)
index 0000000..dcf7782
--- /dev/null
@@ -0,0 +1,6 @@
+var eejs = require('ep_etherpad-lite/node/eejs/');
+
+exports.eejsBlock_editbarMenuLeft = function (hook_name, args, cb) {
+  args.content = args.content + eejs.require("ep_immae_buttons/templates/editbarButtons.ejs");
+  return cb();
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix
new file mode 100644 (file)
index 0000000..d7045df
--- /dev/null
@@ -0,0 +1,22 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_immae_buttons = nodeEnv.buildNodePackage {
+    name = "ep_immae_buttons";
+    packageName = "ep_immae_buttons";
+    version = "0.1.0";
+    src = ./.;
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Additional buttons (replacing clear_formatting and copy_paste_select_all)";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json
new file mode 100644 (file)
index 0000000..39bb0a8
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "name": "ep_immae_buttons",
+  "description": "Additional buttons (replacing clear_formatting and copy_paste_select_all)",
+  "version": "0.1.0",
+  "author": "Immae",
+  "contributors": [],
+  "dependencies": { },
+  "repository" : { "type" : "git", "url"  : "" },
+  "engines": { "node": "*" }
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js
new file mode 100644 (file)
index 0000000..07f7b9c
--- /dev/null
@@ -0,0 +1,67 @@
+exports.postAceInit = function(hook, context){
+  $(document).ready(function () {
+    $('.clearFormatting').click(function(){
+      context.ace.callWithAce(function(ace){
+
+        var rep = ace.ace_getRep(); // get the current user selection
+        var isSelection = (rep.selStart[0] !== rep.selEnd[0] || rep.selStart[1] !== rep.selEnd[1]);
+        if(!isSelection) return false; // No point proceeding if no selection..
+
+        var attrs = rep.apool.attribToNum; // get the attributes on this document
+        $.each(attrs, function(k, v){ // for each attribute
+          var attr = k.split(",")[0]; // get the name of the attribute
+          if(attr !== "author"){ // if its not an author attribute
+            ace.ace_setAttributeOnSelection(attr, false); // set the attribute to false
+          }
+        });
+      },'clearFormatting' , true);
+    });
+
+    $('.findAndReplace').click(function(){
+      var from = prompt("Search for...");
+      var to = prompt("Replace with...");
+      var HTMLLines = $('iframe[name="ace_outer"]').contents().find('iframe').contents().find("#innerdocbody").children("div");
+      $(HTMLLines).each(function(){ // For each line
+        findAndReplace(from, to, this);
+      });
+    });
+
+  });
+}
+
+function findAndReplace(searchText, replacement, searchNode) {
+  if (!searchText || typeof replacement === 'undefined') {
+    // Throw error here if you want...
+    return;
+  }
+  var regex = typeof searchText === 'string' ?
+    new RegExp(searchText, 'gi') : searchText,
+    childNodes = (searchNode || document.body).childNodes,
+    cnLength = childNodes.length,
+    excludes = ["html","head","style","title","meta","script","object","iframe","link"];
+
+  while (cnLength--) {
+    var currentNode = childNodes[cnLength];
+    if (currentNode.nodeType === 1){
+      if(excludes.indexOf(currentNode.nodeName.toLowerCase() === -1)){
+        arguments.callee(searchText, replacement, currentNode);
+      }
+    }
+    if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
+      continue;
+    }
+    var parent = currentNode.parentNode,
+    frag = (function(){
+      var html = currentNode.data.replace(regex, replacement),
+      wrap = document.createElement('div'),
+      frag = document.createDocumentFragment();
+      wrap.innerHTML = html;
+      while (wrap.firstChild) {
+        frag.appendChild(wrap.firstChild);
+      }
+      return frag;
+    })();
+    parent.insertBefore(frag, currentNode);
+    parent.removeChild(currentNode);
+  }
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs b/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs
new file mode 100644 (file)
index 0000000..339ae3d
--- /dev/null
@@ -0,0 +1,12 @@
+<li class="separator"></li>
+<li class="clearFormatting">
+  <a title="Clear Formatting">
+    <span class="buttonicon buttonicon-clear-formatting">Clear</span>
+  </a>
+</li>
+<li class="separator"></li>
+<li class="findAndReplace">
+  <a title="Find and replace">
+    <span class="buttonicon buttonicon-find-replace">Find</span>
+  </a>
+</li>
index 9e6fdbea88d2e259b1aaff4bce7039f40e42d939..8140187d78a8df13e6a6c8651f69d76eb9a6383b 100644 (file)
@@ -330,6 +330,9 @@ in
       url = "https://registry.npmjs.org/ep_ldapauth/-/ep_ldapauth-0.3.0.tgz";
       sha1 = "8b34ea34b20ae97d53d753cc7d1f6f191800e3b0";
     };
+    preRebuild = ''
+      sed -i -e 's/context.message.data.type == "USERINFO_UPDATE"/context.message.data.type == "USERINFO_UPDATE" \&\& context.req \&\& context.req.session \&\& typeof(context.req.session.user) !== "undefined"/g' ep_ldapauth.js
+    '';
     dependencies = [
       sources."asn1-0.2.3"
       sources."assert-plus-1.0.0"
@@ -386,4 +389,4 @@ in
     bypassCache = true;
     reconstructLock = true;
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch b/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch
new file mode 100644 (file)
index 0000000..ffd65f1
--- /dev/null
@@ -0,0 +1,30 @@
+diff --git a/static/js/index.js b/static/js/index.js
+index 1884571..c0490bf 100644
+--- a/static/js/index.js
++++ b/static/js/index.js
+@@ -23,9 +23,6 @@ var postAceInit = function(hook, context){
+   $('.line-height-menu').hover(function(){
+     $('.submenu > .height-selection').attr('size', 4);
+   });
+-  $('.line-height').click(function(){
+-    $('.line-height-select').toggle();
+-  });
+ };
+ exports.aceGetFilterStack = function(name, context){
+diff --git a/templates/editbarButtons.ejs b/templates/editbarButtons.ejs
+index 89a8aaa..8af258b 100644
+--- a/templates/editbarButtons.ejs
++++ b/templates/editbarButtons.ejs
+@@ -1,10 +1,5 @@
+ <li class="separator acl-write"></li>
+-<li class="acl-write line-height">
+-  <a title="line height">
+-    <span class="buttonicon" style="background-image:url('../static/plugins/ep_line_height/static/img/icon.png');"></span>
+-  </a>
+-</li>
+-<li class="line-height-select" class="acl-write" style="display:none;">
++<li class="line-height-select" class="acl-write">
+     <select class="height-selection">
+         <option value="dummy" selected data-l10n-id="ep_line_height.height">Line Height</option>
+         <option value="1">1x</option>
index b89b48d4739e4360659f119fe4e5a16c72325ae6..d5d5c21e708b76ab40c9216458263a2311f37765 100644 (file)
@@ -15,6 +15,9 @@ in
       sha1 = "8afbb441e6d65db97d2335887f9352b10b5d22d2";
     };
     buildInputs = globalBuildInputs;
+    preRebuild = ''
+      patch -p1 < ${./fix.patch}
+    '';
     meta = {
       description = "Change the line height";
     };
@@ -22,4 +25,4 @@ in
     bypassCache = true;
     reconstructLock = true;
   };
-}
\ No newline at end of file
+}
index 738a0668b52f7e3bfc8678867e88d68ef8e769ef..6ade6cb505beca3b2d1a86b7904eca5c688e2f7f 100644 (file)
@@ -1,5 +1,5 @@
 diff --git a/auth.js b/auth.js
-index ce77ee4..de66b03 100644
+index ce77ee4..235d8e6 100644
 --- a/auth.js
 +++ b/auth.js
 @@ -91,6 +91,7 @@ var cuid        = require('cuid');
@@ -10,19 +10,7 @@ index ce77ee4..de66b03 100644
  
  var NOT_INTERNAL_AUTH_PWD = 'soooooo_useless';
  
-@@ -212,6 +213,7 @@ module.exports = (function () {
-             }
-             return callback(new Error(emsg), false);
-           }
-+          console.log("before user.get");
-           user.get(login, function(err, u) {
-             var props = ldapConf.properties;
-             var mail;
-@@ -229,27 +231,30 @@ module.exports = (function () {
-               return callback(new Error(emsg), false);
-             }
-             if (err) {
-+              console.log("in user.get err");
+@@ -232,21 +233,21 @@ module.exports = (function () {
                // We have to create the user in mypads database
                ldapConf  = conf.get('authLdapSettings');
                user.set({
@@ -43,7 +31,6 @@ index ce77ee4..de66b03 100644
 +                       u.lastname  !== utils.getSingleton(ldapuser[props.lastname])) {
                  // Update database and cache informations if needed
                  // (i.e. update from LDAP)
-+                console.log("in user.get update");
                  u.email     = mail;
 -                u.firstname = ldapuser[props.firstname];
 -                u.lastname  = ldapuser[props.lastname];
@@ -52,22 +39,6 @@ index ce77ee4..de66b03 100644
                  u.password  = NOT_INTERNAL_AUTH_PWD;
                  user.set(u, callback);
              } else {
-+                console.log("in user.get callback");
-               return callback(null, u);
-             }
-           });
-diff --git a/model/common.js b/model/common.js
-index b19829b..9421742 100644
---- a/model/common.js
-+++ b/model/common.js
-@@ -94,6 +94,7 @@ module.exports = (function() {
-       var isFS = function (s) { return (ld.isString(s) && !ld.isEmpty(s)); };
-       ld.forEach(strFields, function (s) {
-         if (!isFS(params[s])) {
-+          console.log(params, s);
-           throw new TypeError('BACKEND.ERROR.TYPE.PARAM_STR');
-         }
-         if (s.length > 100) {
 diff --git a/utils.js b/utils.js
 index 32c2727..d381d06 100644
 --- a/utils.js
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json
new file mode 100644 (file)
index 0000000..c5f4a7b
--- /dev/null
@@ -0,0 +1 @@
+["ep_page_view"]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix
new file mode 100644 (file)
index 0000000..e6c6b65
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_page_view = nodeEnv.buildNodePackage {
+    name = "ep_page_view";
+    packageName = "ep_page_view";
+    version = "0.5.24";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_page_view/-/ep_page_view-0.5.24.tgz";
+      sha1 = "26437c23169678f5bd53545b621b492b5b6f2ce4";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support to do 'page view', with a toggle on/off option in Settings, also Page Breaks with Control Enter";
+      homepage = "https://github.com/ether/ep_page_view#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json b/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json
new file mode 100644 (file)
index 0000000..c25d8c9
--- /dev/null
@@ -0,0 +1 @@
+["ep_private_pad"]
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix b/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix
new file mode 100644 (file)
index 0000000..1744f52
--- /dev/null
@@ -0,0 +1,2056 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "abbrev-1.1.1" = {
+      name = "abbrev";
+      packageName = "abbrev";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
+        sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
+      };
+    };
+    "accepts-1.3.7" = {
+      name = "accepts";
+      packageName = "accepts";
+      version = "1.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz";
+        sha512 = "Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==";
+      };
+    };
+    "ajv-6.12.2" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "6.12.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
+        sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
+      };
+    };
+    "align-text-0.1.4" = {
+      name = "align-text";
+      packageName = "align-text";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz";
+        sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "any-1.0.0" = {
+      name = "any";
+      packageName = "any";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/any/-/any-1.0.0.tgz";
+        sha1 = "0a7b348c589faf6ba708d4a2241069ea51628b5e";
+      };
+    };
+    "aproba-1.2.0" = {
+      name = "aproba";
+      packageName = "aproba";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
+        sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
+      };
+    };
+    "are-we-there-yet-1.1.5" = {
+      name = "are-we-there-yet";
+      packageName = "are-we-there-yet";
+      version = "1.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
+      };
+    };
+    "arr-diff-1.1.0" = {
+      name = "arr-diff";
+      packageName = "arr-diff";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz";
+        sha1 = "687c32758163588fef7de7b36fabe495eb1a399a";
+      };
+    };
+    "arr-flatten-1.1.0" = {
+      name = "arr-flatten";
+      packageName = "arr-flatten";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
+      };
+    };
+    "arr-map-2.0.2" = {
+      name = "arr-map";
+      packageName = "arr-map";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz";
+        sha1 = "3a77345ffc1cf35e2a91825601f9e58f2e24cac4";
+      };
+    };
+    "arr-union-3.1.0" = {
+      name = "arr-union";
+      packageName = "arr-union";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    };
+    "array-each-0.1.1" = {
+      name = "array-each";
+      packageName = "array-each";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-each/-/array-each-0.1.1.tgz";
+        sha1 = "c5d52ba8225f36d728178ba7aec413acfaddd0f9";
+      };
+    };
+    "array-flatten-1.1.1" = {
+      name = "array-flatten";
+      packageName = "array-flatten";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    };
+    "array-slice-0.2.3" = {
+      name = "array-slice";
+      packageName = "array-slice";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz";
+        sha1 = "dd3cfb80ed7973a75117cdac69b0b99ec86186f5";
+      };
+    };
+    "array-unique-0.2.1" = {
+      name = "array-unique";
+      packageName = "array-unique";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz";
+        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
+      };
+    };
+    "asn1-0.2.4" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
+        sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "asynckit-0.4.0" = {
+      name = "asynckit";
+      packageName = "asynckit";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    };
+    "aws-sign2-0.7.0" = {
+      name = "aws-sign2";
+      packageName = "aws-sign2";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    };
+    "aws4-1.9.1" = {
+      name = "aws4";
+      packageName = "aws4";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
+        sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "bcrypt-pbkdf-1.0.2" = {
+      name = "bcrypt-pbkdf";
+      packageName = "bcrypt-pbkdf";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    };
+    "bignumber.js-9.0.0" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "9.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz";
+        sha512 = "t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==";
+      };
+    };
+    "block-stream-0.0.9" = {
+      name = "block-stream";
+      packageName = "block-stream";
+      version = "0.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz";
+        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
+      };
+    };
+    "body-parser-1.19.0" = {
+      name = "body-parser";
+      packageName = "body-parser";
+      version = "1.19.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz";
+        sha512 = "dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==";
+      };
+    };
+    "brace-expansion-1.1.11" = {
+      name = "brace-expansion";
+      packageName = "brace-expansion";
+      version = "1.1.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
+      };
+    };
+    "bytes-3.1.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz";
+        sha512 = "zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==";
+      };
+    };
+    "caseless-0.12.0" = {
+      name = "caseless";
+      packageName = "caseless";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    };
+    "center-align-0.1.3" = {
+      name = "center-align";
+      packageName = "center-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz";
+        sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
+      };
+    };
+    "client-sessions-0.8.0" = {
+      name = "client-sessions";
+      packageName = "client-sessions";
+      version = "0.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/client-sessions/-/client-sessions-0.8.0.tgz";
+        sha1 = "a7d8c5558ad5d56f2a199f3533eb654b5df893fd";
+      };
+    };
+    "code-point-at-1.1.0" = {
+      name = "code-point-at";
+      packageName = "code-point-at";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    };
+    "combined-stream-1.0.8" = {
+      name = "combined-stream";
+      packageName = "combined-stream";
+      version = "1.0.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";
+        sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==";
+      };
+    };
+    "concat-map-0.0.1" = {
+      name = "concat-map";
+      packageName = "concat-map";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "console-control-strings-1.1.0" = {
+      name = "console-control-strings";
+      packageName = "console-control-strings";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    };
+    "content-disposition-0.5.3" = {
+      name = "content-disposition";
+      packageName = "content-disposition";
+      version = "0.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz";
+        sha512 = "ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==";
+      };
+    };
+    "content-type-1.0.4" = {
+      name = "content-type";
+      packageName = "content-type";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz";
+        sha512 = "hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==";
+      };
+    };
+    "cookie-0.4.0" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz";
+        sha512 = "+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==";
+      };
+    };
+    "cookie-parser-1.4.5" = {
+      name = "cookie-parser";
+      packageName = "cookie-parser";
+      version = "1.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz";
+        sha512 = "f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==";
+      };
+    };
+    "cookie-signature-1.0.6" = {
+      name = "cookie-signature";
+      packageName = "cookie-signature";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    };
+    "cookies-0.7.3" = {
+      name = "cookies";
+      packageName = "cookies";
+      version = "0.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz";
+        sha512 = "+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "debug-2.6.9" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.6.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
+        sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
+      };
+    };
+    "delayed-stream-1.0.0" = {
+      name = "delayed-stream";
+      packageName = "delayed-stream";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    };
+    "delegates-1.0.0" = {
+      name = "delegates";
+      packageName = "delegates";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    };
+    "depd-1.1.2" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    };
+    "depd-2.0.0" = {
+      name = "depd";
+      packageName = "depd";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz";
+        sha512 = "g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==";
+      };
+    };
+    "destroy-1.0.4" = {
+      name = "destroy";
+      packageName = "destroy";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    };
+    "ecc-jsbn-0.1.2" = {
+      name = "ecc-jsbn";
+      packageName = "ecc-jsbn";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    };
+    "ee-first-1.1.1" = {
+      name = "ee-first";
+      packageName = "ee-first";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    };
+    "eejs-1.0.0" = {
+      name = "eejs";
+      packageName = "eejs";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eejs/-/eejs-1.0.0.tgz";
+        sha1 = "9173f565da10c5d0a7943df7f76bed8381f5bb6b";
+      };
+    };
+    "ejs-1.0.0" = {
+      name = "ejs";
+      packageName = "ejs";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz";
+        sha1 = "c9c60a48a46ee452fb32a71c317b95e5aa1fcb3d";
+      };
+    };
+    "encodeurl-1.0.2" = {
+      name = "encodeurl";
+      packageName = "encodeurl";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    };
+    "escape-html-1.0.3" = {
+      name = "escape-html";
+      packageName = "escape-html";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    };
+    "etag-1.8.1" = {
+      name = "etag";
+      packageName = "etag";
+      version = "1.8.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    };
+    "etherpad-lite-client-0.8.0" = {
+      name = "etherpad-lite-client";
+      packageName = "etherpad-lite-client";
+      version = "0.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-lite-client/-/etherpad-lite-client-0.8.0.tgz";
+        sha1 = "c7db6240f5ca1b09d039b40eaecf3ca2f00a0979";
+      };
+    };
+    "export-dirs-0.2.4" = {
+      name = "export-dirs";
+      packageName = "export-dirs";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/export-dirs/-/export-dirs-0.2.4.tgz";
+        sha1 = "2e16b9b46ebc2c07acb657ccdfbe3845393fe742";
+      };
+    };
+    "export-files-2.1.1" = {
+      name = "export-files";
+      packageName = "export-files";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/export-files/-/export-files-2.1.1.tgz";
+        sha1 = "bbf64574053a09e4eb98e5f43501d572b2c3ce7f";
+      };
+    };
+    "express-4.17.1" = {
+      name = "express";
+      packageName = "express";
+      version = "4.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express/-/express-4.17.1.tgz";
+        sha512 = "mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==";
+      };
+    };
+    "express-session-1.17.1" = {
+      name = "express-session";
+      packageName = "express-session";
+      version = "1.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz";
+        sha512 = "UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==";
+      };
+    };
+    "extend-3.0.2" = {
+      name = "extend";
+      packageName = "extend";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
+        sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
+      };
+    };
+    "extsprintf-1.3.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    };
+    "fast-deep-equal-3.1.1" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
+        sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
+      };
+    };
+    "fast-json-stable-stringify-2.1.0" = {
+      name = "fast-json-stable-stringify";
+      packageName = "fast-json-stable-stringify";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
+        sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
+      };
+    };
+    "finalhandler-1.1.2" = {
+      name = "finalhandler";
+      packageName = "finalhandler";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz";
+        sha512 = "aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==";
+      };
+    };
+    "for-in-0.1.8" = {
+      name = "for-in";
+      packageName = "for-in";
+      version = "0.1.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz";
+        sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
+      };
+    };
+    "for-in-1.0.2" = {
+      name = "for-in";
+      packageName = "for-in";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    };
+    "for-own-0.1.5" = {
+      name = "for-own";
+      packageName = "for-own";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz";
+        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
+      };
+    };
+    "forever-agent-0.6.1" = {
+      name = "forever-agent";
+      packageName = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    };
+    "form-data-2.3.3" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
+        sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
+      };
+    };
+    "forwarded-0.1.2" = {
+      name = "forwarded";
+      packageName = "forwarded";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    };
+    "fresh-0.5.2" = {
+      name = "fresh";
+      packageName = "fresh";
+      version = "0.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    };
+    "fs.realpath-1.0.0" = {
+      name = "fs.realpath";
+      packageName = "fs.realpath";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    };
+    "fstream-1.0.12" = {
+      name = "fstream";
+      packageName = "fstream";
+      version = "1.0.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz";
+        sha512 = "WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==";
+      };
+    };
+    "gauge-2.7.4" = {
+      name = "gauge";
+      packageName = "gauge";
+      version = "2.7.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    };
+    "getpass-0.1.7" = {
+      name = "getpass";
+      packageName = "getpass";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    };
+    "glob-7.1.6" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";
+        sha512 = "LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==";
+      };
+    };
+    "graceful-fs-4.2.4" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz";
+        sha512 = "WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==";
+      };
+    };
+    "har-schema-2.0.0" = {
+      name = "har-schema";
+      packageName = "har-schema";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    };
+    "har-validator-5.1.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
+        sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
+      };
+    };
+    "has-unicode-2.0.1" = {
+      name = "has-unicode";
+      packageName = "has-unicode";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    };
+    "has-values-0.1.4" = {
+      name = "has-values";
+      packageName = "has-values";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    };
+    "http-errors-1.7.2" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.7.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz";
+        sha512 = "uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==";
+      };
+    };
+    "http-signature-1.2.0" = {
+      name = "http-signature";
+      packageName = "http-signature";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    };
+    "iconv-lite-0.4.24" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.4.24";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
+      };
+    };
+    "inflight-1.0.6" = {
+      name = "inflight";
+      packageName = "inflight";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "ipaddr.js-1.9.1" = {
+      name = "ipaddr.js";
+      packageName = "ipaddr.js";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz";
+        sha512 = "0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==";
+      };
+    };
+    "is-buffer-1.1.6" = {
+      name = "is-buffer";
+      packageName = "is-buffer";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
+      };
+    };
+    "is-extendable-0.1.1" = {
+      name = "is-extendable";
+      packageName = "is-extendable";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    };
+    "is-fullwidth-code-point-1.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    };
+    "is-number-2.1.0" = {
+      name = "is-number";
+      packageName = "is-number";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz";
+        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
+      };
+    };
+    "is-plain-object-2.0.4" = {
+      name = "is-plain-object";
+      packageName = "is-plain-object";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
+      };
+    };
+    "is-typedarray-1.0.0" = {
+      name = "is-typedarray";
+      packageName = "is-typedarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    };
+    "isexe-2.0.0" = {
+      name = "isexe";
+      packageName = "isexe";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    };
+    "isobject-1.0.2" = {
+      name = "isobject";
+      packageName = "isobject";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz";
+        sha1 = "f0f9b8ce92dd540fa0740882e3835a2e022ec78a";
+      };
+    };
+    "isobject-3.0.1" = {
+      name = "isobject";
+      packageName = "isobject";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    };
+    "isstream-0.1.2" = {
+      name = "isstream";
+      packageName = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    };
+    "jsbn-0.1.1" = {
+      name = "jsbn";
+      packageName = "jsbn";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    };
+    "json-schema-0.2.3" = {
+      name = "json-schema";
+      packageName = "json-schema";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    };
+    "json-schema-traverse-0.4.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
+      };
+    };
+    "json-stringify-safe-5.0.1" = {
+      name = "json-stringify-safe";
+      packageName = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    };
+    "jsprim-1.4.1" = {
+      name = "jsprim";
+      packageName = "jsprim";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    };
+    "keygrip-1.0.3" = {
+      name = "keygrip";
+      packageName = "keygrip";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz";
+        sha512 = "/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==";
+      };
+    };
+    "kind-of-2.0.1" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz";
+        sha1 = "018ec7a4ce7e3a86cb9141be519d24c8faa981b5";
+      };
+    };
+    "kind-of-3.2.2" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "3.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    };
+    "kind-of-6.0.3" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "6.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
+        sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
+      };
+    };
+    "lazy-cache-1.0.4" = {
+      name = "lazy-cache";
+      packageName = "lazy-cache";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";
+        sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
+      };
+    };
+    "longest-1.0.1" = {
+      name = "longest";
+      packageName = "longest";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz";
+        sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
+      };
+    };
+    "make-iterator-0.1.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-0.1.1.tgz";
+        sha1 = "873d27b8198a465a81483b6f5d16da4e863ecf5b";
+      };
+    };
+    "make-iterator-0.2.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-0.2.1.tgz";
+        sha1 = "a19c660132b54ae6d64f881ec14056c746dbe972";
+      };
+    };
+    "make-iterator-1.0.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz";
+        sha512 = "pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==";
+      };
+    };
+    "media-typer-0.3.0" = {
+      name = "media-typer";
+      packageName = "media-typer";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    };
+    "merge-descriptors-1.0.1" = {
+      name = "merge-descriptors";
+      packageName = "merge-descriptors";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    };
+    "methods-1.1.2" = {
+      name = "methods";
+      packageName = "methods";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    };
+    "mime-1.6.0" = {
+      name = "mime";
+      packageName = "mime";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
+        sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
+      };
+    };
+    "mime-db-1.44.0" = {
+      name = "mime-db";
+      packageName = "mime-db";
+      version = "1.44.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
+        sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
+      };
+    };
+    "mime-types-2.1.27" = {
+      name = "mime-types";
+      packageName = "mime-types";
+      version = "2.1.27";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
+        sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-1.2.5" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
+        sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
+      };
+    };
+    "mkdirp-0.5.5" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
+        sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
+      };
+    };
+    "ms-2.0.0" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "ms-2.1.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
+        sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
+      };
+    };
+    "mysql-2.18.1" = {
+      name = "mysql";
+      packageName = "mysql";
+      version = "2.18.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz";
+        sha512 = "Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==";
+      };
+    };
+    "negotiator-0.6.2" = {
+      name = "negotiator";
+      packageName = "negotiator";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz";
+        sha512 = "hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==";
+      };
+    };
+    "node-gyp-3.8.0" = {
+      name = "node-gyp";
+      packageName = "node-gyp";
+      version = "3.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz";
+        sha512 = "3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==";
+      };
+    };
+    "nopt-3.0.6" = {
+      name = "nopt";
+      packageName = "nopt";
+      version = "3.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
+        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
+      };
+    };
+    "npmlog-4.1.2" = {
+      name = "npmlog";
+      packageName = "npmlog";
+      version = "4.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
+        sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
+      };
+    };
+    "number-is-nan-1.0.1" = {
+      name = "number-is-nan";
+      packageName = "number-is-nan";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    };
+    "oauth-sign-0.9.0" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
+      };
+    };
+    "object-assign-4.1.1" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    };
+    "object.defaults-0.3.0" = {
+      name = "object.defaults";
+      packageName = "object.defaults";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.defaults/-/object.defaults-0.3.0.tgz";
+        sha1 = "b1eb9cbc78c4c7bd56cac6cae3dead5a7113882a";
+      };
+    };
+    "object.filter-0.3.0" = {
+      name = "object.filter";
+      packageName = "object.filter";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.filter/-/object.filter-0.3.0.tgz";
+        sha1 = "1091c69394b44f96d9d6356dd08785028ad6bff9";
+      };
+    };
+    "object.omit-2.0.1" = {
+      name = "object.omit";
+      packageName = "object.omit";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz";
+        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
+      };
+    };
+    "object.pick-1.3.0" = {
+      name = "object.pick";
+      packageName = "object.pick";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    };
+    "object.reduce-0.1.7" = {
+      name = "object.reduce";
+      packageName = "object.reduce";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.reduce/-/object.reduce-0.1.7.tgz";
+        sha1 = "d180e84f72d218348af45352b55165246b95046d";
+      };
+    };
+    "on-finished-2.3.0" = {
+      name = "on-finished";
+      packageName = "on-finished";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    };
+    "on-headers-1.0.2" = {
+      name = "on-headers";
+      packageName = "on-headers";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz";
+        sha512 = "pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==";
+      };
+    };
+    "once-1.4.0" = {
+      name = "once";
+      packageName = "once";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "os-homedir-1.0.2" = {
+      name = "os-homedir";
+      packageName = "os-homedir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    };
+    "os-tmpdir-1.0.2" = {
+      name = "os-tmpdir";
+      packageName = "os-tmpdir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    };
+    "osenv-0.1.5" = {
+      name = "osenv";
+      packageName = "osenv";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
+        sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
+      };
+    };
+    "parseurl-1.3.3" = {
+      name = "parseurl";
+      packageName = "parseurl";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz";
+        sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==";
+      };
+    };
+    "password-hash-1.2.2" = {
+      name = "password-hash";
+      packageName = "password-hash";
+      version = "1.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/password-hash/-/password-hash-1.2.2.tgz";
+        sha1 = "3b451f014de4b2e1ebfa0e5493b9517b1063af1d";
+      };
+    };
+    "path-is-absolute-1.0.1" = {
+      name = "path-is-absolute";
+      packageName = "path-is-absolute";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "path-to-regexp-0.1.7" = {
+      name = "path-to-regexp";
+      packageName = "path-to-regexp";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    };
+    "performance-now-2.1.0" = {
+      name = "performance-now";
+      packageName = "performance-now";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    };
+    "process-nextick-args-2.0.1" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
+      };
+    };
+    "proxy-addr-2.0.6" = {
+      name = "proxy-addr";
+      packageName = "proxy-addr";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz";
+        sha512 = "dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==";
+      };
+    };
+    "psl-1.8.0" = {
+      name = "psl";
+      packageName = "psl";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
+        sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
+      };
+    };
+    "punycode-2.1.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
+        sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
+      };
+    };
+    "qs-6.5.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
+        sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
+      };
+    };
+    "qs-6.7.0" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz";
+        sha512 = "VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==";
+      };
+    };
+    "random-bytes-1.0.0" = {
+      name = "random-bytes";
+      packageName = "random-bytes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz";
+        sha1 = "4f68a1dc0ae58bd3fb95848c30324db75d64360b";
+      };
+    };
+    "range-parser-1.2.1" = {
+      name = "range-parser";
+      packageName = "range-parser";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz";
+        sha512 = "Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==";
+      };
+    };
+    "raw-body-2.4.0" = {
+      name = "raw-body";
+      packageName = "raw-body";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz";
+        sha512 = "4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==";
+      };
+    };
+    "readable-stream-2.3.7" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
+        sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
+      };
+    };
+    "repeat-string-1.6.1" = {
+      name = "repeat-string";
+      packageName = "repeat-string";
+      version = "1.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    };
+    "request-2.88.2" = {
+      name = "request";
+      packageName = "request";
+      version = "2.88.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
+        sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
+      };
+    };
+    "right-align-0.1.3" = {
+      name = "right-align";
+      packageName = "right-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz";
+        sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
+      };
+    };
+    "rimraf-2.7.1" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";
+        sha512 = "uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==";
+      };
+    };
+    "safe-buffer-5.1.2" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
+      };
+    };
+    "safe-buffer-5.2.0" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz";
+        sha512 = "fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==";
+      };
+    };
+    "safer-buffer-2.1.2" = {
+      name = "safer-buffer";
+      packageName = "safer-buffer";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
+      };
+    };
+    "semver-5.3.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz";
+        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+      };
+    };
+    "send-0.17.1" = {
+      name = "send";
+      packageName = "send";
+      version = "0.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
+        sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
+      };
+    };
+    "serve-static-1.14.1" = {
+      name = "serve-static";
+      packageName = "serve-static";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
+        sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
+      };
+    };
+    "set-blocking-2.0.0" = {
+      name = "set-blocking";
+      packageName = "set-blocking";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    };
+    "setprototypeof-1.1.1" = {
+      name = "setprototypeof";
+      packageName = "setprototypeof";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
+        sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
+      };
+    };
+    "signal-exit-3.0.3" = {
+      name = "signal-exit";
+      packageName = "signal-exit";
+      version = "3.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
+        sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
+      };
+    };
+    "sqlstring-2.3.1" = {
+      name = "sqlstring";
+      packageName = "sqlstring";
+      version = "2.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz";
+        sha1 = "475393ff9e91479aea62dcaf0ca3d14983a7fb40";
+      };
+    };
+    "sshpk-1.16.1" = {
+      name = "sshpk";
+      packageName = "sshpk";
+      version = "1.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
+        sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
+      };
+    };
+    "statuses-1.5.0" = {
+      name = "statuses";
+      packageName = "statuses";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    };
+    "string-width-1.0.2" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    };
+    "string_decoder-1.1.1" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "striptags-2.2.1" = {
+      name = "striptags";
+      packageName = "striptags";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/striptags/-/striptags-2.2.1.tgz";
+        sha1 = "4c450b708d41b8bf39cf24c49ff234fc6aabfd32";
+      };
+    };
+    "tar-2.2.2" = {
+      name = "tar";
+      packageName = "tar";
+      version = "2.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz";
+        sha512 = "FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==";
+      };
+    };
+    "toidentifier-1.0.0" = {
+      name = "toidentifier";
+      packageName = "toidentifier";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
+        sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
+      };
+    };
+    "tough-cookie-2.5.0" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
+        sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
+      };
+    };
+    "tunnel-agent-0.6.0" = {
+      name = "tunnel-agent";
+      packageName = "tunnel-agent";
+      version = "0.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    };
+    "tweetnacl-0.14.5" = {
+      name = "tweetnacl";
+      packageName = "tweetnacl";
+      version = "0.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    };
+    "type-is-1.6.18" = {
+      name = "type-is";
+      packageName = "type-is";
+      version = "1.6.18";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz";
+        sha512 = "TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==";
+      };
+    };
+    "uid-safe-2.1.5" = {
+      name = "uid-safe";
+      packageName = "uid-safe";
+      version = "2.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz";
+        sha512 = "KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==";
+      };
+    };
+    "underscore-1.3.3" = {
+      name = "underscore";
+      packageName = "underscore";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz";
+        sha1 = "47ac53683daf832bfa952e1774417da47817ae42";
+      };
+    };
+    "unpipe-1.0.0" = {
+      name = "unpipe";
+      packageName = "unpipe";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    };
+    "uri-js-4.2.2" = {
+      name = "uri-js";
+      packageName = "uri-js";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
+        sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
+      };
+    };
+    "util-deprecate-1.0.2" = {
+      name = "util-deprecate";
+      packageName = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    };
+    "utils-0.3.1" = {
+      name = "utils";
+      packageName = "utils";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/utils/-/utils-0.3.1.tgz";
+        sha1 = "04efaeb4290a67037a4cddfd2ff56144cc3a4581";
+      };
+    };
+    "utils-merge-1.0.1" = {
+      name = "utils-merge";
+      packageName = "utils-merge";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    };
+    "uuid-3.4.0" = {
+      name = "uuid";
+      packageName = "uuid";
+      version = "3.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
+        sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
+      };
+    };
+    "vary-1.1.2" = {
+      name = "vary";
+      packageName = "vary";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "which-1.3.1" = {
+      name = "which";
+      packageName = "which";
+      version = "1.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
+        sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
+      };
+    };
+    "wide-align-1.1.3" = {
+      name = "wide-align";
+      packageName = "wide-align";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
+        sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
+      };
+    };
+    "word-wrap-1.2.3" = {
+      name = "word-wrap";
+      packageName = "word-wrap";
+      version = "1.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
+        sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
+      };
+    };
+    "wrappy-1.0.2" = {
+      name = "wrappy";
+      packageName = "wrappy";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+  };
+in
+{
+  ep_private_pad = nodeEnv.buildNodePackage {
+    name = "ep_private_pad";
+    packageName = "ep_private_pad";
+    version = "1.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_private_pad/-/ep_private_pad-1.0.2.tgz";
+      sha512 = "3cw9br4cg5ctv+w0XoMCXxM0tjYZd0LifH6ci/1wnv3LEkVnkiT19CtKGleOpHBVcQKLDf0aegjP9VaTW3rtHg==";
+    };
+    dependencies = [
+      sources."abbrev-1.1.1"
+      sources."accepts-1.3.7"
+      sources."ajv-6.12.2"
+      (sources."align-text-0.1.4" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      sources."ansi-regex-2.1.1"
+      (sources."any-1.0.0" // {
+        dependencies = [
+          sources."make-iterator-0.1.1"
+        ];
+      })
+      sources."aproba-1.2.0"
+      sources."are-we-there-yet-1.1.5"
+      sources."arr-diff-1.1.0"
+      sources."arr-flatten-1.1.0"
+      (sources."arr-map-2.0.2" // {
+        dependencies = [
+          sources."kind-of-6.0.3"
+          sources."make-iterator-1.0.1"
+        ];
+      })
+      sources."arr-union-3.1.0"
+      sources."array-each-0.1.1"
+      sources."array-flatten-1.1.1"
+      sources."array-slice-0.2.3"
+      sources."array-unique-0.2.1"
+      sources."asn1-0.2.4"
+      sources."assert-plus-1.0.0"
+      sources."asynckit-0.4.0"
+      sources."aws-sign2-0.7.0"
+      sources."aws4-1.9.1"
+      sources."balanced-match-1.0.0"
+      sources."bcrypt-pbkdf-1.0.2"
+      sources."bignumber.js-9.0.0"
+      sources."block-stream-0.0.9"
+      sources."body-parser-1.19.0"
+      sources."brace-expansion-1.1.11"
+      sources."bytes-3.1.0"
+      sources."caseless-0.12.0"
+      sources."center-align-0.1.3"
+      sources."client-sessions-0.8.0"
+      sources."code-point-at-1.1.0"
+      sources."combined-stream-1.0.8"
+      sources."concat-map-0.0.1"
+      sources."console-control-strings-1.1.0"
+      sources."content-disposition-0.5.3"
+      sources."content-type-1.0.4"
+      sources."cookie-0.4.0"
+      sources."cookie-parser-1.4.5"
+      sources."cookie-signature-1.0.6"
+      sources."cookies-0.7.3"
+      sources."core-util-is-1.0.2"
+      sources."dashdash-1.14.1"
+      sources."debug-2.6.9"
+      sources."delayed-stream-1.0.0"
+      sources."delegates-1.0.0"
+      sources."depd-1.1.2"
+      sources."destroy-1.0.4"
+      sources."ecc-jsbn-0.1.2"
+      sources."ee-first-1.1.1"
+      sources."eejs-1.0.0"
+      sources."ejs-1.0.0"
+      sources."encodeurl-1.0.2"
+      sources."escape-html-1.0.3"
+      sources."etag-1.8.1"
+      sources."etherpad-lite-client-0.8.0"
+      sources."export-dirs-0.2.4"
+      sources."export-files-2.1.1"
+      sources."express-4.17.1"
+      (sources."express-session-1.17.1" // {
+        dependencies = [
+          sources."depd-2.0.0"
+          sources."safe-buffer-5.2.0"
+        ];
+      })
+      sources."extend-3.0.2"
+      sources."extsprintf-1.3.0"
+      sources."fast-deep-equal-3.1.1"
+      sources."fast-json-stable-stringify-2.1.0"
+      sources."finalhandler-1.1.2"
+      sources."for-in-0.1.8"
+      (sources."for-own-0.1.5" // {
+        dependencies = [
+          sources."for-in-1.0.2"
+        ];
+      })
+      sources."forever-agent-0.6.1"
+      sources."form-data-2.3.3"
+      sources."forwarded-0.1.2"
+      sources."fresh-0.5.2"
+      sources."fs.realpath-1.0.0"
+      sources."fstream-1.0.12"
+      sources."gauge-2.7.4"
+      sources."getpass-0.1.7"
+      sources."glob-7.1.6"
+      sources."graceful-fs-4.2.4"
+      sources."har-schema-2.0.0"
+      sources."har-validator-5.1.3"
+      sources."has-unicode-2.0.1"
+      sources."has-values-0.1.4"
+      sources."http-errors-1.7.2"
+      sources."http-signature-1.2.0"
+      sources."iconv-lite-0.4.24"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.3"
+      sources."ipaddr.js-1.9.1"
+      sources."is-buffer-1.1.6"
+      sources."is-extendable-0.1.1"
+      sources."is-fullwidth-code-point-1.0.0"
+      (sources."is-number-2.1.0" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      sources."is-plain-object-2.0.4"
+      sources."is-typedarray-1.0.0"
+      sources."isarray-1.0.0"
+      sources."isexe-2.0.0"
+      sources."isobject-3.0.1"
+      sources."isstream-0.1.2"
+      sources."jsbn-0.1.1"
+      sources."json-schema-0.2.3"
+      sources."json-schema-traverse-0.4.1"
+      sources."json-stringify-safe-5.0.1"
+      sources."jsprim-1.4.1"
+      sources."keygrip-1.0.3"
+      sources."kind-of-2.0.1"
+      sources."lazy-cache-1.0.4"
+      sources."longest-1.0.1"
+      (sources."make-iterator-0.2.1" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      sources."media-typer-0.3.0"
+      sources."merge-descriptors-1.0.1"
+      sources."methods-1.1.2"
+      sources."mime-1.6.0"
+      sources."mime-db-1.44.0"
+      sources."mime-types-2.1.27"
+      sources."minimatch-3.0.4"
+      sources."minimist-1.2.5"
+      sources."mkdirp-0.5.5"
+      sources."ms-2.0.0"
+      sources."mysql-2.18.1"
+      sources."negotiator-0.6.2"
+      sources."node-gyp-3.8.0"
+      sources."nopt-3.0.6"
+      sources."npmlog-4.1.2"
+      sources."number-is-nan-1.0.1"
+      sources."oauth-sign-0.9.0"
+      sources."object-assign-4.1.1"
+      (sources."object.defaults-0.3.0" // {
+        dependencies = [
+          sources."isobject-1.0.2"
+        ];
+      })
+      (sources."object.filter-0.3.0" // {
+        dependencies = [
+          sources."make-iterator-0.1.1"
+        ];
+      })
+      sources."object.omit-2.0.1"
+      sources."object.pick-1.3.0"
+      sources."object.reduce-0.1.7"
+      sources."on-finished-2.3.0"
+      sources."on-headers-1.0.2"
+      sources."once-1.4.0"
+      sources."os-homedir-1.0.2"
+      sources."os-tmpdir-1.0.2"
+      sources."osenv-0.1.5"
+      sources."parseurl-1.3.3"
+      sources."password-hash-1.2.2"
+      sources."path-is-absolute-1.0.1"
+      sources."path-to-regexp-0.1.7"
+      sources."performance-now-2.1.0"
+      sources."process-nextick-args-2.0.1"
+      sources."proxy-addr-2.0.6"
+      sources."psl-1.8.0"
+      sources."punycode-2.1.1"
+      sources."qs-6.7.0"
+      sources."random-bytes-1.0.0"
+      sources."range-parser-1.2.1"
+      sources."raw-body-2.4.0"
+      sources."readable-stream-2.3.7"
+      sources."repeat-string-1.6.1"
+      (sources."request-2.88.2" // {
+        dependencies = [
+          sources."qs-6.5.2"
+        ];
+      })
+      sources."right-align-0.1.3"
+      sources."rimraf-2.7.1"
+      sources."safe-buffer-5.1.2"
+      sources."safer-buffer-2.1.2"
+      sources."semver-5.3.0"
+      (sources."send-0.17.1" // {
+        dependencies = [
+          sources."ms-2.1.1"
+        ];
+      })
+      sources."serve-static-1.14.1"
+      sources."set-blocking-2.0.0"
+      sources."setprototypeof-1.1.1"
+      sources."signal-exit-3.0.3"
+      sources."sqlstring-2.3.1"
+      sources."sshpk-1.16.1"
+      sources."statuses-1.5.0"
+      sources."string-width-1.0.2"
+      sources."string_decoder-1.1.1"
+      sources."strip-ansi-3.0.1"
+      sources."striptags-2.2.1"
+      sources."tar-2.2.2"
+      sources."toidentifier-1.0.0"
+      sources."tough-cookie-2.5.0"
+      sources."tunnel-agent-0.6.0"
+      sources."tweetnacl-0.14.5"
+      sources."type-is-1.6.18"
+      sources."uid-safe-2.1.5"
+      sources."underscore-1.3.3"
+      sources."unpipe-1.0.0"
+      sources."uri-js-4.2.2"
+      sources."util-deprecate-1.0.2"
+      sources."utils-0.3.1"
+      sources."utils-merge-1.0.1"
+      sources."uuid-3.4.0"
+      sources."vary-1.1.2"
+      sources."verror-1.10.0"
+      sources."which-1.3.1"
+      sources."wide-align-1.1.3"
+      sources."word-wrap-1.2.3"
+      sources."wrappy-1.0.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Signup and login to manage private pad, share your pad with other users, add roles to users for your pads.";
+      homepage = "https://github.com/angelopiccolella/ep_private_pad#readme";
+      license = "";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch b/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch
new file mode 100644 (file)
index 0000000..474e823
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/templates/editbarButtons.ejs b/templates/editbarButtons.ejs
+index 7511025..f71a491 100644
+--- a/templates/editbarButtons.ejs
++++ b/templates/editbarButtons.ejs
+@@ -20,7 +20,7 @@
+   }
+   .subscript .buttonicon:before{
+-    content:"\e81a";
++    content:"\e834";
+   }
+   .superscript{
+@@ -32,7 +32,7 @@
+   }
+   .superscript .buttonicon:before{
+-    content:"\e819";
++    content:"\e833";
+   }
+       
+ </style>
index f60a7777fcec274ac10464338eccaf21db64e341..04065dda7a9ba52826a4f9c46eae29a4b09e4e1a 100644 (file)
@@ -14,6 +14,9 @@ in
       url = "https://registry.npmjs.org/ep_subscript_and_superscript/-/ep_subscript_and_superscript-0.0.3.tgz";
       sha1 = "47f74a242fe8be5911391943f718eab81c390620";
     };
+    preRebuild = ''
+      patch -p1 < ${./font.patch}
+    '';
     buildInputs = globalBuildInputs;
     meta = {
       description = "Add support for Subscript and Superscript";
@@ -22,4 +25,4 @@ in
     bypassCache = true;
     reconstructLock = true;
   };
-}
\ No newline at end of file
+}