aboutsummaryrefslogtreecommitdiff
path: root/flakes/private
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2023-10-04 01:35:06 +0200
committerIsmaël Bouya <ismael.bouya@normalesup.org>2023-10-04 02:11:48 +0200
commit1a64deeb894dc95e2645a75771732c6cc53a79ad (patch)
tree1b9df4838f894577a09b9b260151756272efeb53 /flakes/private
parentfa25ffd4583cc362075cd5e1b4130f33306103f0 (diff)
downloadNix-1a64deeb894dc95e2645a75771732c6cc53a79ad.tar.gz
Nix-1a64deeb894dc95e2645a75771732c6cc53a79ad.tar.zst
Nix-1a64deeb894dc95e2645a75771732c6cc53a79ad.zip
Squash changes containing private information
There were a lot of changes since the previous commit, but a lot of them contained personnal information about users. All thos changes got stashed into a single commit (history is kept in a different place) and private information was moved in a separate private repository
Diffstat (limited to 'flakes/private')
-rw-r--r--flakes/private/buildbot/buildslist/bower.nix9
-rw-r--r--flakes/private/buildbot/buildslist/default.nix64
-rw-r--r--flakes/private/buildbot/buildslist/yarn-packages.nix9293
-rw-r--r--flakes/private/buildbot/common/build_helpers.py293
-rw-r--r--flakes/private/buildbot/common/libvirt.py318
-rw-r--r--flakes/private/buildbot/common/master.cfg93
-rw-r--r--flakes/private/buildbot/flake.lock61
-rw-r--r--flakes/private/buildbot/flake.nix74
-rw-r--r--flakes/private/buildbot/test_project/__init__.py121
-rw-r--r--flakes/private/chatons/flake.lock23
-rw-r--r--flakes/private/chatons/flake.nix142
-rw-r--r--flakes/private/environment-dummy/flake.nix18
-rw-r--r--flakes/private/environment-dummy/ldap.conf13
-rw-r--r--flakes/private/environment-dummy/vars.yml1
-rw-r--r--flakes/private/environment/flake.nix1135
-rwxr-xr-xflakes/private/mail-relay/filter-rewrite-from.py68
-rw-r--r--flakes/private/mail-relay/flake.lock36
-rw-r--r--flakes/private/mail-relay/flake.nix58
-rw-r--r--flakes/private/milters/flake.lock186
-rw-r--r--flakes/private/milters/flake.nix106
-rwxr-xr-xflakes/private/milters/verify_from.py60
-rw-r--r--flakes/private/monitoring/flake.lock67
-rw-r--r--flakes/private/monitoring/flake.nix267
-rw-r--r--flakes/private/monitoring/myplugins.nix400
-rw-r--r--flakes/private/monitoring/nagios-cli.cfg68
-rw-r--r--flakes/private/monitoring/objects_common.nix227
-rwxr-xr-xflakes/private/monitoring/plugins/check_backup_age66
-rwxr-xr-xflakes/private/monitoring/plugins/check_bandwidth122
-rwxr-xr-xflakes/private/monitoring/plugins/check_command113
-rwxr-xr-xflakes/private/monitoring/plugins/check_emails121
-rwxr-xr-xflakes/private/monitoring/plugins/check_eriomem83
-rwxr-xr-xflakes/private/monitoring/plugins/check_ftp_database11
-rwxr-xr-xflakes/private/monitoring/plugins/check_git81
-rwxr-xr-xflakes/private/monitoring/plugins/check_imap_connection52
-rwxr-xr-xflakes/private/monitoring/plugins/check_last_file_date28
-rwxr-xr-xflakes/private/monitoring/plugins/check_mem.sh31
-rwxr-xr-xflakes/private/monitoring/plugins/check_mysql_replication41
-rwxr-xr-xflakes/private/monitoring/plugins/check_openldap_replication54
-rwxr-xr-xflakes/private/monitoring/plugins/check_ovh_sms25
-rwxr-xr-xflakes/private/monitoring/plugins/check_postgres_database_count32
-rwxr-xr-xflakes/private/monitoring/plugins/check_postgres_replication35
-rwxr-xr-xflakes/private/monitoring/plugins/check_redis_replication38
-rwxr-xr-xflakes/private/monitoring/plugins/check_zfs_snapshot325
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_apprise31
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_email29
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_slack46
-rwxr-xr-xflakes/private/monitoring/plugins/send_nrdp.sh57
-rwxr-xr-xflakes/private/monitoring/send_mails15
-rw-r--r--flakes/private/monitoring/to_objects.nix77
-rw-r--r--flakes/private/openarc/flake.lock72
-rw-r--r--flakes/private/openarc/flake.nix96
-rw-r--r--flakes/private/opendmarc/flake.lock85
-rw-r--r--flakes/private/opendmarc/flake.nix125
-rw-r--r--flakes/private/openldap/flake.nix6
-rw-r--r--flakes/private/openldap/immae.ldif83
-rw-r--r--flakes/private/openldap/immae.schema179
-rw-r--r--flakes/private/paste/flake.lock51
-rw-r--r--flakes/private/paste/flake.nix36
-rw-r--r--flakes/private/peertube/flake.lock89
-rw-r--r--flakes/private/peertube/flake.nix16
-rw-r--r--flakes/private/php/flake.lock62
-rw-r--r--flakes/private/php/flake.nix40
-rw-r--r--flakes/private/ssh/flake.lock36
-rw-r--r--flakes/private/ssh/flake.nix107
-rwxr-xr-xflakes/private/ssh/ldap_authorized_keys.sh62
-rw-r--r--flakes/private/system/flake.lock185
-rw-r--r--flakes/private/system/flake.nix168
-rw-r--r--flakes/private/system/public_keys/Immae.pub322
68 files changed, 16160 insertions, 374 deletions
diff --git a/flakes/private/buildbot/buildslist/bower.nix b/flakes/private/buildbot/buildslist/bower.nix
new file mode 100644
index 0000000..8b26e0a
--- /dev/null
+++ b/flakes/private/buildbot/buildslist/bower.nix
@@ -0,0 +1,9 @@
1# Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
2{ fetchbower, buildEnv }:
3buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
4 (fetchbower "jquery" "2.1.1" "2.1.1" "1qir36vi0bppjr9ckm6303vk1f1dkvq5wandpihb7dxl76s832bd")
5 (fetchbower "angular" "1.5.11" "~1.5.3" "1sw31v3dhmxwgrmncw2f9yl07i9px62ssbj0739zsgi59cq2khl7")
6 (fetchbower "lodash" "2.4.2" "~2.4.1" "0bhqarlvhlrxfvcgnxgsrsjgi6az4c117ffxyfi7gjwr9cvrzz4q")
7 (fetchbower "angular-mocks" "1.5.11" "~1.5.3" "0yv0396fw51i6d9lwiwf241rmc28rnxgg2aa9vsc7dnm4qjkn6gx")
8 (fetchbower "buildbot-data" "2.1.0" "~2.1.0" "0hkmm1byy7d712898lhkxf7i0wshmd1f8cr98iz67679nm6abimk")
9]; }
diff --git a/flakes/private/buildbot/buildslist/default.nix b/flakes/private/buildbot/buildslist/default.nix
new file mode 100644
index 0000000..7f72503
--- /dev/null
+++ b/flakes/private/buildbot/buildslist/default.nix
@@ -0,0 +1,64 @@
1{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }:
2let
3 yarn2nix-moretea' = yarn2nix-moretea.override({
4 yarn = yarn.override({ nodejs = nodejs-10_x; });
5 nodejs = nodejs-10_x;
6 });
7 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
8 cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out
9 '';
10 nodeHeaders = fetchurl {
11 url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
12 sha256 = "sha256-LEk6BOW/vwdUXGAialDOoyFIkZ81k6ADy6MhMfRiE5Y=";
13 };
14 buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec {
15 name = "buildslist-yarn-modules";
16 pname = name;
17 inherit (pythonPackages.buildbot-pkg) version;
18 packageJSON = packagejson;
19 yarnLock = "${buildslist_src}/yarn.lock";
20 yarnNix = ./yarn-packages.nix;
21 pkgConfig = {
22 node-sass = {
23 buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ];
24 postInstall =
25 ''
26 node scripts/build.js --tarball=${nodeHeaders}
27 '';
28 };
29 };
30 };
31 buildslist_bower = buildBowerComponents {
32 name = "buildslist";
33 generated = ./bower.nix;
34 src = "${buildslist_src}/guanlecoja/";
35 };
36 # the buildbot-pkg calls yarn and screws up everything...
37 fakeYarn = writeScriptBin "yarn" ''
38 #!${stdenv.shell}
39 if [ "$1" = "--version" ]; then
40 echo "1.17"
41 fi
42 '';
43in
44pythonPackages.buildPythonPackage rec {
45 pname = "buildbot-buildslist";
46 inherit (pythonPackages.buildbot-pkg) version;
47
48 preConfigure = ''
49 export HOME=$PWD
50 ln -s ${buildslist_yarn}/node_modules .
51 cp -a ${buildslist_bower}/bower_components ./libs
52 PATH=${buildslist_yarn}/node_modules/.bin:$PATH
53 chmod -R u+w libs
54 '';
55 propagatedBuildInputs = with pythonPackages; [
56 (klein.overridePythonAttrs(old: { checkPhase = ""; }))
57 buildbot-pkg
58 ];
59 nativeBuildInputs = [ fakeYarn nodejs-10_x ];
60 buildInputs = [ buildslist_yarn buildslist_bower ];
61
62 doCheck = false;
63 src = buildslist_src;
64}
diff --git a/flakes/private/buildbot/buildslist/yarn-packages.nix b/flakes/private/buildbot/buildslist/yarn-packages.nix
new file mode 100644
index 0000000..2ade970
--- /dev/null
+++ b/flakes/private/buildbot/buildslist/yarn-packages.nix
@@ -0,0 +1,9293 @@
1{fetchurl, linkFarm}: rec {
2 offline_cache = linkFarm "offline" packages;
3 packages = [
4
5 {
6 name = "_types_babel_types___babel_types_7.0.7.tgz";
7 path = fetchurl {
8 name = "_types_babel_types___babel_types_7.0.7.tgz";
9 url = "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.7.tgz";
10 sha1 = "667eb1640e8039436028055737d2b9986ee336e3";
11 };
12 }
13
14 {
15 name = "_types_babylon___babylon_6.16.5.tgz";
16 path = fetchurl {
17 name = "_types_babylon___babylon_6.16.5.tgz";
18 url = "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz";
19 sha1 = "1c5641db69eb8cdf378edd25b4be7754beeb48b4";
20 };
21 }
22
23 {
24 name = "_types_color_name___color_name_1.1.1.tgz";
25 path = fetchurl {
26 name = "_types_color_name___color_name_1.1.1.tgz";
27 url = "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz";
28 sha1 = "1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0";
29 };
30 }
31
32 {
33 name = "Base64___Base64_0.2.1.tgz";
34 path = fetchurl {
35 name = "Base64___Base64_0.2.1.tgz";
36 url = "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz";
37 sha1 = "ba3a4230708e186705065e66babdd4c35cf60028";
38 };
39 }
40
41 {
42 name = "JSONStream___JSONStream_0.6.4.tgz";
43 path = fetchurl {
44 name = "JSONStream___JSONStream_0.6.4.tgz";
45 url = "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.6.4.tgz";
46 sha1 = "4b2c8063f8f512787b2375f7ee9db69208fa2dcb";
47 };
48 }
49
50 {
51 name = "JSONStream___JSONStream_0.7.4.tgz";
52 path = fetchurl {
53 name = "JSONStream___JSONStream_0.7.4.tgz";
54 url = "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.7.4.tgz";
55 sha1 = "734290e41511eea7c2cfe151fbf9a563a97b9786";
56 };
57 }
58
59 {
60 name = "abbrev___abbrev_1.1.1.tgz";
61 path = fetchurl {
62 name = "abbrev___abbrev_1.1.1.tgz";
63 url = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
64 sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
65 };
66 }
67
68 {
69 name = "abbrev___abbrev_1.0.9.tgz";
70 path = fetchurl {
71 name = "abbrev___abbrev_1.0.9.tgz";
72 url = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz";
73 sha1 = "91b4792588a7738c25f35dd6f63752a2f8776135";
74 };
75 }
76
77 {
78 name = "accepts___accepts_1.3.3.tgz";
79 path = fetchurl {
80 name = "accepts___accepts_1.3.3.tgz";
81 url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz";
82 sha1 = "c3ca7434938648c3e0d9c1e328dd68b622c284ca";
83 };
84 }
85
86 {
87 name = "acorn_globals___acorn_globals_3.1.0.tgz";
88 path = fetchurl {
89 name = "acorn_globals___acorn_globals_3.1.0.tgz";
90 url = "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz";
91 sha1 = "fd8270f71fbb4996b004fa880ee5d46573a731bf";
92 };
93 }
94
95 {
96 name = "acorn___acorn_2.7.0.tgz";
97 path = fetchurl {
98 name = "acorn___acorn_2.7.0.tgz";
99 url = "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz";
100 sha1 = "ab6e7d9d886aaca8b085bc3312b79a198433f0e7";
101 };
102 }
103
104 {
105 name = "acorn___acorn_3.3.0.tgz";
106 path = fetchurl {
107 name = "acorn___acorn_3.3.0.tgz";
108 url = "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz";
109 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
110 };
111 }
112
113 {
114 name = "acorn___acorn_4.0.13.tgz";
115 path = fetchurl {
116 name = "acorn___acorn_4.0.13.tgz";
117 url = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz";
118 sha1 = "105495ae5361d697bd195c825192e1ad7f253787";
119 };
120 }
121
122 {
123 name = "acorn___acorn_2.6.4.tgz";
124 path = fetchurl {
125 name = "acorn___acorn_2.6.4.tgz";
126 url = "https://registry.yarnpkg.com/acorn/-/acorn-2.6.4.tgz";
127 sha1 = "eb1f45b4a43fa31d03701a5ec46f3b52673e90ee";
128 };
129 }
130
131 {
132 name = "after___after_0.8.2.tgz";
133 path = fetchurl {
134 name = "after___after_0.8.2.tgz";
135 url = "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz";
136 sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
137 };
138 }
139
140 {
141 name = "ajv___ajv_6.12.0.tgz";
142 path = fetchurl {
143 name = "ajv___ajv_6.12.0.tgz";
144 url = "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz";
145 sha1 = "06d60b96d87b8454a5adaba86e7854da629db4b7";
146 };
147 }
148
149 {
150 name = "align_text___align_text_0.1.4.tgz";
151 path = fetchurl {
152 name = "align_text___align_text_0.1.4.tgz";
153 url = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz";
154 sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
155 };
156 }
157
158 {
159 name = "alter___alter_0.2.0.tgz";
160 path = fetchurl {
161 name = "alter___alter_0.2.0.tgz";
162 url = "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz";
163 sha1 = "c7588808617572034aae62480af26b1d4d1cb3cd";
164 };
165 }
166
167 {
168 name = "amdefine___amdefine_1.0.1.tgz";
169 path = fetchurl {
170 name = "amdefine___amdefine_1.0.1.tgz";
171 url = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz";
172 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
173 };
174 }
175
176 {
177 name = "ansi_gray___ansi_gray_0.1.1.tgz";
178 path = fetchurl {
179 name = "ansi_gray___ansi_gray_0.1.1.tgz";
180 url = "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz";
181 sha1 = "2962cf54ec9792c48510a3deb524436861ef7251";
182 };
183 }
184
185 {
186 name = "ansi_regex___ansi_regex_0.2.1.tgz";
187 path = fetchurl {
188 name = "ansi_regex___ansi_regex_0.2.1.tgz";
189 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz";
190 sha1 = "0d8e946967a3d8143f93e24e298525fc1b2235f9";
191 };
192 }
193
194 {
195 name = "ansi_regex___ansi_regex_1.1.1.tgz";
196 path = fetchurl {
197 name = "ansi_regex___ansi_regex_1.1.1.tgz";
198 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz";
199 sha1 = "41c847194646375e6a1a5d10c3ca054ef9fc980d";
200 };
201 }
202
203 {
204 name = "ansi_regex___ansi_regex_2.1.1.tgz";
205 path = fetchurl {
206 name = "ansi_regex___ansi_regex_2.1.1.tgz";
207 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
208 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
209 };
210 }
211
212 {
213 name = "ansi_regex___ansi_regex_3.0.0.tgz";
214 path = fetchurl {
215 name = "ansi_regex___ansi_regex_3.0.0.tgz";
216 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
217 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
218 };
219 }
220
221 {
222 name = "ansi_styles___ansi_styles_1.1.0.tgz";
223 path = fetchurl {
224 name = "ansi_styles___ansi_styles_1.1.0.tgz";
225 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz";
226 sha1 = "eaecbf66cd706882760b2f4691582b8f55d7a7de";
227 };
228 }
229
230 {
231 name = "ansi_styles___ansi_styles_2.2.1.tgz";
232 path = fetchurl {
233 name = "ansi_styles___ansi_styles_2.2.1.tgz";
234 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
235 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
236 };
237 }
238
239 {
240 name = "ansi_styles___ansi_styles_4.2.1.tgz";
241 path = fetchurl {
242 name = "ansi_styles___ansi_styles_4.2.1.tgz";
243 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz";
244 sha1 = "90ae75c424d008d2624c5bf29ead3177ebfcf359";
245 };
246 }
247
248 {
249 name = "ansi_styles___ansi_styles_1.0.0.tgz";
250 path = fetchurl {
251 name = "ansi_styles___ansi_styles_1.0.0.tgz";
252 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz";
253 sha1 = "cb102df1c56f5123eab8b67cd7b98027a0279178";
254 };
255 }
256
257 {
258 name = "ansi_wrap___ansi_wrap_0.1.0.tgz";
259 path = fetchurl {
260 name = "ansi_wrap___ansi_wrap_0.1.0.tgz";
261 url = "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz";
262 sha1 = "a82250ddb0015e9a27ca82e82ea603bbfa45efaf";
263 };
264 }
265
266 {
267 name = "ansicolors___ansicolors_0.2.1.tgz";
268 path = fetchurl {
269 name = "ansicolors___ansicolors_0.2.1.tgz";
270 url = "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz";
271 sha1 = "be089599097b74a5c9c4a84a0cdbcdb62bd87aef";
272 };
273 }
274
275 {
276 name = "anymatch___anymatch_1.3.2.tgz";
277 path = fetchurl {
278 name = "anymatch___anymatch_1.3.2.tgz";
279 url = "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz";
280 sha1 = "553dcb8f91e3c889845dfdba34c77721b90b9d7a";
281 };
282 }
283
284 {
285 name = "aproba___aproba_1.2.0.tgz";
286 path = fetchurl {
287 name = "aproba___aproba_1.2.0.tgz";
288 url = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
289 sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
290 };
291 }
292
293 {
294 name = "archy___archy_1.0.0.tgz";
295 path = fetchurl {
296 name = "archy___archy_1.0.0.tgz";
297 url = "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz";
298 sha1 = "f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40";
299 };
300 }
301
302 {
303 name = "archy___archy_0.0.2.tgz";
304 path = fetchurl {
305 name = "archy___archy_0.0.2.tgz";
306 url = "https://registry.yarnpkg.com/archy/-/archy-0.0.2.tgz";
307 sha1 = "910f43bf66141fc335564597abc189df44b3d35e";
308 };
309 }
310
311 {
312 name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
313 path = fetchurl {
314 name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
315 url = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
316 sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
317 };
318 }
319
320 {
321 name = "argparse___argparse_1.0.10.tgz";
322 path = fetchurl {
323 name = "argparse___argparse_1.0.10.tgz";
324 url = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
325 sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
326 };
327 }
328
329 {
330 name = "argparse___argparse_0.1.16.tgz";
331 path = fetchurl {
332 name = "argparse___argparse_0.1.16.tgz";
333 url = "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz";
334 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
335 };
336 }
337
338 {
339 name = "arr_diff___arr_diff_2.0.0.tgz";
340 path = fetchurl {
341 name = "arr_diff___arr_diff_2.0.0.tgz";
342 url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
343 sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
344 };
345 }
346
347 {
348 name = "arr_diff___arr_diff_4.0.0.tgz";
349 path = fetchurl {
350 name = "arr_diff___arr_diff_4.0.0.tgz";
351 url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
352 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
353 };
354 }
355
356 {
357 name = "arr_flatten___arr_flatten_1.1.0.tgz";
358 path = fetchurl {
359 name = "arr_flatten___arr_flatten_1.1.0.tgz";
360 url = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
361 sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
362 };
363 }
364
365 {
366 name = "arr_union___arr_union_3.1.0.tgz";
367 path = fetchurl {
368 name = "arr_union___arr_union_3.1.0.tgz";
369 url = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
370 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
371 };
372 }
373
374 {
375 name = "array_differ___array_differ_1.0.0.tgz";
376 path = fetchurl {
377 name = "array_differ___array_differ_1.0.0.tgz";
378 url = "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz";
379 sha1 = "eff52e3758249d33be402b8bb8e564bb2b5d4031";
380 };
381 }
382
383 {
384 name = "array_each___array_each_1.0.1.tgz";
385 path = fetchurl {
386 name = "array_each___array_each_1.0.1.tgz";
387 url = "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz";
388 sha1 = "a794af0c05ab1752846ee753a1f211a05ba0c44f";
389 };
390 }
391
392 {
393 name = "array_filter___array_filter_0.0.1.tgz";
394 path = fetchurl {
395 name = "array_filter___array_filter_0.0.1.tgz";
396 url = "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz";
397 sha1 = "7da8cf2e26628ed732803581fd21f67cacd2eeec";
398 };
399 }
400
401 {
402 name = "array_find_index___array_find_index_1.0.2.tgz";
403 path = fetchurl {
404 name = "array_find_index___array_find_index_1.0.2.tgz";
405 url = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz";
406 sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1";
407 };
408 }
409
410 {
411 name = "array_map___array_map_0.0.0.tgz";
412 path = fetchurl {
413 name = "array_map___array_map_0.0.0.tgz";
414 url = "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz";
415 sha1 = "88a2bab73d1cf7bcd5c1b118a003f66f665fa662";
416 };
417 }
418
419 {
420 name = "array_reduce___array_reduce_0.0.0.tgz";
421 path = fetchurl {
422 name = "array_reduce___array_reduce_0.0.0.tgz";
423 url = "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz";
424 sha1 = "173899d3ffd1c7d9383e4479525dbe278cab5f2b";
425 };
426 }
427
428 {
429 name = "array_slice___array_slice_0.2.3.tgz";
430 path = fetchurl {
431 name = "array_slice___array_slice_0.2.3.tgz";
432 url = "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz";
433 sha1 = "dd3cfb80ed7973a75117cdac69b0b99ec86186f5";
434 };
435 }
436
437 {
438 name = "array_slice___array_slice_1.1.0.tgz";
439 path = fetchurl {
440 name = "array_slice___array_slice_1.1.0.tgz";
441 url = "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz";
442 sha1 = "e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4";
443 };
444 }
445
446 {
447 name = "array_uniq___array_uniq_1.0.3.tgz";
448 path = fetchurl {
449 name = "array_uniq___array_uniq_1.0.3.tgz";
450 url = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
451 sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
452 };
453 }
454
455 {
456 name = "array_unique___array_unique_0.2.1.tgz";
457 path = fetchurl {
458 name = "array_unique___array_unique_0.2.1.tgz";
459 url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
460 sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
461 };
462 }
463
464 {
465 name = "array_unique___array_unique_0.3.2.tgz";
466 path = fetchurl {
467 name = "array_unique___array_unique_0.3.2.tgz";
468 url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
469 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
470 };
471 }
472
473 {
474 name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
475 path = fetchurl {
476 name = "arraybuffer.slice___arraybuffer.slice_0.0.6.tgz";
477 url = "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz";
478 sha1 = "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca";
479 };
480 }
481
482 {
483 name = "asap___asap_2.0.6.tgz";
484 path = fetchurl {
485 name = "asap___asap_2.0.6.tgz";
486 url = "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz";
487 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
488 };
489 }
490
491 {
492 name = "asn1___asn1_0.1.11.tgz";
493 path = fetchurl {
494 name = "asn1___asn1_0.1.11.tgz";
495 url = "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz";
496 sha1 = "559be18376d08a4ec4dbe80877d27818639b2df7";
497 };
498 }
499
500 {
501 name = "asn1___asn1_0.2.4.tgz";
502 path = fetchurl {
503 name = "asn1___asn1_0.2.4.tgz";
504 url = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz";
505 sha1 = "8d2475dfab553bb33e77b54e59e880bb8ce23136";
506 };
507 }
508
509 {
510 name = "assert_plus___assert_plus_1.0.0.tgz";
511 path = fetchurl {
512 name = "assert_plus___assert_plus_1.0.0.tgz";
513 url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
514 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
515 };
516 }
517
518 {
519 name = "assert_plus___assert_plus_0.1.5.tgz";
520 path = fetchurl {
521 name = "assert_plus___assert_plus_0.1.5.tgz";
522 url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz";
523 sha1 = "ee74009413002d84cec7219c6ac811812e723160";
524 };
525 }
526
527 {
528 name = "assert___assert_1.1.2.tgz";
529 path = fetchurl {
530 name = "assert___assert_1.1.2.tgz";
531 url = "https://registry.yarnpkg.com/assert/-/assert-1.1.2.tgz";
532 sha1 = "adaa04c46bb58c6dd1f294da3eb26e6228eb6e44";
533 };
534 }
535
536 {
537 name = "assign_symbols___assign_symbols_1.0.0.tgz";
538 path = fetchurl {
539 name = "assign_symbols___assign_symbols_1.0.0.tgz";
540 url = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
541 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
542 };
543 }
544
545 {
546 name = "astw___astw_2.2.0.tgz";
547 path = fetchurl {
548 name = "astw___astw_2.2.0.tgz";
549 url = "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz";
550 sha1 = "7bd41784d32493987aeb239b6b4e1c57a873b917";
551 };
552 }
553
554 {
555 name = "async_each___async_each_1.0.3.tgz";
556 path = fetchurl {
557 name = "async_each___async_each_1.0.3.tgz";
558 url = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz";
559 sha1 = "b727dbf87d7651602f06f4d4ac387f47d91b0cbf";
560 };
561 }
562
563 {
564 name = "async_foreach___async_foreach_0.1.3.tgz";
565 path = fetchurl {
566 name = "async_foreach___async_foreach_0.1.3.tgz";
567 url = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz";
568 sha1 = "36121f845c0578172de419a97dbeb1d16ec34542";
569 };
570 }
571
572 {
573 name = "async___async_1.5.2.tgz";
574 path = fetchurl {
575 name = "async___async_1.5.2.tgz";
576 url = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
577 sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
578 };
579 }
580
581 {
582 name = "async___async_0.2.10.tgz";
583 path = fetchurl {
584 name = "async___async_0.2.10.tgz";
585 url = "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz";
586 sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
587 };
588 }
589
590 {
591 name = "async___async_0.8.0.tgz";
592 path = fetchurl {
593 name = "async___async_0.8.0.tgz";
594 url = "https://registry.yarnpkg.com/async/-/async-0.8.0.tgz";
595 sha1 = "ee65ec77298c2ff1456bc4418a052d0f06435112";
596 };
597 }
598
599 {
600 name = "async___async_0.9.2.tgz";
601 path = fetchurl {
602 name = "async___async_0.9.2.tgz";
603 url = "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz";
604 sha1 = "aea74d5e61c1f899613bf64bda66d4c78f2fd17d";
605 };
606 }
607
608 {
609 name = "asynckit___asynckit_0.4.0.tgz";
610 path = fetchurl {
611 name = "asynckit___asynckit_0.4.0.tgz";
612 url = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
613 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
614 };
615 }
616
617 {
618 name = "atob___atob_2.1.2.tgz";
619 path = fetchurl {
620 name = "atob___atob_2.1.2.tgz";
621 url = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
622 sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
623 };
624 }
625
626 {
627 name = "aws_sign2___aws_sign2_0.5.0.tgz";
628 path = fetchurl {
629 name = "aws_sign2___aws_sign2_0.5.0.tgz";
630 url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz";
631 sha1 = "c57103f7a17fc037f02d7c2e64b602ea223f7d63";
632 };
633 }
634
635 {
636 name = "aws_sign2___aws_sign2_0.7.0.tgz";
637 path = fetchurl {
638 name = "aws_sign2___aws_sign2_0.7.0.tgz";
639 url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
640 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
641 };
642 }
643
644 {
645 name = "aws_sign___aws_sign_0.3.0.tgz";
646 path = fetchurl {
647 name = "aws_sign___aws_sign_0.3.0.tgz";
648 url = "https://registry.yarnpkg.com/aws-sign/-/aws-sign-0.3.0.tgz";
649 sha1 = "3d81ca69b474b1e16518728b51c24ff0bbedc6e9";
650 };
651 }
652
653 {
654 name = "aws4___aws4_1.9.1.tgz";
655 path = fetchurl {
656 name = "aws4___aws4_1.9.1.tgz";
657 url = "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz";
658 sha1 = "7e33d8f7d449b3f673cd72deb9abdc552dbe528e";
659 };
660 }
661
662 {
663 name = "babel_runtime___babel_runtime_6.26.0.tgz";
664 path = fetchurl {
665 name = "babel_runtime___babel_runtime_6.26.0.tgz";
666 url = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
667 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
668 };
669 }
670
671 {
672 name = "babel_types___babel_types_6.26.0.tgz";
673 path = fetchurl {
674 name = "babel_types___babel_types_6.26.0.tgz";
675 url = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
676 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
677 };
678 }
679
680 {
681 name = "babylon___babylon_6.18.0.tgz";
682 path = fetchurl {
683 name = "babylon___babylon_6.18.0.tgz";
684 url = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
685 sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
686 };
687 }
688
689 {
690 name = "backo2___backo2_1.0.2.tgz";
691 path = fetchurl {
692 name = "backo2___backo2_1.0.2.tgz";
693 url = "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz";
694 sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
695 };
696 }
697
698 {
699 name = "balanced_match___balanced_match_1.0.0.tgz";
700 path = fetchurl {
701 name = "balanced_match___balanced_match_1.0.0.tgz";
702 url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
703 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
704 };
705 }
706
707 {
708 name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
709 path = fetchurl {
710 name = "base64_arraybuffer___base64_arraybuffer_0.1.5.tgz";
711 url = "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
712 sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
713 };
714 }
715
716 {
717 name = "base64_js___base64_js_0.0.8.tgz";
718 path = fetchurl {
719 name = "base64_js___base64_js_0.0.8.tgz";
720 url = "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz";
721 sha1 = "1101e9544f4a76b1bc3b26d452ca96d7a35e7978";
722 };
723 }
724
725 {
726 name = "base64id___base64id_1.0.0.tgz";
727 path = fetchurl {
728 name = "base64id___base64id_1.0.0.tgz";
729 url = "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz";
730 sha1 = "47688cb99bb6804f0e06d3e763b1c32e57d8e6b6";
731 };
732 }
733
734 {
735 name = "base___base_0.11.2.tgz";
736 path = fetchurl {
737 name = "base___base_0.11.2.tgz";
738 url = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
739 sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
740 };
741 }
742
743 {
744 name = "batch___batch_0.5.3.tgz";
745 path = fetchurl {
746 name = "batch___batch_0.5.3.tgz";
747 url = "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz";
748 sha1 = "3f3414f380321743bfc1042f9a83ff1d5824d464";
749 };
750 }
751
752 {
753 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
754 path = fetchurl {
755 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
756 url = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
757 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
758 };
759 }
760
761 {
762 name = "beeper___beeper_1.1.1.tgz";
763 path = fetchurl {
764 name = "beeper___beeper_1.1.1.tgz";
765 url = "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz";
766 sha1 = "e6d5ea8c5dad001304a70b22638447f69cb2f809";
767 };
768 }
769
770 {
771 name = "better_assert___better_assert_1.0.2.tgz";
772 path = fetchurl {
773 name = "better_assert___better_assert_1.0.2.tgz";
774 url = "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz";
775 sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
776 };
777 }
778
779 {
780 name = "binary_extensions___binary_extensions_1.13.1.tgz";
781 path = fetchurl {
782 name = "binary_extensions___binary_extensions_1.13.1.tgz";
783 url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz";
784 sha1 = "598afe54755b2868a5330d2aff9d4ebb53209b65";
785 };
786 }
787
788 {
789 name = "binary___binary_0.3.0.tgz";
790 path = fetchurl {
791 name = "binary___binary_0.3.0.tgz";
792 url = "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz";
793 sha1 = "9f60553bc5ce8c3386f3b553cff47462adecaa79";
794 };
795 }
796
797 {
798 name = "binaryextensions___binaryextensions_1.0.1.tgz";
799 path = fetchurl {
800 name = "binaryextensions___binaryextensions_1.0.1.tgz";
801 url = "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz";
802 sha1 = "1e637488b35b58bda5f4774bf96a5212a8c90755";
803 };
804 }
805
806 {
807 name = "bindings___bindings_1.5.0.tgz";
808 path = fetchurl {
809 name = "bindings___bindings_1.5.0.tgz";
810 url = "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz";
811 sha1 = "10353c9e945334bc0511a6d90b38fbc7c9c504df";
812 };
813 }
814
815 {
816 name = "bl___bl_0.9.5.tgz";
817 path = fetchurl {
818 name = "bl___bl_0.9.5.tgz";
819 url = "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz";
820 sha1 = "c06b797af085ea00bc527afc8efcf11de2232054";
821 };
822 }
823
824 {
825 name = "blob___blob_0.0.4.tgz";
826 path = fetchurl {
827 name = "blob___blob_0.0.4.tgz";
828 url = "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz";
829 sha1 = "bcf13052ca54463f30f9fc7e95b9a47630a94921";
830 };
831 }
832
833 {
834 name = "block_stream___block_stream_0.0.9.tgz";
835 path = fetchurl {
836 name = "block_stream___block_stream_0.0.9.tgz";
837 url = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
838 sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
839 };
840 }
841
842 {
843 name = "bluebird___bluebird_2.11.0.tgz";
844 path = fetchurl {
845 name = "bluebird___bluebird_2.11.0.tgz";
846 url = "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz";
847 sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
848 };
849 }
850
851 {
852 name = "body_parser___body_parser_1.19.0.tgz";
853 path = fetchurl {
854 name = "body_parser___body_parser_1.19.0.tgz";
855 url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz";
856 sha1 = "96b2709e57c9c4e09a6fd66a8fd979844f69f08a";
857 };
858 }
859
860 {
861 name = "body_parser___body_parser_1.14.2.tgz";
862 path = fetchurl {
863 name = "body_parser___body_parser_1.14.2.tgz";
864 url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz";
865 sha1 = "1015cb1fe2c443858259581db53332f8d0cf50f9";
866 };
867 }
868
869 {
870 name = "boom___boom_0.4.2.tgz";
871 path = fetchurl {
872 name = "boom___boom_0.4.2.tgz";
873 url = "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz";
874 sha1 = "7a636e9ded4efcefb19cef4947a3c67dfaee911b";
875 };
876 }
877
878 {
879 name = "bower_config___bower_config_0.5.3.tgz";
880 path = fetchurl {
881 name = "bower_config___bower_config_0.5.3.tgz";
882 url = "https://registry.yarnpkg.com/bower-config/-/bower-config-0.5.3.tgz";
883 sha1 = "98fc5b41a87870ef9cbb9297635cf81f5505fdb1";
884 };
885 }
886
887 {
888 name = "bower_endpoint_parser___bower_endpoint_parser_0.2.2.tgz";
889 path = fetchurl {
890 name = "bower_endpoint_parser___bower_endpoint_parser_0.2.2.tgz";
891 url = "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz";
892 sha1 = "00b565adbfab6f2d35addde977e97962acbcb3f6";
893 };
894 }
895
896 {
897 name = "bower_json___bower_json_0.4.0.tgz";
898 path = fetchurl {
899 name = "bower_json___bower_json_0.4.0.tgz";
900 url = "https://registry.yarnpkg.com/bower-json/-/bower-json-0.4.0.tgz";
901 sha1 = "a99c3ccf416ef0590ed0ded252c760f1c6d93766";
902 };
903 }
904
905 {
906 name = "bower_logger___bower_logger_0.2.2.tgz";
907 path = fetchurl {
908 name = "bower_logger___bower_logger_0.2.2.tgz";
909 url = "https://registry.yarnpkg.com/bower-logger/-/bower-logger-0.2.2.tgz";
910 sha1 = "39be07e979b2fc8e03a94634205ed9422373d381";
911 };
912 }
913
914 {
915 name = "bower_registry_client___bower_registry_client_0.2.4.tgz";
916 path = fetchurl {
917 name = "bower_registry_client___bower_registry_client_0.2.4.tgz";
918 url = "https://registry.yarnpkg.com/bower-registry-client/-/bower-registry-client-0.2.4.tgz";
919 sha1 = "269fc7e898b627fb939d1144a593254d7fbbeebc";
920 };
921 }
922
923 {
924 name = "bower___bower_1.3.8.tgz";
925 path = fetchurl {
926 name = "bower___bower_1.3.8.tgz";
927 url = "https://registry.yarnpkg.com/bower/-/bower-1.3.8.tgz";
928 sha1 = "afa3338a8a88a6e084c38112ea4a15998cbee3e6";
929 };
930 }
931
932 {
933 name = "brace_expansion___brace_expansion_1.1.11.tgz";
934 path = fetchurl {
935 name = "brace_expansion___brace_expansion_1.1.11.tgz";
936 url = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
937 sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
938 };
939 }
940
941 {
942 name = "braces___braces_0.1.5.tgz";
943 path = fetchurl {
944 name = "braces___braces_0.1.5.tgz";
945 url = "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz";
946 sha1 = "c085711085291d8b75fdd74eab0f8597280711e6";
947 };
948 }
949
950 {
951 name = "braces___braces_1.8.5.tgz";
952 path = fetchurl {
953 name = "braces___braces_1.8.5.tgz";
954 url = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
955 sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
956 };
957 }
958
959 {
960 name = "braces___braces_2.3.2.tgz";
961 path = fetchurl {
962 name = "braces___braces_2.3.2.tgz";
963 url = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
964 sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
965 };
966 }
967
968 {
969 name = "browser_pack___browser_pack_2.0.1.tgz";
970 path = fetchurl {
971 name = "browser_pack___browser_pack_2.0.1.tgz";
972 url = "https://registry.yarnpkg.com/browser-pack/-/browser-pack-2.0.1.tgz";
973 sha1 = "5d1c527f56c582677411c4db2a128648ff6bf150";
974 };
975 }
976
977 {
978 name = "browser_resolve___browser_resolve_1.2.4.tgz";
979 path = fetchurl {
980 name = "browser_resolve___browser_resolve_1.2.4.tgz";
981 url = "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.2.4.tgz";
982 sha1 = "59ae7820a82955ecd32f5fb7c468ac21c4723806";
983 };
984 }
985
986 {
987 name = "browserify_shim___browserify_shim_2.0.10.tgz";
988 path = fetchurl {
989 name = "browserify_shim___browserify_shim_2.0.10.tgz";
990 url = "https://registry.yarnpkg.com/browserify-shim/-/browserify-shim-2.0.10.tgz";
991 sha1 = "74a0ed5b9b784a5a287906513a896d31f54a84b8";
992 };
993 }
994
995 {
996 name = "browserify_zlib___browserify_zlib_0.1.4.tgz";
997 path = fetchurl {
998 name = "browserify_zlib___browserify_zlib_0.1.4.tgz";
999 url = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz";
1000 sha1 = "bb35f8a519f600e0fa6b8485241c979d0141fb2d";
1001 };
1002 }
1003
1004 {
1005 name = "browserify___browserify_3.46.1.tgz";
1006 path = fetchurl {
1007 name = "browserify___browserify_3.46.1.tgz";
1008 url = "https://registry.yarnpkg.com/browserify/-/browserify-3.46.1.tgz";
1009 sha1 = "2c2e4a7f2f408178e78c223b5b57b37c2185ad8e";
1010 };
1011 }
1012
1013 {
1014 name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
1015 path = fetchurl {
1016 name = "buffer_alloc_unsafe___buffer_alloc_unsafe_1.1.0.tgz";
1017 url = "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz";
1018 sha1 = "bd7dc26ae2972d0eda253be061dba992349c19f0";
1019 };
1020 }
1021
1022 {
1023 name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
1024 path = fetchurl {
1025 name = "buffer_alloc___buffer_alloc_1.2.0.tgz";
1026 url = "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz";
1027 sha1 = "890dd90d923a873e08e10e5fd51a57e5b7cce0ec";
1028 };
1029 }
1030
1031 {
1032 name = "buffer_fill___buffer_fill_1.0.0.tgz";
1033 path = fetchurl {
1034 name = "buffer_fill___buffer_fill_1.0.0.tgz";
1035 url = "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz";
1036 sha1 = "f8f78b76789888ef39f205cd637f68e702122b2c";
1037 };
1038 }
1039
1040 {
1041 name = "buffer___buffer_2.1.13.tgz";
1042 path = fetchurl {
1043 name = "buffer___buffer_2.1.13.tgz";
1044 url = "https://registry.yarnpkg.com/buffer/-/buffer-2.1.13.tgz";
1045 sha1 = "c88838ebf79f30b8b4a707788470bea8a62c2355";
1046 };
1047 }
1048
1049 {
1050 name = "buffers___buffers_0.1.1.tgz";
1051 path = fetchurl {
1052 name = "buffers___buffers_0.1.1.tgz";
1053 url = "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz";
1054 sha1 = "b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb";
1055 };
1056 }
1057
1058 {
1059 name = "bufferstreams___bufferstreams_0.0.2.tgz";
1060 path = fetchurl {
1061 name = "bufferstreams___bufferstreams_0.0.2.tgz";
1062 url = "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-0.0.2.tgz";
1063 sha1 = "7ce8dff968bbac00b9e90158a2c41456f740abdd";
1064 };
1065 }
1066
1067 {
1068 name = "builtins___builtins_0.0.7.tgz";
1069 path = fetchurl {
1070 name = "builtins___builtins_0.0.7.tgz";
1071 url = "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz";
1072 sha1 = "355219cd6cf18dbe7c01cc7fd2dce765cfdc549a";
1073 };
1074 }
1075
1076 {
1077 name = "bytes___bytes_2.2.0.tgz";
1078 path = fetchurl {
1079 name = "bytes___bytes_2.2.0.tgz";
1080 url = "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz";
1081 sha1 = "fd35464a403f6f9117c2de3609ecff9cae000588";
1082 };
1083 }
1084
1085 {
1086 name = "bytes___bytes_2.4.0.tgz";
1087 path = fetchurl {
1088 name = "bytes___bytes_2.4.0.tgz";
1089 url = "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz";
1090 sha1 = "7d97196f9d5baf7f6935e25985549edd2a6c2339";
1091 };
1092 }
1093
1094 {
1095 name = "bytes___bytes_3.1.0.tgz";
1096 path = fetchurl {
1097 name = "bytes___bytes_3.1.0.tgz";
1098 url = "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz";
1099 sha1 = "f6cf7933a360e0588fa9fde85651cdc7f805d1f6";
1100 };
1101 }
1102
1103 {
1104 name = "cache_base___cache_base_1.0.1.tgz";
1105 path = fetchurl {
1106 name = "cache_base___cache_base_1.0.1.tgz";
1107 url = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
1108 sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
1109 };
1110 }
1111
1112 {
1113 name = "callsite___callsite_1.0.0.tgz";
1114 path = fetchurl {
1115 name = "callsite___callsite_1.0.0.tgz";
1116 url = "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz";
1117 sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
1118 };
1119 }
1120
1121 {
1122 name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
1123 path = fetchurl {
1124 name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
1125 url = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
1126 sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7";
1127 };
1128 }
1129
1130 {
1131 name = "camelcase___camelcase_1.2.1.tgz";
1132 path = fetchurl {
1133 name = "camelcase___camelcase_1.2.1.tgz";
1134 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz";
1135 sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
1136 };
1137 }
1138
1139 {
1140 name = "camelcase___camelcase_2.1.1.tgz";
1141 path = fetchurl {
1142 name = "camelcase___camelcase_2.1.1.tgz";
1143 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz";
1144 sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f";
1145 };
1146 }
1147
1148 {
1149 name = "camelcase___camelcase_3.0.0.tgz";
1150 path = fetchurl {
1151 name = "camelcase___camelcase_3.0.0.tgz";
1152 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz";
1153 sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
1154 };
1155 }
1156
1157 {
1158 name = "cardinal___cardinal_0.4.4.tgz";
1159 path = fetchurl {
1160 name = "cardinal___cardinal_0.4.4.tgz";
1161 url = "https://registry.yarnpkg.com/cardinal/-/cardinal-0.4.4.tgz";
1162 sha1 = "ca5bb68a5b511b90fe93b9acea49bdee5c32bfe2";
1163 };
1164 }
1165
1166 {
1167 name = "caseless___caseless_0.12.0.tgz";
1168 path = fetchurl {
1169 name = "caseless___caseless_0.12.0.tgz";
1170 url = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
1171 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1172 };
1173 }
1174
1175 {
1176 name = "caseless___caseless_0.8.0.tgz";
1177 path = fetchurl {
1178 name = "caseless___caseless_0.8.0.tgz";
1179 url = "https://registry.yarnpkg.com/caseless/-/caseless-0.8.0.tgz";
1180 sha1 = "5bca2881d41437f54b2407ebe34888c7b9ad4f7d";
1181 };
1182 }
1183
1184 {
1185 name = "center_align___center_align_0.1.3.tgz";
1186 path = fetchurl {
1187 name = "center_align___center_align_0.1.3.tgz";
1188 url = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz";
1189 sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
1190 };
1191 }
1192
1193 {
1194 name = "chainsaw___chainsaw_0.1.0.tgz";
1195 path = fetchurl {
1196 name = "chainsaw___chainsaw_0.1.0.tgz";
1197 url = "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz";
1198 sha1 = "5eab50b28afe58074d0d58291388828b5e5fbc98";
1199 };
1200 }
1201
1202 {
1203 name = "chalk___chalk_3.0.0.tgz";
1204 path = fetchurl {
1205 name = "chalk___chalk_3.0.0.tgz";
1206 url = "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz";
1207 sha1 = "3f73c2bf526591f574cc492c51e2456349f844e4";
1208 };
1209 }
1210
1211 {
1212 name = "chalk___chalk_0.5.1.tgz";
1213 path = fetchurl {
1214 name = "chalk___chalk_0.5.1.tgz";
1215 url = "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz";
1216 sha1 = "663b3a648b68b55d04690d49167aa837858f2174";
1217 };
1218 }
1219
1220 {
1221 name = "chalk___chalk_1.1.3.tgz";
1222 path = fetchurl {
1223 name = "chalk___chalk_1.1.3.tgz";
1224 url = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
1225 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1226 };
1227 }
1228
1229 {
1230 name = "chalk___chalk_0.4.0.tgz";
1231 path = fetchurl {
1232 name = "chalk___chalk_0.4.0.tgz";
1233 url = "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz";
1234 sha1 = "5199a3ddcd0c1efe23bc08c1b027b06176e0c64f";
1235 };
1236 }
1237
1238 {
1239 name = "character_parser___character_parser_2.2.0.tgz";
1240 path = fetchurl {
1241 name = "character_parser___character_parser_2.2.0.tgz";
1242 url = "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz";
1243 sha1 = "c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0";
1244 };
1245 }
1246
1247 {
1248 name = "chmodr___chmodr_0.1.2.tgz";
1249 path = fetchurl {
1250 name = "chmodr___chmodr_0.1.2.tgz";
1251 url = "https://registry.yarnpkg.com/chmodr/-/chmodr-0.1.2.tgz";
1252 sha1 = "0dd8041c915087575bec383b47827bb7576a4fd6";
1253 };
1254 }
1255
1256 {
1257 name = "chokidar___chokidar_1.7.0.tgz";
1258 path = fetchurl {
1259 name = "chokidar___chokidar_1.7.0.tgz";
1260 url = "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz";
1261 sha1 = "798e689778151c8076b4b360e5edd28cda2bb468";
1262 };
1263 }
1264
1265 {
1266 name = "chownr___chownr_1.1.4.tgz";
1267 path = fetchurl {
1268 name = "chownr___chownr_1.1.4.tgz";
1269 url = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz";
1270 sha1 = "6fc9d7b42d32a583596337666e7d08084da2cc6b";
1271 };
1272 }
1273
1274 {
1275 name = "class_utils___class_utils_0.3.6.tgz";
1276 path = fetchurl {
1277 name = "class_utils___class_utils_0.3.6.tgz";
1278 url = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
1279 sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
1280 };
1281 }
1282
1283 {
1284 name = "clean_css___clean_css_2.2.23.tgz";
1285 path = fetchurl {
1286 name = "clean_css___clean_css_2.2.23.tgz";
1287 url = "https://registry.yarnpkg.com/clean-css/-/clean-css-2.2.23.tgz";
1288 sha1 = "0590b5478b516c4903edc2d89bd3fdbdd286328c";
1289 };
1290 }
1291
1292 {
1293 name = "clean_css___clean_css_4.2.3.tgz";
1294 path = fetchurl {
1295 name = "clean_css___clean_css_4.2.3.tgz";
1296 url = "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz";
1297 sha1 = "507b5de7d97b48ee53d84adb0160ff6216380f78";
1298 };
1299 }
1300
1301 {
1302 name = "cli_color___cli_color_0.2.3.tgz";
1303 path = fetchurl {
1304 name = "cli_color___cli_color_0.2.3.tgz";
1305 url = "https://registry.yarnpkg.com/cli-color/-/cli-color-0.2.3.tgz";
1306 sha1 = "0a25ceae5a6a1602be7f77d28563c36700274e88";
1307 };
1308 }
1309
1310 {
1311 name = "cli_color___cli_color_0.3.3.tgz";
1312 path = fetchurl {
1313 name = "cli_color___cli_color_0.3.3.tgz";
1314 url = "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.3.tgz";
1315 sha1 = "12d5bdd158ff8a0b0db401198913c03df069f6f5";
1316 };
1317 }
1318
1319 {
1320 name = "cliui___cliui_2.1.0.tgz";
1321 path = fetchurl {
1322 name = "cliui___cliui_2.1.0.tgz";
1323 url = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz";
1324 sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
1325 };
1326 }
1327
1328 {
1329 name = "cliui___cliui_3.2.0.tgz";
1330 path = fetchurl {
1331 name = "cliui___cliui_3.2.0.tgz";
1332 url = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
1333 sha1 = "120601537a916d29940f934da3b48d585a39213d";
1334 };
1335 }
1336
1337 {
1338 name = "clone_buffer___clone_buffer_1.0.0.tgz";
1339 path = fetchurl {
1340 name = "clone_buffer___clone_buffer_1.0.0.tgz";
1341 url = "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz";
1342 sha1 = "e3e25b207ac4e701af721e2cb5a16792cac3dc58";
1343 };
1344 }
1345
1346 {
1347 name = "clone_stats___clone_stats_0.0.1.tgz";
1348 path = fetchurl {
1349 name = "clone_stats___clone_stats_0.0.1.tgz";
1350 url = "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz";
1351 sha1 = "b88f94a82cf38b8791d58046ea4029ad88ca99d1";
1352 };
1353 }
1354
1355 {
1356 name = "clone_stats___clone_stats_1.0.0.tgz";
1357 path = fetchurl {
1358 name = "clone_stats___clone_stats_1.0.0.tgz";
1359 url = "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz";
1360 sha1 = "b3782dff8bb5474e18b9b6bf0fdfe782f8777680";
1361 };
1362 }
1363
1364 {
1365 name = "clone___clone_0.2.0.tgz";
1366 path = fetchurl {
1367 name = "clone___clone_0.2.0.tgz";
1368 url = "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz";
1369 sha1 = "c6126a90ad4f72dbf5acdb243cc37724fe93fc1f";
1370 };
1371 }
1372
1373 {
1374 name = "clone___clone_1.0.4.tgz";
1375 path = fetchurl {
1376 name = "clone___clone_1.0.4.tgz";
1377 url = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
1378 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1379 };
1380 }
1381
1382 {
1383 name = "clone___clone_2.1.2.tgz";
1384 path = fetchurl {
1385 name = "clone___clone_2.1.2.tgz";
1386 url = "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz";
1387 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1388 };
1389 }
1390
1391 {
1392 name = "cloneable_readable___cloneable_readable_1.1.3.tgz";
1393 path = fetchurl {
1394 name = "cloneable_readable___cloneable_readable_1.1.3.tgz";
1395 url = "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz";
1396 sha1 = "120a00cb053bfb63a222e709f9683ea2e11d8cec";
1397 };
1398 }
1399
1400 {
1401 name = "code_point_at___code_point_at_1.1.0.tgz";
1402 path = fetchurl {
1403 name = "code_point_at___code_point_at_1.1.0.tgz";
1404 url = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
1405 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
1406 };
1407 }
1408
1409 {
1410 name = "coffee_script___coffee_script_1.12.7.tgz";
1411 path = fetchurl {
1412 name = "coffee_script___coffee_script_1.12.7.tgz";
1413 url = "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz";
1414 sha1 = "c05dae0cb79591d05b3070a8433a98c9a89ccc53";
1415 };
1416 }
1417
1418 {
1419 name = "coffee_script___coffee_script_1.10.0.tgz";
1420 path = fetchurl {
1421 name = "coffee_script___coffee_script_1.10.0.tgz";
1422 url = "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.10.0.tgz";
1423 sha1 = "12938bcf9be1948fa006f92e0c4c9e81705108c0";
1424 };
1425 }
1426
1427 {
1428 name = "coffeescript___coffeescript_1.12.7.tgz";
1429 path = fetchurl {
1430 name = "coffeescript___coffeescript_1.12.7.tgz";
1431 url = "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz";
1432 sha1 = "e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27";
1433 };
1434 }
1435
1436 {
1437 name = "collection_visit___collection_visit_1.0.0.tgz";
1438 path = fetchurl {
1439 name = "collection_visit___collection_visit_1.0.0.tgz";
1440 url = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
1441 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1442 };
1443 }
1444
1445 {
1446 name = "color_convert___color_convert_2.0.1.tgz";
1447 path = fetchurl {
1448 name = "color_convert___color_convert_2.0.1.tgz";
1449 url = "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz";
1450 sha1 = "72d3a68d598c9bdb3af2ad1e84f21d896abd4de3";
1451 };
1452 }
1453
1454 {
1455 name = "color_name___color_name_1.1.4.tgz";
1456 path = fetchurl {
1457 name = "color_name___color_name_1.1.4.tgz";
1458 url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz";
1459 sha1 = "c2a09a87acbde69543de6f63fa3995c826c536a2";
1460 };
1461 }
1462
1463 {
1464 name = "color_support___color_support_1.1.3.tgz";
1465 path = fetchurl {
1466 name = "color_support___color_support_1.1.3.tgz";
1467 url = "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz";
1468 sha1 = "93834379a1cc9a0c61f82f52f0d04322251bd5a2";
1469 };
1470 }
1471
1472 {
1473 name = "colors___colors_1.4.0.tgz";
1474 path = fetchurl {
1475 name = "colors___colors_1.4.0.tgz";
1476 url = "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz";
1477 sha1 = "c50491479d4c1bdaed2c9ced32cf7c7dc2360f78";
1478 };
1479 }
1480
1481 {
1482 name = "combine_source_map___combine_source_map_0.3.0.tgz";
1483 path = fetchurl {
1484 name = "combine_source_map___combine_source_map_0.3.0.tgz";
1485 url = "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.3.0.tgz";
1486 sha1 = "d9e74f593d9cd43807312cb5d846d451efaa9eb7";
1487 };
1488 }
1489
1490 {
1491 name = "combined_stream___combined_stream_1.0.8.tgz";
1492 path = fetchurl {
1493 name = "combined_stream___combined_stream_1.0.8.tgz";
1494 url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz";
1495 sha1 = "c3d45a8b34fd730631a110a8a2520682b31d5a7f";
1496 };
1497 }
1498
1499 {
1500 name = "combined_stream___combined_stream_0.0.7.tgz";
1501 path = fetchurl {
1502 name = "combined_stream___combined_stream_0.0.7.tgz";
1503 url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz";
1504 sha1 = "0137e657baa5a7541c57ac37ac5fc07d73b4dc1f";
1505 };
1506 }
1507
1508 {
1509 name = "commander___commander_2.2.0.tgz";
1510 path = fetchurl {
1511 name = "commander___commander_2.2.0.tgz";
1512 url = "https://registry.yarnpkg.com/commander/-/commander-2.2.0.tgz";
1513 sha1 = "175ad4b9317f3ff615f201c1e57224f55a3e91df";
1514 };
1515 }
1516
1517 {
1518 name = "commander___commander_2.20.3.tgz";
1519 path = fetchurl {
1520 name = "commander___commander_2.20.3.tgz";
1521 url = "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz";
1522 sha1 = "fd485e84c03eb4881c20722ba48035e8531aeb33";
1523 };
1524 }
1525
1526 {
1527 name = "commondir___commondir_0.0.1.tgz";
1528 path = fetchurl {
1529 name = "commondir___commondir_0.0.1.tgz";
1530 url = "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz";
1531 sha1 = "89f00fdcd51b519c578733fec563e6a6da7f5be2";
1532 };
1533 }
1534
1535 {
1536 name = "component_bind___component_bind_1.0.0.tgz";
1537 path = fetchurl {
1538 name = "component_bind___component_bind_1.0.0.tgz";
1539 url = "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz";
1540 sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
1541 };
1542 }
1543
1544 {
1545 name = "component_emitter___component_emitter_1.1.2.tgz";
1546 path = fetchurl {
1547 name = "component_emitter___component_emitter_1.1.2.tgz";
1548 url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz";
1549 sha1 = "296594f2753daa63996d2af08d15a95116c9aec3";
1550 };
1551 }
1552
1553 {
1554 name = "component_emitter___component_emitter_1.2.1.tgz";
1555 path = fetchurl {
1556 name = "component_emitter___component_emitter_1.2.1.tgz";
1557 url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
1558 sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
1559 };
1560 }
1561
1562 {
1563 name = "component_emitter___component_emitter_1.3.0.tgz";
1564 path = fetchurl {
1565 name = "component_emitter___component_emitter_1.3.0.tgz";
1566 url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz";
1567 sha1 = "16e4070fba8ae29b679f2215853ee181ab2eabc0";
1568 };
1569 }
1570
1571 {
1572 name = "component_inherit___component_inherit_0.0.3.tgz";
1573 path = fetchurl {
1574 name = "component_inherit___component_inherit_0.0.3.tgz";
1575 url = "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz";
1576 sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
1577 };
1578 }
1579
1580 {
1581 name = "concat_map___concat_map_0.0.1.tgz";
1582 path = fetchurl {
1583 name = "concat_map___concat_map_0.0.1.tgz";
1584 url = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
1585 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
1586 };
1587 }
1588
1589 {
1590 name = "concat_stream___concat_stream_1.4.11.tgz";
1591 path = fetchurl {
1592 name = "concat_stream___concat_stream_1.4.11.tgz";
1593 url = "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.11.tgz";
1594 sha1 = "1dc9f666f2621da9c618b1e7f8f3b2ff70b5f76f";
1595 };
1596 }
1597
1598 {
1599 name = "concat_with_sourcemaps___concat_with_sourcemaps_1.1.0.tgz";
1600 path = fetchurl {
1601 name = "concat_with_sourcemaps___concat_with_sourcemaps_1.1.0.tgz";
1602 url = "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz";
1603 sha1 = "d4ea93f05ae25790951b99e7b3b09e3908a4082e";
1604 };
1605 }
1606
1607 {
1608 name = "configstore___configstore_0.3.2.tgz";
1609 path = fetchurl {
1610 name = "configstore___configstore_0.3.2.tgz";
1611 url = "https://registry.yarnpkg.com/configstore/-/configstore-0.3.2.tgz";
1612 sha1 = "25e4c16c3768abf75c5a65bc61761f495055b459";
1613 };
1614 }
1615
1616 {
1617 name = "configstore___configstore_0.2.3.tgz";
1618 path = fetchurl {
1619 name = "configstore___configstore_0.2.3.tgz";
1620 url = "https://registry.yarnpkg.com/configstore/-/configstore-0.2.3.tgz";
1621 sha1 = "b1bdc4ad823a25423dc15d220fcc1ae1d7efab02";
1622 };
1623 }
1624
1625 {
1626 name = "connect___connect_3.7.0.tgz";
1627 path = fetchurl {
1628 name = "connect___connect_3.7.0.tgz";
1629 url = "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz";
1630 sha1 = "5d49348910caa5e07a01800b030d0c35f20484f8";
1631 };
1632 }
1633
1634 {
1635 name = "console_browserify___console_browserify_1.0.3.tgz";
1636 path = fetchurl {
1637 name = "console_browserify___console_browserify_1.0.3.tgz";
1638 url = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.0.3.tgz";
1639 sha1 = "d3898d2c3a93102f364197f8874b4f92b5286a8e";
1640 };
1641 }
1642
1643 {
1644 name = "console_control_strings___console_control_strings_1.1.0.tgz";
1645 path = fetchurl {
1646 name = "console_control_strings___console_control_strings_1.1.0.tgz";
1647 url = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
1648 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
1649 };
1650 }
1651
1652 {
1653 name = "constantinople___constantinople_3.1.2.tgz";
1654 path = fetchurl {
1655 name = "constantinople___constantinople_3.1.2.tgz";
1656 url = "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz";
1657 sha1 = "d45ed724f57d3d10500017a7d3a889c1381ae647";
1658 };
1659 }
1660
1661 {
1662 name = "constants_browserify___constants_browserify_0.0.1.tgz";
1663 path = fetchurl {
1664 name = "constants_browserify___constants_browserify_0.0.1.tgz";
1665 url = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz";
1666 sha1 = "92577db527ba6c4cf0a4568d84bc031f441e21f2";
1667 };
1668 }
1669
1670 {
1671 name = "content_type___content_type_1.0.4.tgz";
1672 path = fetchurl {
1673 name = "content_type___content_type_1.0.4.tgz";
1674 url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
1675 sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
1676 };
1677 }
1678
1679 {
1680 name = "convert_source_map___convert_source_map_0.4.1.tgz";
1681 path = fetchurl {
1682 name = "convert_source_map___convert_source_map_0.4.1.tgz";
1683 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.4.1.tgz";
1684 sha1 = "f919a0099fe31f80fc5a1d0eb303161b394070c7";
1685 };
1686 }
1687
1688 {
1689 name = "convert_source_map___convert_source_map_1.7.0.tgz";
1690 path = fetchurl {
1691 name = "convert_source_map___convert_source_map_1.7.0.tgz";
1692 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz";
1693 sha1 = "17a2cb882d7f77d3490585e2ce6c524424a3a442";
1694 };
1695 }
1696
1697 {
1698 name = "convert_source_map___convert_source_map_0.3.5.tgz";
1699 path = fetchurl {
1700 name = "convert_source_map___convert_source_map_0.3.5.tgz";
1701 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz";
1702 sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190";
1703 };
1704 }
1705
1706 {
1707 name = "convert_source_map___convert_source_map_1.1.3.tgz";
1708 path = fetchurl {
1709 name = "convert_source_map___convert_source_map_1.1.3.tgz";
1710 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz";
1711 sha1 = "4829c877e9fe49b3161f3bf3673888e204699860";
1712 };
1713 }
1714
1715 {
1716 name = "cookie_jar___cookie_jar_0.3.0.tgz";
1717 path = fetchurl {
1718 name = "cookie_jar___cookie_jar_0.3.0.tgz";
1719 url = "https://registry.yarnpkg.com/cookie-jar/-/cookie-jar-0.3.0.tgz";
1720 sha1 = "bc9a27d4e2b97e186cd57c9e2063cb99fa68cccc";
1721 };
1722 }
1723
1724 {
1725 name = "cookie___cookie_0.3.1.tgz";
1726 path = fetchurl {
1727 name = "cookie___cookie_0.3.1.tgz";
1728 url = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
1729 sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
1730 };
1731 }
1732
1733 {
1734 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
1735 path = fetchurl {
1736 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
1737 url = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
1738 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
1739 };
1740 }
1741
1742 {
1743 name = "core_js___core_js_2.6.11.tgz";
1744 path = fetchurl {
1745 name = "core_js___core_js_2.6.11.tgz";
1746 url = "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz";
1747 sha1 = "38831469f9922bded8ee21c9dc46985e0399308c";
1748 };
1749 }
1750
1751 {
1752 name = "core_util_is___core_util_is_1.0.2.tgz";
1753 path = fetchurl {
1754 name = "core_util_is___core_util_is_1.0.2.tgz";
1755 url = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
1756 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
1757 };
1758 }
1759
1760 {
1761 name = "cross_spawn___cross_spawn_3.0.1.tgz";
1762 path = fetchurl {
1763 name = "cross_spawn___cross_spawn_3.0.1.tgz";
1764 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz";
1765 sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982";
1766 };
1767 }
1768
1769 {
1770 name = "cryptiles___cryptiles_0.2.2.tgz";
1771 path = fetchurl {
1772 name = "cryptiles___cryptiles_0.2.2.tgz";
1773 url = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz";
1774 sha1 = "ed91ff1f17ad13d3748288594f8a48a0d26f325c";
1775 };
1776 }
1777
1778 {
1779 name = "crypto_browserify___crypto_browserify_1.0.9.tgz";
1780 path = fetchurl {
1781 name = "crypto_browserify___crypto_browserify_1.0.9.tgz";
1782 url = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz";
1783 sha1 = "cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0";
1784 };
1785 }
1786
1787 {
1788 name = "ctype___ctype_0.5.3.tgz";
1789 path = fetchurl {
1790 name = "ctype___ctype_0.5.3.tgz";
1791 url = "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz";
1792 sha1 = "82c18c2461f74114ef16c135224ad0b9144ca12f";
1793 };
1794 }
1795
1796 {
1797 name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
1798 path = fetchurl {
1799 name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
1800 url = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
1801 sha1 = "988df33feab191ef799a61369dd76c17adf957ea";
1802 };
1803 }
1804
1805 {
1806 name = "custom_event___custom_event_1.0.1.tgz";
1807 path = fetchurl {
1808 name = "custom_event___custom_event_1.0.1.tgz";
1809 url = "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz";
1810 sha1 = "5d02a46850adf1b4a317946a3928fccb5bfd0425";
1811 };
1812 }
1813
1814 {
1815 name = "d___d_1.0.1.tgz";
1816 path = fetchurl {
1817 name = "d___d_1.0.1.tgz";
1818 url = "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz";
1819 sha1 = "8698095372d58dbee346ffd0c7093f99f8f9eb5a";
1820 };
1821 }
1822
1823 {
1824 name = "d___d_0.1.1.tgz";
1825 path = fetchurl {
1826 name = "d___d_0.1.1.tgz";
1827 url = "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz";
1828 sha1 = "da184c535d18d8ee7ba2aa229b914009fae11309";
1829 };
1830 }
1831
1832 {
1833 name = "dashdash___dashdash_1.14.1.tgz";
1834 path = fetchurl {
1835 name = "dashdash___dashdash_1.14.1.tgz";
1836 url = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
1837 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
1838 };
1839 }
1840
1841 {
1842 name = "dateformat___dateformat_1.0.12.tgz";
1843 path = fetchurl {
1844 name = "dateformat___dateformat_1.0.12.tgz";
1845 url = "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz";
1846 sha1 = "9f124b67594c937ff706932e4a642cca8dbbfee9";
1847 };
1848 }
1849
1850 {
1851 name = "dateformat___dateformat_2.2.0.tgz";
1852 path = fetchurl {
1853 name = "dateformat___dateformat_2.2.0.tgz";
1854 url = "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz";
1855 sha1 = "4065e2013cf9fb916ddfd82efb506ad4c6769062";
1856 };
1857 }
1858
1859 {
1860 name = "deap___deap_1.0.1.tgz";
1861 path = fetchurl {
1862 name = "deap___deap_1.0.1.tgz";
1863 url = "https://registry.yarnpkg.com/deap/-/deap-1.0.1.tgz";
1864 sha1 = "0646e9e1a095ffe8a9e404d68d1f76dcf57e66fb";
1865 };
1866 }
1867
1868 {
1869 name = "debug___debug_2.2.0.tgz";
1870 path = fetchurl {
1871 name = "debug___debug_2.2.0.tgz";
1872 url = "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz";
1873 sha1 = "f87057e995b1a1f6ae6a4960664137bc56f039da";
1874 };
1875 }
1876
1877 {
1878 name = "debug___debug_2.3.3.tgz";
1879 path = fetchurl {
1880 name = "debug___debug_2.3.3.tgz";
1881 url = "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz";
1882 sha1 = "40c453e67e6e13c901ddec317af8986cda9eff8c";
1883 };
1884 }
1885
1886 {
1887 name = "debug___debug_2.6.9.tgz";
1888 path = fetchurl {
1889 name = "debug___debug_2.6.9.tgz";
1890 url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
1891 sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
1892 };
1893 }
1894
1895 {
1896 name = "debug___debug_3.2.6.tgz";
1897 path = fetchurl {
1898 name = "debug___debug_3.2.6.tgz";
1899 url = "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz";
1900 sha1 = "e83d17de16d8a7efb7717edbe5fb10135eee629b";
1901 };
1902 }
1903
1904 {
1905 name = "decamelize___decamelize_1.2.0.tgz";
1906 path = fetchurl {
1907 name = "decamelize___decamelize_1.2.0.tgz";
1908 url = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
1909 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
1910 };
1911 }
1912
1913 {
1914 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
1915 path = fetchurl {
1916 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
1917 url = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
1918 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
1919 };
1920 }
1921
1922 {
1923 name = "decompress_zip___decompress_zip_0.0.8.tgz";
1924 path = fetchurl {
1925 name = "decompress_zip___decompress_zip_0.0.8.tgz";
1926 url = "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.0.8.tgz";
1927 sha1 = "4a265b22c7b209d7b24fa66f2b2dfbced59044f3";
1928 };
1929 }
1930
1931 {
1932 name = "deep_equal___deep_equal_0.1.2.tgz";
1933 path = fetchurl {
1934 name = "deep_equal___deep_equal_0.1.2.tgz";
1935 url = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz";
1936 sha1 = "b246c2b80a570a47c11be1d9bd1070ec878b87ce";
1937 };
1938 }
1939
1940 {
1941 name = "deep_extend___deep_extend_0.6.0.tgz";
1942 path = fetchurl {
1943 name = "deep_extend___deep_extend_0.6.0.tgz";
1944 url = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
1945 sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
1946 };
1947 }
1948
1949 {
1950 name = "deep_extend___deep_extend_0.2.11.tgz";
1951 path = fetchurl {
1952 name = "deep_extend___deep_extend_0.2.11.tgz";
1953 url = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.2.11.tgz";
1954 sha1 = "7a16ba69729132340506170494bc83f7076fe08f";
1955 };
1956 }
1957
1958 {
1959 name = "deep_is___deep_is_0.1.3.tgz";
1960 path = fetchurl {
1961 name = "deep_is___deep_is_0.1.3.tgz";
1962 url = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
1963 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
1964 };
1965 }
1966
1967 {
1968 name = "defaults___defaults_1.0.3.tgz";
1969 path = fetchurl {
1970 name = "defaults___defaults_1.0.3.tgz";
1971 url = "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz";
1972 sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
1973 };
1974 }
1975
1976 {
1977 name = "define_property___define_property_0.2.5.tgz";
1978 path = fetchurl {
1979 name = "define_property___define_property_0.2.5.tgz";
1980 url = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
1981 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
1982 };
1983 }
1984
1985 {
1986 name = "define_property___define_property_1.0.0.tgz";
1987 path = fetchurl {
1988 name = "define_property___define_property_1.0.0.tgz";
1989 url = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
1990 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
1991 };
1992 }
1993
1994 {
1995 name = "define_property___define_property_2.0.2.tgz";
1996 path = fetchurl {
1997 name = "define_property___define_property_2.0.2.tgz";
1998 url = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
1999 sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
2000 };
2001 }
2002
2003 {
2004 name = "defined___defined_0.0.0.tgz";
2005 path = fetchurl {
2006 name = "defined___defined_0.0.0.tgz";
2007 url = "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz";
2008 sha1 = "f35eea7d705e933baf13b2f03b3f83d921403b3e";
2009 };
2010 }
2011
2012 {
2013 name = "delayed_stream___delayed_stream_0.0.5.tgz";
2014 path = fetchurl {
2015 name = "delayed_stream___delayed_stream_0.0.5.tgz";
2016 url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz";
2017 sha1 = "d4b1f43a93e8296dfe02694f4680bc37a313c73f";
2018 };
2019 }
2020
2021 {
2022 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2023 path = fetchurl {
2024 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2025 url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
2026 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2027 };
2028 }
2029
2030 {
2031 name = "delegates___delegates_1.0.0.tgz";
2032 path = fetchurl {
2033 name = "delegates___delegates_1.0.0.tgz";
2034 url = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
2035 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
2036 };
2037 }
2038
2039 {
2040 name = "depd___depd_1.1.2.tgz";
2041 path = fetchurl {
2042 name = "depd___depd_1.1.2.tgz";
2043 url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
2044 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2045 };
2046 }
2047
2048 {
2049 name = "deprecated___deprecated_0.0.1.tgz";
2050 path = fetchurl {
2051 name = "deprecated___deprecated_0.0.1.tgz";
2052 url = "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz";
2053 sha1 = "f9c9af5464afa1e7a971458a8bdef2aa94d5bb19";
2054 };
2055 }
2056
2057 {
2058 name = "deps_sort___deps_sort_0.1.2.tgz";
2059 path = fetchurl {
2060 name = "deps_sort___deps_sort_0.1.2.tgz";
2061 url = "https://registry.yarnpkg.com/deps-sort/-/deps-sort-0.1.2.tgz";
2062 sha1 = "daa2fb614a17c9637d801e2f55339ae370f3611a";
2063 };
2064 }
2065
2066 {
2067 name = "derequire___derequire_0.8.0.tgz";
2068 path = fetchurl {
2069 name = "derequire___derequire_0.8.0.tgz";
2070 url = "https://registry.yarnpkg.com/derequire/-/derequire-0.8.0.tgz";
2071 sha1 = "c1f7f1da2cede44adede047378f03f444e9c4c0d";
2072 };
2073 }
2074
2075 {
2076 name = "destroy___destroy_1.0.4.tgz";
2077 path = fetchurl {
2078 name = "destroy___destroy_1.0.4.tgz";
2079 url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
2080 sha1 = "978857442c44749e4206613e37946205826abd80";
2081 };
2082 }
2083
2084 {
2085 name = "detect_file___detect_file_1.0.0.tgz";
2086 path = fetchurl {
2087 name = "detect_file___detect_file_1.0.0.tgz";
2088 url = "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz";
2089 sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
2090 };
2091 }
2092
2093 {
2094 name = "detect_libc___detect_libc_1.0.3.tgz";
2095 path = fetchurl {
2096 name = "detect_libc___detect_libc_1.0.3.tgz";
2097 url = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
2098 sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
2099 };
2100 }
2101
2102 {
2103 name = "detective___detective_3.1.0.tgz";
2104 path = fetchurl {
2105 name = "detective___detective_3.1.0.tgz";
2106 url = "https://registry.yarnpkg.com/detective/-/detective-3.1.0.tgz";
2107 sha1 = "77782444ab752b88ca1be2e9d0a0395f1da25eed";
2108 };
2109 }
2110
2111 {
2112 name = "di___di_0.0.1.tgz";
2113 path = fetchurl {
2114 name = "di___di_0.0.1.tgz";
2115 url = "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz";
2116 sha1 = "806649326ceaa7caa3306d75d985ea2748ba913c";
2117 };
2118 }
2119
2120 {
2121 name = "doctypes___doctypes_1.1.0.tgz";
2122 path = fetchurl {
2123 name = "doctypes___doctypes_1.1.0.tgz";
2124 url = "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz";
2125 sha1 = "ea80b106a87538774e8a3a4a5afe293de489e0a9";
2126 };
2127 }
2128
2129 {
2130 name = "dom_serialize___dom_serialize_2.2.1.tgz";
2131 path = fetchurl {
2132 name = "dom_serialize___dom_serialize_2.2.1.tgz";
2133 url = "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz";
2134 sha1 = "562ae8999f44be5ea3076f5419dcd59eb43ac95b";
2135 };
2136 }
2137
2138 {
2139 name = "domain_browser___domain_browser_1.1.7.tgz";
2140 path = fetchurl {
2141 name = "domain_browser___domain_browser_1.1.7.tgz";
2142 url = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz";
2143 sha1 = "867aa4b093faa05f1de08c06f4d7b21fdf8698bc";
2144 };
2145 }
2146
2147 {
2148 name = "duplexer2___duplexer2_0.0.2.tgz";
2149 path = fetchurl {
2150 name = "duplexer2___duplexer2_0.0.2.tgz";
2151 url = "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz";
2152 sha1 = "c614dcf67e2fb14995a91711e5a617e8a60a31db";
2153 };
2154 }
2155
2156 {
2157 name = "duplexer___duplexer_0.1.1.tgz";
2158 path = fetchurl {
2159 name = "duplexer___duplexer_0.1.1.tgz";
2160 url = "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz";
2161 sha1 = "ace6ff808c1ce66b57d1ebf97977acb02334cfc1";
2162 };
2163 }
2164
2165 {
2166 name = "duplexify___duplexify_3.7.1.tgz";
2167 path = fetchurl {
2168 name = "duplexify___duplexify_3.7.1.tgz";
2169 url = "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz";
2170 sha1 = "2a4df5317f6ccfd91f86d6fd25d8d8a103b88309";
2171 };
2172 }
2173
2174 {
2175 name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
2176 path = fetchurl {
2177 name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
2178 url = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
2179 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2180 };
2181 }
2182
2183 {
2184 name = "ee_first___ee_first_1.1.1.tgz";
2185 path = fetchurl {
2186 name = "ee_first___ee_first_1.1.1.tgz";
2187 url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
2188 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
2189 };
2190 }
2191
2192 {
2193 name = "encodeurl___encodeurl_1.0.2.tgz";
2194 path = fetchurl {
2195 name = "encodeurl___encodeurl_1.0.2.tgz";
2196 url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
2197 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
2198 };
2199 }
2200
2201 {
2202 name = "end_of_stream___end_of_stream_1.4.4.tgz";
2203 path = fetchurl {
2204 name = "end_of_stream___end_of_stream_1.4.4.tgz";
2205 url = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz";
2206 sha1 = "5ae64a5f45057baf3626ec14da0ca5e4b2431eb0";
2207 };
2208 }
2209
2210 {
2211 name = "end_of_stream___end_of_stream_0.1.5.tgz";
2212 path = fetchurl {
2213 name = "end_of_stream___end_of_stream_0.1.5.tgz";
2214 url = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz";
2215 sha1 = "8e177206c3c80837d85632e8b9359dfe8b2f6eaf";
2216 };
2217 }
2218
2219 {
2220 name = "engine.io_client___engine.io_client_1.8.5.tgz";
2221 path = fetchurl {
2222 name = "engine.io_client___engine.io_client_1.8.5.tgz";
2223 url = "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.5.tgz";
2224 sha1 = "fe7fb60cb0dcf2fa2859489329cb5968dedeb11f";
2225 };
2226 }
2227
2228 {
2229 name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
2230 path = fetchurl {
2231 name = "engine.io_parser___engine.io_parser_1.3.2.tgz";
2232 url = "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz";
2233 sha1 = "937b079f0007d0893ec56d46cb220b8cb435220a";
2234 };
2235 }
2236
2237 {
2238 name = "engine.io___engine.io_1.8.5.tgz";
2239 path = fetchurl {
2240 name = "engine.io___engine.io_1.8.5.tgz";
2241 url = "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.5.tgz";
2242 sha1 = "4ebe5e75c6dc123dee4afdce6e5fdced21eb93f6";
2243 };
2244 }
2245
2246 {
2247 name = "ent___ent_2.2.0.tgz";
2248 path = fetchurl {
2249 name = "ent___ent_2.2.0.tgz";
2250 url = "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz";
2251 sha1 = "e964219325a21d05f44466a2f686ed6ce5f5dd1d";
2252 };
2253 }
2254
2255 {
2256 name = "error_ex___error_ex_1.3.2.tgz";
2257 path = fetchurl {
2258 name = "error_ex___error_ex_1.3.2.tgz";
2259 url = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
2260 sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
2261 };
2262 }
2263
2264 {
2265 name = "es5_ext___es5_ext_0.10.53.tgz";
2266 path = fetchurl {
2267 name = "es5_ext___es5_ext_0.10.53.tgz";
2268 url = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz";
2269 sha1 = "93c5a3acfdbef275220ad72644ad02ee18368de1";
2270 };
2271 }
2272
2273 {
2274 name = "es5_ext___es5_ext_0.9.2.tgz";
2275 path = fetchurl {
2276 name = "es5_ext___es5_ext_0.9.2.tgz";
2277 url = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.9.2.tgz";
2278 sha1 = "d2e309d1f223b0718648835acf5b8823a8061f8a";
2279 };
2280 }
2281
2282 {
2283 name = "es6_iterator___es6_iterator_0.1.3.tgz";
2284 path = fetchurl {
2285 name = "es6_iterator___es6_iterator_0.1.3.tgz";
2286 url = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz";
2287 sha1 = "d6f58b8c4fc413c249b4baa19768f8e4d7c8944e";
2288 };
2289 }
2290
2291 {
2292 name = "es6_iterator___es6_iterator_2.0.3.tgz";
2293 path = fetchurl {
2294 name = "es6_iterator___es6_iterator_2.0.3.tgz";
2295 url = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
2296 sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
2297 };
2298 }
2299
2300 {
2301 name = "es6_symbol___es6_symbol_3.1.3.tgz";
2302 path = fetchurl {
2303 name = "es6_symbol___es6_symbol_3.1.3.tgz";
2304 url = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz";
2305 sha1 = "bad5d3c1bcdac28269f4cb331e431c78ac705d18";
2306 };
2307 }
2308
2309 {
2310 name = "es6_symbol___es6_symbol_2.0.1.tgz";
2311 path = fetchurl {
2312 name = "es6_symbol___es6_symbol_2.0.1.tgz";
2313 url = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz";
2314 sha1 = "761b5c67cfd4f1d18afb234f691d678682cb3bf3";
2315 };
2316 }
2317
2318 {
2319 name = "es6_weak_map___es6_weak_map_0.1.4.tgz";
2320 path = fetchurl {
2321 name = "es6_weak_map___es6_weak_map_0.1.4.tgz";
2322 url = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz";
2323 sha1 = "706cef9e99aa236ba7766c239c8b9e286ea7d228";
2324 };
2325 }
2326
2327 {
2328 name = "escape_html___escape_html_1.0.3.tgz";
2329 path = fetchurl {
2330 name = "escape_html___escape_html_1.0.3.tgz";
2331 url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
2332 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
2333 };
2334 }
2335
2336 {
2337 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
2338 path = fetchurl {
2339 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
2340 url = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
2341 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2342 };
2343 }
2344
2345 {
2346 name = "escodegen___escodegen_1.8.1.tgz";
2347 path = fetchurl {
2348 name = "escodegen___escodegen_1.8.1.tgz";
2349 url = "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz";
2350 sha1 = "5a5b53af4693110bebb0867aa3430dd3b70a1018";
2351 };
2352 }
2353
2354 {
2355 name = "escodegen___escodegen_1.1.0.tgz";
2356 path = fetchurl {
2357 name = "escodegen___escodegen_1.1.0.tgz";
2358 url = "https://registry.yarnpkg.com/escodegen/-/escodegen-1.1.0.tgz";
2359 sha1 = "c663923f6e20aad48d0c0fa49f31c6d4f49360cf";
2360 };
2361 }
2362
2363 {
2364 name = "escope___escope_0.0.16.tgz";
2365 path = fetchurl {
2366 name = "escope___escope_0.0.16.tgz";
2367 url = "https://registry.yarnpkg.com/escope/-/escope-0.0.16.tgz";
2368 sha1 = "418c7a0afca721dafe659193fd986283e746538f";
2369 };
2370 }
2371
2372 {
2373 name = "esprima_fb___esprima_fb_3001.0001.0000_dev_harmony_fb.tgz";
2374 path = fetchurl {
2375 name = "esprima_fb___esprima_fb_3001.0001.0000_dev_harmony_fb.tgz";
2376 url = "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz";
2377 sha1 = "b77d37abcd38ea0b77426bb8bc2922ce6b426411";
2378 };
2379 }
2380
2381 {
2382 name = "esprima___esprima_2.7.3.tgz";
2383 path = fetchurl {
2384 name = "esprima___esprima_2.7.3.tgz";
2385 url = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz";
2386 sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
2387 };
2388 }
2389
2390 {
2391 name = "esprima___esprima_4.0.1.tgz";
2392 path = fetchurl {
2393 name = "esprima___esprima_4.0.1.tgz";
2394 url = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
2395 sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
2396 };
2397 }
2398
2399 {
2400 name = "esprima___esprima_1.0.4.tgz";
2401 path = fetchurl {
2402 name = "esprima___esprima_1.0.4.tgz";
2403 url = "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz";
2404 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
2405 };
2406 }
2407
2408 {
2409 name = "esrefactor___esrefactor_0.1.0.tgz";
2410 path = fetchurl {
2411 name = "esrefactor___esrefactor_0.1.0.tgz";
2412 url = "https://registry.yarnpkg.com/esrefactor/-/esrefactor-0.1.0.tgz";
2413 sha1 = "d142795a282339ab81e936b5b7a21b11bf197b13";
2414 };
2415 }
2416
2417 {
2418 name = "estraverse___estraverse_5.0.0.tgz";
2419 path = fetchurl {
2420 name = "estraverse___estraverse_5.0.0.tgz";
2421 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz";
2422 sha1 = "ac81750b482c11cca26e4b07e83ed8f75fbcdc22";
2423 };
2424 }
2425
2426 {
2427 name = "estraverse___estraverse_1.9.3.tgz";
2428 path = fetchurl {
2429 name = "estraverse___estraverse_1.9.3.tgz";
2430 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz";
2431 sha1 = "af67f2dc922582415950926091a4005d29c9bb44";
2432 };
2433 }
2434
2435 {
2436 name = "estraverse___estraverse_0.0.4.tgz";
2437 path = fetchurl {
2438 name = "estraverse___estraverse_0.0.4.tgz";
2439 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz";
2440 sha1 = "01a0932dfee574684a598af5a67c3bf9b6428db2";
2441 };
2442 }
2443
2444 {
2445 name = "estraverse___estraverse_1.5.1.tgz";
2446 path = fetchurl {
2447 name = "estraverse___estraverse_1.5.1.tgz";
2448 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz";
2449 sha1 = "867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71";
2450 };
2451 }
2452
2453 {
2454 name = "esutils___esutils_2.0.3.tgz";
2455 path = fetchurl {
2456 name = "esutils___esutils_2.0.3.tgz";
2457 url = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz";
2458 sha1 = "74d2eb4de0b8da1293711910d50775b9b710ef64";
2459 };
2460 }
2461
2462 {
2463 name = "esutils___esutils_1.0.0.tgz";
2464 path = fetchurl {
2465 name = "esutils___esutils_1.0.0.tgz";
2466 url = "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz";
2467 sha1 = "8151d358e20c8acc7fb745e7472c0025fe496570";
2468 };
2469 }
2470
2471 {
2472 name = "etag___etag_1.7.0.tgz";
2473 path = fetchurl {
2474 name = "etag___etag_1.7.0.tgz";
2475 url = "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz";
2476 sha1 = "03d30b5f67dd6e632d2945d30d6652731a34d5d8";
2477 };
2478 }
2479
2480 {
2481 name = "event_emitter___event_emitter_0.2.2.tgz";
2482 path = fetchurl {
2483 name = "event_emitter___event_emitter_0.2.2.tgz";
2484 url = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.2.2.tgz";
2485 sha1 = "c81e3724eb55407c5a0d5ee3299411f700f54291";
2486 };
2487 }
2488
2489 {
2490 name = "event_emitter___event_emitter_0.3.5.tgz";
2491 path = fetchurl {
2492 name = "event_emitter___event_emitter_0.3.5.tgz";
2493 url = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz";
2494 sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
2495 };
2496 }
2497
2498 {
2499 name = "event_stream___event_stream_4.0.1.tgz";
2500 path = fetchurl {
2501 name = "event_stream___event_stream_4.0.1.tgz";
2502 url = "https://registry.yarnpkg.com/event-stream/-/event-stream-4.0.1.tgz";
2503 sha1 = "4092808ec995d0dd75ea4580c1df6a74db2cde65";
2504 };
2505 }
2506
2507 {
2508 name = "event_stream___event_stream_3.3.2.tgz";
2509 path = fetchurl {
2510 name = "event_stream___event_stream_3.3.2.tgz";
2511 url = "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.2.tgz";
2512 sha1 = "3cc310feb1f28d2f62b2a085d736a9ef566378b8";
2513 };
2514 }
2515
2516 {
2517 name = "event_stream___event_stream_3.3.5.tgz";
2518 path = fetchurl {
2519 name = "event_stream___event_stream_3.3.5.tgz";
2520 url = "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.5.tgz";
2521 sha1 = "e5dd8989543630d94c6cf4d657120341fa31636b";
2522 };
2523 }
2524
2525 {
2526 name = "eventemitter3___eventemitter3_4.0.0.tgz";
2527 path = fetchurl {
2528 name = "eventemitter3___eventemitter3_4.0.0.tgz";
2529 url = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz";
2530 sha1 = "d65176163887ee59f386d64c82610b696a4a74eb";
2531 };
2532 }
2533
2534 {
2535 name = "events___events_1.0.2.tgz";
2536 path = fetchurl {
2537 name = "events___events_1.0.2.tgz";
2538 url = "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz";
2539 sha1 = "75849dcfe93d10fb057c30055afdbd51d06a8e24";
2540 };
2541 }
2542
2543 {
2544 name = "expand_braces___expand_braces_0.1.2.tgz";
2545 path = fetchurl {
2546 name = "expand_braces___expand_braces_0.1.2.tgz";
2547 url = "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz";
2548 sha1 = "488b1d1d2451cb3d3a6b192cfc030f44c5855fea";
2549 };
2550 }
2551
2552 {
2553 name = "expand_brackets___expand_brackets_0.1.5.tgz";
2554 path = fetchurl {
2555 name = "expand_brackets___expand_brackets_0.1.5.tgz";
2556 url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
2557 sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
2558 };
2559 }
2560
2561 {
2562 name = "expand_brackets___expand_brackets_2.1.4.tgz";
2563 path = fetchurl {
2564 name = "expand_brackets___expand_brackets_2.1.4.tgz";
2565 url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
2566 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2567 };
2568 }
2569
2570 {
2571 name = "expand_range___expand_range_0.1.1.tgz";
2572 path = fetchurl {
2573 name = "expand_range___expand_range_0.1.1.tgz";
2574 url = "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz";
2575 sha1 = "4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044";
2576 };
2577 }
2578
2579 {
2580 name = "expand_range___expand_range_1.8.2.tgz";
2581 path = fetchurl {
2582 name = "expand_range___expand_range_1.8.2.tgz";
2583 url = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
2584 sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
2585 };
2586 }
2587
2588 {
2589 name = "expand_tilde___expand_tilde_2.0.2.tgz";
2590 path = fetchurl {
2591 name = "expand_tilde___expand_tilde_2.0.2.tgz";
2592 url = "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz";
2593 sha1 = "97e801aa052df02454de46b02bf621642cdc8502";
2594 };
2595 }
2596
2597 {
2598 name = "ext___ext_1.4.0.tgz";
2599 path = fetchurl {
2600 name = "ext___ext_1.4.0.tgz";
2601 url = "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz";
2602 sha1 = "89ae7a07158f79d35517882904324077e4379244";
2603 };
2604 }
2605
2606 {
2607 name = "extend_shallow___extend_shallow_2.0.1.tgz";
2608 path = fetchurl {
2609 name = "extend_shallow___extend_shallow_2.0.1.tgz";
2610 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
2611 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2612 };
2613 }
2614
2615 {
2616 name = "extend_shallow___extend_shallow_3.0.2.tgz";
2617 path = fetchurl {
2618 name = "extend_shallow___extend_shallow_3.0.2.tgz";
2619 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
2620 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2621 };
2622 }
2623
2624 {
2625 name = "extend___extend_3.0.2.tgz";
2626 path = fetchurl {
2627 name = "extend___extend_3.0.2.tgz";
2628 url = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
2629 sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
2630 };
2631 }
2632
2633 {
2634 name = "extglob___extglob_0.3.2.tgz";
2635 path = fetchurl {
2636 name = "extglob___extglob_0.3.2.tgz";
2637 url = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
2638 sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
2639 };
2640 }
2641
2642 {
2643 name = "extglob___extglob_2.0.4.tgz";
2644 path = fetchurl {
2645 name = "extglob___extglob_2.0.4.tgz";
2646 url = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
2647 sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
2648 };
2649 }
2650
2651 {
2652 name = "extsprintf___extsprintf_1.3.0.tgz";
2653 path = fetchurl {
2654 name = "extsprintf___extsprintf_1.3.0.tgz";
2655 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
2656 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2657 };
2658 }
2659
2660 {
2661 name = "extsprintf___extsprintf_1.4.0.tgz";
2662 path = fetchurl {
2663 name = "extsprintf___extsprintf_1.4.0.tgz";
2664 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
2665 sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
2666 };
2667 }
2668
2669 {
2670 name = "fancy_log___fancy_log_1.3.3.tgz";
2671 path = fetchurl {
2672 name = "fancy_log___fancy_log_1.3.3.tgz";
2673 url = "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz";
2674 sha1 = "dbc19154f558690150a23953a0adbd035be45fc7";
2675 };
2676 }
2677
2678 {
2679 name = "fast_deep_equal___fast_deep_equal_3.1.1.tgz";
2680 path = fetchurl {
2681 name = "fast_deep_equal___fast_deep_equal_3.1.1.tgz";
2682 url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2683 sha1 = "545145077c501491e33b15ec408c294376e94ae4";
2684 };
2685 }
2686
2687 {
2688 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
2689 path = fetchurl {
2690 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
2691 url = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2692 sha1 = "874bf69c6f404c2b5d99c481341399fd55892633";
2693 };
2694 }
2695
2696 {
2697 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
2698 path = fetchurl {
2699 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
2700 url = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2701 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2702 };
2703 }
2704
2705 {
2706 name = "faye_websocket___faye_websocket_0.7.3.tgz";
2707 path = fetchurl {
2708 name = "faye_websocket___faye_websocket_0.7.3.tgz";
2709 url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz";
2710 sha1 = "cc4074c7f4a4dfd03af54dd65c354b135132ce11";
2711 };
2712 }
2713
2714 {
2715 name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
2716 path = fetchurl {
2717 name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
2718 url = "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
2719 sha1 = "553a7b8446ff6f684359c445f1e37a05dacc33dd";
2720 };
2721 }
2722
2723 {
2724 name = "filename_regex___filename_regex_2.0.1.tgz";
2725 path = fetchurl {
2726 name = "filename_regex___filename_regex_2.0.1.tgz";
2727 url = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
2728 sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
2729 };
2730 }
2731
2732 {
2733 name = "fill_range___fill_range_2.2.4.tgz";
2734 path = fetchurl {
2735 name = "fill_range___fill_range_2.2.4.tgz";
2736 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
2737 sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
2738 };
2739 }
2740
2741 {
2742 name = "fill_range___fill_range_4.0.0.tgz";
2743 path = fetchurl {
2744 name = "fill_range___fill_range_4.0.0.tgz";
2745 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
2746 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2747 };
2748 }
2749
2750 {
2751 name = "finalhandler___finalhandler_1.1.2.tgz";
2752 path = fetchurl {
2753 name = "finalhandler___finalhandler_1.1.2.tgz";
2754 url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz";
2755 sha1 = "b7e7d000ffd11938d0fdb053506f6ebabe9f587d";
2756 };
2757 }
2758
2759 {
2760 name = "find_index___find_index_0.1.1.tgz";
2761 path = fetchurl {
2762 name = "find_index___find_index_0.1.1.tgz";
2763 url = "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz";
2764 sha1 = "675d358b2ca3892d795a1ab47232f8b6e2e0dde4";
2765 };
2766 }
2767
2768 {
2769 name = "find_up___find_up_1.1.2.tgz";
2770 path = fetchurl {
2771 name = "find_up___find_up_1.1.2.tgz";
2772 url = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
2773 sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
2774 };
2775 }
2776
2777 {
2778 name = "findup_sync___findup_sync_2.0.0.tgz";
2779 path = fetchurl {
2780 name = "findup_sync___findup_sync_2.0.0.tgz";
2781 url = "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz";
2782 sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc";
2783 };
2784 }
2785
2786 {
2787 name = "fined___fined_1.2.0.tgz";
2788 path = fetchurl {
2789 name = "fined___fined_1.2.0.tgz";
2790 url = "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz";
2791 sha1 = "d00beccf1aa2b475d16d423b0238b713a2c4a37b";
2792 };
2793 }
2794
2795 {
2796 name = "first_chunk_stream___first_chunk_stream_1.0.0.tgz";
2797 path = fetchurl {
2798 name = "first_chunk_stream___first_chunk_stream_1.0.0.tgz";
2799 url = "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz";
2800 sha1 = "59bfb50cd905f60d7c394cd3d9acaab4e6ad934e";
2801 };
2802 }
2803
2804 {
2805 name = "fixtures2js___fixtures2js_0.0.0.tgz";
2806 path = fetchurl {
2807 name = "fixtures2js___fixtures2js_0.0.0.tgz";
2808 url = "https://registry.yarnpkg.com/fixtures2js/-/fixtures2js-0.0.0.tgz";
2809 sha1 = "602f7964c5b2963fe73224c8e4a3607d75c1b34f";
2810 };
2811 }
2812
2813 {
2814 name = "flagged_respawn___flagged_respawn_1.0.1.tgz";
2815 path = fetchurl {
2816 name = "flagged_respawn___flagged_respawn_1.0.1.tgz";
2817 url = "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz";
2818 sha1 = "e7de6f1279ddd9ca9aac8a5971d618606b3aab41";
2819 };
2820 }
2821
2822 {
2823 name = "follow_redirects___follow_redirects_1.11.0.tgz";
2824 path = fetchurl {
2825 name = "follow_redirects___follow_redirects_1.11.0.tgz";
2826 url = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz";
2827 sha1 = "afa14f08ba12a52963140fe43212658897bc0ecb";
2828 };
2829 }
2830
2831 {
2832 name = "for_in___for_in_1.0.2.tgz";
2833 path = fetchurl {
2834 name = "for_in___for_in_1.0.2.tgz";
2835 url = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
2836 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
2837 };
2838 }
2839
2840 {
2841 name = "for_own___for_own_0.1.5.tgz";
2842 path = fetchurl {
2843 name = "for_own___for_own_0.1.5.tgz";
2844 url = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
2845 sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
2846 };
2847 }
2848
2849 {
2850 name = "for_own___for_own_1.0.0.tgz";
2851 path = fetchurl {
2852 name = "for_own___for_own_1.0.0.tgz";
2853 url = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
2854 sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
2855 };
2856 }
2857
2858 {
2859 name = "forever_agent___forever_agent_0.5.2.tgz";
2860 path = fetchurl {
2861 name = "forever_agent___forever_agent_0.5.2.tgz";
2862 url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz";
2863 sha1 = "6d0e09c4921f94a27f63d3b49c5feff1ea4c5130";
2864 };
2865 }
2866
2867 {
2868 name = "forever_agent___forever_agent_0.6.1.tgz";
2869 path = fetchurl {
2870 name = "forever_agent___forever_agent_0.6.1.tgz";
2871 url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
2872 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
2873 };
2874 }
2875
2876 {
2877 name = "fork_stream___fork_stream_0.0.4.tgz";
2878 path = fetchurl {
2879 name = "fork_stream___fork_stream_0.0.4.tgz";
2880 url = "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz";
2881 sha1 = "db849fce77f6708a5f8f386ae533a0907b54ae70";
2882 };
2883 }
2884
2885 {
2886 name = "form_data___form_data_0.1.4.tgz";
2887 path = fetchurl {
2888 name = "form_data___form_data_0.1.4.tgz";
2889 url = "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz";
2890 sha1 = "91abd788aba9702b1aabfa8bc01031a2ac9e3b12";
2891 };
2892 }
2893
2894 {
2895 name = "form_data___form_data_0.2.0.tgz";
2896 path = fetchurl {
2897 name = "form_data___form_data_0.2.0.tgz";
2898 url = "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz";
2899 sha1 = "26f8bc26da6440e299cbdcfb69035c4f77a6e466";
2900 };
2901 }
2902
2903 {
2904 name = "form_data___form_data_2.3.3.tgz";
2905 path = fetchurl {
2906 name = "form_data___form_data_2.3.3.tgz";
2907 url = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz";
2908 sha1 = "dcce52c05f644f298c6a7ab936bd724ceffbf3a6";
2909 };
2910 }
2911
2912 {
2913 name = "fragment_cache___fragment_cache_0.2.1.tgz";
2914 path = fetchurl {
2915 name = "fragment_cache___fragment_cache_0.2.1.tgz";
2916 url = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
2917 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
2918 };
2919 }
2920
2921 {
2922 name = "fresh___fresh_0.3.0.tgz";
2923 path = fetchurl {
2924 name = "fresh___fresh_0.3.0.tgz";
2925 url = "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz";
2926 sha1 = "651f838e22424e7566de161d8358caa199f83d4f";
2927 };
2928 }
2929
2930 {
2931 name = "from___from_0.1.7.tgz";
2932 path = fetchurl {
2933 name = "from___from_0.1.7.tgz";
2934 url = "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz";
2935 sha1 = "83c60afc58b9c56997007ed1a768b3ab303a44fe";
2936 };
2937 }
2938
2939 {
2940 name = "fs_access___fs_access_1.0.1.tgz";
2941 path = fetchurl {
2942 name = "fs_access___fs_access_1.0.1.tgz";
2943 url = "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz";
2944 sha1 = "d6a87f262271cefebec30c553407fb995da8777a";
2945 };
2946 }
2947
2948 {
2949 name = "fs_minipass___fs_minipass_1.2.7.tgz";
2950 path = fetchurl {
2951 name = "fs_minipass___fs_minipass_1.2.7.tgz";
2952 url = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz";
2953 sha1 = "ccff8570841e7fe4265693da88936c55aed7f7c7";
2954 };
2955 }
2956
2957 {
2958 name = "fs.realpath___fs.realpath_1.0.0.tgz";
2959 path = fetchurl {
2960 name = "fs.realpath___fs.realpath_1.0.0.tgz";
2961 url = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
2962 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
2963 };
2964 }
2965
2966 {
2967 name = "fsevents___fsevents_1.2.12.tgz";
2968 path = fetchurl {
2969 name = "fsevents___fsevents_1.2.12.tgz";
2970 url = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz";
2971 sha1 = "db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c";
2972 };
2973 }
2974
2975 {
2976 name = "fstream_ignore___fstream_ignore_0.0.10.tgz";
2977 path = fetchurl {
2978 name = "fstream_ignore___fstream_ignore_0.0.10.tgz";
2979 url = "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-0.0.10.tgz";
2980 sha1 = "b10f8f522cc55415f80b41f7d3a32e6cba254e8c";
2981 };
2982 }
2983
2984 {
2985 name = "fstream___fstream_1.0.12.tgz";
2986 path = fetchurl {
2987 name = "fstream___fstream_1.0.12.tgz";
2988 url = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz";
2989 sha1 = "4e8ba8ee2d48be4f7d0de505455548eae5932045";
2990 };
2991 }
2992
2993 {
2994 name = "fstream___fstream_0.1.31.tgz";
2995 path = fetchurl {
2996 name = "fstream___fstream_0.1.31.tgz";
2997 url = "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz";
2998 sha1 = "7337f058fbbbbefa8c9f561a28cab0849202c988";
2999 };
3000 }
3001
3002 {
3003 name = "function_bind___function_bind_1.1.1.tgz";
3004 path = fetchurl {
3005 name = "function_bind___function_bind_1.1.1.tgz";
3006 url = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
3007 sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
3008 };
3009 }
3010
3011 {
3012 name = "gauge___gauge_2.7.4.tgz";
3013 path = fetchurl {
3014 name = "gauge___gauge_2.7.4.tgz";
3015 url = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
3016 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
3017 };
3018 }
3019
3020 {
3021 name = "gaze___gaze_0.5.2.tgz";
3022 path = fetchurl {
3023 name = "gaze___gaze_0.5.2.tgz";
3024 url = "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz";
3025 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
3026 };
3027 }
3028
3029 {
3030 name = "gaze___gaze_1.1.3.tgz";
3031 path = fetchurl {
3032 name = "gaze___gaze_1.1.3.tgz";
3033 url = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz";
3034 sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a";
3035 };
3036 }
3037
3038 {
3039 name = "get_caller_file___get_caller_file_1.0.3.tgz";
3040 path = fetchurl {
3041 name = "get_caller_file___get_caller_file_1.0.3.tgz";
3042 url = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
3043 sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
3044 };
3045 }
3046
3047 {
3048 name = "get_stdin___get_stdin_4.0.1.tgz";
3049 path = fetchurl {
3050 name = "get_stdin___get_stdin_4.0.1.tgz";
3051 url = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz";
3052 sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe";
3053 };
3054 }
3055
3056 {
3057 name = "get_value___get_value_2.0.6.tgz";
3058 path = fetchurl {
3059 name = "get_value___get_value_2.0.6.tgz";
3060 url = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
3061 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
3062 };
3063 }
3064
3065 {
3066 name = "getpass___getpass_0.1.7.tgz";
3067 path = fetchurl {
3068 name = "getpass___getpass_0.1.7.tgz";
3069 url = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
3070 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
3071 };
3072 }
3073
3074 {
3075 name = "glob_base___glob_base_0.3.0.tgz";
3076 path = fetchurl {
3077 name = "glob_base___glob_base_0.3.0.tgz";
3078 url = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
3079 sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
3080 };
3081 }
3082
3083 {
3084 name = "glob_parent___glob_parent_2.0.0.tgz";
3085 path = fetchurl {
3086 name = "glob_parent___glob_parent_2.0.0.tgz";
3087 url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
3088 sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
3089 };
3090 }
3091
3092 {
3093 name = "glob_stream___glob_stream_3.1.18.tgz";
3094 path = fetchurl {
3095 name = "glob_stream___glob_stream_3.1.18.tgz";
3096 url = "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz";
3097 sha1 = "9170a5f12b790306fdfe598f313f8f7954fd143b";
3098 };
3099 }
3100
3101 {
3102 name = "glob_watcher___glob_watcher_0.0.6.tgz";
3103 path = fetchurl {
3104 name = "glob_watcher___glob_watcher_0.0.6.tgz";
3105 url = "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz";
3106 sha1 = "b95b4a8df74b39c83298b0c05c978b4d9a3b710b";
3107 };
3108 }
3109
3110 {
3111 name = "glob2base___glob2base_0.0.12.tgz";
3112 path = fetchurl {
3113 name = "glob2base___glob2base_0.0.12.tgz";
3114 url = "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz";
3115 sha1 = "9d419b3e28f12e83a362164a277055922c9c0d56";
3116 };
3117 }
3118
3119 {
3120 name = "glob___glob_4.5.3.tgz";
3121 path = fetchurl {
3122 name = "glob___glob_4.5.3.tgz";
3123 url = "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz";
3124 sha1 = "c6cb73d3226c1efef04de3c56d012f03377ee15f";
3125 };
3126 }
3127
3128 {
3129 name = "glob___glob_5.0.15.tgz";
3130 path = fetchurl {
3131 name = "glob___glob_5.0.15.tgz";
3132 url = "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz";
3133 sha1 = "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1";
3134 };
3135 }
3136
3137 {
3138 name = "glob___glob_6.0.4.tgz";
3139 path = fetchurl {
3140 name = "glob___glob_6.0.4.tgz";
3141 url = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz";
3142 sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
3143 };
3144 }
3145
3146 {
3147 name = "glob___glob_7.1.6.tgz";
3148 path = fetchurl {
3149 name = "glob___glob_7.1.6.tgz";
3150 url = "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz";
3151 sha1 = "141f33b81a7c2492e125594307480c46679278a6";
3152 };
3153 }
3154
3155 {
3156 name = "glob___glob_3.1.21.tgz";
3157 path = fetchurl {
3158 name = "glob___glob_3.1.21.tgz";
3159 url = "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz";
3160 sha1 = "d29e0a055dea5138f4d07ed40e8982e83c2066cd";
3161 };
3162 }
3163
3164 {
3165 name = "glob___glob_3.2.11.tgz";
3166 path = fetchurl {
3167 name = "glob___glob_3.2.11.tgz";
3168 url = "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz";
3169 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
3170 };
3171 }
3172
3173 {
3174 name = "glob___glob_4.0.6.tgz";
3175 path = fetchurl {
3176 name = "glob___glob_4.0.6.tgz";
3177 url = "https://registry.yarnpkg.com/glob/-/glob-4.0.6.tgz";
3178 sha1 = "695c50bdd4e2fb5c5d370b091f388d3707e291a7";
3179 };
3180 }
3181
3182 {
3183 name = "global_modules___global_modules_1.0.0.tgz";
3184 path = fetchurl {
3185 name = "global_modules___global_modules_1.0.0.tgz";
3186 url = "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz";
3187 sha1 = "6d770f0eb523ac78164d72b5e71a8877265cc3ea";
3188 };
3189 }
3190
3191 {
3192 name = "global_prefix___global_prefix_1.0.2.tgz";
3193 path = fetchurl {
3194 name = "global_prefix___global_prefix_1.0.2.tgz";
3195 url = "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz";
3196 sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe";
3197 };
3198 }
3199
3200 {
3201 name = "globule___globule_1.3.1.tgz";
3202 path = fetchurl {
3203 name = "globule___globule_1.3.1.tgz";
3204 url = "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz";
3205 sha1 = "90a25338f22b7fbeb527cee63c629aea754d33b9";
3206 };
3207 }
3208
3209 {
3210 name = "globule___globule_0.1.0.tgz";
3211 path = fetchurl {
3212 name = "globule___globule_0.1.0.tgz";
3213 url = "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz";
3214 sha1 = "d9c8edde1da79d125a151b79533b978676346ae5";
3215 };
3216 }
3217
3218 {
3219 name = "glogg___glogg_1.0.2.tgz";
3220 path = fetchurl {
3221 name = "glogg___glogg_1.0.2.tgz";
3222 url = "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz";
3223 sha1 = "2d7dd702beda22eb3bffadf880696da6d846313f";
3224 };
3225 }
3226
3227 {
3228 name = "got___got_3.3.1.tgz";
3229 path = fetchurl {
3230 name = "got___got_3.3.1.tgz";
3231 url = "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz";
3232 sha1 = "e5d0ed4af55fc3eef4d56007769d98192bcb2eca";
3233 };
3234 }
3235
3236 {
3237 name = "graceful_fs___graceful_fs_3.0.12.tgz";
3238 path = fetchurl {
3239 name = "graceful_fs___graceful_fs_3.0.12.tgz";
3240 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz";
3241 sha1 = "0034947ce9ed695ec8ab0b854bc919e82b1ffaef";
3242 };
3243 }
3244
3245 {
3246 name = "graceful_fs___graceful_fs_4.2.3.tgz";
3247 path = fetchurl {
3248 name = "graceful_fs___graceful_fs_4.2.3.tgz";
3249 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz";
3250 sha1 = "4a12ff1b60376ef09862c2093edd908328be8423";
3251 };
3252 }
3253
3254 {
3255 name = "graceful_fs___graceful_fs_1.2.3.tgz";
3256 path = fetchurl {
3257 name = "graceful_fs___graceful_fs_1.2.3.tgz";
3258 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz";
3259 sha1 = "15a4806a57547cb2d2dbf27f42e89a8c3451b364";
3260 };
3261 }
3262
3263 {
3264 name = "graceful_fs___graceful_fs_2.0.3.tgz";
3265 path = fetchurl {
3266 name = "graceful_fs___graceful_fs_2.0.3.tgz";
3267 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz";
3268 sha1 = "7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0";
3269 };
3270 }
3271
3272 {
3273 name = "guanlecoja___guanlecoja_0.9.2.tgz";
3274 path = fetchurl {
3275 name = "guanlecoja___guanlecoja_0.9.2.tgz";
3276 url = "https://registry.yarnpkg.com/guanlecoja/-/guanlecoja-0.9.2.tgz";
3277 sha1 = "03febe92d9e7575a633b4d5ad8d19f5ee1cdf326";
3278 };
3279 }
3280
3281 {
3282 name = "gulp_angular_templatecache___gulp_angular_templatecache_1.9.1.tgz";
3283 path = fetchurl {
3284 name = "gulp_angular_templatecache___gulp_angular_templatecache_1.9.1.tgz";
3285 url = "https://registry.yarnpkg.com/gulp-angular-templatecache/-/gulp-angular-templatecache-1.9.1.tgz";
3286 sha1 = "60f631e97aaaa765d942e37042e4bfbb1a5df244";
3287 };
3288 }
3289
3290 {
3291 name = "gulp_bower_deps___gulp_bower_deps_0.3.3.tgz";
3292 path = fetchurl {
3293 name = "gulp_bower_deps___gulp_bower_deps_0.3.3.tgz";
3294 url = "https://registry.yarnpkg.com/gulp-bower-deps/-/gulp-bower-deps-0.3.3.tgz";
3295 sha1 = "2109fe3fbee35069f67312bb977e591d890296cd";
3296 };
3297 }
3298
3299 {
3300 name = "gulp_browserify___gulp_browserify_0.5.1.tgz";
3301 path = fetchurl {
3302 name = "gulp_browserify___gulp_browserify_0.5.1.tgz";
3303 url = "https://registry.yarnpkg.com/gulp-browserify/-/gulp-browserify-0.5.1.tgz";
3304 sha1 = "820108ac2554a954adb8be17d23958b0c04be083";
3305 };
3306 }
3307
3308 {
3309 name = "gulp_cached___gulp_cached_1.1.1.tgz";
3310 path = fetchurl {
3311 name = "gulp_cached___gulp_cached_1.1.1.tgz";
3312 url = "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz";
3313 sha1 = "fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce";
3314 };
3315 }
3316
3317 {
3318 name = "gulp_clean_css___gulp_clean_css_2.4.0.tgz";
3319 path = fetchurl {
3320 name = "gulp_clean_css___gulp_clean_css_2.4.0.tgz";
3321 url = "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-2.4.0.tgz";
3322 sha1 = "2ae48109fe83ccc967ff5ad53c044949a4863b36";
3323 };
3324 }
3325
3326 {
3327 name = "gulp_coffee___gulp_coffee_2.3.5.tgz";
3328 path = fetchurl {
3329 name = "gulp_coffee___gulp_coffee_2.3.5.tgz";
3330 url = "https://registry.yarnpkg.com/gulp-coffee/-/gulp-coffee-2.3.5.tgz";
3331 sha1 = "8c64e9ac884e1bab4e20b66ac7c386a816859041";
3332 };
3333 }
3334
3335 {
3336 name = "gulp_concat___gulp_concat_2.6.0.tgz";
3337 path = fetchurl {
3338 name = "gulp_concat___gulp_concat_2.6.0.tgz";
3339 url = "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.0.tgz";
3340 sha1 = "585cfb115411f348773131140566b6a81c69cb91";
3341 };
3342 }
3343
3344 {
3345 name = "gulp_concat___gulp_concat_2.6.1.tgz";
3346 path = fetchurl {
3347 name = "gulp_concat___gulp_concat_2.6.1.tgz";
3348 url = "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz";
3349 sha1 = "633d16c95d88504628ad02665663cee5a4793353";
3350 };
3351 }
3352
3353 {
3354 name = "gulp_fixtures2js___gulp_fixtures2js_0.0.1.tgz";
3355 path = fetchurl {
3356 name = "gulp_fixtures2js___gulp_fixtures2js_0.0.1.tgz";
3357 url = "https://registry.yarnpkg.com/gulp-fixtures2js/-/gulp-fixtures2js-0.0.1.tgz";
3358 sha1 = "4a3cbb4404bdfab92f7d2b6e09de2bfd0ae78506";
3359 };
3360 }
3361
3362 {
3363 name = "gulp_footer___gulp_footer_1.0.5.tgz";
3364 path = fetchurl {
3365 name = "gulp_footer___gulp_footer_1.0.5.tgz";
3366 url = "https://registry.yarnpkg.com/gulp-footer/-/gulp-footer-1.0.5.tgz";
3367 sha1 = "e84ca777e266be7bbc2d45d2df0e7eba8dfa3e54";
3368 };
3369 }
3370
3371 {
3372 name = "gulp_footer___gulp_footer_1.1.2.tgz";
3373 path = fetchurl {
3374 name = "gulp_footer___gulp_footer_1.1.2.tgz";
3375 url = "https://registry.yarnpkg.com/gulp-footer/-/gulp-footer-1.1.2.tgz";
3376 sha1 = "7fe28324ec67e3d618d31e0f5ea2ee5b454f6877";
3377 };
3378 }
3379
3380 {
3381 name = "gulp_header___gulp_header_1.8.2.tgz";
3382 path = fetchurl {
3383 name = "gulp_header___gulp_header_1.8.2.tgz";
3384 url = "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.2.tgz";
3385 sha1 = "3ab222f53719d2d03d81d9134252fe7d52425aa4";
3386 };
3387 }
3388
3389 {
3390 name = "gulp_header___gulp_header_1.8.12.tgz";
3391 path = fetchurl {
3392 name = "gulp_header___gulp_header_1.8.12.tgz";
3393 url = "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz";
3394 sha1 = "ad306be0066599127281c4f8786660e705080a84";
3395 };
3396 }
3397
3398 {
3399 name = "gulp_help___gulp_help_1.6.1.tgz";
3400 path = fetchurl {
3401 name = "gulp_help___gulp_help_1.6.1.tgz";
3402 url = "https://registry.yarnpkg.com/gulp-help/-/gulp-help-1.6.1.tgz";
3403 sha1 = "261db186e18397fef3f6a2c22e9c315bfa88ae0c";
3404 };
3405 }
3406
3407 {
3408 name = "gulp_if___gulp_if_2.0.2.tgz";
3409 path = fetchurl {
3410 name = "gulp_if___gulp_if_2.0.2.tgz";
3411 url = "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz";
3412 sha1 = "a497b7e7573005041caa2bc8b7dda3c80444d629";
3413 };
3414 }
3415
3416 {
3417 name = "gulp_less___gulp_less_1.3.9.tgz";
3418 path = fetchurl {
3419 name = "gulp_less___gulp_less_1.3.9.tgz";
3420 url = "https://registry.yarnpkg.com/gulp-less/-/gulp-less-1.3.9.tgz";
3421 sha1 = "e129750f236693ead5b522af311cc33eeff1910e";
3422 };
3423 }
3424
3425 {
3426 name = "gulp_livereload___gulp_livereload_3.8.1.tgz";
3427 path = fetchurl {
3428 name = "gulp_livereload___gulp_livereload_3.8.1.tgz";
3429 url = "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz";
3430 sha1 = "00f744b2d749d3e9e3746589c8a44acac779b50f";
3431 };
3432 }
3433
3434 {
3435 name = "gulp_match___gulp_match_1.1.0.tgz";
3436 path = fetchurl {
3437 name = "gulp_match___gulp_match_1.1.0.tgz";
3438 url = "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz";
3439 sha1 = "552b7080fc006ee752c90563f9fec9d61aafdf4f";
3440 };
3441 }
3442
3443 {
3444 name = "gulp_ng_annotate___gulp_ng_annotate_1.1.0.tgz";
3445 path = fetchurl {
3446 name = "gulp_ng_annotate___gulp_ng_annotate_1.1.0.tgz";
3447 url = "https://registry.yarnpkg.com/gulp-ng-annotate/-/gulp-ng-annotate-1.1.0.tgz";
3448 sha1 = "5e801be073d8f6d343c4ff65b71717b90fac13ce";
3449 };
3450 }
3451
3452 {
3453 name = "gulp_ng_classify___gulp_ng_classify_4.0.1.tgz";
3454 path = fetchurl {
3455 name = "gulp_ng_classify___gulp_ng_classify_4.0.1.tgz";
3456 url = "https://registry.yarnpkg.com/gulp-ng-classify/-/gulp-ng-classify-4.0.1.tgz";
3457 sha1 = "3019161127c35c317ea08dc2a65ea35b592dbfd7";
3458 };
3459 }
3460
3461 {
3462 name = "gulp_pug___gulp_pug_3.3.0.tgz";
3463 path = fetchurl {
3464 name = "gulp_pug___gulp_pug_3.3.0.tgz";
3465 url = "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-3.3.0.tgz";
3466 sha1 = "46982c1439c094c360542ed8ba5c882d3bb711cf";
3467 };
3468 }
3469
3470 {
3471 name = "gulp_remember___gulp_remember_0.3.1.tgz";
3472 path = fetchurl {
3473 name = "gulp_remember___gulp_remember_0.3.1.tgz";
3474 url = "https://registry.yarnpkg.com/gulp-remember/-/gulp-remember-0.3.1.tgz";
3475 sha1 = "5776b6f64c5a1c5c4d4555406723ec8e2b0407e7";
3476 };
3477 }
3478
3479 {
3480 name = "gulp_rename___gulp_rename_1.2.3.tgz";
3481 path = fetchurl {
3482 name = "gulp_rename___gulp_rename_1.2.3.tgz";
3483 url = "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz";
3484 sha1 = "37b75298e9d3e6c0fe9ac4eac13ce3be5434646b";
3485 };
3486 }
3487
3488 {
3489 name = "gulp_replace___gulp_replace_0.5.4.tgz";
3490 path = fetchurl {
3491 name = "gulp_replace___gulp_replace_0.5.4.tgz";
3492 url = "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.5.4.tgz";
3493 sha1 = "69a67914bbd13c562bff14f504a403796aa0daa9";
3494 };
3495 }
3496
3497 {
3498 name = "gulp_sass___gulp_sass_3.2.1.tgz";
3499 path = fetchurl {
3500 name = "gulp_sass___gulp_sass_3.2.1.tgz";
3501 url = "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-3.2.1.tgz";
3502 sha1 = "2e3688a96fd8be1c0c01340750c191b2e79fab94";
3503 };
3504 }
3505
3506 {
3507 name = "gulp_sourcemaps___gulp_sourcemaps_1.6.0.tgz";
3508 path = fetchurl {
3509 name = "gulp_sourcemaps___gulp_sourcemaps_1.6.0.tgz";
3510 url = "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz";
3511 sha1 = "b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c";
3512 };
3513 }
3514
3515 {
3516 name = "gulp_uglify___gulp_uglify_1.4.2.tgz";
3517 path = fetchurl {
3518 name = "gulp_uglify___gulp_uglify_1.4.2.tgz";
3519 url = "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-1.4.2.tgz";
3520 sha1 = "2807ea1016e4962c37766c02feeb5501818857c3";
3521 };
3522 }
3523
3524 {
3525 name = "gulp_util___gulp_util_3.0.8.tgz";
3526 path = fetchurl {
3527 name = "gulp_util___gulp_util_3.0.8.tgz";
3528 url = "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz";
3529 sha1 = "0054e1e744502e27c04c187c3ecc505dd54bbb4f";
3530 };
3531 }
3532
3533 {
3534 name = "gulp_util___gulp_util_3.0.7.tgz";
3535 path = fetchurl {
3536 name = "gulp_util___gulp_util_3.0.7.tgz";
3537 url = "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz";
3538 sha1 = "78925c4b8f8b49005ac01a011c557e6218941cbb";
3539 };
3540 }
3541
3542 {
3543 name = "gulp_util___gulp_util_2.2.20.tgz";
3544 path = fetchurl {
3545 name = "gulp_util___gulp_util_2.2.20.tgz";
3546 url = "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz";
3547 sha1 = "d7146e5728910bd8f047a6b0b1e549bc22dbd64c";
3548 };
3549 }
3550
3551 {
3552 name = "gulp_wrap___gulp_wrap_0.8.0.tgz";
3553 path = fetchurl {
3554 name = "gulp_wrap___gulp_wrap_0.8.0.tgz";
3555 url = "https://registry.yarnpkg.com/gulp-wrap/-/gulp-wrap-0.8.0.tgz";
3556 sha1 = "c41ce89a374947788b78c9e67f33bbe838c69b86";
3557 };
3558 }
3559
3560 {
3561 name = "gulp___gulp_3.9.1.tgz";
3562 path = fetchurl {
3563 name = "gulp___gulp_3.9.1.tgz";
3564 url = "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz";
3565 sha1 = "571ce45928dd40af6514fc4011866016c13845b4";
3566 };
3567 }
3568
3569 {
3570 name = "gulplog___gulplog_1.0.0.tgz";
3571 path = fetchurl {
3572 name = "gulplog___gulplog_1.0.0.tgz";
3573 url = "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz";
3574 sha1 = "e28c4d45d05ecbbed818363ce8f9c5926229ffe5";
3575 };
3576 }
3577
3578 {
3579 name = "handlebars___handlebars_4.7.3.tgz";
3580 path = fetchurl {
3581 name = "handlebars___handlebars_4.7.3.tgz";
3582 url = "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz";
3583 sha1 = "8ece2797826886cf8082d1726ff21d2a022550ee";
3584 };
3585 }
3586
3587 {
3588 name = "handlebars___handlebars_1.3.0.tgz";
3589 path = fetchurl {
3590 name = "handlebars___handlebars_1.3.0.tgz";
3591 url = "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz";
3592 sha1 = "9e9b130a93e389491322d975cf3ec1818c37ce34";
3593 };
3594 }
3595
3596 {
3597 name = "har_schema___har_schema_2.0.0.tgz";
3598 path = fetchurl {
3599 name = "har_schema___har_schema_2.0.0.tgz";
3600 url = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
3601 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
3602 };
3603 }
3604
3605 {
3606 name = "har_validator___har_validator_5.1.3.tgz";
3607 path = fetchurl {
3608 name = "har_validator___har_validator_5.1.3.tgz";
3609 url = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz";
3610 sha1 = "1ef89ebd3e4996557675eed9893110dc350fa080";
3611 };
3612 }
3613
3614 {
3615 name = "has_ansi___has_ansi_0.1.0.tgz";
3616 path = fetchurl {
3617 name = "has_ansi___has_ansi_0.1.0.tgz";
3618 url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz";
3619 sha1 = "84f265aae8c0e6a88a12d7022894b7568894c62e";
3620 };
3621 }
3622
3623 {
3624 name = "has_ansi___has_ansi_2.0.0.tgz";
3625 path = fetchurl {
3626 name = "has_ansi___has_ansi_2.0.0.tgz";
3627 url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
3628 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
3629 };
3630 }
3631
3632 {
3633 name = "has_binary___has_binary_0.1.7.tgz";
3634 path = fetchurl {
3635 name = "has_binary___has_binary_0.1.7.tgz";
3636 url = "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz";
3637 sha1 = "68e61eb16210c9545a0a5cce06a873912fe1e68c";
3638 };
3639 }
3640
3641 {
3642 name = "has_color___has_color_0.1.7.tgz";
3643 path = fetchurl {
3644 name = "has_color___has_color_0.1.7.tgz";
3645 url = "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz";
3646 sha1 = "67144a5260c34fc3cca677d041daf52fe7b78b2f";
3647 };
3648 }
3649
3650 {
3651 name = "has_cors___has_cors_1.1.0.tgz";
3652 path = fetchurl {
3653 name = "has_cors___has_cors_1.1.0.tgz";
3654 url = "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz";
3655 sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
3656 };
3657 }
3658
3659 {
3660 name = "has_flag___has_flag_1.0.0.tgz";
3661 path = fetchurl {
3662 name = "has_flag___has_flag_1.0.0.tgz";
3663 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
3664 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
3665 };
3666 }
3667
3668 {
3669 name = "has_flag___has_flag_4.0.0.tgz";
3670 path = fetchurl {
3671 name = "has_flag___has_flag_4.0.0.tgz";
3672 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz";
3673 sha1 = "944771fd9c81c81265c4d6941860da06bb59479b";
3674 };
3675 }
3676
3677 {
3678 name = "has_gulplog___has_gulplog_0.1.0.tgz";
3679 path = fetchurl {
3680 name = "has_gulplog___has_gulplog_0.1.0.tgz";
3681 url = "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz";
3682 sha1 = "6414c82913697da51590397dafb12f22967811ce";
3683 };
3684 }
3685
3686 {
3687 name = "has_unicode___has_unicode_2.0.1.tgz";
3688 path = fetchurl {
3689 name = "has_unicode___has_unicode_2.0.1.tgz";
3690 url = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
3691 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
3692 };
3693 }
3694
3695 {
3696 name = "has_value___has_value_0.3.1.tgz";
3697 path = fetchurl {
3698 name = "has_value___has_value_0.3.1.tgz";
3699 url = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
3700 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
3701 };
3702 }
3703
3704 {
3705 name = "has_value___has_value_1.0.0.tgz";
3706 path = fetchurl {
3707 name = "has_value___has_value_1.0.0.tgz";
3708 url = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
3709 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
3710 };
3711 }
3712
3713 {
3714 name = "has_values___has_values_0.1.4.tgz";
3715 path = fetchurl {
3716 name = "has_values___has_values_0.1.4.tgz";
3717 url = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
3718 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
3719 };
3720 }
3721
3722 {
3723 name = "has_values___has_values_1.0.0.tgz";
3724 path = fetchurl {
3725 name = "has_values___has_values_1.0.0.tgz";
3726 url = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
3727 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
3728 };
3729 }
3730
3731 {
3732 name = "has___has_1.0.3.tgz";
3733 path = fetchurl {
3734 name = "has___has_1.0.3.tgz";
3735 url = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
3736 sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
3737 };
3738 }
3739
3740 {
3741 name = "hawk___hawk_1.1.1.tgz";
3742 path = fetchurl {
3743 name = "hawk___hawk_1.1.1.tgz";
3744 url = "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz";
3745 sha1 = "87cd491f9b46e4e2aeaca335416766885d2d1ed9";
3746 };
3747 }
3748
3749 {
3750 name = "hawk___hawk_1.0.0.tgz";
3751 path = fetchurl {
3752 name = "hawk___hawk_1.0.0.tgz";
3753 url = "https://registry.yarnpkg.com/hawk/-/hawk-1.0.0.tgz";
3754 sha1 = "b90bb169807285411da7ffcb8dd2598502d3b52d";
3755 };
3756 }
3757
3758 {
3759 name = "hoek___hoek_0.9.1.tgz";
3760 path = fetchurl {
3761 name = "hoek___hoek_0.9.1.tgz";
3762 url = "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz";
3763 sha1 = "3d322462badf07716ea7eb85baf88079cddce505";
3764 };
3765 }
3766
3767 {
3768 name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
3769 path = fetchurl {
3770 name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
3771 url = "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz";
3772 sha1 = "743298cef4e5af3e194161fbadcc2151d3a058e8";
3773 };
3774 }
3775
3776 {
3777 name = "hosted_git_info___hosted_git_info_2.8.8.tgz";
3778 path = fetchurl {
3779 name = "hosted_git_info___hosted_git_info_2.8.8.tgz";
3780 url = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz";
3781 sha1 = "7539bd4bc1e0e0a895815a2e0262420b12858488";
3782 };
3783 }
3784
3785 {
3786 name = "http_browserify___http_browserify_1.3.2.tgz";
3787 path = fetchurl {
3788 name = "http_browserify___http_browserify_1.3.2.tgz";
3789 url = "https://registry.yarnpkg.com/http-browserify/-/http-browserify-1.3.2.tgz";
3790 sha1 = "b562c34479349a690d7a6597df495aefa8c604f5";
3791 };
3792 }
3793
3794 {
3795 name = "http_errors___http_errors_1.7.2.tgz";
3796 path = fetchurl {
3797 name = "http_errors___http_errors_1.7.2.tgz";
3798 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz";
3799 sha1 = "4f5029cf13239f31036e5b2e55292bcfbcc85c8f";
3800 };
3801 }
3802
3803 {
3804 name = "http_errors___http_errors_1.3.1.tgz";
3805 path = fetchurl {
3806 name = "http_errors___http_errors_1.3.1.tgz";
3807 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz";
3808 sha1 = "197e22cdebd4198585e8694ef6786197b91ed942";
3809 };
3810 }
3811
3812 {
3813 name = "http_parser_js___http_parser_js_0.4.10.tgz";
3814 path = fetchurl {
3815 name = "http_parser_js___http_parser_js_0.4.10.tgz";
3816 url = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz";
3817 sha1 = "92c9c1374c35085f75db359ec56cc257cbb93fa4";
3818 };
3819 }
3820
3821 {
3822 name = "http_proxy___http_proxy_1.18.0.tgz";
3823 path = fetchurl {
3824 name = "http_proxy___http_proxy_1.18.0.tgz";
3825 url = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz";
3826 sha1 = "dbe55f63e75a347db7f3d99974f2692a314a6a3a";
3827 };
3828 }
3829
3830 {
3831 name = "http_signature___http_signature_0.10.1.tgz";
3832 path = fetchurl {
3833 name = "http_signature___http_signature_0.10.1.tgz";
3834 url = "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz";
3835 sha1 = "4fbdac132559aa8323121e540779c0a012b27e66";
3836 };
3837 }
3838
3839 {
3840 name = "http_signature___http_signature_1.2.0.tgz";
3841 path = fetchurl {
3842 name = "http_signature___http_signature_1.2.0.tgz";
3843 url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
3844 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
3845 };
3846 }
3847
3848 {
3849 name = "https_browserify___https_browserify_0.0.1.tgz";
3850 path = fetchurl {
3851 name = "https_browserify___https_browserify_0.0.1.tgz";
3852 url = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz";
3853 sha1 = "3f91365cabe60b77ed0ebba24b454e3e09d95a82";
3854 };
3855 }
3856
3857 {
3858 name = "iconv_lite___iconv_lite_0.4.13.tgz";
3859 path = fetchurl {
3860 name = "iconv_lite___iconv_lite_0.4.13.tgz";
3861 url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz";
3862 sha1 = "1f88aba4ab0b1508e8312acc39345f36e992e2f2";
3863 };
3864 }
3865
3866 {
3867 name = "iconv_lite___iconv_lite_0.4.24.tgz";
3868 path = fetchurl {
3869 name = "iconv_lite___iconv_lite_0.4.24.tgz";
3870 url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
3871 sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
3872 };
3873 }
3874
3875 {
3876 name = "ieee754___ieee754_1.1.13.tgz";
3877 path = fetchurl {
3878 name = "ieee754___ieee754_1.1.13.tgz";
3879 url = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz";
3880 sha1 = "ec168558e95aa181fd87d37f55c32bbcb6708b84";
3881 };
3882 }
3883
3884 {
3885 name = "ignore_walk___ignore_walk_3.0.3.tgz";
3886 path = fetchurl {
3887 name = "ignore_walk___ignore_walk_3.0.3.tgz";
3888 url = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz";
3889 sha1 = "017e2447184bfeade7c238e4aefdd1e8f95b1e37";
3890 };
3891 }
3892
3893 {
3894 name = "in_publish___in_publish_2.0.1.tgz";
3895 path = fetchurl {
3896 name = "in_publish___in_publish_2.0.1.tgz";
3897 url = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz";
3898 sha1 = "948b1a535c8030561cea522f73f78f4be357e00c";
3899 };
3900 }
3901
3902 {
3903 name = "indent_string___indent_string_2.1.0.tgz";
3904 path = fetchurl {
3905 name = "indent_string___indent_string_2.1.0.tgz";
3906 url = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz";
3907 sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80";
3908 };
3909 }
3910
3911 {
3912 name = "indexof___indexof_0.0.1.tgz";
3913 path = fetchurl {
3914 name = "indexof___indexof_0.0.1.tgz";
3915 url = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
3916 sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
3917 };
3918 }
3919
3920 {
3921 name = "infinity_agent___infinity_agent_2.0.3.tgz";
3922 path = fetchurl {
3923 name = "infinity_agent___infinity_agent_2.0.3.tgz";
3924 url = "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz";
3925 sha1 = "45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216";
3926 };
3927 }
3928
3929 {
3930 name = "inflight___inflight_1.0.6.tgz";
3931 path = fetchurl {
3932 name = "inflight___inflight_1.0.6.tgz";
3933 url = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
3934 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
3935 };
3936 }
3937
3938 {
3939 name = "inherits___inherits_1.0.2.tgz";
3940 path = fetchurl {
3941 name = "inherits___inherits_1.0.2.tgz";
3942 url = "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz";
3943 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
3944 };
3945 }
3946
3947 {
3948 name = "inherits___inherits_2.0.4.tgz";
3949 path = fetchurl {
3950 name = "inherits___inherits_2.0.4.tgz";
3951 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz";
3952 sha1 = "0fa2c64f932917c3433a0ded55363aae37416b7c";
3953 };
3954 }
3955
3956 {
3957 name = "inherits___inherits_2.0.1.tgz";
3958 path = fetchurl {
3959 name = "inherits___inherits_2.0.1.tgz";
3960 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
3961 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3962 };
3963 }
3964
3965 {
3966 name = "inherits___inherits_2.0.3.tgz";
3967 path = fetchurl {
3968 name = "inherits___inherits_2.0.3.tgz";
3969 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
3970 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
3971 };
3972 }
3973
3974 {
3975 name = "ini___ini_1.3.5.tgz";
3976 path = fetchurl {
3977 name = "ini___ini_1.3.5.tgz";
3978 url = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
3979 sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
3980 };
3981 }
3982
3983 {
3984 name = "inline_source_map___inline_source_map_0.3.1.tgz";
3985 path = fetchurl {
3986 name = "inline_source_map___inline_source_map_0.3.1.tgz";
3987 url = "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.3.1.tgz";
3988 sha1 = "a528b514e689fce90db3089e870d92f527acb5eb";
3989 };
3990 }
3991
3992 {
3993 name = "inquirer___inquirer_0.4.1.tgz";
3994 path = fetchurl {
3995 name = "inquirer___inquirer_0.4.1.tgz";
3996 url = "https://registry.yarnpkg.com/inquirer/-/inquirer-0.4.1.tgz";
3997 sha1 = "6cf74eb1a347f97a1a207bea8ad1c987d0ff4b81";
3998 };
3999 }
4000
4001 {
4002 name = "inquirer___inquirer_0.5.1.tgz";
4003 path = fetchurl {
4004 name = "inquirer___inquirer_0.5.1.tgz";
4005 url = "https://registry.yarnpkg.com/inquirer/-/inquirer-0.5.1.tgz";
4006 sha1 = "e9f2cd1ee172c7a32e054b78a03d4ddb0d7707f1";
4007 };
4008 }
4009
4010 {
4011 name = "insert_module_globals___insert_module_globals_6.0.0.tgz";
4012 path = fetchurl {
4013 name = "insert_module_globals___insert_module_globals_6.0.0.tgz";
4014 url = "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.0.0.tgz";
4015 sha1 = "ee8aeb9dee16819e33aa14588a558824af0c15dc";
4016 };
4017 }
4018
4019 {
4020 name = "insight___insight_0.3.1.tgz";
4021 path = fetchurl {
4022 name = "insight___insight_0.3.1.tgz";
4023 url = "https://registry.yarnpkg.com/insight/-/insight-0.3.1.tgz";
4024 sha1 = "1a14f32c06115c0850338c38a253d707b611d448";
4025 };
4026 }
4027
4028 {
4029 name = "interpret___interpret_1.2.0.tgz";
4030 path = fetchurl {
4031 name = "interpret___interpret_1.2.0.tgz";
4032 url = "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz";
4033 sha1 = "d5061a6224be58e8083985f5014d844359576296";
4034 };
4035 }
4036
4037 {
4038 name = "intersect___intersect_0.0.3.tgz";
4039 path = fetchurl {
4040 name = "intersect___intersect_0.0.3.tgz";
4041 url = "https://registry.yarnpkg.com/intersect/-/intersect-0.0.3.tgz";
4042 sha1 = "c1a4a5e5eac6ede4af7504cc07e0ada7bc9f4920";
4043 };
4044 }
4045
4046 {
4047 name = "invert_kv___invert_kv_1.0.0.tgz";
4048 path = fetchurl {
4049 name = "invert_kv___invert_kv_1.0.0.tgz";
4050 url = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
4051 sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
4052 };
4053 }
4054
4055 {
4056 name = "is_absolute___is_absolute_1.0.0.tgz";
4057 path = fetchurl {
4058 name = "is_absolute___is_absolute_1.0.0.tgz";
4059 url = "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz";
4060 sha1 = "395e1ae84b11f26ad1795e73c17378e48a301576";
4061 };
4062 }
4063
4064 {
4065 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
4066 path = fetchurl {
4067 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
4068 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
4069 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
4070 };
4071 }
4072
4073 {
4074 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
4075 path = fetchurl {
4076 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
4077 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
4078 sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
4079 };
4080 }
4081
4082 {
4083 name = "is_arrayish___is_arrayish_0.2.1.tgz";
4084 path = fetchurl {
4085 name = "is_arrayish___is_arrayish_0.2.1.tgz";
4086 url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
4087 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
4088 };
4089 }
4090
4091 {
4092 name = "is_binary_path___is_binary_path_1.0.1.tgz";
4093 path = fetchurl {
4094 name = "is_binary_path___is_binary_path_1.0.1.tgz";
4095 url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
4096 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
4097 };
4098 }
4099
4100 {
4101 name = "is_buffer___is_buffer_1.1.6.tgz";
4102 path = fetchurl {
4103 name = "is_buffer___is_buffer_1.1.6.tgz";
4104 url = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
4105 sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
4106 };
4107 }
4108
4109 {
4110 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
4111 path = fetchurl {
4112 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
4113 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
4114 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
4115 };
4116 }
4117
4118 {
4119 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
4120 path = fetchurl {
4121 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
4122 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
4123 sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
4124 };
4125 }
4126
4127 {
4128 name = "is_descriptor___is_descriptor_0.1.6.tgz";
4129 path = fetchurl {
4130 name = "is_descriptor___is_descriptor_0.1.6.tgz";
4131 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
4132 sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
4133 };
4134 }
4135
4136 {
4137 name = "is_descriptor___is_descriptor_1.0.2.tgz";
4138 path = fetchurl {
4139 name = "is_descriptor___is_descriptor_1.0.2.tgz";
4140 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
4141 sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
4142 };
4143 }
4144
4145 {
4146 name = "is_dotfile___is_dotfile_1.0.3.tgz";
4147 path = fetchurl {
4148 name = "is_dotfile___is_dotfile_1.0.3.tgz";
4149 url = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
4150 sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
4151 };
4152 }
4153
4154 {
4155 name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
4156 path = fetchurl {
4157 name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
4158 url = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
4159 sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
4160 };
4161 }
4162
4163 {
4164 name = "is_expression___is_expression_3.0.0.tgz";
4165 path = fetchurl {
4166 name = "is_expression___is_expression_3.0.0.tgz";
4167 url = "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz";
4168 sha1 = "39acaa6be7fd1f3471dc42c7416e61c24317ac9f";
4169 };
4170 }
4171
4172 {
4173 name = "is_extendable___is_extendable_0.1.1.tgz";
4174 path = fetchurl {
4175 name = "is_extendable___is_extendable_0.1.1.tgz";
4176 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
4177 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
4178 };
4179 }
4180
4181 {
4182 name = "is_extendable___is_extendable_1.0.1.tgz";
4183 path = fetchurl {
4184 name = "is_extendable___is_extendable_1.0.1.tgz";
4185 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
4186 sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
4187 };
4188 }
4189
4190 {
4191 name = "is_extglob___is_extglob_1.0.0.tgz";
4192 path = fetchurl {
4193 name = "is_extglob___is_extglob_1.0.0.tgz";
4194 url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
4195 sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
4196 };
4197 }
4198
4199 {
4200 name = "is_extglob___is_extglob_2.1.1.tgz";
4201 path = fetchurl {
4202 name = "is_extglob___is_extglob_2.1.1.tgz";
4203 url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
4204 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
4205 };
4206 }
4207
4208 {
4209 name = "is_finite___is_finite_1.1.0.tgz";
4210 path = fetchurl {
4211 name = "is_finite___is_finite_1.1.0.tgz";
4212 url = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz";
4213 sha1 = "904135c77fb42c0641d6aa1bcdbc4daa8da082f3";
4214 };
4215 }
4216
4217 {
4218 name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
4219 path = fetchurl {
4220 name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
4221 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
4222 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
4223 };
4224 }
4225
4226 {
4227 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
4228 path = fetchurl {
4229 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
4230 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
4231 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
4232 };
4233 }
4234
4235 {
4236 name = "is_glob___is_glob_2.0.1.tgz";
4237 path = fetchurl {
4238 name = "is_glob___is_glob_2.0.1.tgz";
4239 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
4240 sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
4241 };
4242 }
4243
4244 {
4245 name = "is_glob___is_glob_3.1.0.tgz";
4246 path = fetchurl {
4247 name = "is_glob___is_glob_3.1.0.tgz";
4248 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
4249 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
4250 };
4251 }
4252
4253 {
4254 name = "is_npm___is_npm_1.0.0.tgz";
4255 path = fetchurl {
4256 name = "is_npm___is_npm_1.0.0.tgz";
4257 url = "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz";
4258 sha1 = "f2fb63a65e4905b406c86072765a1a4dc793b9f4";
4259 };
4260 }
4261
4262 {
4263 name = "is_number___is_number_0.1.1.tgz";
4264 path = fetchurl {
4265 name = "is_number___is_number_0.1.1.tgz";
4266 url = "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz";
4267 sha1 = "69a7af116963d47206ec9bd9b48a14216f1e3806";
4268 };
4269 }
4270
4271 {
4272 name = "is_number___is_number_2.1.0.tgz";
4273 path = fetchurl {
4274 name = "is_number___is_number_2.1.0.tgz";
4275 url = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
4276 sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
4277 };
4278 }
4279
4280 {
4281 name = "is_number___is_number_3.0.0.tgz";
4282 path = fetchurl {
4283 name = "is_number___is_number_3.0.0.tgz";
4284 url = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
4285 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
4286 };
4287 }
4288
4289 {
4290 name = "is_number___is_number_4.0.0.tgz";
4291 path = fetchurl {
4292 name = "is_number___is_number_4.0.0.tgz";
4293 url = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
4294 sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
4295 };
4296 }
4297
4298 {
4299 name = "is_plain_object___is_plain_object_2.0.4.tgz";
4300 path = fetchurl {
4301 name = "is_plain_object___is_plain_object_2.0.4.tgz";
4302 url = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
4303 sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
4304 };
4305 }
4306
4307 {
4308 name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
4309 path = fetchurl {
4310 name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
4311 url = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
4312 sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
4313 };
4314 }
4315
4316 {
4317 name = "is_primitive___is_primitive_2.0.0.tgz";
4318 path = fetchurl {
4319 name = "is_primitive___is_primitive_2.0.0.tgz";
4320 url = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
4321 sha1 = "207bab91638499c07b2adf240a41a87210034575";
4322 };
4323 }
4324
4325 {
4326 name = "is_promise___is_promise_2.1.0.tgz";
4327 path = fetchurl {
4328 name = "is_promise___is_promise_2.1.0.tgz";
4329 url = "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz";
4330 sha1 = "79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa";
4331 };
4332 }
4333
4334 {
4335 name = "is_redirect___is_redirect_1.0.0.tgz";
4336 path = fetchurl {
4337 name = "is_redirect___is_redirect_1.0.0.tgz";
4338 url = "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz";
4339 sha1 = "1d03dded53bd8db0f30c26e4f95d36fc7c87dc24";
4340 };
4341 }
4342
4343 {
4344 name = "is_regex___is_regex_1.0.5.tgz";
4345 path = fetchurl {
4346 name = "is_regex___is_regex_1.0.5.tgz";
4347 url = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz";
4348 sha1 = "39d589a358bf18967f726967120b8fc1aed74eae";
4349 };
4350 }
4351
4352 {
4353 name = "is_relative___is_relative_1.0.0.tgz";
4354 path = fetchurl {
4355 name = "is_relative___is_relative_1.0.0.tgz";
4356 url = "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz";
4357 sha1 = "a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d";
4358 };
4359 }
4360
4361 {
4362 name = "is_root___is_root_0.1.0.tgz";
4363 path = fetchurl {
4364 name = "is_root___is_root_0.1.0.tgz";
4365 url = "https://registry.yarnpkg.com/is-root/-/is-root-0.1.0.tgz";
4366 sha1 = "825e394ab593df2d73c5d0092fce507270b53dcb";
4367 };
4368 }
4369
4370 {
4371 name = "is_stream___is_stream_1.1.0.tgz";
4372 path = fetchurl {
4373 name = "is_stream___is_stream_1.1.0.tgz";
4374 url = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
4375 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
4376 };
4377 }
4378
4379 {
4380 name = "is_typedarray___is_typedarray_1.0.0.tgz";
4381 path = fetchurl {
4382 name = "is_typedarray___is_typedarray_1.0.0.tgz";
4383 url = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
4384 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
4385 };
4386 }
4387
4388 {
4389 name = "is_unc_path___is_unc_path_1.0.0.tgz";
4390 path = fetchurl {
4391 name = "is_unc_path___is_unc_path_1.0.0.tgz";
4392 url = "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz";
4393 sha1 = "d731e8898ed090a12c352ad2eaed5095ad322c9d";
4394 };
4395 }
4396
4397 {
4398 name = "is_utf8___is_utf8_0.2.1.tgz";
4399 path = fetchurl {
4400 name = "is_utf8___is_utf8_0.2.1.tgz";
4401 url = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
4402 sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
4403 };
4404 }
4405
4406 {
4407 name = "is_windows___is_windows_1.0.2.tgz";
4408 path = fetchurl {
4409 name = "is_windows___is_windows_1.0.2.tgz";
4410 url = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
4411 sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
4412 };
4413 }
4414
4415 {
4416 name = "is___is_3.3.0.tgz";
4417 path = fetchurl {
4418 name = "is___is_3.3.0.tgz";
4419 url = "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz";
4420 sha1 = "61cff6dd3c4193db94a3d62582072b44e5645d79";
4421 };
4422 }
4423
4424 {
4425 name = "isarray___isarray_0.0.1.tgz";
4426 path = fetchurl {
4427 name = "isarray___isarray_0.0.1.tgz";
4428 url = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
4429 sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
4430 };
4431 }
4432
4433 {
4434 name = "isarray___isarray_1.0.0.tgz";
4435 path = fetchurl {
4436 name = "isarray___isarray_1.0.0.tgz";
4437 url = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
4438 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
4439 };
4440 }
4441
4442 {
4443 name = "isbinaryfile___isbinaryfile_3.0.3.tgz";
4444 path = fetchurl {
4445 name = "isbinaryfile___isbinaryfile_3.0.3.tgz";
4446 url = "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz";
4447 sha1 = "5d6def3edebf6e8ca8cae9c30183a804b5f8be80";
4448 };
4449 }
4450
4451 {
4452 name = "isexe___isexe_2.0.0.tgz";
4453 path = fetchurl {
4454 name = "isexe___isexe_2.0.0.tgz";
4455 url = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
4456 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
4457 };
4458 }
4459
4460 {
4461 name = "isobject___isobject_2.1.0.tgz";
4462 path = fetchurl {
4463 name = "isobject___isobject_2.1.0.tgz";
4464 url = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
4465 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
4466 };
4467 }
4468
4469 {
4470 name = "isobject___isobject_3.0.1.tgz";
4471 path = fetchurl {
4472 name = "isobject___isobject_3.0.1.tgz";
4473 url = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
4474 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
4475 };
4476 }
4477
4478 {
4479 name = "isstream___isstream_0.1.2.tgz";
4480 path = fetchurl {
4481 name = "isstream___isstream_0.1.2.tgz";
4482 url = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
4483 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
4484 };
4485 }
4486
4487 {
4488 name = "istanbul___istanbul_0.4.5.tgz";
4489 path = fetchurl {
4490 name = "istanbul___istanbul_0.4.5.tgz";
4491 url = "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz";
4492 sha1 = "65c7d73d4c4da84d4f3ac310b918fb0b8033733b";
4493 };
4494 }
4495
4496 {
4497 name = "istextorbinary___istextorbinary_1.0.2.tgz";
4498 path = fetchurl {
4499 name = "istextorbinary___istextorbinary_1.0.2.tgz";
4500 url = "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz";
4501 sha1 = "ace19354d1a9a0173efeb1084ce0f87b0ad7decf";
4502 };
4503 }
4504
4505 {
4506 name = "jasmine_core___jasmine_core_2.99.1.tgz";
4507 path = fetchurl {
4508 name = "jasmine_core___jasmine_core_2.99.1.tgz";
4509 url = "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.99.1.tgz";
4510 sha1 = "e6400df1e6b56e130b61c4bcd093daa7f6e8ca15";
4511 };
4512 }
4513
4514 {
4515 name = "js_base64___js_base64_2.5.2.tgz";
4516 path = fetchurl {
4517 name = "js_base64___js_base64_2.5.2.tgz";
4518 url = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz";
4519 sha1 = "313b6274dda718f714d00b3330bbae6e38e90209";
4520 };
4521 }
4522
4523 {
4524 name = "js_string_escape___js_string_escape_1.0.1.tgz";
4525 path = fetchurl {
4526 name = "js_string_escape___js_string_escape_1.0.1.tgz";
4527 url = "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz";
4528 sha1 = "e2625badbc0d67c7533e9edc1068c587ae4137ef";
4529 };
4530 }
4531
4532 {
4533 name = "js_stringify___js_stringify_1.0.2.tgz";
4534 path = fetchurl {
4535 name = "js_stringify___js_stringify_1.0.2.tgz";
4536 url = "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz";
4537 sha1 = "1736fddfd9724f28a3682adc6230ae7e4e9679db";
4538 };
4539 }
4540
4541 {
4542 name = "js_yaml___js_yaml_3.13.1.tgz";
4543 path = fetchurl {
4544 name = "js_yaml___js_yaml_3.13.1.tgz";
4545 url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz";
4546 sha1 = "aff151b30bfdfa8e49e05da22e7415e9dfa37847";
4547 };
4548 }
4549
4550 {
4551 name = "js_yaml___js_yaml_3.0.2.tgz";
4552 path = fetchurl {
4553 name = "js_yaml___js_yaml_3.0.2.tgz";
4554 url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.0.2.tgz";
4555 sha1 = "9937865f8e897a5e894e73c2c5cf2e89b32eb771";
4556 };
4557 }
4558
4559 {
4560 name = "jsbn___jsbn_0.1.1.tgz";
4561 path = fetchurl {
4562 name = "jsbn___jsbn_0.1.1.tgz";
4563 url = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
4564 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
4565 };
4566 }
4567
4568 {
4569 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
4570 path = fetchurl {
4571 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
4572 url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
4573 sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
4574 };
4575 }
4576
4577 {
4578 name = "json_schema___json_schema_0.2.3.tgz";
4579 path = fetchurl {
4580 name = "json_schema___json_schema_0.2.3.tgz";
4581 url = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
4582 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
4583 };
4584 }
4585
4586 {
4587 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
4588 path = fetchurl {
4589 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
4590 url = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
4591 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
4592 };
4593 }
4594
4595 {
4596 name = "json3___json3_3.3.2.tgz";
4597 path = fetchurl {
4598 name = "json3___json3_3.3.2.tgz";
4599 url = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
4600 sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
4601 };
4602 }
4603
4604 {
4605 name = "jsonify___jsonify_0.0.0.tgz";
4606 path = fetchurl {
4607 name = "jsonify___jsonify_0.0.0.tgz";
4608 url = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
4609 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
4610 };
4611 }
4612
4613 {
4614 name = "jsonparse___jsonparse_0.0.5.tgz";
4615 path = fetchurl {
4616 name = "jsonparse___jsonparse_0.0.5.tgz";
4617 url = "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz";
4618 sha1 = "330542ad3f0a654665b778f3eb2d9a9fa507ac64";
4619 };
4620 }
4621
4622 {
4623 name = "jsprim___jsprim_1.4.1.tgz";
4624 path = fetchurl {
4625 name = "jsprim___jsprim_1.4.1.tgz";
4626 url = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
4627 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
4628 };
4629 }
4630
4631 {
4632 name = "jstransformer___jstransformer_1.0.0.tgz";
4633 path = fetchurl {
4634 name = "jstransformer___jstransformer_1.0.0.tgz";
4635 url = "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz";
4636 sha1 = "ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3";
4637 };
4638 }
4639
4640 {
4641 name = "junk___junk_0.3.0.tgz";
4642 path = fetchurl {
4643 name = "junk___junk_0.3.0.tgz";
4644 url = "https://registry.yarnpkg.com/junk/-/junk-0.3.0.tgz";
4645 sha1 = "6c89c636f6e99898d8efbfc50430db40be71e10c";
4646 };
4647 }
4648
4649 {
4650 name = "karma_chrome_launcher___karma_chrome_launcher_2.1.1.tgz";
4651 path = fetchurl {
4652 name = "karma_chrome_launcher___karma_chrome_launcher_2.1.1.tgz";
4653 url = "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz";
4654 sha1 = "216879c68ac04d8d5140e99619ba04b59afd46cf";
4655 };
4656 }
4657
4658 {
4659 name = "karma_coffee_preprocessor___karma_coffee_preprocessor_0.3.0.tgz";
4660 path = fetchurl {
4661 name = "karma_coffee_preprocessor___karma_coffee_preprocessor_0.3.0.tgz";
4662 url = "https://registry.yarnpkg.com/karma-coffee-preprocessor/-/karma-coffee-preprocessor-0.3.0.tgz";
4663 sha1 = "a4d8dc2b145bfef458a203d308b63bc03c9b4259";
4664 };
4665 }
4666
4667 {
4668 name = "karma_coverage___karma_coverage_0.5.5.tgz";
4669 path = fetchurl {
4670 name = "karma_coverage___karma_coverage_0.5.5.tgz";
4671 url = "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-0.5.5.tgz";
4672 sha1 = "b0d58b1025d59d5c6620263186f1d58f5d5348c5";
4673 };
4674 }
4675
4676 {
4677 name = "karma_jasmine___karma_jasmine_0.3.8.tgz";
4678 path = fetchurl {
4679 name = "karma_jasmine___karma_jasmine_0.3.8.tgz";
4680 url = "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-0.3.8.tgz";
4681 sha1 = "5b6457791ad9b89aa173f079e3ebe1b8c805236c";
4682 };
4683 }
4684
4685 {
4686 name = "karma_sourcemap_loader___karma_sourcemap_loader_0.3.7.tgz";
4687 path = fetchurl {
4688 name = "karma_sourcemap_loader___karma_sourcemap_loader_0.3.7.tgz";
4689 url = "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz";
4690 sha1 = "91322c77f8f13d46fed062b042e1009d4c4505d8";
4691 };
4692 }
4693
4694 {
4695 name = "karma___karma_0.13.22.tgz";
4696 path = fetchurl {
4697 name = "karma___karma_0.13.22.tgz";
4698 url = "https://registry.yarnpkg.com/karma/-/karma-0.13.22.tgz";
4699 sha1 = "07750b1bd063d7e7e7b91bcd2e6354d8f2aa8744";
4700 };
4701 }
4702
4703 {
4704 name = "kind_of___kind_of_3.2.2.tgz";
4705 path = fetchurl {
4706 name = "kind_of___kind_of_3.2.2.tgz";
4707 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
4708 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
4709 };
4710 }
4711
4712 {
4713 name = "kind_of___kind_of_4.0.0.tgz";
4714 path = fetchurl {
4715 name = "kind_of___kind_of_4.0.0.tgz";
4716 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
4717 sha1 = "20813df3d712928b207378691a45066fae72dd57";
4718 };
4719 }
4720
4721 {
4722 name = "kind_of___kind_of_5.1.0.tgz";
4723 path = fetchurl {
4724 name = "kind_of___kind_of_5.1.0.tgz";
4725 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
4726 sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
4727 };
4728 }
4729
4730 {
4731 name = "kind_of___kind_of_6.0.3.tgz";
4732 path = fetchurl {
4733 name = "kind_of___kind_of_6.0.3.tgz";
4734 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz";
4735 sha1 = "07c05034a6c349fa06e24fa35aa76db4580ce4dd";
4736 };
4737 }
4738
4739 {
4740 name = "latest_version___latest_version_1.0.1.tgz";
4741 path = fetchurl {
4742 name = "latest_version___latest_version_1.0.1.tgz";
4743 url = "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz";
4744 sha1 = "72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb";
4745 };
4746 }
4747
4748 {
4749 name = "lazy_cache___lazy_cache_1.0.4.tgz";
4750 path = fetchurl {
4751 name = "lazy_cache___lazy_cache_1.0.4.tgz";
4752 url = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz";
4753 sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
4754 };
4755 }
4756
4757 {
4758 name = "lazypipe___lazypipe_1.0.2.tgz";
4759 path = fetchurl {
4760 name = "lazypipe___lazypipe_1.0.2.tgz";
4761 url = "https://registry.yarnpkg.com/lazypipe/-/lazypipe-1.0.2.tgz";
4762 sha1 = "b66f64ed7fd8b04869f1f1bcb795dbbaa80e418c";
4763 };
4764 }
4765
4766 {
4767 name = "lcid___lcid_1.0.0.tgz";
4768 path = fetchurl {
4769 name = "lcid___lcid_1.0.0.tgz";
4770 url = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
4771 sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
4772 };
4773 }
4774
4775 {
4776 name = "less___less_1.7.5.tgz";
4777 path = fetchurl {
4778 name = "less___less_1.7.5.tgz";
4779 url = "https://registry.yarnpkg.com/less/-/less-1.7.5.tgz";
4780 sha1 = "4f220cf7288a27eaca739df6e4808a2d4c0d5756";
4781 };
4782 }
4783
4784 {
4785 name = "levn___levn_0.3.0.tgz";
4786 path = fetchurl {
4787 name = "levn___levn_0.3.0.tgz";
4788 url = "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz";
4789 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
4790 };
4791 }
4792
4793 {
4794 name = "lexical_scope___lexical_scope_1.1.1.tgz";
4795 path = fetchurl {
4796 name = "lexical_scope___lexical_scope_1.1.1.tgz";
4797 url = "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.1.1.tgz";
4798 sha1 = "debac1067435f1359d90fcfd9e94bcb2ee47b2bf";
4799 };
4800 }
4801
4802 {
4803 name = "liftoff___liftoff_2.5.0.tgz";
4804 path = fetchurl {
4805 name = "liftoff___liftoff_2.5.0.tgz";
4806 url = "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz";
4807 sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec";
4808 };
4809 }
4810
4811 {
4812 name = "livereload_js___livereload_js_2.4.0.tgz";
4813 path = fetchurl {
4814 name = "livereload_js___livereload_js_2.4.0.tgz";
4815 url = "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz";
4816 sha1 = "447c31cf1ea9ab52fc20db615c5ddf678f78009c";
4817 };
4818 }
4819
4820 {
4821 name = "load_json_file___load_json_file_1.1.0.tgz";
4822 path = fetchurl {
4823 name = "load_json_file___load_json_file_1.1.0.tgz";
4824 url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
4825 sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
4826 };
4827 }
4828
4829 {
4830 name = "lockfile___lockfile_0.4.3.tgz";
4831 path = fetchurl {
4832 name = "lockfile___lockfile_0.4.3.tgz";
4833 url = "https://registry.yarnpkg.com/lockfile/-/lockfile-0.4.3.tgz";
4834 sha1 = "79b965ee9b32d9dd24b59cf81205e6dcb6d3b224";
4835 };
4836 }
4837
4838 {
4839 name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
4840 path = fetchurl {
4841 name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
4842 url = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz";
4843 sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e";
4844 };
4845 }
4846
4847 {
4848 name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
4849 path = fetchurl {
4850 name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
4851 url = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz";
4852 sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36";
4853 };
4854 }
4855
4856 {
4857 name = "lodash._basetostring___lodash._basetostring_3.0.1.tgz";
4858 path = fetchurl {
4859 name = "lodash._basetostring___lodash._basetostring_3.0.1.tgz";
4860 url = "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz";
4861 sha1 = "d1861d877f824a52f669832dcaf3ee15566a07d5";
4862 };
4863 }
4864
4865 {
4866 name = "lodash._basevalues___lodash._basevalues_3.0.0.tgz";
4867 path = fetchurl {
4868 name = "lodash._basevalues___lodash._basevalues_3.0.0.tgz";
4869 url = "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz";
4870 sha1 = "5b775762802bde3d3297503e26300820fdf661b7";
4871 };
4872 }
4873
4874 {
4875 name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
4876 path = fetchurl {
4877 name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
4878 url = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz";
4879 sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e";
4880 };
4881 }
4882
4883 {
4884 name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
4885 path = fetchurl {
4886 name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
4887 url = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz";
4888 sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11";
4889 };
4890 }
4891
4892 {
4893 name = "lodash._escapehtmlchar___lodash._escapehtmlchar_2.4.1.tgz";
4894 path = fetchurl {
4895 name = "lodash._escapehtmlchar___lodash._escapehtmlchar_2.4.1.tgz";
4896 url = "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz";
4897 sha1 = "df67c3bb6b7e8e1e831ab48bfa0795b92afe899d";
4898 };
4899 }
4900
4901 {
4902 name = "lodash._escapestringchar___lodash._escapestringchar_2.4.1.tgz";
4903 path = fetchurl {
4904 name = "lodash._escapestringchar___lodash._escapestringchar_2.4.1.tgz";
4905 url = "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz";
4906 sha1 = "ecfe22618a2ade50bfeea43937e51df66f0edb72";
4907 };
4908 }
4909
4910 {
4911 name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
4912 path = fetchurl {
4913 name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
4914 url = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz";
4915 sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5";
4916 };
4917 }
4918
4919 {
4920 name = "lodash._htmlescapes___lodash._htmlescapes_2.4.1.tgz";
4921 path = fetchurl {
4922 name = "lodash._htmlescapes___lodash._htmlescapes_2.4.1.tgz";
4923 url = "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz";
4924 sha1 = "32d14bf0844b6de6f8b62a051b4f67c228b624cb";
4925 };
4926 }
4927
4928 {
4929 name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
4930 path = fetchurl {
4931 name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
4932 url = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz";
4933 sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c";
4934 };
4935 }
4936
4937 {
4938 name = "lodash._isnative___lodash._isnative_2.4.1.tgz";
4939 path = fetchurl {
4940 name = "lodash._isnative___lodash._isnative_2.4.1.tgz";
4941 url = "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz";
4942 sha1 = "3ea6404b784a7be836c7b57580e1cdf79b14832c";
4943 };
4944 }
4945
4946 {
4947 name = "lodash._objecttypes___lodash._objecttypes_2.4.1.tgz";
4948 path = fetchurl {
4949 name = "lodash._objecttypes___lodash._objecttypes_2.4.1.tgz";
4950 url = "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz";
4951 sha1 = "7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11";
4952 };
4953 }
4954
4955 {
4956 name = "lodash._reescape___lodash._reescape_3.0.0.tgz";
4957 path = fetchurl {
4958 name = "lodash._reescape___lodash._reescape_3.0.0.tgz";
4959 url = "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz";
4960 sha1 = "2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a";
4961 };
4962 }
4963
4964 {
4965 name = "lodash._reevaluate___lodash._reevaluate_3.0.0.tgz";
4966 path = fetchurl {
4967 name = "lodash._reevaluate___lodash._reevaluate_3.0.0.tgz";
4968 url = "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz";
4969 sha1 = "58bc74c40664953ae0b124d806996daca431e2ed";
4970 };
4971 }
4972
4973 {
4974 name = "lodash._reinterpolate___lodash._reinterpolate_2.4.1.tgz";
4975 path = fetchurl {
4976 name = "lodash._reinterpolate___lodash._reinterpolate_2.4.1.tgz";
4977 url = "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz";
4978 sha1 = "4f1227aa5a8711fc632f5b07a1f4607aab8b3222";
4979 };
4980 }
4981
4982 {
4983 name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
4984 path = fetchurl {
4985 name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
4986 url = "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz";
4987 sha1 = "0ccf2d89166af03b3663c796538b75ac6e114d9d";
4988 };
4989 }
4990
4991 {
4992 name = "lodash._reunescapedhtml___lodash._reunescapedhtml_2.4.1.tgz";
4993 path = fetchurl {
4994 name = "lodash._reunescapedhtml___lodash._reunescapedhtml_2.4.1.tgz";
4995 url = "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz";
4996 sha1 = "747c4fc40103eb3bb8a0976e571f7a2659e93ba7";
4997 };
4998 }
4999
5000 {
5001 name = "lodash._root___lodash._root_3.0.1.tgz";
5002 path = fetchurl {
5003 name = "lodash._root___lodash._root_3.0.1.tgz";
5004 url = "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz";
5005 sha1 = "fba1c4524c19ee9a5f8136b4609f017cf4ded692";
5006 };
5007 }
5008
5009 {
5010 name = "lodash._shimkeys___lodash._shimkeys_2.4.1.tgz";
5011 path = fetchurl {
5012 name = "lodash._shimkeys___lodash._shimkeys_2.4.1.tgz";
5013 url = "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz";
5014 sha1 = "6e9cc9666ff081f0b5a6c978b83e242e6949d203";
5015 };
5016 }
5017
5018 {
5019 name = "lodash.assign___lodash.assign_4.2.0.tgz";
5020 path = fetchurl {
5021 name = "lodash.assign___lodash.assign_4.2.0.tgz";
5022 url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
5023 sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
5024 };
5025 }
5026
5027 {
5028 name = "lodash.assign___lodash.assign_3.2.0.tgz";
5029 path = fetchurl {
5030 name = "lodash.assign___lodash.assign_3.2.0.tgz";
5031 url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz";
5032 sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa";
5033 };
5034 }
5035
5036 {
5037 name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
5038 path = fetchurl {
5039 name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
5040 url = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
5041 sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
5042 };
5043 }
5044
5045 {
5046 name = "lodash.debounce___lodash.debounce_2.4.1.tgz";
5047 path = fetchurl {
5048 name = "lodash.debounce___lodash.debounce_2.4.1.tgz";
5049 url = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-2.4.1.tgz";
5050 sha1 = "d8cead246ec4b926e8b85678fc396bfeba8cc6fc";
5051 };
5052 }
5053
5054 {
5055 name = "lodash.defaults___lodash.defaults_2.4.1.tgz";
5056 path = fetchurl {
5057 name = "lodash.defaults___lodash.defaults_2.4.1.tgz";
5058 url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz";
5059 sha1 = "a7e8885f05e68851144b6e12a8f3678026bc4c54";
5060 };
5061 }
5062
5063 {
5064 name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
5065 path = fetchurl {
5066 name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
5067 url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
5068 sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
5069 };
5070 }
5071
5072 {
5073 name = "lodash.escape___lodash.escape_3.2.0.tgz";
5074 path = fetchurl {
5075 name = "lodash.escape___lodash.escape_3.2.0.tgz";
5076 url = "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz";
5077 sha1 = "995ee0dc18c1b48cc92effae71a10aab5b487698";
5078 };
5079 }
5080
5081 {
5082 name = "lodash.escape___lodash.escape_2.4.1.tgz";
5083 path = fetchurl {
5084 name = "lodash.escape___lodash.escape_2.4.1.tgz";
5085 url = "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz";
5086 sha1 = "2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4";
5087 };
5088 }
5089
5090 {
5091 name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
5092 path = fetchurl {
5093 name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
5094 url = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz";
5095 sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a";
5096 };
5097 }
5098
5099 {
5100 name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
5101 path = fetchurl {
5102 name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
5103 url = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz";
5104 sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55";
5105 };
5106 }
5107
5108 {
5109 name = "lodash.isfunction___lodash.isfunction_2.4.1.tgz";
5110 path = fetchurl {
5111 name = "lodash.isfunction___lodash.isfunction_2.4.1.tgz";
5112 url = "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz";
5113 sha1 = "2cfd575c73e498ab57e319b77fa02adef13a94d1";
5114 };
5115 }
5116
5117 {
5118 name = "lodash.isobject___lodash.isobject_2.4.1.tgz";
5119 path = fetchurl {
5120 name = "lodash.isobject___lodash.isobject_2.4.1.tgz";
5121 url = "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz";
5122 sha1 = "5a2e47fe69953f1ee631a7eba1fe64d2d06558f5";
5123 };
5124 }
5125
5126 {
5127 name = "lodash.keys___lodash.keys_3.1.2.tgz";
5128 path = fetchurl {
5129 name = "lodash.keys___lodash.keys_3.1.2.tgz";
5130 url = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz";
5131 sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a";
5132 };
5133 }
5134
5135 {
5136 name = "lodash.keys___lodash.keys_2.4.1.tgz";
5137 path = fetchurl {
5138 name = "lodash.keys___lodash.keys_2.4.1.tgz";
5139 url = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz";
5140 sha1 = "48dea46df8ff7632b10d706b8acb26591e2b3727";
5141 };
5142 }
5143
5144 {
5145 name = "lodash.now___lodash.now_2.4.1.tgz";
5146 path = fetchurl {
5147 name = "lodash.now___lodash.now_2.4.1.tgz";
5148 url = "https://registry.yarnpkg.com/lodash.now/-/lodash.now-2.4.1.tgz";
5149 sha1 = "6872156500525185faf96785bb7fe7fe15b562c6";
5150 };
5151 }
5152
5153 {
5154 name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
5155 path = fetchurl {
5156 name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
5157 url = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz";
5158 sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805";
5159 };
5160 }
5161
5162 {
5163 name = "lodash.template___lodash.template_2.4.1.tgz";
5164 path = fetchurl {
5165 name = "lodash.template___lodash.template_2.4.1.tgz";
5166 url = "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz";
5167 sha1 = "9e611007edf629129a974ab3c48b817b3e1cf20d";
5168 };
5169 }
5170
5171 {
5172 name = "lodash.template___lodash.template_3.6.2.tgz";
5173 path = fetchurl {
5174 name = "lodash.template___lodash.template_3.6.2.tgz";
5175 url = "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz";
5176 sha1 = "f8cdecc6169a255be9098ae8b0c53d378931d14f";
5177 };
5178 }
5179
5180 {
5181 name = "lodash.template___lodash.template_4.5.0.tgz";
5182 path = fetchurl {
5183 name = "lodash.template___lodash.template_4.5.0.tgz";
5184 url = "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz";
5185 sha1 = "f976195cf3f347d0d5f52483569fe8031ccce8ab";
5186 };
5187 }
5188
5189 {
5190 name = "lodash.templatesettings___lodash.templatesettings_3.1.1.tgz";
5191 path = fetchurl {
5192 name = "lodash.templatesettings___lodash.templatesettings_3.1.1.tgz";
5193 url = "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz";
5194 sha1 = "fb307844753b66b9f1afa54e262c745307dba8e5";
5195 };
5196 }
5197
5198 {
5199 name = "lodash.templatesettings___lodash.templatesettings_4.2.0.tgz";
5200 path = fetchurl {
5201 name = "lodash.templatesettings___lodash.templatesettings_4.2.0.tgz";
5202 url = "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz";
5203 sha1 = "e481310f049d3cf6d47e912ad09313b154f0fb33";
5204 };
5205 }
5206
5207 {
5208 name = "lodash.templatesettings___lodash.templatesettings_2.4.1.tgz";
5209 path = fetchurl {
5210 name = "lodash.templatesettings___lodash.templatesettings_2.4.1.tgz";
5211 url = "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz";
5212 sha1 = "ea76c75d11eb86d4dbe89a83893bb861929ac699";
5213 };
5214 }
5215
5216 {
5217 name = "lodash.values___lodash.values_2.4.1.tgz";
5218 path = fetchurl {
5219 name = "lodash.values___lodash.values_2.4.1.tgz";
5220 url = "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz";
5221 sha1 = "abf514436b3cb705001627978cbcf30b1280eea4";
5222 };
5223 }
5224
5225 {
5226 name = "lodash___lodash_2.4.2.tgz";
5227 path = fetchurl {
5228 name = "lodash___lodash_2.4.2.tgz";
5229 url = "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz";
5230 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
5231 };
5232 }
5233
5234 {
5235 name = "lodash___lodash_3.10.1.tgz";
5236 path = fetchurl {
5237 name = "lodash___lodash_3.10.1.tgz";
5238 url = "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz";
5239 sha1 = "5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
5240 };
5241 }
5242
5243 {
5244 name = "lodash___lodash_4.17.15.tgz";
5245 path = fetchurl {
5246 name = "lodash___lodash_4.17.15.tgz";
5247 url = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz";
5248 sha1 = "b447f6670a0455bbfeedd11392eff330ea097548";
5249 };
5250 }
5251
5252 {
5253 name = "lodash___lodash_1.0.2.tgz";
5254 path = fetchurl {
5255 name = "lodash___lodash_1.0.2.tgz";
5256 url = "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz";
5257 sha1 = "8f57560c83b59fc270bd3d561b690043430e2551";
5258 };
5259 }
5260
5261 {
5262 name = "log4js___log4js_0.6.38.tgz";
5263 path = fetchurl {
5264 name = "log4js___log4js_0.6.38.tgz";
5265 url = "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz";
5266 sha1 = "2c494116695d6fb25480943d3fc872e662a522fd";
5267 };
5268 }
5269
5270 {
5271 name = "longest___longest_1.0.1.tgz";
5272 path = fetchurl {
5273 name = "longest___longest_1.0.1.tgz";
5274 url = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz";
5275 sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
5276 };
5277 }
5278
5279 {
5280 name = "loophole___loophole_1.1.0.tgz";
5281 path = fetchurl {
5282 name = "loophole___loophole_1.1.0.tgz";
5283 url = "https://registry.yarnpkg.com/loophole/-/loophole-1.1.0.tgz";
5284 sha1 = "37949fea453b6256acc725c320ce0c5a7f70a2bd";
5285 };
5286 }
5287
5288 {
5289 name = "loud_rejection___loud_rejection_1.6.0.tgz";
5290 path = fetchurl {
5291 name = "loud_rejection___loud_rejection_1.6.0.tgz";
5292 url = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz";
5293 sha1 = "5b46f80147edee578870f086d04821cf998e551f";
5294 };
5295 }
5296
5297 {
5298 name = "lowercase_keys___lowercase_keys_1.0.1.tgz";
5299 path = fetchurl {
5300 name = "lowercase_keys___lowercase_keys_1.0.1.tgz";
5301 url = "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz";
5302 sha1 = "6f9e30b47084d971a7c820ff15a6c5167b74c26f";
5303 };
5304 }
5305
5306 {
5307 name = "lru_cache___lru_cache_2.7.3.tgz";
5308 path = fetchurl {
5309 name = "lru_cache___lru_cache_2.7.3.tgz";
5310 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz";
5311 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
5312 };
5313 }
5314
5315 {
5316 name = "lru_cache___lru_cache_4.1.5.tgz";
5317 path = fetchurl {
5318 name = "lru_cache___lru_cache_4.1.5.tgz";
5319 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz";
5320 sha1 = "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
5321 };
5322 }
5323
5324 {
5325 name = "lru_cache___lru_cache_2.3.1.tgz";
5326 path = fetchurl {
5327 name = "lru_cache___lru_cache_2.3.1.tgz";
5328 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.3.1.tgz";
5329 sha1 = "b3adf6b3d856e954e2c390e6cef22081245a53d6";
5330 };
5331 }
5332
5333 {
5334 name = "lru_cache___lru_cache_2.5.2.tgz";
5335 path = fetchurl {
5336 name = "lru_cache___lru_cache_2.5.2.tgz";
5337 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.2.tgz";
5338 sha1 = "1fddad938aae1263ce138680be1b3f591c0ab41c";
5339 };
5340 }
5341
5342 {
5343 name = "lru_queue___lru_queue_0.1.0.tgz";
5344 path = fetchurl {
5345 name = "lru_queue___lru_queue_0.1.0.tgz";
5346 url = "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz";
5347 sha1 = "2738bd9f0d3cf4f84490c5736c48699ac632cda3";
5348 };
5349 }
5350
5351 {
5352 name = "make_iterator___make_iterator_1.0.1.tgz";
5353 path = fetchurl {
5354 name = "make_iterator___make_iterator_1.0.1.tgz";
5355 url = "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz";
5356 sha1 = "29b33f312aa8f547c4a5e490f56afcec99133ad6";
5357 };
5358 }
5359
5360 {
5361 name = "map_cache___map_cache_0.2.2.tgz";
5362 path = fetchurl {
5363 name = "map_cache___map_cache_0.2.2.tgz";
5364 url = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
5365 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
5366 };
5367 }
5368
5369 {
5370 name = "map_obj___map_obj_1.0.1.tgz";
5371 path = fetchurl {
5372 name = "map_obj___map_obj_1.0.1.tgz";
5373 url = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
5374 sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
5375 };
5376 }
5377
5378 {
5379 name = "map_stream___map_stream_0.0.7.tgz";
5380 path = fetchurl {
5381 name = "map_stream___map_stream_0.0.7.tgz";
5382 url = "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz";
5383 sha1 = "8a1f07896d82b10926bd3744a2420009f88974a8";
5384 };
5385 }
5386
5387 {
5388 name = "map_stream___map_stream_0.1.0.tgz";
5389 path = fetchurl {
5390 name = "map_stream___map_stream_0.1.0.tgz";
5391 url = "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz";
5392 sha1 = "e56aa94c4c8055a16404a0674b78f215f7c8e194";
5393 };
5394 }
5395
5396 {
5397 name = "map_visit___map_visit_1.0.0.tgz";
5398 path = fetchurl {
5399 name = "map_visit___map_visit_1.0.0.tgz";
5400 url = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
5401 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
5402 };
5403 }
5404
5405 {
5406 name = "math_random___math_random_1.0.4.tgz";
5407 path = fetchurl {
5408 name = "math_random___math_random_1.0.4.tgz";
5409 url = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz";
5410 sha1 = "5dd6943c938548267016d4e34f057583080c514c";
5411 };
5412 }
5413
5414 {
5415 name = "media_typer___media_typer_0.3.0.tgz";
5416 path = fetchurl {
5417 name = "media_typer___media_typer_0.3.0.tgz";
5418 url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
5419 sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
5420 };
5421 }
5422
5423 {
5424 name = "memoizee___memoizee_0.2.6.tgz";
5425 path = fetchurl {
5426 name = "memoizee___memoizee_0.2.6.tgz";
5427 url = "https://registry.yarnpkg.com/memoizee/-/memoizee-0.2.6.tgz";
5428 sha1 = "bb45a7ad02530082f1612671dab35219cd2e0741";
5429 };
5430 }
5431
5432 {
5433 name = "memoizee___memoizee_0.3.10.tgz";
5434 path = fetchurl {
5435 name = "memoizee___memoizee_0.3.10.tgz";
5436 url = "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz";
5437 sha1 = "4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f";
5438 };
5439 }
5440
5441 {
5442 name = "meow___meow_3.7.0.tgz";
5443 path = fetchurl {
5444 name = "meow___meow_3.7.0.tgz";
5445 url = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz";
5446 sha1 = "72cb668b425228290abbfa856892587308a801fb";
5447 };
5448 }
5449
5450 {
5451 name = "merge_stream___merge_stream_1.0.1.tgz";
5452 path = fetchurl {
5453 name = "merge_stream___merge_stream_1.0.1.tgz";
5454 url = "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz";
5455 sha1 = "4041202d508a342ba00174008df0c251b8c135e1";
5456 };
5457 }
5458
5459 {
5460 name = "merge___merge_1.2.1.tgz";
5461 path = fetchurl {
5462 name = "merge___merge_1.2.1.tgz";
5463 url = "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz";
5464 sha1 = "38bebf80c3220a8a487b6fcfb3941bb11720c145";
5465 };
5466 }
5467
5468 {
5469 name = "micromatch___micromatch_2.3.11.tgz";
5470 path = fetchurl {
5471 name = "micromatch___micromatch_2.3.11.tgz";
5472 url = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
5473 sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
5474 };
5475 }
5476
5477 {
5478 name = "micromatch___micromatch_3.1.10.tgz";
5479 path = fetchurl {
5480 name = "micromatch___micromatch_3.1.10.tgz";
5481 url = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
5482 sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
5483 };
5484 }
5485
5486 {
5487 name = "mime_db___mime_db_1.43.0.tgz";
5488 path = fetchurl {
5489 name = "mime_db___mime_db_1.43.0.tgz";
5490 url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz";
5491 sha1 = "0a12e0502650e473d735535050e7c8f4eb4fae58";
5492 };
5493 }
5494
5495 {
5496 name = "mime_db___mime_db_1.12.0.tgz";
5497 path = fetchurl {
5498 name = "mime_db___mime_db_1.12.0.tgz";
5499 url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz";
5500 sha1 = "3d0c63180f458eb10d325aaa37d7c58ae312e9d7";
5501 };
5502 }
5503
5504 {
5505 name = "mime_types___mime_types_2.1.26.tgz";
5506 path = fetchurl {
5507 name = "mime_types___mime_types_2.1.26.tgz";
5508 url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz";
5509 sha1 = "9c921fc09b7e149a65dfdc0da4d20997200b0a06";
5510 };
5511 }
5512
5513 {
5514 name = "mime_types___mime_types_1.0.2.tgz";
5515 path = fetchurl {
5516 name = "mime_types___mime_types_1.0.2.tgz";
5517 url = "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz";
5518 sha1 = "995ae1392ab8affcbfcb2641dd054e943c0d5dce";
5519 };
5520 }
5521
5522 {
5523 name = "mime_types___mime_types_2.0.14.tgz";
5524 path = fetchurl {
5525 name = "mime_types___mime_types_2.0.14.tgz";
5526 url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz";
5527 sha1 = "310e159db23e077f8bb22b748dabfa4957140aa6";
5528 };
5529 }
5530
5531 {
5532 name = "mime___mime_1.3.4.tgz";
5533 path = fetchurl {
5534 name = "mime___mime_1.3.4.tgz";
5535 url = "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz";
5536 sha1 = "115f9e3b6b3daf2959983cb38f149a2d40eb5d53";
5537 };
5538 }
5539
5540 {
5541 name = "mime___mime_1.6.0.tgz";
5542 path = fetchurl {
5543 name = "mime___mime_1.6.0.tgz";
5544 url = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
5545 sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
5546 };
5547 }
5548
5549 {
5550 name = "mime___mime_1.2.11.tgz";
5551 path = fetchurl {
5552 name = "mime___mime_1.2.11.tgz";
5553 url = "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz";
5554 sha1 = "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10";
5555 };
5556 }
5557
5558 {
5559 name = "mini_lr___mini_lr_0.1.9.tgz";
5560 path = fetchurl {
5561 name = "mini_lr___mini_lr_0.1.9.tgz";
5562 url = "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz";
5563 sha1 = "02199d27347953d1fd1d6dbded4261f187b2d0f6";
5564 };
5565 }
5566
5567 {
5568 name = "minimatch___minimatch_0.3.0.tgz";
5569 path = fetchurl {
5570 name = "minimatch___minimatch_0.3.0.tgz";
5571 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz";
5572 sha1 = "275d8edaac4f1bb3326472089e7949c8394699dd";
5573 };
5574 }
5575
5576 {
5577 name = "minimatch___minimatch_3.0.4.tgz";
5578 path = fetchurl {
5579 name = "minimatch___minimatch_3.0.4.tgz";
5580 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
5581 sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
5582 };
5583 }
5584
5585 {
5586 name = "minimatch___minimatch_0.2.14.tgz";
5587 path = fetchurl {
5588 name = "minimatch___minimatch_0.2.14.tgz";
5589 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz";
5590 sha1 = "c74e780574f63c6f9a090e90efbe6ef53a6a756a";
5591 };
5592 }
5593
5594 {
5595 name = "minimatch___minimatch_1.0.0.tgz";
5596 path = fetchurl {
5597 name = "minimatch___minimatch_1.0.0.tgz";
5598 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz";
5599 sha1 = "e0dd2120b49e1b724ce8d714c520822a9438576d";
5600 };
5601 }
5602
5603 {
5604 name = "minimatch___minimatch_2.0.10.tgz";
5605 path = fetchurl {
5606 name = "minimatch___minimatch_2.0.10.tgz";
5607 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz";
5608 sha1 = "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7";
5609 };
5610 }
5611
5612 {
5613 name = "minimist___minimist_0.2.1.tgz";
5614 path = fetchurl {
5615 name = "minimist___minimist_0.2.1.tgz";
5616 url = "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz";
5617 sha1 = "827ba4e7593464e7c221e8c5bed930904ee2c455";
5618 };
5619 }
5620
5621 {
5622 name = "minimist___minimist_1.2.5.tgz";
5623 path = fetchurl {
5624 name = "minimist___minimist_1.2.5.tgz";
5625 url = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz";
5626 sha1 = "67d66014b66a6a8aaa0c083c5fd58df4e4e97602";
5627 };
5628 }
5629
5630 {
5631 name = "minimist___minimist_0.0.10.tgz";
5632 path = fetchurl {
5633 name = "minimist___minimist_0.0.10.tgz";
5634 url = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz";
5635 sha1 = "de3f98543dbf96082be48ad1a0c7cda836301dcf";
5636 };
5637 }
5638
5639 {
5640 name = "minipass___minipass_2.9.0.tgz";
5641 path = fetchurl {
5642 name = "minipass___minipass_2.9.0.tgz";
5643 url = "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz";
5644 sha1 = "e713762e7d3e32fed803115cf93e04bca9fcc9a6";
5645 };
5646 }
5647
5648 {
5649 name = "minizlib___minizlib_1.3.3.tgz";
5650 path = fetchurl {
5651 name = "minizlib___minizlib_1.3.3.tgz";
5652 url = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz";
5653 sha1 = "2290de96818a34c29551c8a8d301216bd65a861d";
5654 };
5655 }
5656
5657 {
5658 name = "mixin_deep___mixin_deep_1.3.2.tgz";
5659 path = fetchurl {
5660 name = "mixin_deep___mixin_deep_1.3.2.tgz";
5661 url = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz";
5662 sha1 = "1120b43dc359a785dce65b55b82e257ccf479566";
5663 };
5664 }
5665
5666 {
5667 name = "mkdirp___mkdirp_0.5.4.tgz";
5668 path = fetchurl {
5669 name = "mkdirp___mkdirp_0.5.4.tgz";
5670 url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz";
5671 sha1 = "fd01504a6797ec5c9be81ff43d204961ed64a512";
5672 };
5673 }
5674
5675 {
5676 name = "mkdirp___mkdirp_0.3.5.tgz";
5677 path = fetchurl {
5678 name = "mkdirp___mkdirp_0.3.5.tgz";
5679 url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz";
5680 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
5681 };
5682 }
5683
5684 {
5685 name = "mkpath___mkpath_0.1.0.tgz";
5686 path = fetchurl {
5687 name = "mkpath___mkpath_0.1.0.tgz";
5688 url = "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz";
5689 sha1 = "7554a6f8d871834cc97b5462b122c4c124d6de91";
5690 };
5691 }
5692
5693 {
5694 name = "module_deps___module_deps_2.0.6.tgz";
5695 path = fetchurl {
5696 name = "module_deps___module_deps_2.0.6.tgz";
5697 url = "https://registry.yarnpkg.com/module-deps/-/module-deps-2.0.6.tgz";
5698 sha1 = "b999321c73ac33580f00712c0f3075fdca42563f";
5699 };
5700 }
5701
5702 {
5703 name = "mout___mout_0.9.1.tgz";
5704 path = fetchurl {
5705 name = "mout___mout_0.9.1.tgz";
5706 url = "https://registry.yarnpkg.com/mout/-/mout-0.9.1.tgz";
5707 sha1 = "84f0f3fd6acc7317f63de2affdcc0cee009b0477";
5708 };
5709 }
5710
5711 {
5712 name = "ms___ms_0.7.1.tgz";
5713 path = fetchurl {
5714 name = "ms___ms_0.7.1.tgz";
5715 url = "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz";
5716 sha1 = "9cd13c03adbff25b65effde7ce864ee952017098";
5717 };
5718 }
5719
5720 {
5721 name = "ms___ms_0.7.2.tgz";
5722 path = fetchurl {
5723 name = "ms___ms_0.7.2.tgz";
5724 url = "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz";
5725 sha1 = "ae25cf2512b3885a1d95d7f037868d8431124765";
5726 };
5727 }
5728
5729 {
5730 name = "ms___ms_2.0.0.tgz";
5731 path = fetchurl {
5732 name = "ms___ms_2.0.0.tgz";
5733 url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
5734 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
5735 };
5736 }
5737
5738 {
5739 name = "ms___ms_2.1.2.tgz";
5740 path = fetchurl {
5741 name = "ms___ms_2.1.2.tgz";
5742 url = "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz";
5743 sha1 = "d09d1f357b443f493382a8eb3ccd183872ae6009";
5744 };
5745 }
5746
5747 {
5748 name = "multipipe___multipipe_0.1.2.tgz";
5749 path = fetchurl {
5750 name = "multipipe___multipipe_0.1.2.tgz";
5751 url = "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz";
5752 sha1 = "2a8f2ddf70eed564dff2d57f1e1a137d9f05078b";
5753 };
5754 }
5755
5756 {
5757 name = "mute_stream___mute_stream_0.0.4.tgz";
5758 path = fetchurl {
5759 name = "mute_stream___mute_stream_0.0.4.tgz";
5760 url = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz";
5761 sha1 = "a9219960a6d5d5d046597aee51252c6655f7177e";
5762 };
5763 }
5764
5765 {
5766 name = "mute_stream___mute_stream_0.0.8.tgz";
5767 path = fetchurl {
5768 name = "mute_stream___mute_stream_0.0.8.tgz";
5769 url = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz";
5770 sha1 = "1630c42b2251ff81e2a283de96a5497ea92e5e0d";
5771 };
5772 }
5773
5774 {
5775 name = "nan___nan_2.14.0.tgz";
5776 path = fetchurl {
5777 name = "nan___nan_2.14.0.tgz";
5778 url = "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz";
5779 sha1 = "7818f722027b2459a86f0295d434d1fc2336c52c";
5780 };
5781 }
5782
5783 {
5784 name = "nanomatch___nanomatch_1.2.13.tgz";
5785 path = fetchurl {
5786 name = "nanomatch___nanomatch_1.2.13.tgz";
5787 url = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
5788 sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
5789 };
5790 }
5791
5792 {
5793 name = "natives___natives_1.1.6.tgz";
5794 path = fetchurl {
5795 name = "natives___natives_1.1.6.tgz";
5796 url = "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz";
5797 sha1 = "a603b4a498ab77173612b9ea1acdec4d980f00bb";
5798 };
5799 }
5800
5801 {
5802 name = "needle___needle_2.3.3.tgz";
5803 path = fetchurl {
5804 name = "needle___needle_2.3.3.tgz";
5805 url = "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz";
5806 sha1 = "a041ad1d04a871b0ebb666f40baaf1fb47867117";
5807 };
5808 }
5809
5810 {
5811 name = "negotiator___negotiator_0.6.1.tgz";
5812 path = fetchurl {
5813 name = "negotiator___negotiator_0.6.1.tgz";
5814 url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
5815 sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
5816 };
5817 }
5818
5819 {
5820 name = "neo_async___neo_async_2.6.1.tgz";
5821 path = fetchurl {
5822 name = "neo_async___neo_async_2.6.1.tgz";
5823 url = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz";
5824 sha1 = "ac27ada66167fa8849a6addd837f6b189ad2081c";
5825 };
5826 }
5827
5828 {
5829 name = "nested_error_stacks___nested_error_stacks_1.0.2.tgz";
5830 path = fetchurl {
5831 name = "nested_error_stacks___nested_error_stacks_1.0.2.tgz";
5832 url = "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz";
5833 sha1 = "19f619591519f096769a5ba9a86e6eeec823c3cf";
5834 };
5835 }
5836
5837 {
5838 name = "next_tick___next_tick_0.1.0.tgz";
5839 path = fetchurl {
5840 name = "next_tick___next_tick_0.1.0.tgz";
5841 url = "https://registry.yarnpkg.com/next-tick/-/next-tick-0.1.0.tgz";
5842 sha1 = "1912cce8eb9b697d640fbba94f8f00dec3b94259";
5843 };
5844 }
5845
5846 {
5847 name = "next_tick___next_tick_1.1.0.tgz";
5848 path = fetchurl {
5849 name = "next_tick___next_tick_1.1.0.tgz";
5850 url = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz";
5851 sha1 = "1836ee30ad56d67ef281b22bd199f709449b35eb";
5852 };
5853 }
5854
5855 {
5856 name = "next_tick___next_tick_0.2.2.tgz";
5857 path = fetchurl {
5858 name = "next_tick___next_tick_0.2.2.tgz";
5859 url = "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz";
5860 sha1 = "75da4a927ee5887e39065880065b7336413b310d";
5861 };
5862 }
5863
5864 {
5865 name = "next_tick___next_tick_1.0.0.tgz";
5866 path = fetchurl {
5867 name = "next_tick___next_tick_1.0.0.tgz";
5868 url = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
5869 sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
5870 };
5871 }
5872
5873 {
5874 name = "ng_annotate___ng_annotate_1.2.2.tgz";
5875 path = fetchurl {
5876 name = "ng_annotate___ng_annotate_1.2.2.tgz";
5877 url = "https://registry.yarnpkg.com/ng-annotate/-/ng-annotate-1.2.2.tgz";
5878 sha1 = "dc3fc51ba0b2f8b385dbe047f4da06f580a1fd61";
5879 };
5880 }
5881
5882 {
5883 name = "ng_classify___ng_classify_4.1.1.tgz";
5884 path = fetchurl {
5885 name = "ng_classify___ng_classify_4.1.1.tgz";
5886 url = "https://registry.yarnpkg.com/ng-classify/-/ng-classify-4.1.1.tgz";
5887 sha1 = "6688b924c3c9b5f94da5f8fbc0d55176f3dda122";
5888 };
5889 }
5890
5891 {
5892 name = "node_gyp___node_gyp_3.8.0.tgz";
5893 path = fetchurl {
5894 name = "node_gyp___node_gyp_3.8.0.tgz";
5895 url = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz";
5896 sha1 = "540304261c330e80d0d5edce253a68cb3964218c";
5897 };
5898 }
5899
5900 {
5901 name = "node_pre_gyp___node_pre_gyp_0.14.0.tgz";
5902 path = fetchurl {
5903 name = "node_pre_gyp___node_pre_gyp_0.14.0.tgz";
5904 url = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz";
5905 sha1 = "9a0596533b877289bcad4e143982ca3d904ddc83";
5906 };
5907 }
5908
5909 {
5910 name = "node_sass___node_sass_4.13.1.tgz";
5911 path = fetchurl {
5912 name = "node_sass___node_sass_4.13.1.tgz";
5913 url = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz";
5914 sha1 = "9db5689696bb2eec2c32b98bfea4c7a2e992d0a3";
5915 };
5916 }
5917
5918 {
5919 name = "node_uuid___node_uuid_1.4.8.tgz";
5920 path = fetchurl {
5921 name = "node_uuid___node_uuid_1.4.8.tgz";
5922 url = "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz";
5923 sha1 = "b040eb0923968afabf8d32fb1f17f1167fdab907";
5924 };
5925 }
5926
5927 {
5928 name = "node.extend___node.extend_1.1.8.tgz";
5929 path = fetchurl {
5930 name = "node.extend___node.extend_1.1.8.tgz";
5931 url = "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz";
5932 sha1 = "0aab3e63789f4e6d68b42bc00073ad1881243cf0";
5933 };
5934 }
5935
5936 {
5937 name = "nopt___nopt_3.0.6.tgz";
5938 path = fetchurl {
5939 name = "nopt___nopt_3.0.6.tgz";
5940 url = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
5941 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
5942 };
5943 }
5944
5945 {
5946 name = "nopt___nopt_4.0.3.tgz";
5947 path = fetchurl {
5948 name = "nopt___nopt_4.0.3.tgz";
5949 url = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz";
5950 sha1 = "a375cad9d02fd921278d954c2254d5aa57e15e48";
5951 };
5952 }
5953
5954 {
5955 name = "nopt___nopt_1.0.10.tgz";
5956 path = fetchurl {
5957 name = "nopt___nopt_1.0.10.tgz";
5958 url = "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz";
5959 sha1 = "6ddd21bd2a31417b92727dd585f8a6f37608ebee";
5960 };
5961 }
5962
5963 {
5964 name = "nopt___nopt_2.2.1.tgz";
5965 path = fetchurl {
5966 name = "nopt___nopt_2.2.1.tgz";
5967 url = "https://registry.yarnpkg.com/nopt/-/nopt-2.2.1.tgz";
5968 sha1 = "2aa09b7d1768487b3b89a9c5aa52335bff0baea7";
5969 };
5970 }
5971
5972 {
5973 name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
5974 path = fetchurl {
5975 name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
5976 url = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz";
5977 sha1 = "e66db1838b200c1dfc233225d12cb36520e234a8";
5978 };
5979 }
5980
5981 {
5982 name = "normalize_path___normalize_path_2.1.1.tgz";
5983 path = fetchurl {
5984 name = "normalize_path___normalize_path_2.1.1.tgz";
5985 url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
5986 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
5987 };
5988 }
5989
5990 {
5991 name = "npm_bundled___npm_bundled_1.1.1.tgz";
5992 path = fetchurl {
5993 name = "npm_bundled___npm_bundled_1.1.1.tgz";
5994 url = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz";
5995 sha1 = "1edd570865a94cdb1bc8220775e29466c9fb234b";
5996 };
5997 }
5998
5999 {
6000 name = "npm_normalize_package_bin___npm_normalize_package_bin_1.0.1.tgz";
6001 path = fetchurl {
6002 name = "npm_normalize_package_bin___npm_normalize_package_bin_1.0.1.tgz";
6003 url = "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz";
6004 sha1 = "6e79a41f23fd235c0623218228da7d9c23b8f6e2";
6005 };
6006 }
6007
6008 {
6009 name = "npm_packlist___npm_packlist_1.4.8.tgz";
6010 path = fetchurl {
6011 name = "npm_packlist___npm_packlist_1.4.8.tgz";
6012 url = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz";
6013 sha1 = "56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e";
6014 };
6015 }
6016
6017 {
6018 name = "npmlog___npmlog_4.1.2.tgz";
6019 path = fetchurl {
6020 name = "npmlog___npmlog_4.1.2.tgz";
6021 url = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
6022 sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
6023 };
6024 }
6025
6026 {
6027 name = "null_check___null_check_1.0.0.tgz";
6028 path = fetchurl {
6029 name = "null_check___null_check_1.0.0.tgz";
6030 url = "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz";
6031 sha1 = "977dffd7176012b9ec30d2a39db5cf72a0439edd";
6032 };
6033 }
6034
6035 {
6036 name = "number_is_nan___number_is_nan_1.0.1.tgz";
6037 path = fetchurl {
6038 name = "number_is_nan___number_is_nan_1.0.1.tgz";
6039 url = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
6040 sha1 = "097b602b53422a522c1afb8790318336941a011d";
6041 };
6042 }
6043
6044 {
6045 name = "oauth_sign___oauth_sign_0.3.0.tgz";
6046 path = fetchurl {
6047 name = "oauth_sign___oauth_sign_0.3.0.tgz";
6048 url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz";
6049 sha1 = "cb540f93bb2b22a7d5941691a288d60e8ea9386e";
6050 };
6051 }
6052
6053 {
6054 name = "oauth_sign___oauth_sign_0.5.0.tgz";
6055 path = fetchurl {
6056 name = "oauth_sign___oauth_sign_0.5.0.tgz";
6057 url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.5.0.tgz";
6058 sha1 = "d767f5169325620eab2e087ef0c472e773db6461";
6059 };
6060 }
6061
6062 {
6063 name = "oauth_sign___oauth_sign_0.9.0.tgz";
6064 path = fetchurl {
6065 name = "oauth_sign___oauth_sign_0.9.0.tgz";
6066 url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz";
6067 sha1 = "47a7b016baa68b5fa0ecf3dee08a85c679ac6455";
6068 };
6069 }
6070
6071 {
6072 name = "object_assign___object_assign_4.1.1.tgz";
6073 path = fetchurl {
6074 name = "object_assign___object_assign_4.1.1.tgz";
6075 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
6076 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
6077 };
6078 }
6079
6080 {
6081 name = "object_assign___object_assign_4.1.0.tgz";
6082 path = fetchurl {
6083 name = "object_assign___object_assign_4.1.0.tgz";
6084 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz";
6085 sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
6086 };
6087 }
6088
6089 {
6090 name = "object_assign___object_assign_2.1.1.tgz";
6091 path = fetchurl {
6092 name = "object_assign___object_assign_2.1.1.tgz";
6093 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz";
6094 sha1 = "43c36e5d569ff8e4816c4efa8be02d26967c18aa";
6095 };
6096 }
6097
6098 {
6099 name = "object_assign___object_assign_3.0.0.tgz";
6100 path = fetchurl {
6101 name = "object_assign___object_assign_3.0.0.tgz";
6102 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz";
6103 sha1 = "9bedd5ca0897949bca47e7ff408062d549f587f2";
6104 };
6105 }
6106
6107 {
6108 name = "object_assign___object_assign_0.1.2.tgz";
6109 path = fetchurl {
6110 name = "object_assign___object_assign_0.1.2.tgz";
6111 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-0.1.2.tgz";
6112 sha1 = "036992f073aff7b2db83d06b3fb3155a5ccac37f";
6113 };
6114 }
6115
6116 {
6117 name = "object_component___object_component_0.0.3.tgz";
6118 path = fetchurl {
6119 name = "object_component___object_component_0.0.3.tgz";
6120 url = "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz";
6121 sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
6122 };
6123 }
6124
6125 {
6126 name = "object_copy___object_copy_0.1.0.tgz";
6127 path = fetchurl {
6128 name = "object_copy___object_copy_0.1.0.tgz";
6129 url = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
6130 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
6131 };
6132 }
6133
6134 {
6135 name = "object_keys___object_keys_0.4.0.tgz";
6136 path = fetchurl {
6137 name = "object_keys___object_keys_0.4.0.tgz";
6138 url = "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz";
6139 sha1 = "28a6aae7428dd2c3a92f3d95f21335dd204e0336";
6140 };
6141 }
6142
6143 {
6144 name = "object_visit___object_visit_1.0.1.tgz";
6145 path = fetchurl {
6146 name = "object_visit___object_visit_1.0.1.tgz";
6147 url = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
6148 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
6149 };
6150 }
6151
6152 {
6153 name = "object.defaults___object.defaults_1.1.0.tgz";
6154 path = fetchurl {
6155 name = "object.defaults___object.defaults_1.1.0.tgz";
6156 url = "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz";
6157 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
6158 };
6159 }
6160
6161 {
6162 name = "object.map___object.map_1.0.1.tgz";
6163 path = fetchurl {
6164 name = "object.map___object.map_1.0.1.tgz";
6165 url = "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz";
6166 sha1 = "cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37";
6167 };
6168 }
6169
6170 {
6171 name = "object.omit___object.omit_2.0.1.tgz";
6172 path = fetchurl {
6173 name = "object.omit___object.omit_2.0.1.tgz";
6174 url = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
6175 sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
6176 };
6177 }
6178
6179 {
6180 name = "object.pick___object.pick_1.3.0.tgz";
6181 path = fetchurl {
6182 name = "object.pick___object.pick_1.3.0.tgz";
6183 url = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
6184 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
6185 };
6186 }
6187
6188 {
6189 name = "on_finished___on_finished_2.3.0.tgz";
6190 path = fetchurl {
6191 name = "on_finished___on_finished_2.3.0.tgz";
6192 url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
6193 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
6194 };
6195 }
6196
6197 {
6198 name = "once___once_1.4.0.tgz";
6199 path = fetchurl {
6200 name = "once___once_1.4.0.tgz";
6201 url = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
6202 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
6203 };
6204 }
6205
6206 {
6207 name = "once___once_1.3.3.tgz";
6208 path = fetchurl {
6209 name = "once___once_1.3.3.tgz";
6210 url = "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz";
6211 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
6212 };
6213 }
6214
6215 {
6216 name = "opn___opn_0.1.2.tgz";
6217 path = fetchurl {
6218 name = "opn___opn_0.1.2.tgz";
6219 url = "https://registry.yarnpkg.com/opn/-/opn-0.1.2.tgz";
6220 sha1 = "c527832cfd964d52096b524d0035ecaece51db4f";
6221 };
6222 }
6223
6224 {
6225 name = "optimist___optimist_0.6.1.tgz";
6226 path = fetchurl {
6227 name = "optimist___optimist_0.6.1.tgz";
6228 url = "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz";
6229 sha1 = "da3ea74686fa21a19a111c326e90eb15a0196686";
6230 };
6231 }
6232
6233 {
6234 name = "optimist___optimist_0.3.7.tgz";
6235 path = fetchurl {
6236 name = "optimist___optimist_0.3.7.tgz";
6237 url = "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz";
6238 sha1 = "c90941ad59e4273328923074d2cf2e7cbc6ec0d9";
6239 };
6240 }
6241
6242 {
6243 name = "optionator___optionator_0.8.3.tgz";
6244 path = fetchurl {
6245 name = "optionator___optionator_0.8.3.tgz";
6246 url = "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz";
6247 sha1 = "84fa1d036fe9d3c7e21d99884b601167ec8fb495";
6248 };
6249 }
6250
6251 {
6252 name = "options___options_0.0.6.tgz";
6253 path = fetchurl {
6254 name = "options___options_0.0.6.tgz";
6255 url = "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz";
6256 sha1 = "ec22d312806bb53e731773e7cdaefcf1c643128f";
6257 };
6258 }
6259
6260 {
6261 name = "orchestrator___orchestrator_0.3.8.tgz";
6262 path = fetchurl {
6263 name = "orchestrator___orchestrator_0.3.8.tgz";
6264 url = "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz";
6265 sha1 = "14e7e9e2764f7315fbac184e506c7aa6df94ad7e";
6266 };
6267 }
6268
6269 {
6270 name = "ordered_ast_traverse___ordered_ast_traverse_1.1.1.tgz";
6271 path = fetchurl {
6272 name = "ordered_ast_traverse___ordered_ast_traverse_1.1.1.tgz";
6273 url = "https://registry.yarnpkg.com/ordered-ast-traverse/-/ordered-ast-traverse-1.1.1.tgz";
6274 sha1 = "6843a170bc0eee8b520cc8ddc1ddd3aa30fa057c";
6275 };
6276 }
6277
6278 {
6279 name = "ordered_esprima_props___ordered_esprima_props_1.1.0.tgz";
6280 path = fetchurl {
6281 name = "ordered_esprima_props___ordered_esprima_props_1.1.0.tgz";
6282 url = "https://registry.yarnpkg.com/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz";
6283 sha1 = "a9827086df5f010aa60e9bd02b6e0335cea2ffcb";
6284 };
6285 }
6286
6287 {
6288 name = "ordered_read_streams___ordered_read_streams_0.1.0.tgz";
6289 path = fetchurl {
6290 name = "ordered_read_streams___ordered_read_streams_0.1.0.tgz";
6291 url = "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz";
6292 sha1 = "fd565a9af8eb4473ba69b6ed8a34352cb552f126";
6293 };
6294 }
6295
6296 {
6297 name = "os_browserify___os_browserify_0.1.2.tgz";
6298 path = fetchurl {
6299 name = "os_browserify___os_browserify_0.1.2.tgz";
6300 url = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz";
6301 sha1 = "49ca0293e0b19590a5f5de10c7f265a617d8fe54";
6302 };
6303 }
6304
6305 {
6306 name = "os_homedir___os_homedir_1.0.2.tgz";
6307 path = fetchurl {
6308 name = "os_homedir___os_homedir_1.0.2.tgz";
6309 url = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
6310 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
6311 };
6312 }
6313
6314 {
6315 name = "os_locale___os_locale_1.4.0.tgz";
6316 path = fetchurl {
6317 name = "os_locale___os_locale_1.4.0.tgz";
6318 url = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz";
6319 sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9";
6320 };
6321 }
6322
6323 {
6324 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
6325 path = fetchurl {
6326 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
6327 url = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
6328 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
6329 };
6330 }
6331
6332 {
6333 name = "osenv___osenv_0.1.5.tgz";
6334 path = fetchurl {
6335 name = "osenv___osenv_0.1.5.tgz";
6336 url = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
6337 sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
6338 };
6339 }
6340
6341 {
6342 name = "osenv___osenv_0.0.3.tgz";
6343 path = fetchurl {
6344 name = "osenv___osenv_0.0.3.tgz";
6345 url = "https://registry.yarnpkg.com/osenv/-/osenv-0.0.3.tgz";
6346 sha1 = "cd6ad8ddb290915ad9e22765576025d411f29cb6";
6347 };
6348 }
6349
6350 {
6351 name = "p_throttler___p_throttler_0.0.1.tgz";
6352 path = fetchurl {
6353 name = "p_throttler___p_throttler_0.0.1.tgz";
6354 url = "https://registry.yarnpkg.com/p-throttler/-/p-throttler-0.0.1.tgz";
6355 sha1 = "c341e3589ec843852a035e6f88e6c1e96150029b";
6356 };
6357 }
6358
6359 {
6360 name = "package_json___package_json_1.2.0.tgz";
6361 path = fetchurl {
6362 name = "package_json___package_json_1.2.0.tgz";
6363 url = "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz";
6364 sha1 = "c8ecac094227cdf76a316874ed05e27cc939a0e0";
6365 };
6366 }
6367
6368 {
6369 name = "pako___pako_0.2.9.tgz";
6370 path = fetchurl {
6371 name = "pako___pako_0.2.9.tgz";
6372 url = "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz";
6373 sha1 = "f3f7522f4ef782348da8161bad9ecfd51bf83a75";
6374 };
6375 }
6376
6377 {
6378 name = "parents___parents_0.0.2.tgz";
6379 path = fetchurl {
6380 name = "parents___parents_0.0.2.tgz";
6381 url = "https://registry.yarnpkg.com/parents/-/parents-0.0.2.tgz";
6382 sha1 = "67147826e497d40759aaf5ba4c99659b6034d302";
6383 };
6384 }
6385
6386 {
6387 name = "parents___parents_0.0.3.tgz";
6388 path = fetchurl {
6389 name = "parents___parents_0.0.3.tgz";
6390 url = "https://registry.yarnpkg.com/parents/-/parents-0.0.3.tgz";
6391 sha1 = "fa212f024d9fa6318dbb6b4ce676c8be493b9c43";
6392 };
6393 }
6394
6395 {
6396 name = "parse_filepath___parse_filepath_1.0.2.tgz";
6397 path = fetchurl {
6398 name = "parse_filepath___parse_filepath_1.0.2.tgz";
6399 url = "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz";
6400 sha1 = "a632127f53aaf3d15876f5872f3ffac763d6c891";
6401 };
6402 }
6403
6404 {
6405 name = "parse_glob___parse_glob_3.0.4.tgz";
6406 path = fetchurl {
6407 name = "parse_glob___parse_glob_3.0.4.tgz";
6408 url = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
6409 sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
6410 };
6411 }
6412
6413 {
6414 name = "parse_json___parse_json_2.2.0.tgz";
6415 path = fetchurl {
6416 name = "parse_json___parse_json_2.2.0.tgz";
6417 url = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
6418 sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
6419 };
6420 }
6421
6422 {
6423 name = "parse_node_version___parse_node_version_1.0.1.tgz";
6424 path = fetchurl {
6425 name = "parse_node_version___parse_node_version_1.0.1.tgz";
6426 url = "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz";
6427 sha1 = "e2b5dbede00e7fa9bc363607f53327e8b073189b";
6428 };
6429 }
6430
6431 {
6432 name = "parse_passwd___parse_passwd_1.0.0.tgz";
6433 path = fetchurl {
6434 name = "parse_passwd___parse_passwd_1.0.0.tgz";
6435 url = "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz";
6436 sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6";
6437 };
6438 }
6439
6440 {
6441 name = "parsejson___parsejson_0.0.3.tgz";
6442 path = fetchurl {
6443 name = "parsejson___parsejson_0.0.3.tgz";
6444 url = "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz";
6445 sha1 = "ab7e3759f209ece99437973f7d0f1f64ae0e64ab";
6446 };
6447 }
6448
6449 {
6450 name = "parseqs___parseqs_0.0.5.tgz";
6451 path = fetchurl {
6452 name = "parseqs___parseqs_0.0.5.tgz";
6453 url = "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz";
6454 sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
6455 };
6456 }
6457
6458 {
6459 name = "parseuri___parseuri_0.0.5.tgz";
6460 path = fetchurl {
6461 name = "parseuri___parseuri_0.0.5.tgz";
6462 url = "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz";
6463 sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
6464 };
6465 }
6466
6467 {
6468 name = "parseurl___parseurl_1.3.3.tgz";
6469 path = fetchurl {
6470 name = "parseurl___parseurl_1.3.3.tgz";
6471 url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz";
6472 sha1 = "9da19e7bee8d12dff0513ed5b76957793bc2e8d4";
6473 };
6474 }
6475
6476 {
6477 name = "pascalcase___pascalcase_0.1.1.tgz";
6478 path = fetchurl {
6479 name = "pascalcase___pascalcase_0.1.1.tgz";
6480 url = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
6481 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
6482 };
6483 }
6484
6485 {
6486 name = "path_browserify___path_browserify_0.0.1.tgz";
6487 path = fetchurl {
6488 name = "path_browserify___path_browserify_0.0.1.tgz";
6489 url = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz";
6490 sha1 = "e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a";
6491 };
6492 }
6493
6494 {
6495 name = "path_exists___path_exists_2.1.0.tgz";
6496 path = fetchurl {
6497 name = "path_exists___path_exists_2.1.0.tgz";
6498 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
6499 sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
6500 };
6501 }
6502
6503 {
6504 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
6505 path = fetchurl {
6506 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
6507 url = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
6508 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
6509 };
6510 }
6511
6512 {
6513 name = "path_parse___path_parse_1.0.6.tgz";
6514 path = fetchurl {
6515 name = "path_parse___path_parse_1.0.6.tgz";
6516 url = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
6517 sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
6518 };
6519 }
6520
6521 {
6522 name = "path_platform___path_platform_0.0.1.tgz";
6523 path = fetchurl {
6524 name = "path_platform___path_platform_0.0.1.tgz";
6525 url = "https://registry.yarnpkg.com/path-platform/-/path-platform-0.0.1.tgz";
6526 sha1 = "b5585d7c3c463d89aa0060d86611cf1afd617e2a";
6527 };
6528 }
6529
6530 {
6531 name = "path_root_regex___path_root_regex_0.1.2.tgz";
6532 path = fetchurl {
6533 name = "path_root_regex___path_root_regex_0.1.2.tgz";
6534 url = "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz";
6535 sha1 = "bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d";
6536 };
6537 }
6538
6539 {
6540 name = "path_root___path_root_0.1.1.tgz";
6541 path = fetchurl {
6542 name = "path_root___path_root_0.1.1.tgz";
6543 url = "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz";
6544 sha1 = "9a4a6814cac1c0cd73360a95f32083c8ea4745b7";
6545 };
6546 }
6547
6548 {
6549 name = "path_type___path_type_1.1.0.tgz";
6550 path = fetchurl {
6551 name = "path_type___path_type_1.1.0.tgz";
6552 url = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
6553 sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
6554 };
6555 }
6556
6557 {
6558 name = "pause_stream___pause_stream_0.0.11.tgz";
6559 path = fetchurl {
6560 name = "pause_stream___pause_stream_0.0.11.tgz";
6561 url = "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz";
6562 sha1 = "fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445";
6563 };
6564 }
6565
6566 {
6567 name = "performance_now___performance_now_2.1.0.tgz";
6568 path = fetchurl {
6569 name = "performance_now___performance_now_2.1.0.tgz";
6570 url = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
6571 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
6572 };
6573 }
6574
6575 {
6576 name = "pify___pify_2.3.0.tgz";
6577 path = fetchurl {
6578 name = "pify___pify_2.3.0.tgz";
6579 url = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
6580 sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
6581 };
6582 }
6583
6584 {
6585 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
6586 path = fetchurl {
6587 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
6588 url = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
6589 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
6590 };
6591 }
6592
6593 {
6594 name = "pinkie___pinkie_2.0.4.tgz";
6595 path = fetchurl {
6596 name = "pinkie___pinkie_2.0.4.tgz";
6597 url = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
6598 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
6599 };
6600 }
6601
6602 {
6603 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
6604 path = fetchurl {
6605 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
6606 url = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
6607 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
6608 };
6609 }
6610
6611 {
6612 name = "prelude_ls___prelude_ls_1.1.2.tgz";
6613 path = fetchurl {
6614 name = "prelude_ls___prelude_ls_1.1.2.tgz";
6615 url = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz";
6616 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
6617 };
6618 }
6619
6620 {
6621 name = "prepend_http___prepend_http_1.0.4.tgz";
6622 path = fetchurl {
6623 name = "prepend_http___prepend_http_1.0.4.tgz";
6624 url = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
6625 sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
6626 };
6627 }
6628
6629 {
6630 name = "preserve___preserve_0.2.0.tgz";
6631 path = fetchurl {
6632 name = "preserve___preserve_0.2.0.tgz";
6633 url = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
6634 sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
6635 };
6636 }
6637
6638 {
6639 name = "pretty_hrtime___pretty_hrtime_1.0.3.tgz";
6640 path = fetchurl {
6641 name = "pretty_hrtime___pretty_hrtime_1.0.3.tgz";
6642 url = "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz";
6643 sha1 = "b7e3ea42435a4c9b2759d99e0f201eb195802ee1";
6644 };
6645 }
6646
6647 {
6648 name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
6649 path = fetchurl {
6650 name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
6651 url = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
6652 sha1 = "7820d9b16120cc55ca9ae7792680ae7dba6d7fe2";
6653 };
6654 }
6655
6656 {
6657 name = "process___process_0.7.0.tgz";
6658 path = fetchurl {
6659 name = "process___process_0.7.0.tgz";
6660 url = "https://registry.yarnpkg.com/process/-/process-0.7.0.tgz";
6661 sha1 = "c52208161a34adf3812344ae85d3e6150469389d";
6662 };
6663 }
6664
6665 {
6666 name = "process___process_0.5.2.tgz";
6667 path = fetchurl {
6668 name = "process___process_0.5.2.tgz";
6669 url = "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz";
6670 sha1 = "1638d8a8e34c2f440a91db95ab9aeb677fc185cf";
6671 };
6672 }
6673
6674 {
6675 name = "process___process_0.6.0.tgz";
6676 path = fetchurl {
6677 name = "process___process_0.6.0.tgz";
6678 url = "https://registry.yarnpkg.com/process/-/process-0.6.0.tgz";
6679 sha1 = "7dd9be80ffaaedd4cb628f1827f1cbab6dc0918f";
6680 };
6681 }
6682
6683 {
6684 name = "promise___promise_7.3.1.tgz";
6685 path = fetchurl {
6686 name = "promise___promise_7.3.1.tgz";
6687 url = "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz";
6688 sha1 = "064b72602b18f90f29192b8b1bc418ffd1ebd3bf";
6689 };
6690 }
6691
6692 {
6693 name = "promptly___promptly_0.2.1.tgz";
6694 path = fetchurl {
6695 name = "promptly___promptly_0.2.1.tgz";
6696 url = "https://registry.yarnpkg.com/promptly/-/promptly-0.2.1.tgz";
6697 sha1 = "6444e7ca4dbd9899e7eeb5ec3922827ebdc22b3b";
6698 };
6699 }
6700
6701 {
6702 name = "pseudomap___pseudomap_1.0.2.tgz";
6703 path = fetchurl {
6704 name = "pseudomap___pseudomap_1.0.2.tgz";
6705 url = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
6706 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
6707 };
6708 }
6709
6710 {
6711 name = "psl___psl_1.8.0.tgz";
6712 path = fetchurl {
6713 name = "psl___psl_1.8.0.tgz";
6714 url = "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz";
6715 sha1 = "9326f8bcfb013adcc005fdff056acce020e51c24";
6716 };
6717 }
6718
6719 {
6720 name = "pug_attrs___pug_attrs_2.0.4.tgz";
6721 path = fetchurl {
6722 name = "pug_attrs___pug_attrs_2.0.4.tgz";
6723 url = "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz";
6724 sha1 = "b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336";
6725 };
6726 }
6727
6728 {
6729 name = "pug_code_gen___pug_code_gen_2.0.2.tgz";
6730 path = fetchurl {
6731 name = "pug_code_gen___pug_code_gen_2.0.2.tgz";
6732 url = "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz";
6733 sha1 = "ad0967162aea077dcf787838d94ed14acb0217c2";
6734 };
6735 }
6736
6737 {
6738 name = "pug_error___pug_error_1.3.3.tgz";
6739 path = fetchurl {
6740 name = "pug_error___pug_error_1.3.3.tgz";
6741 url = "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz";
6742 sha1 = "f342fb008752d58034c185de03602dd9ffe15fa6";
6743 };
6744 }
6745
6746 {
6747 name = "pug_filters___pug_filters_3.1.1.tgz";
6748 path = fetchurl {
6749 name = "pug_filters___pug_filters_3.1.1.tgz";
6750 url = "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz";
6751 sha1 = "ab2cc82db9eeccf578bda89130e252a0db026aa7";
6752 };
6753 }
6754
6755 {
6756 name = "pug_lexer___pug_lexer_4.1.0.tgz";
6757 path = fetchurl {
6758 name = "pug_lexer___pug_lexer_4.1.0.tgz";
6759 url = "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz";
6760 sha1 = "531cde48c7c0b1fcbbc2b85485c8665e31489cfd";
6761 };
6762 }
6763
6764 {
6765 name = "pug_linker___pug_linker_3.0.6.tgz";
6766 path = fetchurl {
6767 name = "pug_linker___pug_linker_3.0.6.tgz";
6768 url = "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz";
6769 sha1 = "f5bf218b0efd65ce6670f7afc51658d0f82989fb";
6770 };
6771 }
6772
6773 {
6774 name = "pug_load___pug_load_2.0.12.tgz";
6775 path = fetchurl {
6776 name = "pug_load___pug_load_2.0.12.tgz";
6777 url = "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz";
6778 sha1 = "d38c85eb85f6e2f704dea14dcca94144d35d3e7b";
6779 };
6780 }
6781
6782 {
6783 name = "pug_parser___pug_parser_5.0.1.tgz";
6784 path = fetchurl {
6785 name = "pug_parser___pug_parser_5.0.1.tgz";
6786 url = "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz";
6787 sha1 = "03e7ada48b6840bd3822f867d7d90f842d0ffdc9";
6788 };
6789 }
6790
6791 {
6792 name = "pug_runtime___pug_runtime_2.0.5.tgz";
6793 path = fetchurl {
6794 name = "pug_runtime___pug_runtime_2.0.5.tgz";
6795 url = "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz";
6796 sha1 = "6da7976c36bf22f68e733c359240d8ae7a32953a";
6797 };
6798 }
6799
6800 {
6801 name = "pug_strip_comments___pug_strip_comments_1.0.4.tgz";
6802 path = fetchurl {
6803 name = "pug_strip_comments___pug_strip_comments_1.0.4.tgz";
6804 url = "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz";
6805 sha1 = "cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8";
6806 };
6807 }
6808
6809 {
6810 name = "pug_walk___pug_walk_1.1.8.tgz";
6811 path = fetchurl {
6812 name = "pug_walk___pug_walk_1.1.8.tgz";
6813 url = "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz";
6814 sha1 = "b408f67f27912f8c21da2f45b7230c4bd2a5ea7a";
6815 };
6816 }
6817
6818 {
6819 name = "pug___pug_2.0.4.tgz";
6820 path = fetchurl {
6821 name = "pug___pug_2.0.4.tgz";
6822 url = "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz";
6823 sha1 = "ee7682ec0a60494b38d48a88f05f3b0ac931377d";
6824 };
6825 }
6826
6827 {
6828 name = "punycode___punycode_1.3.2.tgz";
6829 path = fetchurl {
6830 name = "punycode___punycode_1.3.2.tgz";
6831 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
6832 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
6833 };
6834 }
6835
6836 {
6837 name = "punycode___punycode_2.1.1.tgz";
6838 path = fetchurl {
6839 name = "punycode___punycode_2.1.1.tgz";
6840 url = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
6841 sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
6842 };
6843 }
6844
6845 {
6846 name = "punycode___punycode_1.2.4.tgz";
6847 path = fetchurl {
6848 name = "punycode___punycode_1.2.4.tgz";
6849 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.2.4.tgz";
6850 sha1 = "54008ac972aec74175def9cba6df7fa9d3918740";
6851 };
6852 }
6853
6854 {
6855 name = "q___q_1.5.1.tgz";
6856 path = fetchurl {
6857 name = "q___q_1.5.1.tgz";
6858 url = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
6859 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
6860 };
6861 }
6862
6863 {
6864 name = "q___q_0.9.7.tgz";
6865 path = fetchurl {
6866 name = "q___q_0.9.7.tgz";
6867 url = "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz";
6868 sha1 = "4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75";
6869 };
6870 }
6871
6872 {
6873 name = "q___q_1.0.1.tgz";
6874 path = fetchurl {
6875 name = "q___q_1.0.1.tgz";
6876 url = "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz";
6877 sha1 = "11872aeedee89268110b10a718448ffb10112a14";
6878 };
6879 }
6880
6881 {
6882 name = "qs___qs_5.2.0.tgz";
6883 path = fetchurl {
6884 name = "qs___qs_5.2.0.tgz";
6885 url = "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz";
6886 sha1 = "a9f31142af468cb72b25b30136ba2456834916be";
6887 };
6888 }
6889
6890 {
6891 name = "qs___qs_6.7.0.tgz";
6892 path = fetchurl {
6893 name = "qs___qs_6.7.0.tgz";
6894 url = "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz";
6895 sha1 = "41dc1a015e3d581f1621776be31afb2876a9b1bc";
6896 };
6897 }
6898
6899 {
6900 name = "qs___qs_0.6.6.tgz";
6901 path = fetchurl {
6902 name = "qs___qs_0.6.6.tgz";
6903 url = "https://registry.yarnpkg.com/qs/-/qs-0.6.6.tgz";
6904 sha1 = "6e015098ff51968b8a3c819001d5f2c89bc4b107";
6905 };
6906 }
6907
6908 {
6909 name = "qs___qs_1.0.2.tgz";
6910 path = fetchurl {
6911 name = "qs___qs_1.0.2.tgz";
6912 url = "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz";
6913 sha1 = "50a93e2b5af6691c31bcea5dae78ee6ea1903768";
6914 };
6915 }
6916
6917 {
6918 name = "qs___qs_2.2.5.tgz";
6919 path = fetchurl {
6920 name = "qs___qs_2.2.5.tgz";
6921 url = "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz";
6922 sha1 = "1088abaf9dcc0ae5ae45b709e6c6b5888b23923c";
6923 };
6924 }
6925
6926 {
6927 name = "qs___qs_2.3.3.tgz";
6928 path = fetchurl {
6929 name = "qs___qs_2.3.3.tgz";
6930 url = "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz";
6931 sha1 = "e9e85adbe75da0bbe4c8e0476a086290f863b404";
6932 };
6933 }
6934
6935 {
6936 name = "qs___qs_6.5.2.tgz";
6937 path = fetchurl {
6938 name = "qs___qs_6.5.2.tgz";
6939 url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
6940 sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
6941 };
6942 }
6943
6944 {
6945 name = "querystring_es3___querystring_es3_0.2.0.tgz";
6946 path = fetchurl {
6947 name = "querystring_es3___querystring_es3_0.2.0.tgz";
6948 url = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.0.tgz";
6949 sha1 = "c365a08a69c443accfeb3a9deab35e3f0abaa476";
6950 };
6951 }
6952
6953 {
6954 name = "querystring___querystring_0.2.0.tgz";
6955 path = fetchurl {
6956 name = "querystring___querystring_0.2.0.tgz";
6957 url = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
6958 sha1 = "b209849203bb25df820da756e747005878521620";
6959 };
6960 }
6961
6962 {
6963 name = "randomatic___randomatic_3.1.1.tgz";
6964 path = fetchurl {
6965 name = "randomatic___randomatic_3.1.1.tgz";
6966 url = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz";
6967 sha1 = "b776efc59375984e36c537b2f51a1f0aff0da1ed";
6968 };
6969 }
6970
6971 {
6972 name = "range_parser___range_parser_1.0.3.tgz";
6973 path = fetchurl {
6974 name = "range_parser___range_parser_1.0.3.tgz";
6975 url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz";
6976 sha1 = "6872823535c692e2c2a0103826afd82c2e0ff175";
6977 };
6978 }
6979
6980 {
6981 name = "raw_body___raw_body_2.4.0.tgz";
6982 path = fetchurl {
6983 name = "raw_body___raw_body_2.4.0.tgz";
6984 url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz";
6985 sha1 = "a1ce6fb9c9bc356ca52e89256ab59059e13d0332";
6986 };
6987 }
6988
6989 {
6990 name = "raw_body___raw_body_2.1.7.tgz";
6991 path = fetchurl {
6992 name = "raw_body___raw_body_2.1.7.tgz";
6993 url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz";
6994 sha1 = "adfeace2e4fb3098058014d08c072dcc59758774";
6995 };
6996 }
6997
6998 {
6999 name = "rc___rc_1.2.8.tgz";
7000 path = fetchurl {
7001 name = "rc___rc_1.2.8.tgz";
7002 url = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
7003 sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
7004 };
7005 }
7006
7007 {
7008 name = "read_all_stream___read_all_stream_3.1.0.tgz";
7009 path = fetchurl {
7010 name = "read_all_stream___read_all_stream_3.1.0.tgz";
7011 url = "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz";
7012 sha1 = "35c3e177f2078ef789ee4bfafa4373074eaef4fa";
7013 };
7014 }
7015
7016 {
7017 name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
7018 path = fetchurl {
7019 name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
7020 url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
7021 sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
7022 };
7023 }
7024
7025 {
7026 name = "read_pkg___read_pkg_1.1.0.tgz";
7027 path = fetchurl {
7028 name = "read_pkg___read_pkg_1.1.0.tgz";
7029 url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
7030 sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
7031 };
7032 }
7033
7034 {
7035 name = "read___read_1.0.7.tgz";
7036 path = fetchurl {
7037 name = "read___read_1.0.7.tgz";
7038 url = "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz";
7039 sha1 = "b3da19bd052431a97671d44a42634adf710b40c4";
7040 };
7041 }
7042
7043 {
7044 name = "readable_stream___readable_stream_1.0.34.tgz";
7045 path = fetchurl {
7046 name = "readable_stream___readable_stream_1.0.34.tgz";
7047 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
7048 sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
7049 };
7050 }
7051
7052 {
7053 name = "readable_stream___readable_stream_1.1.14.tgz";
7054 path = fetchurl {
7055 name = "readable_stream___readable_stream_1.1.14.tgz";
7056 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz";
7057 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
7058 };
7059 }
7060
7061 {
7062 name = "readable_stream___readable_stream_2.3.7.tgz";
7063 path = fetchurl {
7064 name = "readable_stream___readable_stream_2.3.7.tgz";
7065 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz";
7066 sha1 = "1eca1cf711aef814c04f62252a36a62f6cb23b57";
7067 };
7068 }
7069
7070 {
7071 name = "readdirp___readdirp_2.2.1.tgz";
7072 path = fetchurl {
7073 name = "readdirp___readdirp_2.2.1.tgz";
7074 url = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
7075 sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
7076 };
7077 }
7078
7079 {
7080 name = "readline2___readline2_0.1.1.tgz";
7081 path = fetchurl {
7082 name = "readline2___readline2_0.1.1.tgz";
7083 url = "https://registry.yarnpkg.com/readline2/-/readline2-0.1.1.tgz";
7084 sha1 = "99443ba6e83b830ef3051bfd7dc241a82728d568";
7085 };
7086 }
7087
7088 {
7089 name = "rechoir___rechoir_0.6.2.tgz";
7090 path = fetchurl {
7091 name = "rechoir___rechoir_0.6.2.tgz";
7092 url = "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz";
7093 sha1 = "85204b54dba82d5742e28c96756ef43af50e3384";
7094 };
7095 }
7096
7097 {
7098 name = "redent___redent_1.0.0.tgz";
7099 path = fetchurl {
7100 name = "redent___redent_1.0.0.tgz";
7101 url = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz";
7102 sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde";
7103 };
7104 }
7105
7106 {
7107 name = "redeyed___redeyed_0.4.4.tgz";
7108 path = fetchurl {
7109 name = "redeyed___redeyed_0.4.4.tgz";
7110 url = "https://registry.yarnpkg.com/redeyed/-/redeyed-0.4.4.tgz";
7111 sha1 = "37e990a6f2b21b2a11c2e6a48fd4135698cba97f";
7112 };
7113 }
7114
7115 {
7116 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
7117 path = fetchurl {
7118 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
7119 url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
7120 sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
7121 };
7122 }
7123
7124 {
7125 name = "regex_cache___regex_cache_0.4.4.tgz";
7126 path = fetchurl {
7127 name = "regex_cache___regex_cache_0.4.4.tgz";
7128 url = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
7129 sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
7130 };
7131 }
7132
7133 {
7134 name = "regex_not___regex_not_1.0.2.tgz";
7135 path = fetchurl {
7136 name = "regex_not___regex_not_1.0.2.tgz";
7137 url = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
7138 sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
7139 };
7140 }
7141
7142 {
7143 name = "registry_url___registry_url_3.1.0.tgz";
7144 path = fetchurl {
7145 name = "registry_url___registry_url_3.1.0.tgz";
7146 url = "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz";
7147 sha1 = "3d4ef870f73dde1d77f0cf9a381432444e174942";
7148 };
7149 }
7150
7151 {
7152 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
7153 path = fetchurl {
7154 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
7155 url = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
7156 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
7157 };
7158 }
7159
7160 {
7161 name = "repeat_element___repeat_element_1.1.3.tgz";
7162 path = fetchurl {
7163 name = "repeat_element___repeat_element_1.1.3.tgz";
7164 url = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
7165 sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
7166 };
7167 }
7168
7169 {
7170 name = "repeat_string___repeat_string_0.2.2.tgz";
7171 path = fetchurl {
7172 name = "repeat_string___repeat_string_0.2.2.tgz";
7173 url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz";
7174 sha1 = "c7a8d3236068362059a7e4651fc6884e8b1fb4ae";
7175 };
7176 }
7177
7178 {
7179 name = "repeat_string___repeat_string_1.6.1.tgz";
7180 path = fetchurl {
7181 name = "repeat_string___repeat_string_1.6.1.tgz";
7182 url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
7183 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
7184 };
7185 }
7186
7187 {
7188 name = "repeating___repeating_2.0.1.tgz";
7189 path = fetchurl {
7190 name = "repeating___repeating_2.0.1.tgz";
7191 url = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
7192 sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
7193 };
7194 }
7195
7196 {
7197 name = "replace_ext___replace_ext_0.0.1.tgz";
7198 path = fetchurl {
7199 name = "replace_ext___replace_ext_0.0.1.tgz";
7200 url = "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz";
7201 sha1 = "29bbd92078a739f0bcce2b4ee41e837953522924";
7202 };
7203 }
7204
7205 {
7206 name = "replace_ext___replace_ext_1.0.0.tgz";
7207 path = fetchurl {
7208 name = "replace_ext___replace_ext_1.0.0.tgz";
7209 url = "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz";
7210 sha1 = "de63128373fcbf7c3ccfa4de5a480c45a67958eb";
7211 };
7212 }
7213
7214 {
7215 name = "replacestream___replacestream_4.0.3.tgz";
7216 path = fetchurl {
7217 name = "replacestream___replacestream_4.0.3.tgz";
7218 url = "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz";
7219 sha1 = "3ee5798092be364b1cdb1484308492cb3dff2f36";
7220 };
7221 }
7222
7223 {
7224 name = "request_progress___request_progress_0.3.1.tgz";
7225 path = fetchurl {
7226 name = "request_progress___request_progress_0.3.1.tgz";
7227 url = "https://registry.yarnpkg.com/request-progress/-/request-progress-0.3.1.tgz";
7228 sha1 = "0721c105d8a96ac6b2ce8b2c89ae2d5ecfcf6b3a";
7229 };
7230 }
7231
7232 {
7233 name = "request_replay___request_replay_0.2.0.tgz";
7234 path = fetchurl {
7235 name = "request_replay___request_replay_0.2.0.tgz";
7236 url = "https://registry.yarnpkg.com/request-replay/-/request-replay-0.2.0.tgz";
7237 sha1 = "9b693a5d118b39f5c596ead5ed91a26444057f60";
7238 };
7239 }
7240
7241 {
7242 name = "request___request_2.88.2.tgz";
7243 path = fetchurl {
7244 name = "request___request_2.88.2.tgz";
7245 url = "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz";
7246 sha1 = "d73c918731cb5a87da047e207234146f664d12b3";
7247 };
7248 }
7249
7250 {
7251 name = "request___request_2.27.0.tgz";
7252 path = fetchurl {
7253 name = "request___request_2.27.0.tgz";
7254 url = "https://registry.yarnpkg.com/request/-/request-2.27.0.tgz";
7255 sha1 = "dfb1a224dd3a5a9bade4337012503d710e538668";
7256 };
7257 }
7258
7259 {
7260 name = "request___request_2.36.0.tgz";
7261 path = fetchurl {
7262 name = "request___request_2.36.0.tgz";
7263 url = "https://registry.yarnpkg.com/request/-/request-2.36.0.tgz";
7264 sha1 = "28c6c04262c7b9ffdd21b9255374517ee6d943f5";
7265 };
7266 }
7267
7268 {
7269 name = "request___request_2.40.0.tgz";
7270 path = fetchurl {
7271 name = "request___request_2.40.0.tgz";
7272 url = "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz";
7273 sha1 = "4dd670f696f1e6e842e66b4b5e839301ab9beb67";
7274 };
7275 }
7276
7277 {
7278 name = "request___request_2.51.0.tgz";
7279 path = fetchurl {
7280 name = "request___request_2.51.0.tgz";
7281 url = "https://registry.yarnpkg.com/request/-/request-2.51.0.tgz";
7282 sha1 = "35d00bbecc012e55f907b1bd9e0dbd577bfef26e";
7283 };
7284 }
7285
7286 {
7287 name = "require_directory___require_directory_2.1.1.tgz";
7288 path = fetchurl {
7289 name = "require_directory___require_directory_2.1.1.tgz";
7290 url = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
7291 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
7292 };
7293 }
7294
7295 {
7296 name = "require_main_filename___require_main_filename_1.0.1.tgz";
7297 path = fetchurl {
7298 name = "require_main_filename___require_main_filename_1.0.1.tgz";
7299 url = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
7300 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
7301 };
7302 }
7303
7304 {
7305 name = "requires_port___requires_port_1.0.0.tgz";
7306 path = fetchurl {
7307 name = "requires_port___requires_port_1.0.0.tgz";
7308 url = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
7309 sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
7310 };
7311 }
7312
7313 {
7314 name = "resolve_dir___resolve_dir_1.0.1.tgz";
7315 path = fetchurl {
7316 name = "resolve_dir___resolve_dir_1.0.1.tgz";
7317 url = "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz";
7318 sha1 = "79a40644c362be82f26effe739c9bb5382046f43";
7319 };
7320 }
7321
7322 {
7323 name = "resolve_url___resolve_url_0.2.1.tgz";
7324 path = fetchurl {
7325 name = "resolve_url___resolve_url_0.2.1.tgz";
7326 url = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
7327 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
7328 };
7329 }
7330
7331 {
7332 name = "resolve___resolve_0.6.3.tgz";
7333 path = fetchurl {
7334 name = "resolve___resolve_0.6.3.tgz";
7335 url = "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz";
7336 sha1 = "dd957982e7e736debdf53b58a4dd91754575dd46";
7337 };
7338 }
7339
7340 {
7341 name = "resolve___resolve_1.1.7.tgz";
7342 path = fetchurl {
7343 name = "resolve___resolve_1.1.7.tgz";
7344 url = "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz";
7345 sha1 = "203114d82ad2c5ed9e8e0411b3932875e889e97b";
7346 };
7347 }
7348
7349 {
7350 name = "resolve___resolve_1.15.1.tgz";
7351 path = fetchurl {
7352 name = "resolve___resolve_1.15.1.tgz";
7353 url = "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz";
7354 sha1 = "27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8";
7355 };
7356 }
7357
7358 {
7359 name = "resolve___resolve_0.3.1.tgz";
7360 path = fetchurl {
7361 name = "resolve___resolve_0.3.1.tgz";
7362 url = "https://registry.yarnpkg.com/resolve/-/resolve-0.3.1.tgz";
7363 sha1 = "34c63447c664c70598d1c9b126fc43b2a24310a4";
7364 };
7365 }
7366
7367 {
7368 name = "ret___ret_0.1.15.tgz";
7369 path = fetchurl {
7370 name = "ret___ret_0.1.15.tgz";
7371 url = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
7372 sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
7373 };
7374 }
7375
7376 {
7377 name = "retry___retry_0.6.1.tgz";
7378 path = fetchurl {
7379 name = "retry___retry_0.6.1.tgz";
7380 url = "https://registry.yarnpkg.com/retry/-/retry-0.6.1.tgz";
7381 sha1 = "fdc90eed943fde11b893554b8cc63d0e899ba918";
7382 };
7383 }
7384
7385 {
7386 name = "rfile___rfile_1.0.0.tgz";
7387 path = fetchurl {
7388 name = "rfile___rfile_1.0.0.tgz";
7389 url = "https://registry.yarnpkg.com/rfile/-/rfile-1.0.0.tgz";
7390 sha1 = "59708cf90ca1e74c54c3cfc5c36fdb9810435261";
7391 };
7392 }
7393
7394 {
7395 name = "right_align___right_align_0.1.3.tgz";
7396 path = fetchurl {
7397 name = "right_align___right_align_0.1.3.tgz";
7398 url = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz";
7399 sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
7400 };
7401 }
7402
7403 {
7404 name = "rimraf___rimraf_2.7.1.tgz";
7405 path = fetchurl {
7406 name = "rimraf___rimraf_2.7.1.tgz";
7407 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz";
7408 sha1 = "35797f13a7fdadc566142c29d4f07ccad483e3ec";
7409 };
7410 }
7411
7412 {
7413 name = "rimraf___rimraf_2.2.8.tgz";
7414 path = fetchurl {
7415 name = "rimraf___rimraf_2.2.8.tgz";
7416 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz";
7417 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
7418 };
7419 }
7420
7421 {
7422 name = "rimraf___rimraf_2.4.5.tgz";
7423 path = fetchurl {
7424 name = "rimraf___rimraf_2.4.5.tgz";
7425 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz";
7426 sha1 = "ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da";
7427 };
7428 }
7429
7430 {
7431 name = "ruglify___ruglify_1.0.0.tgz";
7432 path = fetchurl {
7433 name = "ruglify___ruglify_1.0.0.tgz";
7434 url = "https://registry.yarnpkg.com/ruglify/-/ruglify-1.0.0.tgz";
7435 sha1 = "dc8930e2a9544a274301cc9972574c0d0986b675";
7436 };
7437 }
7438
7439 {
7440 name = "run_sequence___run_sequence_1.1.5.tgz";
7441 path = fetchurl {
7442 name = "run_sequence___run_sequence_1.1.5.tgz";
7443 url = "https://registry.yarnpkg.com/run-sequence/-/run-sequence-1.1.5.tgz";
7444 sha1 = "556bd47eb47877349e36c9c582748897db7be4f7";
7445 };
7446 }
7447
7448 {
7449 name = "safe_buffer___safe_buffer_5.2.0.tgz";
7450 path = fetchurl {
7451 name = "safe_buffer___safe_buffer_5.2.0.tgz";
7452 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz";
7453 sha1 = "b74daec49b1148f88c64b68d49b1e815c1f2f519";
7454 };
7455 }
7456
7457 {
7458 name = "safe_buffer___safe_buffer_5.1.2.tgz";
7459 path = fetchurl {
7460 name = "safe_buffer___safe_buffer_5.1.2.tgz";
7461 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
7462 sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
7463 };
7464 }
7465
7466 {
7467 name = "safe_regex___safe_regex_1.1.0.tgz";
7468 path = fetchurl {
7469 name = "safe_regex___safe_regex_1.1.0.tgz";
7470 url = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
7471 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
7472 };
7473 }
7474
7475 {
7476 name = "safer_buffer___safer_buffer_2.1.2.tgz";
7477 path = fetchurl {
7478 name = "safer_buffer___safer_buffer_2.1.2.tgz";
7479 url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
7480 sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
7481 };
7482 }
7483
7484 {
7485 name = "sass_graph___sass_graph_2.2.4.tgz";
7486 path = fetchurl {
7487 name = "sass_graph___sass_graph_2.2.4.tgz";
7488 url = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz";
7489 sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49";
7490 };
7491 }
7492
7493 {
7494 name = "sax___sax_1.2.4.tgz";
7495 path = fetchurl {
7496 name = "sax___sax_1.2.4.tgz";
7497 url = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
7498 sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
7499 };
7500 }
7501
7502 {
7503 name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
7504 path = fetchurl {
7505 name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
7506 url = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz";
7507 sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1";
7508 };
7509 }
7510
7511 {
7512 name = "semver_diff___semver_diff_2.1.0.tgz";
7513 path = fetchurl {
7514 name = "semver_diff___semver_diff_2.1.0.tgz";
7515 url = "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz";
7516 sha1 = "4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36";
7517 };
7518 }
7519
7520 {
7521 name = "semver___semver_5.7.1.tgz";
7522 path = fetchurl {
7523 name = "semver___semver_5.7.1.tgz";
7524 url = "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz";
7525 sha1 = "a954f931aeba508d307bbf069eff0c01c96116f7";
7526 };
7527 }
7528
7529 {
7530 name = "semver___semver_4.3.6.tgz";
7531 path = fetchurl {
7532 name = "semver___semver_4.3.6.tgz";
7533 url = "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz";
7534 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
7535 };
7536 }
7537
7538 {
7539 name = "semver___semver_2.3.2.tgz";
7540 path = fetchurl {
7541 name = "semver___semver_2.3.2.tgz";
7542 url = "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz";
7543 sha1 = "b9848f25d6cf36333073ec9ef8856d42f1233e52";
7544 };
7545 }
7546
7547 {
7548 name = "semver___semver_5.3.0.tgz";
7549 path = fetchurl {
7550 name = "semver___semver_5.3.0.tgz";
7551 url = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
7552 sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
7553 };
7554 }
7555
7556 {
7557 name = "send___send_0.13.2.tgz";
7558 path = fetchurl {
7559 name = "send___send_0.13.2.tgz";
7560 url = "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz";
7561 sha1 = "765e7607c8055452bba6f0b052595350986036de";
7562 };
7563 }
7564
7565 {
7566 name = "sequencify___sequencify_0.0.7.tgz";
7567 path = fetchurl {
7568 name = "sequencify___sequencify_0.0.7.tgz";
7569 url = "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz";
7570 sha1 = "90cff19d02e07027fd767f5ead3e7b95d1e7380c";
7571 };
7572 }
7573
7574 {
7575 name = "serve_static___serve_static_1.10.3.tgz";
7576 path = fetchurl {
7577 name = "serve_static___serve_static_1.10.3.tgz";
7578 url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz";
7579 sha1 = "ce5a6ecd3101fed5ec09827dac22a9c29bfb0535";
7580 };
7581 }
7582
7583 {
7584 name = "set_blocking___set_blocking_2.0.0.tgz";
7585 path = fetchurl {
7586 name = "set_blocking___set_blocking_2.0.0.tgz";
7587 url = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
7588 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
7589 };
7590 }
7591
7592 {
7593 name = "set_value___set_value_2.0.1.tgz";
7594 path = fetchurl {
7595 name = "set_value___set_value_2.0.1.tgz";
7596 url = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz";
7597 sha1 = "a18d40530e6f07de4228c7defe4227af8cad005b";
7598 };
7599 }
7600
7601 {
7602 name = "setprototypeof___setprototypeof_1.1.1.tgz";
7603 path = fetchurl {
7604 name = "setprototypeof___setprototypeof_1.1.1.tgz";
7605 url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz";
7606 sha1 = "7e95acb24aa92f5885e0abef5ba131330d4ae683";
7607 };
7608 }
7609
7610 {
7611 name = "shallow_copy___shallow_copy_0.0.1.tgz";
7612 path = fetchurl {
7613 name = "shallow_copy___shallow_copy_0.0.1.tgz";
7614 url = "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz";
7615 sha1 = "415f42702d73d810330292cc5ee86eae1a11a170";
7616 };
7617 }
7618
7619 {
7620 name = "shell_quote___shell_quote_0.0.1.tgz";
7621 path = fetchurl {
7622 name = "shell_quote___shell_quote_0.0.1.tgz";
7623 url = "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz";
7624 sha1 = "1a41196f3c0333c482323593d6886ecf153dd986";
7625 };
7626 }
7627
7628 {
7629 name = "shell_quote___shell_quote_1.4.3.tgz";
7630 path = fetchurl {
7631 name = "shell_quote___shell_quote_1.4.3.tgz";
7632 url = "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.4.3.tgz";
7633 sha1 = "952c44e0b1ed9013ef53958179cc643e8777466b";
7634 };
7635 }
7636
7637 {
7638 name = "sigmund___sigmund_1.0.1.tgz";
7639 path = fetchurl {
7640 name = "sigmund___sigmund_1.0.1.tgz";
7641 url = "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz";
7642 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
7643 };
7644 }
7645
7646 {
7647 name = "signal_exit___signal_exit_3.0.3.tgz";
7648 path = fetchurl {
7649 name = "signal_exit___signal_exit_3.0.3.tgz";
7650 url = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz";
7651 sha1 = "a1410c2edd8f077b08b4e253c8eacfcaf057461c";
7652 };
7653 }
7654
7655 {
7656 name = "simple_fmt___simple_fmt_0.1.0.tgz";
7657 path = fetchurl {
7658 name = "simple_fmt___simple_fmt_0.1.0.tgz";
7659 url = "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz";
7660 sha1 = "191bf566a59e6530482cb25ab53b4a8dc85c3a6b";
7661 };
7662 }
7663
7664 {
7665 name = "simple_is___simple_is_0.2.0.tgz";
7666 path = fetchurl {
7667 name = "simple_is___simple_is_0.2.0.tgz";
7668 url = "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz";
7669 sha1 = "2abb75aade39deb5cc815ce10e6191164850baf0";
7670 };
7671 }
7672
7673 {
7674 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
7675 path = fetchurl {
7676 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
7677 url = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
7678 sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
7679 };
7680 }
7681
7682 {
7683 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
7684 path = fetchurl {
7685 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
7686 url = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
7687 sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
7688 };
7689 }
7690
7691 {
7692 name = "snapdragon___snapdragon_0.8.2.tgz";
7693 path = fetchurl {
7694 name = "snapdragon___snapdragon_0.8.2.tgz";
7695 url = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
7696 sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
7697 };
7698 }
7699
7700 {
7701 name = "sntp___sntp_0.2.4.tgz";
7702 path = fetchurl {
7703 name = "sntp___sntp_0.2.4.tgz";
7704 url = "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz";
7705 sha1 = "fb885f18b0f3aad189f824862536bceeec750900";
7706 };
7707 }
7708
7709 {
7710 name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
7711 path = fetchurl {
7712 name = "socket.io_adapter___socket.io_adapter_0.5.0.tgz";
7713 url = "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz";
7714 sha1 = "cb6d4bb8bec81e1078b99677f9ced0046066bb8b";
7715 };
7716 }
7717
7718 {
7719 name = "socket.io_client___socket.io_client_1.7.4.tgz";
7720 path = fetchurl {
7721 name = "socket.io_client___socket.io_client_1.7.4.tgz";
7722 url = "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.4.tgz";
7723 sha1 = "ec9f820356ed99ef6d357f0756d648717bdd4281";
7724 };
7725 }
7726
7727 {
7728 name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
7729 path = fetchurl {
7730 name = "socket.io_parser___socket.io_parser_2.3.1.tgz";
7731 url = "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz";
7732 sha1 = "dd532025103ce429697326befd64005fcfe5b4a0";
7733 };
7734 }
7735
7736 {
7737 name = "socket.io___socket.io_1.7.4.tgz";
7738 path = fetchurl {
7739 name = "socket.io___socket.io_1.7.4.tgz";
7740 url = "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.4.tgz";
7741 sha1 = "2f7ecedc3391bf2d5c73e291fe233e6e34d4dd00";
7742 };
7743 }
7744
7745 {
7746 name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
7747 path = fetchurl {
7748 name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
7749 url = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
7750 sha1 = "190866bece7553e1f8f267a2ee82c606b5509a1a";
7751 };
7752 }
7753
7754 {
7755 name = "source_map_url___source_map_url_0.4.0.tgz";
7756 path = fetchurl {
7757 name = "source_map_url___source_map_url_0.4.0.tgz";
7758 url = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
7759 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
7760 };
7761 }
7762
7763 {
7764 name = "source_map___source_map_0.1.34.tgz";
7765 path = fetchurl {
7766 name = "source_map___source_map_0.1.34.tgz";
7767 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz";
7768 sha1 = "a7cfe89aec7b1682c3b198d0acfb47d7d090566b";
7769 };
7770 }
7771
7772 {
7773 name = "source_map___source_map_0.1.43.tgz";
7774 path = fetchurl {
7775 name = "source_map___source_map_0.1.43.tgz";
7776 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz";
7777 sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346";
7778 };
7779 }
7780
7781 {
7782 name = "source_map___source_map_0.4.4.tgz";
7783 path = fetchurl {
7784 name = "source_map___source_map_0.4.4.tgz";
7785 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz";
7786 sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
7787 };
7788 }
7789
7790 {
7791 name = "source_map___source_map_0.5.7.tgz";
7792 path = fetchurl {
7793 name = "source_map___source_map_0.5.7.tgz";
7794 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
7795 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
7796 };
7797 }
7798
7799 {
7800 name = "source_map___source_map_0.6.1.tgz";
7801 path = fetchurl {
7802 name = "source_map___source_map_0.6.1.tgz";
7803 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
7804 sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
7805 };
7806 }
7807
7808 {
7809 name = "source_map___source_map_0.2.0.tgz";
7810 path = fetchurl {
7811 name = "source_map___source_map_0.2.0.tgz";
7812 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz";
7813 sha1 = "dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d";
7814 };
7815 }
7816
7817 {
7818 name = "source_map___source_map_0.3.0.tgz";
7819 path = fetchurl {
7820 name = "source_map___source_map_0.3.0.tgz";
7821 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.3.0.tgz";
7822 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
7823 };
7824 }
7825
7826 {
7827 name = "sparkles___sparkles_1.0.1.tgz";
7828 path = fetchurl {
7829 name = "sparkles___sparkles_1.0.1.tgz";
7830 url = "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz";
7831 sha1 = "008db65edce6c50eec0c5e228e1945061dd0437c";
7832 };
7833 }
7834
7835 {
7836 name = "spdx_correct___spdx_correct_3.1.0.tgz";
7837 path = fetchurl {
7838 name = "spdx_correct___spdx_correct_3.1.0.tgz";
7839 url = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz";
7840 sha1 = "fb83e504445268f154b074e218c87c003cd31df4";
7841 };
7842 }
7843
7844 {
7845 name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
7846 path = fetchurl {
7847 name = "spdx_exceptions___spdx_exceptions_2.2.0.tgz";
7848 url = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
7849 sha1 = "2ea450aee74f2a89bfb94519c07fcd6f41322977";
7850 };
7851 }
7852
7853 {
7854 name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
7855 path = fetchurl {
7856 name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
7857 url = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
7858 sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
7859 };
7860 }
7861
7862 {
7863 name = "spdx_license_ids___spdx_license_ids_3.0.5.tgz";
7864 path = fetchurl {
7865 name = "spdx_license_ids___spdx_license_ids_3.0.5.tgz";
7866 url = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz";
7867 sha1 = "3694b5804567a458d3c8045842a6358632f62654";
7868 };
7869 }
7870
7871 {
7872 name = "split_string___split_string_3.1.0.tgz";
7873 path = fetchurl {
7874 name = "split_string___split_string_3.1.0.tgz";
7875 url = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
7876 sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
7877 };
7878 }
7879
7880 {
7881 name = "split___split_0.3.3.tgz";
7882 path = fetchurl {
7883 name = "split___split_0.3.3.tgz";
7884 url = "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz";
7885 sha1 = "cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f";
7886 };
7887 }
7888
7889 {
7890 name = "split___split_1.0.1.tgz";
7891 path = fetchurl {
7892 name = "split___split_1.0.1.tgz";
7893 url = "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz";
7894 sha1 = "605bd9be303aa59fb35f9229fbea0ddec9ea07d9";
7895 };
7896 }
7897
7898 {
7899 name = "sprintf_js___sprintf_js_1.0.3.tgz";
7900 path = fetchurl {
7901 name = "sprintf_js___sprintf_js_1.0.3.tgz";
7902 url = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
7903 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
7904 };
7905 }
7906
7907 {
7908 name = "sshpk___sshpk_1.16.1.tgz";
7909 path = fetchurl {
7910 name = "sshpk___sshpk_1.16.1.tgz";
7911 url = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz";
7912 sha1 = "fb661c0bef29b39db40769ee39fa70093d6f6877";
7913 };
7914 }
7915
7916 {
7917 name = "stable___stable_0.1.8.tgz";
7918 path = fetchurl {
7919 name = "stable___stable_0.1.8.tgz";
7920 url = "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz";
7921 sha1 = "836eb3c8382fe2936feaf544631017ce7d47a3cf";
7922 };
7923 }
7924
7925 {
7926 name = "static_extend___static_extend_0.1.2.tgz";
7927 path = fetchurl {
7928 name = "static_extend___static_extend_0.1.2.tgz";
7929 url = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
7930 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
7931 };
7932 }
7933
7934 {
7935 name = "statuses___statuses_1.5.0.tgz";
7936 path = fetchurl {
7937 name = "statuses___statuses_1.5.0.tgz";
7938 url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
7939 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
7940 };
7941 }
7942
7943 {
7944 name = "statuses___statuses_1.2.1.tgz";
7945 path = fetchurl {
7946 name = "statuses___statuses_1.2.1.tgz";
7947 url = "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz";
7948 sha1 = "dded45cc18256d51ed40aec142489d5c61026d28";
7949 };
7950 }
7951
7952 {
7953 name = "stdout_stream___stdout_stream_1.4.1.tgz";
7954 path = fetchurl {
7955 name = "stdout_stream___stdout_stream_1.4.1.tgz";
7956 url = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz";
7957 sha1 = "5ac174cdd5cd726104aa0c0b2bd83815d8d535de";
7958 };
7959 }
7960
7961 {
7962 name = "stream_browserify___stream_browserify_0.1.3.tgz";
7963 path = fetchurl {
7964 name = "stream_browserify___stream_browserify_0.1.3.tgz";
7965 url = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-0.1.3.tgz";
7966 sha1 = "95cf1b369772e27adaf46352265152689c6c4be9";
7967 };
7968 }
7969
7970 {
7971 name = "stream_combiner___stream_combiner_0.2.2.tgz";
7972 path = fetchurl {
7973 name = "stream_combiner___stream_combiner_0.2.2.tgz";
7974 url = "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz";
7975 sha1 = "aec8cbac177b56b6f4fa479ced8c1912cee52858";
7976 };
7977 }
7978
7979 {
7980 name = "stream_combiner___stream_combiner_0.0.4.tgz";
7981 path = fetchurl {
7982 name = "stream_combiner___stream_combiner_0.0.4.tgz";
7983 url = "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz";
7984 sha1 = "4d5e433c185261dde623ca3f44c586bcf5c4ad14";
7985 };
7986 }
7987
7988 {
7989 name = "stream_combiner___stream_combiner_0.1.0.tgz";
7990 path = fetchurl {
7991 name = "stream_combiner___stream_combiner_0.1.0.tgz";
7992 url = "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.1.0.tgz";
7993 sha1 = "0dc389a3c203f8f4d56368f95dde52eb9269b5be";
7994 };
7995 }
7996
7997 {
7998 name = "stream_consume___stream_consume_0.1.1.tgz";
7999 path = fetchurl {
8000 name = "stream_consume___stream_consume_0.1.1.tgz";
8001 url = "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz";
8002 sha1 = "d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48";
8003 };
8004 }
8005
8006 {
8007 name = "stream_shift___stream_shift_1.0.1.tgz";
8008 path = fetchurl {
8009 name = "stream_shift___stream_shift_1.0.1.tgz";
8010 url = "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz";
8011 sha1 = "d7088281559ab2778424279b0877da3c392d5a3d";
8012 };
8013 }
8014
8015 {
8016 name = "string_length___string_length_1.0.1.tgz";
8017 path = fetchurl {
8018 name = "string_length___string_length_1.0.1.tgz";
8019 url = "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz";
8020 sha1 = "56970fb1c38558e9e70b728bf3de269ac45adfac";
8021 };
8022 }
8023
8024 {
8025 name = "string_width___string_width_1.0.2.tgz";
8026 path = fetchurl {
8027 name = "string_width___string_width_1.0.2.tgz";
8028 url = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
8029 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
8030 };
8031 }
8032
8033 {
8034 name = "string_width___string_width_2.1.1.tgz";
8035 path = fetchurl {
8036 name = "string_width___string_width_2.1.1.tgz";
8037 url = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
8038 sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
8039 };
8040 }
8041
8042 {
8043 name = "string_decoder___string_decoder_0.0.1.tgz";
8044 path = fetchurl {
8045 name = "string_decoder___string_decoder_0.0.1.tgz";
8046 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.0.1.tgz";
8047 sha1 = "f5472d0a8d1650ec823752d24e6fd627b39bf141";
8048 };
8049 }
8050
8051 {
8052 name = "string_decoder___string_decoder_0.10.31.tgz";
8053 path = fetchurl {
8054 name = "string_decoder___string_decoder_0.10.31.tgz";
8055 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
8056 sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
8057 };
8058 }
8059
8060 {
8061 name = "string_decoder___string_decoder_1.1.1.tgz";
8062 path = fetchurl {
8063 name = "string_decoder___string_decoder_1.1.1.tgz";
8064 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
8065 sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
8066 };
8067 }
8068
8069 {
8070 name = "stringify_object___stringify_object_0.2.1.tgz";
8071 path = fetchurl {
8072 name = "stringify_object___stringify_object_0.2.1.tgz";
8073 url = "https://registry.yarnpkg.com/stringify-object/-/stringify-object-0.2.1.tgz";
8074 sha1 = "b58be50b3ff5f371038c545d4332656bfded5620";
8075 };
8076 }
8077
8078 {
8079 name = "stringmap___stringmap_0.2.2.tgz";
8080 path = fetchurl {
8081 name = "stringmap___stringmap_0.2.2.tgz";
8082 url = "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz";
8083 sha1 = "556c137b258f942b8776f5b2ef582aa069d7d1b1";
8084 };
8085 }
8086
8087 {
8088 name = "stringset___stringset_0.2.1.tgz";
8089 path = fetchurl {
8090 name = "stringset___stringset_0.2.1.tgz";
8091 url = "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz";
8092 sha1 = "ef259c4e349344377fcd1c913dd2e848c9c042b5";
8093 };
8094 }
8095
8096 {
8097 name = "stringstream___stringstream_0.0.6.tgz";
8098 path = fetchurl {
8099 name = "stringstream___stringstream_0.0.6.tgz";
8100 url = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz";
8101 sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72";
8102 };
8103 }
8104
8105 {
8106 name = "strip_ansi___strip_ansi_0.3.0.tgz";
8107 path = fetchurl {
8108 name = "strip_ansi___strip_ansi_0.3.0.tgz";
8109 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz";
8110 sha1 = "25f48ea22ca79187f3174a4db8759347bb126220";
8111 };
8112 }
8113
8114 {
8115 name = "strip_ansi___strip_ansi_2.0.1.tgz";
8116 path = fetchurl {
8117 name = "strip_ansi___strip_ansi_2.0.1.tgz";
8118 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz";
8119 sha1 = "df62c1aa94ed2f114e1d0f21fd1d50482b79a60e";
8120 };
8121 }
8122
8123 {
8124 name = "strip_ansi___strip_ansi_3.0.1.tgz";
8125 path = fetchurl {
8126 name = "strip_ansi___strip_ansi_3.0.1.tgz";
8127 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
8128 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
8129 };
8130 }
8131
8132 {
8133 name = "strip_ansi___strip_ansi_4.0.0.tgz";
8134 path = fetchurl {
8135 name = "strip_ansi___strip_ansi_4.0.0.tgz";
8136 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
8137 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
8138 };
8139 }
8140
8141 {
8142 name = "strip_ansi___strip_ansi_0.1.1.tgz";
8143 path = fetchurl {
8144 name = "strip_ansi___strip_ansi_0.1.1.tgz";
8145 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz";
8146 sha1 = "39e8a98d044d150660abe4a6808acf70bb7bc991";
8147 };
8148 }
8149
8150 {
8151 name = "strip_bom___strip_bom_1.0.0.tgz";
8152 path = fetchurl {
8153 name = "strip_bom___strip_bom_1.0.0.tgz";
8154 url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz";
8155 sha1 = "85b8862f3844b5a6d5ec8467a93598173a36f794";
8156 };
8157 }
8158
8159 {
8160 name = "strip_bom___strip_bom_2.0.0.tgz";
8161 path = fetchurl {
8162 name = "strip_bom___strip_bom_2.0.0.tgz";
8163 url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
8164 sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
8165 };
8166 }
8167
8168 {
8169 name = "strip_indent___strip_indent_1.0.1.tgz";
8170 path = fetchurl {
8171 name = "strip_indent___strip_indent_1.0.1.tgz";
8172 url = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz";
8173 sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2";
8174 };
8175 }
8176
8177 {
8178 name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
8179 path = fetchurl {
8180 name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
8181 url = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
8182 sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
8183 };
8184 }
8185
8186 {
8187 name = "subarg___subarg_0.0.1.tgz";
8188 path = fetchurl {
8189 name = "subarg___subarg_0.0.1.tgz";
8190 url = "https://registry.yarnpkg.com/subarg/-/subarg-0.0.1.tgz";
8191 sha1 = "3d56b07dacfbc45bbb63f7672b43b63e46368e3a";
8192 };
8193 }
8194
8195 {
8196 name = "supports_color___supports_color_0.2.0.tgz";
8197 path = fetchurl {
8198 name = "supports_color___supports_color_0.2.0.tgz";
8199 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz";
8200 sha1 = "d92de2694eb3f67323973d7ae3d8b55b4c22190a";
8201 };
8202 }
8203
8204 {
8205 name = "supports_color___supports_color_2.0.0.tgz";
8206 path = fetchurl {
8207 name = "supports_color___supports_color_2.0.0.tgz";
8208 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
8209 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
8210 };
8211 }
8212
8213 {
8214 name = "supports_color___supports_color_3.2.3.tgz";
8215 path = fetchurl {
8216 name = "supports_color___supports_color_3.2.3.tgz";
8217 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
8218 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
8219 };
8220 }
8221
8222 {
8223 name = "supports_color___supports_color_7.1.0.tgz";
8224 path = fetchurl {
8225 name = "supports_color___supports_color_7.1.0.tgz";
8226 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz";
8227 sha1 = "68e32591df73e25ad1c4b49108a2ec507962bfd1";
8228 };
8229 }
8230
8231 {
8232 name = "syntax_error___syntax_error_1.1.6.tgz";
8233 path = fetchurl {
8234 name = "syntax_error___syntax_error_1.1.6.tgz";
8235 url = "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz";
8236 sha1 = "b4549706d386cc1c1dc7c2423f18579b6cade710";
8237 };
8238 }
8239
8240 {
8241 name = "tar___tar_2.2.2.tgz";
8242 path = fetchurl {
8243 name = "tar___tar_2.2.2.tgz";
8244 url = "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz";
8245 sha1 = "0ca8848562c7299b8b446ff6a4d60cdbb23edc40";
8246 };
8247 }
8248
8249 {
8250 name = "tar___tar_4.4.13.tgz";
8251 path = fetchurl {
8252 name = "tar___tar_4.4.13.tgz";
8253 url = "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz";
8254 sha1 = "43b364bc52888d555298637b10d60790254ab525";
8255 };
8256 }
8257
8258 {
8259 name = "tar___tar_0.1.20.tgz";
8260 path = fetchurl {
8261 name = "tar___tar_0.1.20.tgz";
8262 url = "https://registry.yarnpkg.com/tar/-/tar-0.1.20.tgz";
8263 sha1 = "42940bae5b5f22c74483699126f9f3f27449cb13";
8264 };
8265 }
8266
8267 {
8268 name = "ternary_stream___ternary_stream_2.1.1.tgz";
8269 path = fetchurl {
8270 name = "ternary_stream___ternary_stream_2.1.1.tgz";
8271 url = "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.1.1.tgz";
8272 sha1 = "4ad64b98668d796a085af2c493885a435a8a8bfc";
8273 };
8274 }
8275
8276 {
8277 name = "textextensions___textextensions_1.0.2.tgz";
8278 path = fetchurl {
8279 name = "textextensions___textextensions_1.0.2.tgz";
8280 url = "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz";
8281 sha1 = "65486393ee1f2bb039a60cbba05b0b68bd9501d2";
8282 };
8283 }
8284
8285 {
8286 name = "throttleit___throttleit_0.0.2.tgz";
8287 path = fetchurl {
8288 name = "throttleit___throttleit_0.0.2.tgz";
8289 url = "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz";
8290 sha1 = "cfedf88e60c00dd9697b61fdd2a8343a9b680eaf";
8291 };
8292 }
8293
8294 {
8295 name = "through2___through2_0.4.2.tgz";
8296 path = fetchurl {
8297 name = "through2___through2_0.4.2.tgz";
8298 url = "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz";
8299 sha1 = "dbf5866031151ec8352bb6c4db64a2292a840b9b";
8300 };
8301 }
8302
8303 {
8304 name = "through2___through2_0.5.1.tgz";
8305 path = fetchurl {
8306 name = "through2___through2_0.5.1.tgz";
8307 url = "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz";
8308 sha1 = "dfdd012eb9c700e2323fd334f38ac622ab372da7";
8309 };
8310 }
8311
8312 {
8313 name = "through2___through2_0.6.5.tgz";
8314 path = fetchurl {
8315 name = "through2___through2_0.6.5.tgz";
8316 url = "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz";
8317 sha1 = "41ab9c67b29d57209071410e1d7a7a968cd3ad48";
8318 };
8319 }
8320
8321 {
8322 name = "through2___through2_2.0.5.tgz";
8323 path = fetchurl {
8324 name = "through2___through2_2.0.5.tgz";
8325 url = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
8326 sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
8327 };
8328 }
8329
8330 {
8331 name = "through___through_2.3.8.tgz";
8332 path = fetchurl {
8333 name = "through___through_2.3.8.tgz";
8334 url = "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz";
8335 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
8336 };
8337 }
8338
8339 {
8340 name = "through___through_2.2.7.tgz";
8341 path = fetchurl {
8342 name = "through___through_2.2.7.tgz";
8343 url = "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz";
8344 sha1 = "6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd";
8345 };
8346 }
8347
8348 {
8349 name = "tildify___tildify_1.2.0.tgz";
8350 path = fetchurl {
8351 name = "tildify___tildify_1.2.0.tgz";
8352 url = "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz";
8353 sha1 = "dcec03f55dca9b7aa3e5b04f21817eb56e63588a";
8354 };
8355 }
8356
8357 {
8358 name = "time_stamp___time_stamp_1.1.0.tgz";
8359 path = fetchurl {
8360 name = "time_stamp___time_stamp_1.1.0.tgz";
8361 url = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz";
8362 sha1 = "764a5a11af50561921b133f3b44e618687e0f5c3";
8363 };
8364 }
8365
8366 {
8367 name = "timed_out___timed_out_2.0.0.tgz";
8368 path = fetchurl {
8369 name = "timed_out___timed_out_2.0.0.tgz";
8370 url = "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz";
8371 sha1 = "f38b0ae81d3747d628001f41dafc652ace671c0a";
8372 };
8373 }
8374
8375 {
8376 name = "timers_browserify___timers_browserify_1.0.3.tgz";
8377 path = fetchurl {
8378 name = "timers_browserify___timers_browserify_1.0.3.tgz";
8379 url = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.0.3.tgz";
8380 sha1 = "ffba70c9c12eed916fd67318e629ac6f32295551";
8381 };
8382 }
8383
8384 {
8385 name = "timers_ext___timers_ext_0.1.7.tgz";
8386 path = fetchurl {
8387 name = "timers_ext___timers_ext_0.1.7.tgz";
8388 url = "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz";
8389 sha1 = "6f57ad8578e07a3fb9f91d9387d65647555e25c6";
8390 };
8391 }
8392
8393 {
8394 name = "tmp___tmp_0.0.23.tgz";
8395 path = fetchurl {
8396 name = "tmp___tmp_0.0.23.tgz";
8397 url = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz";
8398 sha1 = "de874aa5e974a85f0a32cdfdbd74663cb3bd9c74";
8399 };
8400 }
8401
8402 {
8403 name = "tmp___tmp_0.0.33.tgz";
8404 path = fetchurl {
8405 name = "tmp___tmp_0.0.33.tgz";
8406 url = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz";
8407 sha1 = "6d34335889768d21b2bcda0aa277ced3b1bfadf9";
8408 };
8409 }
8410
8411 {
8412 name = "to_array___to_array_0.1.4.tgz";
8413 path = fetchurl {
8414 name = "to_array___to_array_0.1.4.tgz";
8415 url = "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz";
8416 sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
8417 };
8418 }
8419
8420 {
8421 name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
8422 path = fetchurl {
8423 name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
8424 url = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
8425 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
8426 };
8427 }
8428
8429 {
8430 name = "to_object_path___to_object_path_0.3.0.tgz";
8431 path = fetchurl {
8432 name = "to_object_path___to_object_path_0.3.0.tgz";
8433 url = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
8434 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
8435 };
8436 }
8437
8438 {
8439 name = "to_regex_range___to_regex_range_2.1.1.tgz";
8440 path = fetchurl {
8441 name = "to_regex_range___to_regex_range_2.1.1.tgz";
8442 url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
8443 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
8444 };
8445 }
8446
8447 {
8448 name = "to_regex___to_regex_3.0.2.tgz";
8449 path = fetchurl {
8450 name = "to_regex___to_regex_3.0.2.tgz";
8451 url = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
8452 sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
8453 };
8454 }
8455
8456 {
8457 name = "toidentifier___toidentifier_1.0.0.tgz";
8458 path = fetchurl {
8459 name = "toidentifier___toidentifier_1.0.0.tgz";
8460 url = "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz";
8461 sha1 = "7e1be3470f1e77948bc43d94a3c8f4d7752ba553";
8462 };
8463 }
8464
8465 {
8466 name = "token_stream___token_stream_0.0.1.tgz";
8467 path = fetchurl {
8468 name = "token_stream___token_stream_0.0.1.tgz";
8469 url = "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz";
8470 sha1 = "ceeefc717a76c4316f126d0b9dbaa55d7e7df01a";
8471 };
8472 }
8473
8474 {
8475 name = "touch___touch_0.0.2.tgz";
8476 path = fetchurl {
8477 name = "touch___touch_0.0.2.tgz";
8478 url = "https://registry.yarnpkg.com/touch/-/touch-0.0.2.tgz";
8479 sha1 = "a65a777795e5cbbe1299499bdc42281ffb21b5f4";
8480 };
8481 }
8482
8483 {
8484 name = "tough_cookie___tough_cookie_4.0.0.tgz";
8485 path = fetchurl {
8486 name = "tough_cookie___tough_cookie_4.0.0.tgz";
8487 url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz";
8488 sha1 = "d822234eeca882f991f0f908824ad2622ddbece4";
8489 };
8490 }
8491
8492 {
8493 name = "tough_cookie___tough_cookie_2.5.0.tgz";
8494 path = fetchurl {
8495 name = "tough_cookie___tough_cookie_2.5.0.tgz";
8496 url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz";
8497 sha1 = "cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2";
8498 };
8499 }
8500
8501 {
8502 name = "traverse___traverse_0.3.9.tgz";
8503 path = fetchurl {
8504 name = "traverse___traverse_0.3.9.tgz";
8505 url = "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz";
8506 sha1 = "717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9";
8507 };
8508 }
8509
8510 {
8511 name = "trim_newlines___trim_newlines_1.0.0.tgz";
8512 path = fetchurl {
8513 name = "trim_newlines___trim_newlines_1.0.0.tgz";
8514 url = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz";
8515 sha1 = "5887966bb582a4503a41eb524f7d35011815a613";
8516 };
8517 }
8518
8519 {
8520 name = "true_case_path___true_case_path_1.0.3.tgz";
8521 path = fetchurl {
8522 name = "true_case_path___true_case_path_1.0.3.tgz";
8523 url = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz";
8524 sha1 = "f813b5a8c86b40da59606722b144e3225799f47d";
8525 };
8526 }
8527
8528 {
8529 name = "tryor___tryor_0.1.2.tgz";
8530 path = fetchurl {
8531 name = "tryor___tryor_0.1.2.tgz";
8532 url = "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz";
8533 sha1 = "8145e4ca7caff40acde3ccf946e8b8bb75b4172b";
8534 };
8535 }
8536
8537 {
8538 name = "tty_browserify___tty_browserify_0.0.1.tgz";
8539 path = fetchurl {
8540 name = "tty_browserify___tty_browserify_0.0.1.tgz";
8541 url = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz";
8542 sha1 = "3f05251ee17904dfd0677546670db9651682b811";
8543 };
8544 }
8545
8546 {
8547 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
8548 path = fetchurl {
8549 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
8550 url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
8551 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
8552 };
8553 }
8554
8555 {
8556 name = "tunnel_agent___tunnel_agent_0.3.0.tgz";
8557 path = fetchurl {
8558 name = "tunnel_agent___tunnel_agent_0.3.0.tgz";
8559 url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.3.0.tgz";
8560 sha1 = "ad681b68f5321ad2827c4cfb1b7d5df2cfe942ee";
8561 };
8562 }
8563
8564 {
8565 name = "tunnel_agent___tunnel_agent_0.4.3.tgz";
8566 path = fetchurl {
8567 name = "tunnel_agent___tunnel_agent_0.4.3.tgz";
8568 url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz";
8569 sha1 = "6373db76909fe570e08d73583365ed828a74eeeb";
8570 };
8571 }
8572
8573 {
8574 name = "tweetnacl___tweetnacl_0.14.5.tgz";
8575 path = fetchurl {
8576 name = "tweetnacl___tweetnacl_0.14.5.tgz";
8577 url = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
8578 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
8579 };
8580 }
8581
8582 {
8583 name = "type_check___type_check_0.3.2.tgz";
8584 path = fetchurl {
8585 name = "type_check___type_check_0.3.2.tgz";
8586 url = "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz";
8587 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
8588 };
8589 }
8590
8591 {
8592 name = "type_is___type_is_1.6.18.tgz";
8593 path = fetchurl {
8594 name = "type_is___type_is_1.6.18.tgz";
8595 url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz";
8596 sha1 = "4e552cd05df09467dcbc4ef739de89f2cf37c131";
8597 };
8598 }
8599
8600 {
8601 name = "type___type_1.2.0.tgz";
8602 path = fetchurl {
8603 name = "type___type_1.2.0.tgz";
8604 url = "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz";
8605 sha1 = "848dd7698dafa3e54a6c479e759c4bc3f18847a0";
8606 };
8607 }
8608
8609 {
8610 name = "type___type_2.0.0.tgz";
8611 path = fetchurl {
8612 name = "type___type_2.0.0.tgz";
8613 url = "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz";
8614 sha1 = "5f16ff6ef2eb44f260494dae271033b29c09a9c3";
8615 };
8616 }
8617
8618 {
8619 name = "typedarray___typedarray_0.0.6.tgz";
8620 path = fetchurl {
8621 name = "typedarray___typedarray_0.0.6.tgz";
8622 url = "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz";
8623 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
8624 };
8625 }
8626
8627 {
8628 name = "uglify_js___uglify_js_2.5.0.tgz";
8629 path = fetchurl {
8630 name = "uglify_js___uglify_js_2.5.0.tgz";
8631 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.5.0.tgz";
8632 sha1 = "4ab5d65a4730ecb7a4fb62d3f499e2054d98fba1";
8633 };
8634 }
8635
8636 {
8637 name = "uglify_js___uglify_js_2.8.29.tgz";
8638 path = fetchurl {
8639 name = "uglify_js___uglify_js_2.8.29.tgz";
8640 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz";
8641 sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
8642 };
8643 }
8644
8645 {
8646 name = "uglify_js___uglify_js_3.8.1.tgz";
8647 path = fetchurl {
8648 name = "uglify_js___uglify_js_3.8.1.tgz";
8649 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.1.tgz";
8650 sha1 = "43bb15ce6f545eaa0a64c49fd29375ea09fa0f93";
8651 };
8652 }
8653
8654 {
8655 name = "uglify_js___uglify_js_2.2.5.tgz";
8656 path = fetchurl {
8657 name = "uglify_js___uglify_js_2.2.5.tgz";
8658 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz";
8659 sha1 = "a6e02a70d839792b9780488b7b8b184c095c99c7";
8660 };
8661 }
8662
8663 {
8664 name = "uglify_js___uglify_js_2.3.6.tgz";
8665 path = fetchurl {
8666 name = "uglify_js___uglify_js_2.3.6.tgz";
8667 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz";
8668 sha1 = "fa0984770b428b7a9b2a8058f46355d14fef211a";
8669 };
8670 }
8671
8672 {
8673 name = "uglify_js___uglify_js_2.4.24.tgz";
8674 path = fetchurl {
8675 name = "uglify_js___uglify_js_2.4.24.tgz";
8676 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz";
8677 sha1 = "fad5755c1e1577658bb06ff9ab6e548c95bebd6e";
8678 };
8679 }
8680
8681 {
8682 name = "uglify_save_license___uglify_save_license_0.4.1.tgz";
8683 path = fetchurl {
8684 name = "uglify_save_license___uglify_save_license_0.4.1.tgz";
8685 url = "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz";
8686 sha1 = "95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1";
8687 };
8688 }
8689
8690 {
8691 name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
8692 path = fetchurl {
8693 name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
8694 url = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
8695 sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
8696 };
8697 }
8698
8699 {
8700 name = "ultron___ultron_1.0.2.tgz";
8701 path = fetchurl {
8702 name = "ultron___ultron_1.0.2.tgz";
8703 url = "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz";
8704 sha1 = "ace116ab557cd197386a4e88f4685378c8b2e4fa";
8705 };
8706 }
8707
8708 {
8709 name = "umd___umd_2.0.0.tgz";
8710 path = fetchurl {
8711 name = "umd___umd_2.0.0.tgz";
8712 url = "https://registry.yarnpkg.com/umd/-/umd-2.0.0.tgz";
8713 sha1 = "749683b0d514728ae0e1b6195f5774afc0ad4f8f";
8714 };
8715 }
8716
8717 {
8718 name = "unc_path_regex___unc_path_regex_0.1.2.tgz";
8719 path = fetchurl {
8720 name = "unc_path_regex___unc_path_regex_0.1.2.tgz";
8721 url = "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz";
8722 sha1 = "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa";
8723 };
8724 }
8725
8726 {
8727 name = "underscore.string___underscore.string_2.4.0.tgz";
8728 path = fetchurl {
8729 name = "underscore.string___underscore.string_2.4.0.tgz";
8730 url = "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz";
8731 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
8732 };
8733 }
8734
8735 {
8736 name = "underscore___underscore_1.7.0.tgz";
8737 path = fetchurl {
8738 name = "underscore___underscore_1.7.0.tgz";
8739 url = "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz";
8740 sha1 = "6bbaf0877500d36be34ecaa584e0db9fef035209";
8741 };
8742 }
8743
8744 {
8745 name = "union_value___union_value_1.0.1.tgz";
8746 path = fetchurl {
8747 name = "union_value___union_value_1.0.1.tgz";
8748 url = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz";
8749 sha1 = "0b6fe7b835aecda61c6ea4d4f02c14221e109847";
8750 };
8751 }
8752
8753 {
8754 name = "unique_stream___unique_stream_1.0.0.tgz";
8755 path = fetchurl {
8756 name = "unique_stream___unique_stream_1.0.0.tgz";
8757 url = "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz";
8758 sha1 = "d59a4a75427447d9aa6c91e70263f8d26a4b104b";
8759 };
8760 }
8761
8762 {
8763 name = "universalify___universalify_0.1.2.tgz";
8764 path = fetchurl {
8765 name = "universalify___universalify_0.1.2.tgz";
8766 url = "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz";
8767 sha1 = "b646f69be3942dabcecc9d6639c80dc105efaa66";
8768 };
8769 }
8770
8771 {
8772 name = "unpipe___unpipe_1.0.0.tgz";
8773 path = fetchurl {
8774 name = "unpipe___unpipe_1.0.0.tgz";
8775 url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
8776 sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
8777 };
8778 }
8779
8780 {
8781 name = "unset_value___unset_value_1.0.0.tgz";
8782 path = fetchurl {
8783 name = "unset_value___unset_value_1.0.0.tgz";
8784 url = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
8785 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
8786 };
8787 }
8788
8789 {
8790 name = "update_notifier___update_notifier_0.2.2.tgz";
8791 path = fetchurl {
8792 name = "update_notifier___update_notifier_0.2.2.tgz";
8793 url = "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.2.2.tgz";
8794 sha1 = "e69b3a784b4e686a2acd98f5e66944591996e187";
8795 };
8796 }
8797
8798 {
8799 name = "uri_js___uri_js_4.2.2.tgz";
8800 path = fetchurl {
8801 name = "uri_js___uri_js_4.2.2.tgz";
8802 url = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
8803 sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
8804 };
8805 }
8806
8807 {
8808 name = "urix___urix_0.1.0.tgz";
8809 path = fetchurl {
8810 name = "urix___urix_0.1.0.tgz";
8811 url = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
8812 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
8813 };
8814 }
8815
8816 {
8817 name = "url___url_0.10.3.tgz";
8818 path = fetchurl {
8819 name = "url___url_0.10.3.tgz";
8820 url = "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz";
8821 sha1 = "021e4d9c7705f21bbf37d03ceb58767402774c64";
8822 };
8823 }
8824
8825 {
8826 name = "use___use_3.1.1.tgz";
8827 path = fetchurl {
8828 name = "use___use_3.1.1.tgz";
8829 url = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
8830 sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
8831 };
8832 }
8833
8834 {
8835 name = "user_home___user_home_1.1.1.tgz";
8836 path = fetchurl {
8837 name = "user_home___user_home_1.1.1.tgz";
8838 url = "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz";
8839 sha1 = "2b5be23a32b63a7c9deb8d0f28d485724a3df190";
8840 };
8841 }
8842
8843 {
8844 name = "useragent___useragent_2.3.0.tgz";
8845 path = fetchurl {
8846 name = "useragent___useragent_2.3.0.tgz";
8847 url = "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz";
8848 sha1 = "217f943ad540cb2128658ab23fc960f6a88c9972";
8849 };
8850 }
8851
8852 {
8853 name = "util_deprecate___util_deprecate_1.0.2.tgz";
8854 path = fetchurl {
8855 name = "util_deprecate___util_deprecate_1.0.2.tgz";
8856 url = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
8857 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
8858 };
8859 }
8860
8861 {
8862 name = "util___util_0.10.3.tgz";
8863 path = fetchurl {
8864 name = "util___util_0.10.3.tgz";
8865 url = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
8866 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
8867 };
8868 }
8869
8870 {
8871 name = "util___util_0.10.4.tgz";
8872 path = fetchurl {
8873 name = "util___util_0.10.4.tgz";
8874 url = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
8875 sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
8876 };
8877 }
8878
8879 {
8880 name = "utils_merge___utils_merge_1.0.1.tgz";
8881 path = fetchurl {
8882 name = "utils_merge___utils_merge_1.0.1.tgz";
8883 url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
8884 sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
8885 };
8886 }
8887
8888 {
8889 name = "uuid___uuid_2.0.3.tgz";
8890 path = fetchurl {
8891 name = "uuid___uuid_2.0.3.tgz";
8892 url = "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz";
8893 sha1 = "67e2e863797215530dff318e5bf9dcebfd47b21a";
8894 };
8895 }
8896
8897 {
8898 name = "uuid___uuid_3.4.0.tgz";
8899 path = fetchurl {
8900 name = "uuid___uuid_3.4.0.tgz";
8901 url = "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz";
8902 sha1 = "b23e4358afa8a202fe7a100af1f5f883f02007ee";
8903 };
8904 }
8905
8906 {
8907 name = "uuid___uuid_1.4.2.tgz";
8908 path = fetchurl {
8909 name = "uuid___uuid_1.4.2.tgz";
8910 url = "https://registry.yarnpkg.com/uuid/-/uuid-1.4.2.tgz";
8911 sha1 = "453019f686966a6df83cdc5244e7c990ecc332fc";
8912 };
8913 }
8914
8915 {
8916 name = "v8flags___v8flags_2.1.1.tgz";
8917 path = fetchurl {
8918 name = "v8flags___v8flags_2.1.1.tgz";
8919 url = "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz";
8920 sha1 = "aab1a1fa30d45f88dd321148875ac02c0b55e5b4";
8921 };
8922 }
8923
8924 {
8925 name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
8926 path = fetchurl {
8927 name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
8928 url = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
8929 sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
8930 };
8931 }
8932
8933 {
8934 name = "verror___verror_1.10.0.tgz";
8935 path = fetchurl {
8936 name = "verror___verror_1.10.0.tgz";
8937 url = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
8938 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
8939 };
8940 }
8941
8942 {
8943 name = "vinyl_fs___vinyl_fs_0.3.14.tgz";
8944 path = fetchurl {
8945 name = "vinyl_fs___vinyl_fs_0.3.14.tgz";
8946 url = "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz";
8947 sha1 = "9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6";
8948 };
8949 }
8950
8951 {
8952 name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.1.4.tgz";
8953 path = fetchurl {
8954 name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.1.4.tgz";
8955 url = "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz";
8956 sha1 = "c5fcbd43e2f238423c2dc98bddd6f79b72bc345b";
8957 };
8958 }
8959
8960 {
8961 name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.2.1.tgz";
8962 path = fetchurl {
8963 name = "vinyl_sourcemaps_apply___vinyl_sourcemaps_apply_0.2.1.tgz";
8964 url = "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz";
8965 sha1 = "ab6549d61d172c2b1b87be5c508d239c8ef87705";
8966 };
8967 }
8968
8969 {
8970 name = "vinyl___vinyl_0.2.3.tgz";
8971 path = fetchurl {
8972 name = "vinyl___vinyl_0.2.3.tgz";
8973 url = "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz";
8974 sha1 = "bca938209582ec5a49ad538a00fa1f125e513252";
8975 };
8976 }
8977
8978 {
8979 name = "vinyl___vinyl_0.4.6.tgz";
8980 path = fetchurl {
8981 name = "vinyl___vinyl_0.4.6.tgz";
8982 url = "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz";
8983 sha1 = "2f356c87a550a255461f36bbeb2a5ba8bf784847";
8984 };
8985 }
8986
8987 {
8988 name = "vinyl___vinyl_0.5.3.tgz";
8989 path = fetchurl {
8990 name = "vinyl___vinyl_0.5.3.tgz";
8991 url = "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz";
8992 sha1 = "b0455b38fc5e0cf30d4325132e461970c2091cde";
8993 };
8994 }
8995
8996 {
8997 name = "vinyl___vinyl_1.2.0.tgz";
8998 path = fetchurl {
8999 name = "vinyl___vinyl_1.2.0.tgz";
9000 url = "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz";
9001 sha1 = "5c88036cf565e5df05558bfc911f8656df218884";
9002 };
9003 }
9004
9005 {
9006 name = "vinyl___vinyl_2.2.0.tgz";
9007 path = fetchurl {
9008 name = "vinyl___vinyl_2.2.0.tgz";
9009 url = "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz";
9010 sha1 = "d85b07da96e458d25b2ffe19fece9f2caa13ed86";
9011 };
9012 }
9013
9014 {
9015 name = "vm_browserify___vm_browserify_0.0.4.tgz";
9016 path = fetchurl {
9017 name = "vm_browserify___vm_browserify_0.0.4.tgz";
9018 url = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz";
9019 sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
9020 };
9021 }
9022
9023 {
9024 name = "void_elements___void_elements_2.0.1.tgz";
9025 path = fetchurl {
9026 name = "void_elements___void_elements_2.0.1.tgz";
9027 url = "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz";
9028 sha1 = "c066afb582bb1cb4128d60ea92392e94d5e9dbec";
9029 };
9030 }
9031
9032 {
9033 name = "websocket_driver___websocket_driver_0.7.3.tgz";
9034 path = fetchurl {
9035 name = "websocket_driver___websocket_driver_0.7.3.tgz";
9036 url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz";
9037 sha1 = "a2d4e0d4f4f116f1e6297eba58b05d430100e9f9";
9038 };
9039 }
9040
9041 {
9042 name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
9043 path = fetchurl {
9044 name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
9045 url = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
9046 sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
9047 };
9048 }
9049
9050 {
9051 name = "which_module___which_module_1.0.0.tgz";
9052 path = fetchurl {
9053 name = "which_module___which_module_1.0.0.tgz";
9054 url = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz";
9055 sha1 = "bba63ca861948994ff307736089e3b96026c2a4f";
9056 };
9057 }
9058
9059 {
9060 name = "which___which_1.3.1.tgz";
9061 path = fetchurl {
9062 name = "which___which_1.3.1.tgz";
9063 url = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
9064 sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
9065 };
9066 }
9067
9068 {
9069 name = "which___which_1.0.9.tgz";
9070 path = fetchurl {
9071 name = "which___which_1.0.9.tgz";
9072 url = "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz";
9073 sha1 = "460c1da0f810103d0321a9b633af9e575e64486f";
9074 };
9075 }
9076
9077 {
9078 name = "wide_align___wide_align_1.1.3.tgz";
9079 path = fetchurl {
9080 name = "wide_align___wide_align_1.1.3.tgz";
9081 url = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
9082 sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
9083 };
9084 }
9085
9086 {
9087 name = "window_size___window_size_0.1.0.tgz";
9088 path = fetchurl {
9089 name = "window_size___window_size_0.1.0.tgz";
9090 url = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz";
9091 sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
9092 };
9093 }
9094
9095 {
9096 name = "with___with_5.1.1.tgz";
9097 path = fetchurl {
9098 name = "with___with_5.1.1.tgz";
9099 url = "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz";
9100 sha1 = "fa4daa92daf32c4ea94ed453c81f04686b575dfe";
9101 };
9102 }
9103
9104 {
9105 name = "word_wrap___word_wrap_1.2.3.tgz";
9106 path = fetchurl {
9107 name = "word_wrap___word_wrap_1.2.3.tgz";
9108 url = "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz";
9109 sha1 = "610636f6b1f703891bd34771ccb17fb93b47079c";
9110 };
9111 }
9112
9113 {
9114 name = "wordwrap___wordwrap_0.0.2.tgz";
9115 path = fetchurl {
9116 name = "wordwrap___wordwrap_0.0.2.tgz";
9117 url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz";
9118 sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
9119 };
9120 }
9121
9122 {
9123 name = "wordwrap___wordwrap_1.0.0.tgz";
9124 path = fetchurl {
9125 name = "wordwrap___wordwrap_1.0.0.tgz";
9126 url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz";
9127 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
9128 };
9129 }
9130
9131 {
9132 name = "wordwrap___wordwrap_0.0.3.tgz";
9133 path = fetchurl {
9134 name = "wordwrap___wordwrap_0.0.3.tgz";
9135 url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz";
9136 sha1 = "a3d5da6cd5c0bc0008d37234bbaf1bed63059107";
9137 };
9138 }
9139
9140 {
9141 name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
9142 path = fetchurl {
9143 name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
9144 url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
9145 sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
9146 };
9147 }
9148
9149 {
9150 name = "wrappy___wrappy_1.0.2.tgz";
9151 path = fetchurl {
9152 name = "wrappy___wrappy_1.0.2.tgz";
9153 url = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
9154 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
9155 };
9156 }
9157
9158 {
9159 name = "ws___ws_1.1.5.tgz";
9160 path = fetchurl {
9161 name = "ws___ws_1.1.5.tgz";
9162 url = "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz";
9163 sha1 = "cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51";
9164 };
9165 }
9166
9167 {
9168 name = "wtf_8___wtf_8_1.0.0.tgz";
9169 path = fetchurl {
9170 name = "wtf_8___wtf_8_1.0.0.tgz";
9171 url = "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz";
9172 sha1 = "392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
9173 };
9174 }
9175
9176 {
9177 name = "xdg_basedir___xdg_basedir_1.0.1.tgz";
9178 path = fetchurl {
9179 name = "xdg_basedir___xdg_basedir_1.0.1.tgz";
9180 url = "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-1.0.1.tgz";
9181 sha1 = "14ff8f63a4fdbcb05d5b6eea22b36f3033b9f04e";
9182 };
9183 }
9184
9185 {
9186 name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
9187 path = fetchurl {
9188 name = "xmlhttprequest_ssl___xmlhttprequest_ssl_1.5.3.tgz";
9189 url = "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz";
9190 sha1 = "185a888c04eca46c3e4070d99f7b49de3528992d";
9191 };
9192 }
9193
9194 {
9195 name = "xtend___xtend_4.0.2.tgz";
9196 path = fetchurl {
9197 name = "xtend___xtend_4.0.2.tgz";
9198 url = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz";
9199 sha1 = "bb72779f5fa465186b1f438f674fa347fdb5db54";
9200 };
9201 }
9202
9203 {
9204 name = "xtend___xtend_3.0.0.tgz";
9205 path = fetchurl {
9206 name = "xtend___xtend_3.0.0.tgz";
9207 url = "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz";
9208 sha1 = "5cce7407baf642cba7becda568111c493f59665a";
9209 };
9210 }
9211
9212 {
9213 name = "xtend___xtend_2.1.2.tgz";
9214 path = fetchurl {
9215 name = "xtend___xtend_2.1.2.tgz";
9216 url = "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz";
9217 sha1 = "6efecc2a4dad8e6962c4901b337ce7ba87b5d28b";
9218 };
9219 }
9220
9221 {
9222 name = "y18n___y18n_3.2.1.tgz";
9223 path = fetchurl {
9224 name = "y18n___y18n_3.2.1.tgz";
9225 url = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
9226 sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
9227 };
9228 }
9229
9230 {
9231 name = "yallist___yallist_2.1.2.tgz";
9232 path = fetchurl {
9233 name = "yallist___yallist_2.1.2.tgz";
9234 url = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
9235 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
9236 };
9237 }
9238
9239 {
9240 name = "yallist___yallist_3.1.1.tgz";
9241 path = fetchurl {
9242 name = "yallist___yallist_3.1.1.tgz";
9243 url = "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz";
9244 sha1 = "dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd";
9245 };
9246 }
9247
9248 {
9249 name = "yargs_parser___yargs_parser_5.0.0.tgz";
9250 path = fetchurl {
9251 name = "yargs_parser___yargs_parser_5.0.0.tgz";
9252 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz";
9253 sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
9254 };
9255 }
9256
9257 {
9258 name = "yargs___yargs_7.1.0.tgz";
9259 path = fetchurl {
9260 name = "yargs___yargs_7.1.0.tgz";
9261 url = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz";
9262 sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8";
9263 };
9264 }
9265
9266 {
9267 name = "yargs___yargs_3.10.0.tgz";
9268 path = fetchurl {
9269 name = "yargs___yargs_3.10.0.tgz";
9270 url = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz";
9271 sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
9272 };
9273 }
9274
9275 {
9276 name = "yargs___yargs_3.5.4.tgz";
9277 path = fetchurl {
9278 name = "yargs___yargs_3.5.4.tgz";
9279 url = "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz";
9280 sha1 = "d8aff8f665e94c34bd259bdebd1bfaf0ddd35361";
9281 };
9282 }
9283
9284 {
9285 name = "yeast___yeast_0.1.2.tgz";
9286 path = fetchurl {
9287 name = "yeast___yeast_0.1.2.tgz";
9288 url = "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz";
9289 sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
9290 };
9291 }
9292 ];
9293}
diff --git a/flakes/private/buildbot/common/build_helpers.py b/flakes/private/buildbot/common/build_helpers.py
new file mode 100644
index 0000000..77e6c07
--- /dev/null
+++ b/flakes/private/buildbot/common/build_helpers.py
@@ -0,0 +1,293 @@
1from buildbot.plugins import util, steps, schedulers
2from buildbot_buildslist import BuildsList
3from shutil import which
4
5__all__ = [
6 "force_scheduler", "deploy_scheduler", "git_hook_scheduler",
7 "clean_branch", "package_and_upload", "AppriseStatusPush",
8 "XMPPStatusPush", "NixShellCommand",
9 "all_builder_names", "compute_build_infos", "deploy_ssh_command",
10 "configure_apprise_push",
11 "configure_xmpp_push", "deploy_hook_scheduler",
12 ]
13
14# Small helpers"
15@util.renderer
16def clean_branch(props):
17 if props.hasProperty("branch") and len(props["branch"]) > 0:
18 return props["branch"].replace("/", "_")
19 else:
20 return "HEAD"
21
22def package_and_upload(package, package_dest, package_url):
23 return [
24 steps.ShellCommand(name="build package",
25 logEnviron=False, haltOnFailure=True,
26 command=["git", "archive", "HEAD", "-o", package]),
27
28 steps.FileUpload(name="upload package", workersrc=package,
29 masterdest=package_dest,
30 url=package_url, mode=0o644),
31
32 steps.ShellCommand(name="cleanup package", logEnviron=False,
33 haltOnFailure=True, alwaysRun=True,
34 command=["rm", "-f", package]),
35 ]
36
37# Steps
38class NixShellCommand(steps.ShellCommand):
39 def __init__(self, command=None, nixPackages=[], pure=True, nixFile=None, nixIncludes={}, nixArgs={}, **kwargs):
40 oldpath = kwargs.get("env", {}).get("PATH", None)
41 if which("nix-shell", path=oldpath) is None:
42 kwargs["env"] = kwargs.get("env", {})
43 if isinstance(oldpath, str):
44 kwargs["env"]["PATH"] = "/run/current-system/sw/bin:" + oldpath
45 elif isinstance(oldpath, list):
46 kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath
47 nixcommand = ["nix-shell"]
48 for k, v in nixArgs.items():
49 nixcommand.append("--arg")
50 nixcommand.append(k)
51 nixcommand.append(v)
52 if pure:
53 nixcommand.append("--pure")
54 for k, v in nixIncludes.items():
55 nixcommand.append("-I")
56 nixcommand.append("{}={}".format(k, v))
57 nixcommand.append("--run")
58 nixcommand.append(command)
59 if len(nixPackages) > 0:
60 nixcommand.append("-p")
61 nixcommand += nixPackages
62 elif nixFile is not None:
63 nixcommand.append(nixFile)
64 super().__init__(command=nixcommand, **kwargs)
65
66# Schedulers
67def force_scheduler(name, builders, nobranch=False):
68 if nobranch:
69 branch = util.FixedParameter(name="branch", default="")
70 else:
71 branch=util.StringParameter(name="branch", label="Git reference (tag, branch)", required=True)
72
73 return schedulers.ForceScheduler(name=name,
74 label="Force build", buttonName="Force build",
75 reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
76 codebases=[
77 util.CodebaseParameter("",
78 branch=branch,
79 revision=util.FixedParameter(name="revision", default=""),
80 repository=util.FixedParameter(name="repository", default=""),
81 project=util.FixedParameter(name="project", default=""),
82 ),
83 ],
84 username=util.FixedParameter(name="username", default="Web button"),
85 builderNames=builders)
86
87def deploy_scheduler(name, builders):
88 return schedulers.ForceScheduler(name=name,
89 builderNames=builders,
90 label="Deploy built package", buttonName="Deploy",
91 username=util.FixedParameter(name="username", default="Web button"),
92 codebases=[
93 util.CodebaseParameter(codebase="",
94 branch=util.FixedParameter(name="branch", default=""),
95 revision=util.FixedParameter(name="revision", default=""),
96 repository=util.FixedParameter(name="repository", default=""),
97 project=util.FixedParameter(name="project", default=""))],
98 reason=util.FixedParameter(name="reason", default="Deploy"),
99 properties=[
100 util.ChoiceStringParameter(label="Environment",
101 name="environment", default="integration",
102 choices=["integration", "production"]),
103 BuildsList(label="Build to deploy", name="build"),
104 ]
105 )
106
107def git_hook_scheduler(project, builders=[], timer=1):
108 if len(builders) == 0:
109 builders = ["{}_build".format(project)]
110 return schedulers.AnyBranchScheduler(
111 change_filter=util.ChangeFilter(category="gitolite-hooks", project=project),
112 name="{}_git_hook".format(project), treeStableTimer=timer, builderNames=builders)
113
114def deploy_hook_scheduler(project, builders, timer=1):
115 return schedulers.AnyBranchScheduler(
116 change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
117 name="{}_deploy".format(project), treeStableTimer=timer, builderNames=builders)
118
119# Builders
120def all_builder_names(c):
121 return [builder.name for builder in c['builders']]
122
123# Apprise/XMPP status push
124from buildbot.reporters.http import HttpStatusPushBase
125from twisted.internet import defer
126from twisted.python import log
127from buildbot.reporters import utils
128from buildbot.process import results
129from twisted.words.protocols.jabber.jid import JID
130from wokkel import client, xmppim
131from functools import partial
132import apprise
133
134class AppriseStatusPush(HttpStatusPushBase):
135 name = "AppriseStatusPush"
136
137 @defer.inlineCallbacks
138 def reconfigService(self, appriseUrls, **kwargs):
139 self.appriseUrls = appriseUrls
140 yield HttpStatusPushBase.reconfigService(self, **kwargs)
141
142 @defer.inlineCallbacks
143 def send(self, build):
144 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
145 appobject = apprise.Apprise()
146 message = self.format(build)
147 for url in self.appriseUrls:
148 appobject.add(url.format(**message))
149 yield appobject.notify(title=message["title"], body=message["text"])
150
151 def format(self, build):
152 if "environment" in build["properties"]:
153 msg = "{} environment".format(build["properties"]["environment"][0])
154 if "build" in build["properties"]:
155 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
156 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
157 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
158 else:
159 msg = "build"
160
161 if build["complete"]:
162 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
163 hours, rest = divmod(timedelta, 3600)
164 minutes, seconds = divmod(rest, 60)
165 if hours > 0:
166 duration = "{}h {}min {}s".format(hours, minutes, seconds)
167 elif minutes > 0:
168 duration = "{}min {}s".format(minutes, seconds)
169 else:
170 duration = "{}s".format(seconds)
171
172 text = "Build {} ({}) of {}'s {} was {} in {}.".format(
173 build["number"], build["url"],
174 build["builder"]["name"],
175 msg,
176 results.Results[build["results"]],
177 duration,
178 )
179 else:
180 text = "Build {} ({}) of {}'s {} started.".format(
181 build["number"], build["url"],
182 build["builder"]["name"],
183 msg,
184 )
185 return {
186 "username": "Buildbot",
187 "image_url": "http://docs.buildbot.net/current/_static/icon.png",
188 "text": text,
189 "title": "",
190 }
191
192def configure_apprise_push(c, secrets_file, builders):
193 c['services'].append(AppriseStatusPush(
194 name="apprise_status", builders=builders,
195 appriseUrls=open(secrets_file + "/apprise_webhooks", "r").read().split("\n")))
196
197class XMPPStatusPush(HttpStatusPushBase):
198 name = "XMPPStatusPush"
199
200 @defer.inlineCallbacks
201 def reconfigService(self, password, recipients, **kwargs):
202 yield HttpStatusPushBase.reconfigService(self, **kwargs)
203 self.password = password
204 self.recipients = recipients
205
206 @defer.inlineCallbacks
207 def send(self, build):
208 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
209 body = self.format(build)
210 factory = client.DeferredClientFactory(JID("notify_bot@immae.fr/buildbot"), self.password)
211 d = client.clientCreator(factory)
212 def send_message(recipient, stream):
213 message = xmppim.Message(recipient=JID(recipient), body=body)
214 message.stanzaType = 'chat'
215 stream.send(message.toElement())
216 # To allow chaining
217 return stream
218 for recipient in self.recipients:
219 d.addCallback(partial(send_message, recipient))
220 d.addCallback(lambda _: factory.streamManager.xmlstream.sendFooter())
221 d.addErrback(log.err)
222
223 def format(self, build):
224 if "environment" in build["properties"]:
225 msg = "{} environment".format(build["properties"]["environment"][0])
226 if "build" in build["properties"]:
227 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
228 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
229 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
230 else:
231 msg = "build"
232
233 if build["complete"]:
234 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
235 hours, rest = divmod(timedelta, 3600)
236 minutes, seconds = divmod(rest, 60)
237 if hours > 0:
238 duration = "{}h {}min {}s".format(hours, minutes, seconds)
239 elif minutes > 0:
240 duration = "{}min {}s".format(minutes, seconds)
241 else:
242 duration = "{}s".format(seconds)
243
244 text = "Build {} ( {} ) of {}'s {} was {} in {}.".format(
245 build["number"], build["url"],
246 build["builder"]["name"],
247 msg,
248 results.Results[build["results"]],
249 duration,
250 )
251 else:
252 text = "Build {} ( {} ) of {}'s {} started.".format(
253 build["number"], build["url"],
254 build["builder"]["name"],
255 msg,
256 )
257
258 return text
259
260def configure_xmpp_push(c, secrets_file, builders, recipients):
261 c['services'].append(XMPPStatusPush(
262 name="xmpp_status", builders=builders, recipients=recipients,
263 password=open(secrets_file + "/notify_xmpp_password", "r").read().rstrip()))
264
265# LDAP edit
266from buildbot.process.buildstep import FAILURE
267from buildbot.process.buildstep import SUCCESS
268from buildbot.process.buildstep import BuildStep
269
270def compute_build_infos(prefix, release_path):
271 @util.renderer
272 def compute(props):
273 import re, hashlib
274 build_file = props.getProperty("build")
275 package_dest = "{}/{}".format(release_path, build_file)
276 version = re.match(r"{0}_(.*).tar.gz".format(prefix), build_file).group(1)
277 with open(package_dest, "rb") as f:
278 sha = hashlib.sha256(f.read()).hexdigest()
279 return {
280 "build_version": version,
281 "build_hash": sha,
282 }
283 return compute
284
285def deploy_ssh_command(ssh_key_path, deploy_hosts):
286 @util.renderer
287 def compute(props):
288 environment = props["environment"] if props.hasProperty("environment") else "integration"
289 ssh_command = [
290 "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no",
291 "-i", ssh_key_path ]
292 return ssh_command + deploy_hosts.get(environment, ["host.invalid"])
293 return compute
diff --git a/flakes/private/buildbot/common/libvirt.py b/flakes/private/buildbot/common/libvirt.py
new file mode 100644
index 0000000..e250627
--- /dev/null
+++ b/flakes/private/buildbot/common/libvirt.py
@@ -0,0 +1,318 @@
1# This file was part of Buildbot. Buildbot is free software: you can
2# redistribute it and/or modify it under the terms of the GNU General Public
3# License as published by the Free Software Foundation, version 2.
4#
5# This program is distributed in the hope that it will be useful, but WITHOUT
6# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
8# details.
9#
10# You should have received a copy of the GNU General Public License along with
11# this program; if not, write to the Free Software Foundation, Inc., 51
12# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
13#
14# Portions Copyright Buildbot Team Members
15# Portions Copyright 2010 Isotoma Limited
16
17
18import os
19
20from twisted.internet import defer
21from twisted.internet import threads
22from twisted.internet import utils
23from twisted.python import failure
24from twisted.python import log
25
26from buildbot import config
27from buildbot.util.eventual import eventually
28from buildbot.worker import AbstractLatentWorker
29
30try:
31 import libvirt
32except ImportError:
33 libvirt = None
34
35import random
36import string
37
38def random_string_generator():
39 chars = string.ascii_letters
40 return ''.join(random.choice(chars) for x in range(6))
41
42class WorkQueue:
43
44 """
45 I am a class that turns parallel access into serial access.
46
47 I exist because we want to run libvirt access in threads as we don't
48 trust calls not to block, but under load libvirt doesn't seem to like
49 this kind of threaded use.
50 """
51
52 def __init__(self):
53 self.queue = []
54
55 def _process(self):
56 log.msg("Looking to start a piece of work now...")
57
58 # Is there anything to do?
59 if not self.queue:
60 log.msg("_process called when there is no work")
61 return
62
63 # Peek at the top of the stack - get a function to call and
64 # a deferred to fire when its all over
65 d, next_operation, args, kwargs = self.queue[0]
66
67 # Start doing some work - expects a deferred
68 try:
69 d2 = next_operation(*args, **kwargs)
70 except Exception:
71 d2 = defer.fail()
72
73 # Whenever a piece of work is done, whether it worked or not
74 # call this to schedule the next piece of work
75 @d2.addBoth
76 def _work_done(res):
77 log.msg("Completed a piece of work")
78 self.queue.pop(0)
79 if self.queue:
80 log.msg("Preparing next piece of work")
81 eventually(self._process)
82 return res
83
84 # When the work is done, trigger d
85 d2.chainDeferred(d)
86
87 def execute(self, cb, *args, **kwargs):
88 kickstart_processing = not self.queue
89 d = defer.Deferred()
90 self.queue.append((d, cb, args, kwargs))
91 if kickstart_processing:
92 self._process()
93 return d
94
95 def executeInThread(self, cb, *args, **kwargs):
96 return self.execute(threads.deferToThread, cb, *args, **kwargs)
97
98
99# A module is effectively a singleton class, so this is OK
100queue = WorkQueue()
101
102
103class Domain:
104
105 """
106 I am a wrapper around a libvirt Domain object
107 """
108
109 def __init__(self, connection, domain):
110 self.connection = connection
111 self.domain = domain
112
113 def name(self):
114 return queue.executeInThread(self.domain.name)
115
116 def create(self):
117 return queue.executeInThread(self.domain.create)
118
119 def shutdown(self):
120 return queue.executeInThread(self.domain.shutdown)
121
122 def destroy(self):
123 return queue.executeInThread(self.domain.destroy)
124
125class Volume:
126 def __init__(self, connection, volume):
127 self.connection = connection
128 self.volume = volume
129
130 @defer.inlineCallbacks
131 def destroy(self):
132 yield queue.executeInThread(self.volume.wipe)
133 yield queue.executeInThread(self.volume.delete)
134
135class Pool:
136 VolumeClass = Volume
137 def __init__(self, connection, pool):
138 self.connection = connection
139 self.pool = pool
140
141 @defer.inlineCallbacks
142 def create_volume(self, xml):
143 res = yield queue.executeInThread(self.pool.createXML, xml)
144 return self.VolumeClass(self.connection, res)
145
146class Connection:
147
148 """
149 I am a wrapper around a libvirt Connection object.
150 """
151
152 DomainClass = Domain
153 PoolClass = Pool
154
155 def __init__(self, uri):
156 self.uri = uri
157 self._connection = None
158
159 @property
160 def connection(self):
161 if self._connection is not None:
162 try:
163 if not self._connection.isAlive():
164 self._connection = None
165 except:
166 self._connection = None
167 if self._connection is None:
168 self._connection = libvirt.open(self.uri)
169 return self._connection
170
171 @defer.inlineCallbacks
172 def create(self, xml):
173 """ I take libvirt XML and start a new VM """
174 res = yield queue.executeInThread(self.connection.createXML, xml, 0)
175 return self.DomainClass(self, res)
176
177 @defer.inlineCallbacks
178 def lookup_pool(self, name):
179 res = yield queue.executeInThread(self.connection.storagePoolLookupByName, name)
180 return self.PoolClass(self, res)
181
182class LibVirtWorker(AbstractLatentWorker):
183
184 def __init__(self, name, password, connection, master_url, base_image=None, **kwargs):
185 super().__init__(name, password, **kwargs)
186 if not libvirt:
187 config.error(
188 "The python module 'libvirt' is needed to use a LibVirtWorker")
189
190 self.master_url = master_url
191 self.random_name = random_string_generator()
192 self.connection = connection
193 self.base_image = base_image
194
195 self.domain = None
196 self.domain_name = "buildbot-" + self.workername + "-" + self.random_name
197 self.volume = None
198 self.volume_name = "buildbot-" + self.workername + "-" + self.random_name
199 self.pool_name = "buildbot-disks"
200
201 def reconfigService(self, *args, **kwargs):
202 if 'build_wait_timeout' not in kwargs:
203 kwargs['build_wait_timeout'] = 0
204 return super().reconfigService(*args, **kwargs)
205
206 def canStartBuild(self):
207 if self.domain and not self.isConnected():
208 log.msg(
209 "Not accepting builds as existing domain but worker not connected")
210 return False
211
212 return super().canStartBuild()
213
214 @defer.inlineCallbacks
215 def _prepare_image(self):
216 log.msg("Creating temporary image {}".format(self.volume_name))
217 pool = yield self.connection.lookup_pool(self.pool_name)
218 vol_xml = """
219 <volume type='file'>
220 <name>{vol_name}</name>
221 <capacity unit='G'>10</capacity>
222 <target>
223 <format type='qcow2'/>
224 <permissions>
225 <mode>0600</mode>
226 <owner>0</owner>
227 <group>0</group>
228 </permissions>
229 </target>
230 <backingStore>
231 <path>/etc/libvirtd/base-images/buildbot.qcow2</path>
232 <format type='qcow2'/>
233 </backingStore>
234 </volume>
235 """.format(vol_name = self.volume_name)
236 self.volume = yield pool.create_volume(vol_xml)
237
238 @defer.inlineCallbacks
239 def start_instance(self, build):
240 """
241 I start a new instance of a VM.
242
243 If a base_image is specified, I will make a clone of that otherwise i will
244 use image directly.
245
246 If i'm not given libvirt domain definition XML, I will look for my name
247 in the list of defined virtual machines and start that.
248 """
249 domain_xml = """
250 <domain type="kvm">
251 <name>{domain_name}</name>
252 <memory unit="GiB">2</memory>
253 <vcpu>1</vcpu>
254 <sysinfo type='smbios'>
255 <oemStrings>
256 <entry>buildbot_master_url={master_url}</entry>
257 <entry>buildbot_worker_name={worker_name}</entry>
258 </oemStrings>
259 </sysinfo>
260 <os>
261 <type arch="x86_64">hvm</type>
262 <smbios mode='sysinfo'/>
263 </os>
264 <devices>
265 <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator>
266 <disk type="volume" device="disk">
267 <driver name='qemu' type='qcow2' />
268 <source type="volume" pool="{pool_name}" volume="{volume_name}" />
269 <backingStore type='volume'>
270 <format type='qcow2'/>
271 <source type="volume" pool="niximages" volume="buildbot.qcow2" />
272 </backingStore>
273 <target dev="vda" bus="virtio"/>
274 </disk>
275 <input type="keyboard" bus="usb"/>
276 <graphics type="vnc" port="-1" autoport="yes"/>
277 <interface type="network">
278 <source network="immae" />
279 </interface>
280 </devices>
281 </domain>
282 """.format(volume_name = self.volume_name, master_url = self.master_url, pool_name =
283 self.pool_name, domain_name = self.domain_name, worker_name = self.workername)
284
285 yield self._prepare_image()
286
287 try:
288 self.domain = yield self.connection.create(domain_xml)
289 except Exception:
290 log.err(failure.Failure(),
291 ("Cannot start a VM ({}), failing gracefully and triggering"
292 "a new build check").format(self.workername))
293 self.domain = None
294 return False
295
296 return [self.domain_name]
297
298 def stop_instance(self, fast=False):
299 """
300 I attempt to stop a running VM.
301 I make sure any connection to the worker is removed.
302 If the VM was using a cloned image, I remove the clone
303 When everything is tidied up, I ask that bbot looks for work to do
304 """
305
306 log.msg("Attempting to stop '{}'".format(self.workername))
307 if self.domain is None:
308 log.msg("I don't think that domain is even running, aborting")
309 return defer.succeed(None)
310
311 domain = self.domain
312 self.domain = None
313
314 d = domain.destroy()
315 if self.volume is not None:
316 self.volume.destroy()
317
318 return d
diff --git a/flakes/private/buildbot/common/master.cfg b/flakes/private/buildbot/common/master.cfg
new file mode 100644
index 0000000..0357f2a
--- /dev/null
+++ b/flakes/private/buildbot/common/master.cfg
@@ -0,0 +1,93 @@
1# -*- python -*-
2# ex: set filetype=python:
3
4from buildbot.plugins import secrets, util, webhooks
5from buildbot.util import bytes2unicode
6import re
7import os
8from buildbot_config import E, configure
9import json
10
11class CustomBase(webhooks.base):
12 def getChanges(self, request):
13 try:
14 content = request.content.read()
15 args = json.loads(bytes2unicode(content))
16 except Exception as e:
17 raise ValueError("Error loading JSON: " + str(e))
18
19 args.setdefault("comments", "")
20 args.setdefault("repository", "")
21 args.setdefault("author", args.get("who"))
22
23 return ([args], None)
24
25class GitoliteHook(webhooks.base):
26 def getChanges(self, request):
27 try:
28 branch = request.args[b"branch"][0].decode("utf-8")
29 project = request.args[b"project"][0].decode("utf-8")
30 repository = request.args[b"repository"][0].decode("utf-8")
31 author = request.args[b"author"][0].decode("utf-8")
32 except Exception as e:
33 raise ValueError("Error missing key in request: " + str(e))
34
35 args = {
36 "author": "gitolite for " + author,
37 "category": "gitolite-hooks",
38 "comments": "gitolite post-receive hook",
39 "branch": branch,
40 "project": project,
41 "repository": repository,
42 }
43
44 return ([args], None)
45
46userInfoProvider = util.LdapUserInfo(
47 uri=E.LDAP_URL,
48 bindUser=E.LDAP_ADMIN_USER,
49 bindPw=open(E.SECRETS_FILE + "/ldap", "r").read().rstrip(),
50 accountBase=E.LDAP_BASE,
51 accountPattern=E.LDAP_PATTERN,
52 accountFullName='cn',
53 accountEmail='mail',
54 avatarData="jpegPhoto",
55 groupBase=E.LDAP_BASE,
56 groupName="cn",
57 groupMemberPattern=E.LDAP_GROUP_PATTERN,
58 )
59
60c = BuildmasterConfig = {
61 "title": E.TITLE,
62 "titleURL": E.TITLE_URL,
63 "db": {
64 "db_url": "sqlite:///state.sqlite"
65 },
66 "protocols": { "pb": { "port": E.PB_SOCKET } },
67 "workers": [],
68 "change_source": [],
69 "schedulers": [],
70 "builders": [],
71 "services": [],
72 "secretsProviders": [
73 secrets.SecretInAFile(E.SECRETS_FILE),
74 ],
75 "www": {
76 "change_hook_dialects": {
77 "base": { "custom_class": CustomBase },
78 "gitolite": { "custom_class": GitoliteHook },
79 },
80 "plugins": {
81 "waterfall_view": {},
82 "console_view": {},
83 "grid_view": {},
84 "buildslist": {},
85 },
86 "auth": util.RemoteUserAuth(
87 header=b"X-Remote-User",
88 userInfoProvider=userInfoProvider,
89 headerRegex=re.compile(br"(?P<username>[^ @]+)")),
90 }
91 }
92
93configure(c)
diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock
new file mode 100644
index 0000000..8952f75
--- /dev/null
+++ b/flakes/private/buildbot/flake.lock
@@ -0,0 +1,61 @@
1{
2 "nodes": {
3 "buildslist": {
4 "flake": false,
5 "locked": {
6 "lastModified": 1585697026,
7 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
8 "ref": "master",
9 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
10 "revCount": 4,
11 "type": "git",
12 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
13 },
14 "original": {
15 "type": "git",
16 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
17 }
18 },
19 "flake-utils": {
20 "locked": {
21 "lastModified": 1648297722,
22 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
23 "owner": "numtide",
24 "repo": "flake-utils",
25 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
26 "type": "github"
27 },
28 "original": {
29 "owner": "numtide",
30 "repo": "flake-utils",
31 "type": "github"
32 }
33 },
34 "nixpkgs": {
35 "flake": false,
36 "locked": {
37 "lastModified": 1596265691,
38 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
39 "owner": "NixOS",
40 "repo": "nixpkgs",
41 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
42 "type": "github"
43 },
44 "original": {
45 "owner": "NixOS",
46 "repo": "nixpkgs",
47 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
48 "type": "github"
49 }
50 },
51 "root": {
52 "inputs": {
53 "buildslist": "buildslist",
54 "flake-utils": "flake-utils",
55 "nixpkgs": "nixpkgs"
56 }
57 }
58 },
59 "root": "root",
60 "version": 7
61}
diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix
new file mode 100644
index 0000000..8b3c704
--- /dev/null
+++ b/flakes/private/buildbot/flake.nix
@@ -0,0 +1,74 @@
1{
2 description = "The continuous integration framework";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.buildslist = {
9 url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist";
10 type = "git";
11 flake = false;
12 };
13 outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
14 let
15 pkgs = import nixpkgs { inherit system; overlays = []; };
16 python = pkgs.python38;
17 wokkel = python.pkgs.buildPythonPackage rec {
18 pname = "wokkel";
19 version = "18.0.0";
20 src = python.pkgs.fetchPypi {
21 inherit pname version;
22 sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
23 };
24 propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ];
25 doCheck = false;
26 };
27 buildbot_common = python.pkgs.buildPythonPackage {
28 name = "buildbot_common";
29 src = ./common;
30 format = "other";
31 installPhase = ''
32 mkdir -p $out/${python.sitePackages}
33 cp -a $src $out/${python.sitePackages}/buildbot_common
34 '';
35 };
36 buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // {
37 inherit buildbot_common;
38 buildbot_config = project: python.pkgs.buildPythonPackage (rec {
39 name = "buildbot_config-${project.name}";
40 src = if project.name == "test" then ./test_project else project.src;
41 format = "other";
42 installPhase = ''
43 mkdir -p $out/${python.sitePackages}
44 cp -a $src $out/${python.sitePackages}/buildbot_config
45 '';
46 });
47 common_packages = pkgs: [
48 (pkgs.apprise.overridePythonAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.sleekxmpp ]; })) pkgs.libvirt pkgs.treq pkgs.ldap3
49 buildbot-full pkgs.buildbot-worker pkgs.pip buildbot_common
50 wokkel
51 ];
52 };
53 buildslist-plugin = pkgs.callPackage ./buildslist {
54 pythonPackages = python.pkgs;
55 buildslist_src = buildslist;
56 };
57 in rec {
58 packages = {
59 buildslist = buildslist-plugin;
60 buildbot-full = buildbot-full;
61 buildbot_common = buildbot_common;
62 };
63 defaultPackage = packages.buildbot-full;
64 legacyPackages = packages;
65 checks = packages;
66 }) // rec {
67 overlays = {
68 immae-buildbot = final: prev: {
69 immae-buildbot = self.defaultPackage."${final.system}";
70 };
71 };
72 overlay = overlays.immae-buildbot;
73 };
74}
diff --git a/flakes/private/buildbot/test_project/__init__.py b/flakes/private/buildbot/test_project/__init__.py
new file mode 100644
index 0000000..d5893fd
--- /dev/null
+++ b/flakes/private/buildbot/test_project/__init__.py
@@ -0,0 +1,121 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import buildbot_common.libvirt as ilibvirt
4import os
5from buildbot.util import bytes2unicode
6import json
7
8__all__ = [ "configure", "E" ]
9
10class E():
11 PROJECT = "test"
12 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
13 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
14 PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"]
15 WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET)
16 RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
17 RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT)
18 GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git"
19 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
20 LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH
21 XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
22
23 # master.cfg
24 SECRETS_FILE = os.getcwd() + "/secrets"
25 LDAP_URL = "ldaps://ldap.immae.eu:636"
26 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
27 LDAP_BASE = "dc=immae,dc=eu"
28 LDAP_PATTERN = "(uid=%(username)s)"
29 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
30 TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
31 TITLE = "Test project"
32
33class CustomBase(webhooks.base):
34 def getChanges(self, request):
35 try:
36 content = request.content.read()
37 args = json.loads(bytes2unicode(content))
38 except Exception as e:
39 raise ValueError("Error loading JSON: " + str(e))
40
41 args.setdefault("comments", "")
42 args.setdefault("repository", "")
43 args.setdefault("author", args.get("who", "unknown"))
44
45 if args["category"] == "deploy_webhook":
46 args = {
47 "category": "deploy_webhook",
48 "comments": "",
49 "repository": "",
50 "author": "unknown",
51 "project": "TestProject",
52 "properties": {
53 "environment": args.get("environment", "integration"),
54 "build": "test_{}.tar.gz".format(args.get("branch", "master"))
55 }
56 }
57
58 return ([args], None)
59
60def configure(c):
61 c["buildbotURL"] = E.BUILDBOT_URL
62 c["www"]["port"] = E.SOCKET
63
64 c["www"]["change_hook_dialects"]["base"] = { "custom_class": CustomBase }
65
66 configure_build(c)
67 configure_deploy(c)
68
69 configure_apprise_push(c, E.SECRETS_FILE, all_builder_names(c))
70 configure_xmpp_push(c, E.SECRETS_FILE, all_builder_names(c), E.XMPP_RECIPIENTS)
71
72def configure_build(c):
73 builder_name = "TestProject_build"
74 worker_name = "test-build"
75 c['schedulers'].append(force_scheduler("force_test", [builder_name]))
76 c['schedulers'].append(git_hook_scheduler("TestProject", [builder_name]))
77 c['workers'].append(libvirt_worker(worker_name))
78 c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=build_factory()))
79
80def configure_deploy(c):
81 builder_name = "TestProject_deploy"
82 worker_name = "test-deploy"
83 c['workers'].append(libvirt_worker(worker_name))
84 c['schedulers'].append(deploy_hook_scheduler("TestProject", [builder_name]))
85 c['schedulers'].append(deploy_scheduler("deploy_test", [builder_name]))
86 c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=deploy_factory()))
87
88def libvirt_worker(name):
89 return ilibvirt.LibVirtWorker(name,
90 open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
91 ilibvirt.Connection(E.LIBVIRT_URL),
92 E.WORKER_HOST)
93
94def build_factory():
95 package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
96 package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
97 package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
98
99 factory = util.BuildFactory()
100 factory.addStep(steps.Git(logEnviron=False,
101 repourl=E.GIT_URL, mode="full", method="fresh"))
102 factory.addStep(steps.ShellCommand(name="env",
103 logEnviron=False, command=["env"]))
104 factory.addStep(steps.ShellCommand(name="pwd",
105 logEnviron=False, command=["pwd"]))
106 factory.addStep(steps.ShellCommand(name="true",
107 logEnviron=False, command=["true"]))
108 factory.addStep(steps.ShellCommand(name="echo",
109 logEnviron=False, command=["echo", package]))
110 factory.addSteps(package_and_upload(package, package_dest, package_url))
111
112 return factory
113
114def deploy_factory():
115 package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
116
117 factory = util.BuildFactory()
118 factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
119 factory.addStep(steps.SetProperties(properties=compute_build_infos("test", E.RELEASE_PATH)))
120 factory.addStep(steps.MasterShellCommand(command=deploy_ssh_command(E.SSH_KEY_PATH, {})))
121 return factory
diff --git a/flakes/private/chatons/flake.lock b/flakes/private/chatons/flake.lock
new file mode 100644
index 0000000..39ed484
--- /dev/null
+++ b/flakes/private/chatons/flake.lock
@@ -0,0 +1,23 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment"
18 }
19 }
20 },
21 "root": "root",
22 "version": 7
23}
diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix
new file mode 100644
index 0000000..70fb02d
--- /dev/null
+++ b/flakes/private/chatons/flake.nix
@@ -0,0 +1,142 @@
1{
2 inputs.environment.url = "path:../environment";
3 outputs = { self, environment }: {
4 nixosModule = self.nixosModules.chatons;
5 nixosModules.chatons = { config, lib, pkgs, nodes, ... }:
6 let
7 concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value;
8 toProperties = properties: builtins.concatStringsSep "\n" (
9 lib.collect
10 (p: !(lib.isAttrs p))
11 (lib.mapAttrsRecursive
12 (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value))
13 properties));
14 before = name: {
15 "${name}" = {
16 status.level = "OK";
17 status.description = "OK";
18 install.type = "PACKAGE";
19 registration.load = "OPEN";
20 };
21 host = {
22 name = "Hetzner";
23 server.type = "PHYSICAL";
24 provider.type = "HOSTEDSERVER";
25 server.distribution = "NixOS";
26 country.name = "Allemagne";
27 country.code = "DE";
28 };
29 };
30 after = name: {
31 file = {
32 class = name;
33 protocol = "ChatonsInfos-0.5";
34 generator = "Nix derivation";
35 };
36 "${name}" = {
37 legal.url = "https://www.immae.eu/mentions.html";
38 guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
39 contact.url = "https://www.immae.eu/contacts_fr.html";
40 contact.email = config.myEnv.tools.contact;
41 startdate = "01/01/2019";
42 };
43 };
44 organization = {
45 file = {
46 class = "organization";
47 protocol = "ChatonsInfos-0.5";
48 datetime = "2021-01-11T22:23:00";
49 generator = "Nix derivation";
50 };
51 organization = {
52 country.name = "France";
53 country.code = "FR";
54 name = "ImmaeEu";
55 description = "ImmaeEu est un CHATONS des Alpes-Maritimes";
56 website = "https://www.immae.eu";
57 logo = "https://assets.immae.eu/logo.jpg";
58 socialnetworks = {
59 diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35";
60 facebook = "https://www.facebook.com/ismael.bouya";
61 mastodon = "https://mastodon.immae.eu/@immae";
62 peertube = "https://peertube.immae.eu/accounts/immae/";
63 twitter = "https://twitter.com/_immae";
64 };
65 chatrooms = {
66 xmpp = "ismael@immae.fr";
67 irc = "immae@freenode";
68 matrix = "#support:immae.eu";
69 };
70 contact.url = "https://www.immae.eu/contacts_fr.html";
71 contact.email = config.myEnv.tools.contact;
72 legal.url = "https://www.immae.eu/mentions.html";
73 guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
74 guide.user = "https://www.immae.eu/docs";
75 status.level = "ACTIVE";
76 status.description = "En activité";
77 startdate = "01/01/2019";
78 type = "COMPANY";
79 owner = {
80 logo = "https://assets.immae.eu/logo.jpg";
81 name = "Ismaël Bouya";
82 website = "https://www.immae.eu";
83 };
84 memberof.chatons = {
85 startdate = "01/07/2019";
86 status.level = "ACTIVE";
87 status.description = "Participe au collectif";
88 };
89 };
90 };
91 subname = v: if v.published or true then "subs" else "subs-hidden";
92 toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + (
93 builtins.concatStringsSep "\n" (lib.mapAttrsToList
94 (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices
95 )) + "\n" + (
96 builtins.concatStringsSep "\n" (lib.mapAttrsToList
97 (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings
98 )));
99 toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting"))));
100 toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service"))));
101
102 cfg = config.myServices.chatonsProperties;
103 mergedServices = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.services else {}) nodes);
104 mergedHostings = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.hostings else {}) nodes);
105 in {
106 imports = [
107 environment.nixosModule
108 ];
109 options.myServices.chatonsProperties.organization = lib.mkOption {
110 type = lib.types.attrsOf lib.types.unspecified;
111 default = {};
112 description = ''
113 nested attrs of strings or arrays of strings
114 '';
115 };
116 options.myServices.chatonsProperties.services = lib.mkOption {
117 type = lib.types.attrsOf lib.types.unspecified;
118 default = {};
119 description = ''
120 nested attrs of strings or arrays of strings
121 '';
122 };
123 options.myServices.chatonsProperties.hostings = lib.mkOption {
124 type = lib.types.attrsOf lib.types.unspecified;
125 default = {};
126 description = ''
127 nested attrs of strings or arrays of strings
128 '';
129 };
130 options.myServices.chatonsProperties.propertiesPath = lib.mkOption {
131 type = lib.types.package;
132 readOnly = true;
133 default = pkgs.runCommand "chatons" {} ''
134 mkdir -p $out
135 cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties
136 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)}
137 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)}
138 '';
139 };
140 };
141 };
142}
diff --git a/flakes/private/environment-dummy/flake.nix b/flakes/private/environment-dummy/flake.nix
new file mode 100644
index 0000000..5ebc27f
--- /dev/null
+++ b/flakes/private/environment-dummy/flake.nix
@@ -0,0 +1,18 @@
1{
2 description = ''
3 A dummy flake that contains a compatible structure to the one stored at
4 git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets
5 It is used as default value in "public" configurations
6 '';
7 outputs = { self }: {
8 vars-file = ./vars.yml;
9 ldap-conf = ./ldap.conf;
10 environment-file = ./environment.nix;
11 nixosModule = self.nixosModules.my-environment;
12 nixosModules.my-environment = { ... }: {
13 config.myEnv = import self.environment-file;
14 };
15 nixosModules.users-config-eldiron = { ... }: {};
16 };
17}
18
diff --git a/flakes/private/environment-dummy/ldap.conf b/flakes/private/environment-dummy/ldap.conf
new file mode 100644
index 0000000..064a4be
--- /dev/null
+++ b/flakes/private/environment-dummy/ldap.conf
@@ -0,0 +1,13 @@
1# Indices to maintain
2index objectClass eq
3index uid pres,eq
4index mail pres,sub,eq
5index cn pres,sub,eq
6index sn pres,sub,eq
7index dc eq
8index krbPrincipalName eq
9index member eq
10index memberOf eq
11
12access to *
13 by * none
diff --git a/flakes/private/environment-dummy/vars.yml b/flakes/private/environment-dummy/vars.yml
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/flakes/private/environment-dummy/vars.yml
@@ -0,0 +1 @@
{}
diff --git a/flakes/private/environment/flake.nix b/flakes/private/environment/flake.nix
new file mode 100644
index 0000000..15c079a
--- /dev/null
+++ b/flakes/private/environment/flake.nix
@@ -0,0 +1,1135 @@
1{
2 outputs = { self }: {
3 nixosModule = self.nixosModules.environment;
4 nixosModules.environment = { config, lib, name, ... }:
5 with lib;
6 with types;
7 with lists;
8 let
9 ldapOptions = {
10 base = mkOption { description = "Base of the LDAP tree"; type = str; };
11 host = mkOption { description = "Host to access LDAP"; type = str; };
12 root_dn = mkOption { description = "DN of the root user"; type = str; };
13 root_pw = mkOption { description = "Hashed password of the root user"; type = str; };
14 replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; };
15 replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; };
16 };
17 mkLdapOptions = name: more: mkOption {
18 description = "${name} LDAP configuration";
19 type = submodule {
20 options = ldapOptions // {
21 dn = mkOption { description = "DN of the ${name} user"; type = str; };
22 password = mkOption { description = "password of the ${name} user"; type = str; };
23 filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; };
24 } // more;
25 };
26 };
27 mysqlOptions = {
28 host = mkOption { description = "Host to access Mysql"; type = str; };
29 remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; };
30 port = mkOption { description = "Port to access Mysql"; type = int; };
31 socket = mkOption { description = "Socket to access Mysql"; type = path; };
32 systemUsers = mkOption {
33 description = "Attrs of user-passwords allowed to access mysql";
34 type = attrsOf str;
35 };
36 pam = mkOption {
37 description = "PAM configuration for mysql";
38 type = submodule {
39 options = {
40 dn = mkOption { description = "DN to connect as to check users"; type = str; };
41 password = mkOption { description = "DN password to connect as to check users"; type = str; };
42 filter = mkOption { description = "filter to match users"; type = str; };
43 };
44 };
45 };
46 };
47 mkMysqlOptions = name: more: mkOption {
48 description = "${name} mysql configuration";
49 type = submodule {
50 options = mysqlOptions // {
51 database = mkOption { description = "${name} database"; type = str; };
52 user = mkOption { description = "${name} user"; type = str; };
53 password = mkOption { description = "mysql password of the ${name} user"; type = str; };
54 } // more;
55 };
56 };
57 psqlOptions = {
58 host = mkOption { description = "Host to access Postgresql"; type = str; };
59 port = mkOption { description = "Port to access Postgresql"; type = str; };
60 socket = mkOption { description = "Socket to access Postgresql"; type = path; };
61 pam = mkOption {
62 description = "PAM configuration for psql";
63 type = submodule {
64 options = {
65 dn = mkOption { description = "DN to connect as to check users"; type = str; };
66 password = mkOption { description = "DN password to connect as to check users"; type = str; };
67 filter = mkOption { description = "filter to match users"; type = str; };
68 };
69 };
70 };
71 };
72 mkPsqlOptions = name: mkOption {
73 description = "${name} psql configuration";
74 type = submodule {
75 options = psqlOptions // {
76 database = mkOption { description = "${name} database"; type = str; };
77 schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; };
78 user = mkOption { description = "${name} user"; type = str; };
79 password = mkOption { description = "psql password of the ${name} user"; type = str; };
80 };
81 };
82 };
83 redisOptions = {
84 host = mkOption { description = "Host to access Redis"; type = str; };
85 port = mkOption { description = "Port to access Redis"; type = str; };
86 socket = mkOption { description = "Socket to access Redis"; type = path; };
87 dbs = mkOption {
88 description = "Attrs of db number. Each number should be unique to avoid collision!";
89 type = attrsOf str;
90 };
91 spiped_key = mkOption {
92 type = str;
93 description = ''
94 Key to use with spiped to make a secure channel to replication
95 '';
96 };
97 predixy = mkOption {
98 description = "Predixy configuration. Unused yet";
99 type = submodule {
100 options = {
101 read = mkOption { type = str; description = "Read password"; };
102 };
103 };
104 };
105 };
106 mkRedisOptions = name: mkOption {
107 description = "${name} redis configuration";
108 type = submodule {
109 options = redisOptions // {
110 db = mkOption { description = "${name} database"; type = str; };
111 };
112 };
113 };
114 smtpOptions = {
115 host = mkOption { description = "Host to access SMTP"; type = str; };
116 port = mkOption { description = "Port to access SMTP"; type = str; };
117 };
118 mkSmtpOptions = name: mkOption {
119 description = "${name} smtp configuration";
120 type = submodule {
121 options = smtpOptions // {
122 email = mkOption { description = "${name} email"; type = str; };
123 password = mkOption { description = "SMTP password of the ${name} user"; type = str; };
124 };
125 };
126 };
127 hostEnv = submodule {
128 options = {
129 fqdn = mkOption {
130 description = "Host FQDN";
131 type = str;
132 };
133 hostKey = mkOption {
134 type = nullOr str;
135 default = null;
136 description = ''
137 ssh host key
138 '';
139 };
140 isVm = mkEnableOption "The host is a vm";
141 users = mkOption {
142 type = unspecified;
143 default = pkgs: [];
144 description = ''
145 Sublist of users from realUsers. Function that takes pkgs as
146 argument and gives an array as a result
147 '';
148 };
149 emails = mkOption {
150 default = [];
151 description = "List of e-mails that the server can be a sender of";
152 type = listOf str;
153 };
154 ldap = mkOption {
155 description = ''
156 LDAP credentials for the host
157 '';
158 type = submodule {
159 options = {
160 password = mkOption { type = str; description = "Password for the LDAP connection"; };
161 dn = mkOption { type = str; description = "DN for the LDAP connection"; };
162 };
163 };
164 };
165 mx = mkOption {
166 description = "subdomain and priority for MX server";
167 default = { enable = false; };
168 type = submodule {
169 options = {
170 enable = mkEnableOption "Enable MX";
171 subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; };
172 priority = mkOption { type = nullOr int; description = "Priority"; };
173 };
174 };
175 };
176 ips = mkOption {
177 description = ''
178 attrs of ip4/ip6 grouped by section
179 '';
180 type = attrsOf (submodule {
181 options = {
182 alias = mkOption {
183 type = nullOr str;
184 default = null;
185 description = ''
186 alias to use in DNS for that group
187 '';
188 };
189 ip4 = mkOption {
190 type = listOf str;
191 default = [];
192 description = ''
193 ip4 addresses of the host
194 '';
195 };
196 ip6 = mkOption {
197 type = listOf str;
198 default = [];
199 description = ''
200 ip6 addresses of the host
201 '';
202 };
203 };
204 });
205 };
206 };
207 };
208 in
209 {
210 # Necessary for situations where flake gets included multiple times
211 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
212
213 options.myEnv = {
214 servers = mkOption {
215 description = ''
216 Attrs of servers information in the cluster (not necessarily handled by nixops)
217 '';
218 default = {};
219 type = attrsOf hostEnv;
220 };
221 hetznerCloud = mkOption {
222 description = ''
223 Hetzner Cloud credential information
224 '';
225 type = submodule {
226 options = {
227 authToken = mkOption {
228 type = str;
229 description = ''
230 The API auth token.
231 '';
232 };
233 };
234 };
235 };
236 hetzner = mkOption {
237 description = ''
238 Hetzner credential information
239 '';
240 type = submodule {
241 options = {
242 user = mkOption { type = str; description = "User"; };
243 pass = mkOption { type = str; description = "Password"; };
244 };
245 };
246 };
247 sshd = mkOption {
248 description = ''
249 sshd service credential information
250 '';
251 type = submodule {
252 options = {
253 rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; };
254 ldap = mkOption {
255 description = ''
256 LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn
257 '';
258 type = submodule {
259 options = {
260 password = mkOption { description = "Password"; type = str; };
261 };
262 };
263 };
264 psql = mkOption {
265 description = ''
266 PSQL credentials for immae_auth_read
267 '';
268 type = submodule {
269 options = {
270 password = mkOption { description = "Password"; type = str; };
271 };
272 };
273 };
274 };
275 };
276 };
277 ports = mkOption {
278 description = ''
279 non-standard reserved ports. Must be unique!
280 '';
281 type = attrsOf port;
282 default = {};
283 apply = let
284 noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x));
285 in
286 x: if isAttrs x && noDupl x then x else throw "Non unique values for ports";
287 };
288 httpd = mkOption {
289 description = ''
290 httpd service credential information
291 '';
292 type = submodule {
293 options = {
294 ldap = mkOption {
295 description = ''
296 LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn
297 '';
298 type = submodule {
299 options = {
300 password = mkOption { description = "Password"; type = str; };
301 };
302 };
303 };
304 };
305 };
306 };
307 smtp = mkOption {
308 type = submodule { options = smtpOptions; };
309 description = "SMTP configuration";
310 };
311 ldap = mkOption {
312 description = ''
313 LDAP server configuration
314 '';
315 type = submodule {
316 options = ldapOptions;
317 };
318 };
319 databases = mkOption {
320 description = "Databases configuration";
321 type = submodule {
322 options = {
323 mysql = mkOption {
324 type = submodule { options = mysqlOptions; };
325 description = "Mysql configuration";
326 };
327 redis = mkOption {
328 type = submodule { options = redisOptions; };
329 description = "Redis configuration";
330 };
331 postgresql = mkOption {
332 type = submodule { options = psqlOptions; };
333 description = "Postgresql configuration";
334 };
335 };
336 };
337 };
338 jabber = mkOption {
339 description = "Jabber configuration";
340 type = submodule {
341 options = {
342 postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; };
343 ldap = mkLdapOptions "Jabber" {};
344 postgresql = mkPsqlOptions "Jabber";
345 };
346 };
347 };
348 realUsers = mkOption {
349 description = ''
350 Attrset of function taking pkgs as argument.
351 Real users settings, should provide a subattr of users.users.<name>
352 with at least: name, (hashed)Password, shell
353 '';
354 type = attrsOf unspecified;
355 };
356 users = mkOption {
357 description = "System and regular users uid/gid";
358 type = attrsOf (submodule {
359 options = {
360 uid = mkOption {
361 description = "user uid";
362 type = int;
363 };
364 gid = mkOption {
365 description = "user gid";
366 type = int;
367 };
368 };
369 });
370 };
371 dns = mkOption {
372 description = "DNS configuration";
373 type = submodule {
374 options = {
375 ns = mkOption {
376 description = "Attrs of NS servers group";
377 example = {
378 foo = {
379 "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ];
380 "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ];
381 };
382 };
383 type = attrsOf (attrsOf (listOf str));
384 };
385 };
386 };
387 };
388 backup = mkOption {
389 description = ''
390 Remote backup with duplicity
391 '';
392 type = submodule {
393 options = {
394 password = mkOption { type = str; description = "Password for encrypting files"; };
395 remotes = mkOption {
396 type = attrsOf (submodule {
397 options = {
398 remote = mkOption {
399 type = functionTo str;
400 example = literalExample ''
401 bucket: "s3://some_host/${bucket}";
402 '';
403 description = ''
404 Function.
405 Takes a bucket name as argument and returns a url
406 '';
407 };
408 accessKeyId = mkOption { type = str; description = "Remote access-key"; };
409 secretAccessKey = mkOption { type = str; description = "Remote access secret"; };
410 };
411 });
412 };
413 };
414 };
415 };
416 zrepl_backup = mkOption {
417 type = submodule {
418 options = {
419 ssh_key = mkOption {
420 description = "SSH key information";
421 type = submodule {
422 options = {
423 public = mkOption { type = str; description = "Public part of the key"; };
424 private = mkOption { type = lines; description = "Private part of the key"; };
425 };
426 };
427 };
428 mysql = mkMysqlOptions "Zrepl" {};
429 certs = mkOption {
430 description = "Certificates";
431 type = attrsOf (submodule {
432 options = {
433 key = mkOption { type = str; description = "Key"; };
434 certificate = mkOption { type = str; description = "Certificate"; };
435 };
436 });
437 };
438 };
439 };
440 };
441 rsync_backup = mkOption {
442 description =''
443 Rsync backup configuration from controlled host
444 '';
445 type = submodule {
446 options = {
447 ssh_key = mkOption {
448 description = "SSH key information";
449 type = submodule {
450 options = {
451 public = mkOption { type = str; description = "Public part of the key"; };
452 private = mkOption { type = lines; description = "Private part of the key"; };
453 };
454 };
455 };
456 profiles = mkOption {
457 description = "Attrs of profiles to backup";
458 default = {};
459 type = attrsOf (submodule {
460 options = {
461 keep = mkOption { type = int; description = "Number of backups to keep"; };
462 check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; };
463 login = mkOption { type = str; description = "Login to connect to host"; };
464 port = mkOption { type = str; default = "22"; description = "Port to connect to host"; };
465 host = mkOption { type = str; description = "Host to connect to"; };
466 host_key = mkOption { type = str; description = "Host key"; };
467 host_key_type = mkOption { type = str; description = "Host key type"; };
468 parts = mkOption {
469 description = "Parts to backup for this host";
470 type = attrsOf (submodule {
471 options = {
472 remote_folder = mkOption { type = path; description = "Remote folder to backup";};
473 exclude_from = mkOption {
474 type = listOf path;
475 default = [];
476 description = "List of folders/files to exclude from the backup";
477 };
478 files_from = mkOption {
479 type = listOf path;
480 default = [];
481 description = "List of folders/files to backup in the base folder";
482 };
483 args = mkOption {
484 type = nullOr str;
485 default = null;
486 description = "Extra arguments to pass to rsync";
487 };
488 };
489 });
490 };
491 };
492 });
493 };
494 };
495 };
496 };
497 monitoring = mkOption {
498 description = "Monitoring configuration";
499 type = submodule {
500 options = {
501 status_url = mkOption { type = str; description = "URL to push status to"; };
502 status_token = mkOption { type = str; description = "Token for the status url"; };
503 http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; };
504 email = mkOption { type = str; description = "Admin E-mail"; };
505 ssh_public_key = mkOption { type = str; description = "SSH public key"; };
506 ssh_secret_key = mkOption { type = str; description = "SSH secret key"; };
507 imap_login = mkOption { type = str; description = "IMAP login"; };
508 imap_password = mkOption { type = str; description = "IMAP password"; };
509 eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; };
510 ovh_sms = mkOption {
511 description = "OVH credentials for sms script";
512 type = submodule {
513 options = {
514 endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; };
515 application_key = mkOption { type = str; description = "Application key"; };
516 application_secret = mkOption { type = str; description = "Application secret"; };
517 consumer_key = mkOption { type = str; description = "Consumer key"; };
518 account = mkOption { type = str; description = "Account"; };
519 };
520 };
521 };
522 nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; };
523 apprise_urls = mkOption { type = str; description = "Apprise space-separated urls to push status update"; };
524 netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; };
525 netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; };
526 immae_contact = mkOption { type = str; description = "Immae Contact e-mail"; };
527 email_check = mkOption {
528 description = "Emails services to check";
529 type = attrsOf (submodule {
530 options = {
531 local = mkOption { type = bool; default = false; description = "Use local configuration"; };
532 port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; };
533 login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; };
534 targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; };
535 mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; };
536 mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; };
537 };
538 });
539 };
540 };
541 };
542 };
543 mpd = mkOption {
544 description = "MPD configuration";
545 type = submodule {
546 options = {
547 folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; };
548 password = mkOption { type = str; description = "Password to connect to the MPD instance"; };
549 host = mkOption { type = str; description = "Host to connect to the MPD instance"; };
550 port = mkOption { type = str; description = "Port to connect to the MPD instance"; };
551 };
552 };
553 };
554 ftp = mkOption {
555 description = "FTP configuration";
556 type = submodule {
557 options = {
558 ldap = mkLdapOptions "FTP" {
559 proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; };
560 pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; };
561 };
562 };
563 };
564 };
565 vpn = mkOption {
566 description = "VPN configuration";
567 type = attrsOf (submodule {
568 options = {
569 prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; };
570 privateKey = mkOption { type = str; description = "Private key for the host"; };
571 publicKey = mkOption { type = str; description = "Public key for the host"; };
572 };
573 });
574 };
575 mail = mkOption {
576 description = "Mail configuration";
577 type = submodule {
578 options = {
579 dmarc = mkOption {
580 description = "DMARC configuration";
581 type = submodule {
582 options = {
583 ignore_hosts = mkOption {
584 type = lines;
585 description = ''
586 Hosts to ignore when checking for dmarc
587 '';
588 };
589 };
590 };
591 };
592 dkim = mkOption {
593 description = "DKIM configuration";
594 type = attrsOf (submodule {
595 options = {
596 public = mkOption {
597 type = attrsOf str;
598 example = literalExample ''
599 {
600 v = "DKIM1";
601 k = "rsa";
602 p = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB";
603 }
604 '';
605 description = "Public entry to put in DNS TXT field";
606 };
607 private = mkOption { type = nullOr str; default = null; description = "Private key"; };
608 };
609 });
610 };
611 postfix = mkOption {
612 description = "Postfix configuration";
613 type = submodule {
614 options = {
615 mysql = mkMysqlOptions "Postfix" {
616 password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; };
617 };
618 admins = mkOption {
619 description = ''
620 List of admins meant to receive common aliases
621 '';
622 type = listOf str;
623 };
624 common_aliases = mkOption {
625 description = ''
626 List of aliases common to all hosts, to forward to admins
627 '';
628 type = listOf str;
629 };
630 other_aliases = mkOption {
631 description = ''
632 Other list of aliases, to forward to admins
633 '';
634 type = listOf str;
635 };
636 };
637 };
638 };
639 dovecot = mkOption {
640 description = "Dovecot configuration";
641 type = submodule {
642 options = {
643 ldap = mkLdapOptions "Dovecot" {
644 pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; };
645 user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; };
646 iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; };
647 iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; };
648 postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; };
649 };
650 };
651 };
652 };
653 rspamd = mkOption {
654 description = "rspamd configuration";
655 type = submodule {
656 options = {
657 redis = mkRedisOptions "Redis";
658 read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; };
659 write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; };
660 read_password = mkOption {
661 type = str;
662 description = "Read password for rspamd. Unused";
663 apply = x: "";
664 };
665 write_password = mkOption {
666 type = str;
667 description = "Write password for rspamd. Unused";
668 apply = x: "";
669 };
670 };
671 };
672 };
673 sympa = mkOption {
674 description = "Sympa configuration";
675 type = submodule {
676 options = {
677 listmasters = mkOption {
678 type = listOf str;
679 description = "Listmasters";
680 };
681 postgresql = mkPsqlOptions "Sympa";
682 data_sources = mkOption {
683 type = attrsOf str;
684 default = {};
685 description = "Data sources to make available to sympa";
686 };
687 scenari = mkOption {
688 type = attrsOf str;
689 default = {};
690 description = "Scenari to make available to sympa";
691 };
692 };
693 };
694 };
695 };
696 };
697 };
698 coturn = mkOption {
699 description = "Coturn configuration";
700 type = submodule {
701 options = {
702 auth_access_key = mkOption { type = str; description = "key to access coturn"; };
703 };
704 };
705 };
706 buildbot = mkOption {
707 description = "Buildbot configuration";
708 type = submodule {
709 options = {
710 ssh_key = mkOption {
711 description = "SSH key information";
712 type = submodule {
713 options = {
714 public = mkOption { type = str; description = "Public part of the key"; };
715 private = mkOption { type = lines; description = "Private part of the key"; };
716 };
717 };
718 };
719 workerPassword = mkOption { description = "Buildbot worker password"; type = str; };
720 user = mkOption {
721 description = "Buildbot user";
722 type = submodule {
723 options = {
724 uid = mkOption {
725 description = "user uid";
726 type = int;
727 };
728 gid = mkOption {
729 description = "user gid";
730 type = int;
731 };
732 };
733 };
734 };
735 ldap = mkOption {
736 description = "Ldap configuration for buildbot";
737 type = submodule {
738 options = {
739 password = mkOption { type = str; description = "Buildbot password"; };
740 };
741 };
742 };
743 projects = mkOption {
744 description = "Projects to make a buildbot for";
745 type = attrsOf (submodule {
746 options = {
747 name = mkOption { type = str; description = "Project name"; };
748 src = mkOption { type = path; description = "source of the project configuration"; };
749 packages = mkOption {
750 type = listOf package;
751 example = literalExample ''
752 [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ];
753 '';
754 description = ''
755 Builds packages list to make available to buildbot project.
756 '';
757 };
758 pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; };
759 workerPort = mkOption { type = port; description = "Port for the worker"; };
760 secrets = mkOption {
761 type = attrsOf lines;
762 description = "Secrets for the project to dump as files";
763 };
764 secretsDeps = mkOption {
765 type = listOf package;
766 default = [];
767 description = "Dependencies of file that will land in secrets";
768 };
769 environment = mkOption {
770 type = attrsOf str;
771 description = ''
772 Environment variables for the project.
773 BUILDBOT_ is prefixed to the variable names
774 '';
775 };
776 activationScript = mkOption {
777 type = lines;
778 description = ''
779 Activation script to run during deployment
780 '';
781 };
782 webhookTokens = mkOption {
783 type = nullOr (listOf str);
784 default = null;
785 description = ''
786 List of tokens allowed to push to project’s change_hook/base endpoint
787 '';
788 };
789 };
790 });
791 };
792 };
793 };
794 };
795 tools = mkOption {
796 description = "Tools configurations";
797 type = submodule {
798 options = {
799 contact = mkOption { type = str; description = "Contact e-mail address"; };
800 assets = mkOption {
801 default = {};
802 type = attrsOf (submodule {
803 options = {
804 assetType = mkOption { type = enum ["tgz" "url" "googleFont"]; default = "url"; description = "Type of asset"; };
805 tgzRemoveComponents = mkOption { type = int; default = 0; description = "Remove components when extracting"; };
806 url = mkOption { type = str; description = "URL to fetch"; };
807 sha256 = mkOption { type = str; description = "Hash of the url"; };
808 };
809 });
810 description = "Assets to provide on assets.immae.eu";
811 };
812 davical = mkOption {
813 description = "Davical configuration";
814 type = submodule {
815 options = {
816 postgresql = mkPsqlOptions "Davical";
817 ldap = mkLdapOptions "Davical" {};
818 };
819 };
820 };
821 diaspora = mkOption {
822 description = "Diaspora configuration";
823 type = submodule {
824 options = {
825 postgresql = mkPsqlOptions "Diaspora";
826 redis = mkRedisOptions "Diaspora";
827 ldap = mkLdapOptions "Diaspora" {};
828 secret_token = mkOption { type = str; description = "Secret token"; };
829 };
830 };
831 };
832 dmarc_reports = mkOption {
833 description = "DMARC reports configuration";
834 type = submodule {
835 options = {
836 mysql = mkMysqlOptions "DMARC" {};
837 anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; };
838 };
839 };
840 };
841 etherpad-lite = mkOption {
842 description = "Etherpad configuration";
843 type = submodule {
844 options = {
845 postgresql = mkPsqlOptions "Etherpad";
846 ldap = mkLdapOptions "Etherpad" {
847 group_filter = mkOption { type = str; description = "Filter for groups"; };
848 };
849 adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; };
850 session_key = mkOption { type = str; description = "Session key"; };
851 api_key = mkOption { type = str; description = "API key"; };
852 };
853 };
854 };
855 gitolite = mkOption {
856 description = "Gitolite configuration";
857 type = submodule {
858 options = {
859 ldap = mkLdapOptions "Gitolite" {};
860 ssh_key = mkOption {
861 description = "SSH key information";
862 type = submodule {
863 options = {
864 public = mkOption { type = str; description = "Public part of the key"; };
865 private = mkOption { type = lines; description = "Private part of the key"; };
866 };
867 };
868 };
869 };
870 };
871 };
872 landing = mkOption {
873 description = "Landing configuration";
874 type = submodule {
875 options = {
876 postgresql = mkPsqlOptions "Landing";
877 };
878 };
879 };
880 kanboard = mkOption {
881 description = "Kanboard configuration";
882 type = submodule {
883 options = {
884 postgresql = mkPsqlOptions "Kanboard";
885 ldap = mkLdapOptions "Kanboard" {
886 admin_dn = mkOption { type = str; description = "Admin DN"; };
887 };
888 };
889 };
890 };
891 mantisbt = mkOption {
892 description = "Mantisbt configuration";
893 type = submodule {
894 options = {
895 postgresql = mkPsqlOptions "Mantisbt";
896 ldap = mkLdapOptions "Mantisbt" {};
897 master_salt = mkOption { type = str; description = "Master salt for password hash"; };
898 };
899 };
900 };
901 mastodon = mkOption {
902 description = "Mastodon configuration";
903 type = submodule {
904 options = {
905 postgresql = mkPsqlOptions "Mastodon";
906 redis = mkRedisOptions "Mastodon";
907 ldap = mkLdapOptions "Mastodon" {};
908 paperclip_secret = mkOption { type = str; description = "Paperclip secret"; };
909 otp_secret = mkOption { type = str; description = "OTP secret"; };
910 secret_key_base = mkOption { type = str; description = "Secret key base"; };
911 vapid = mkOption {
912 description = "vapid key";
913 type = submodule {
914 options = {
915 private = mkOption { type = str; description = "Private key"; };
916 public = mkOption { type = str; description = "Public key"; };
917 };
918 };
919 };
920 };
921 };
922 };
923 mediagoblin = mkOption {
924 description = "Mediagoblin configuration";
925 type = submodule {
926 options = {
927 postgresql = mkPsqlOptions "Mediagoblin";
928 redis = mkRedisOptions "Mediagoblin";
929 ldap = mkLdapOptions "Mediagoblin" {};
930 };
931 };
932 };
933 nextcloud = mkOption {
934 description = "Nextcloud configuration";
935 type = submodule {
936 options = {
937 postgresql = mkPsqlOptions "Nextcloud";
938 redis = mkRedisOptions "Nextcloud";
939 password_salt = mkOption { type = str; description = "Password salt"; };
940 instance_id = mkOption { type = str; description = "Instance ID"; };
941 secret = mkOption { type = str; description = "App secret"; };
942 };
943 };
944 };
945 peertube = mkOption {
946 description = "Peertube configuration";
947 type = submodule {
948 options = {
949 listenPort = mkOption { type = port; description = "Port to listen to"; };
950 postgresql = mkPsqlOptions "Peertube";
951 redis = mkRedisOptions "Peertube";
952 ldap = mkLdapOptions "Peertube" {};
953 };
954 };
955 };
956 phpldapadmin = mkOption {
957 description = "phpLdapAdmin configuration";
958 type = submodule {
959 options = {
960 ldap = mkLdapOptions "phpldapadmin" {};
961 };
962 };
963 };
964 rompr = mkOption {
965 description = "Rompr configuration";
966 type = submodule {
967 options = {
968 mpd = mkOption {
969 description = "MPD configuration";
970 type = submodule {
971 options = {
972 host = mkOption { type = str; description = "Host for MPD"; };
973 port = mkOption { type = port; description = "Port to access MPD host"; };
974 };
975 };
976 };
977 };
978 };
979 };
980 roundcubemail = mkOption {
981 description = "Roundcubemail configuration";
982 type = submodule {
983 options = {
984 postgresql = mkPsqlOptions "TT-RSS";
985 secret = mkOption { type = str; description = "Secret"; };
986 };
987 };
988 };
989 shaarli = mkOption {
990 description = "Shaarli configuration";
991 type = submodule {
992 options = {
993 ldap = mkLdapOptions "Shaarli" {};
994 };
995 };
996 };
997 status_engine = mkOption {
998 description = "Status Engine configuration";
999 type = submodule {
1000 options = {
1001 mysql = mkMysqlOptions "StatusEngine" {};
1002 ldap = mkLdapOptions "StatusEngine" {};
1003 };
1004 };
1005 };
1006 task = mkOption {
1007 description = "Taskwarrior configuration";
1008 type = submodule {
1009 options = {
1010 ldap = mkLdapOptions "Taskwarrior" {};
1011 taskwarrior-web = mkOption {
1012 description = "taskwarrior-web profiles";
1013 default = {};
1014 type = attrsOf (submodule {
1015 options = {
1016 uid = mkOption {
1017 type = listOf str;
1018 description = "List of ldap uids having access to this profile";
1019 };
1020 org = mkOption { type = str; description = "Taskd organisation"; };
1021 key = mkOption { type = str; description = "Taskd key"; };
1022 date = mkOption { type = str; description = "Preferred date format"; };
1023 };
1024 });
1025 };
1026 };
1027 };
1028 };
1029 ttrss = mkOption {
1030 description = "TT-RSS configuration";
1031 type = submodule {
1032 options = {
1033 postgresql = mkPsqlOptions "TT-RSS";
1034 ldap = mkLdapOptions "TT-RSS" {};
1035 };
1036 };
1037 };
1038 wallabag = mkOption {
1039 description = "Wallabag configuration";
1040 type = submodule {
1041 options = {
1042 postgresql = mkPsqlOptions "Wallabag";
1043 ldap = mkLdapOptions "Wallabag" {
1044 admin_filter = mkOption { type = str; description = "Admin users filter"; };
1045 };
1046 redis = mkRedisOptions "Wallabag";
1047 secret = mkOption { type = str; description = "App secret"; };
1048 };
1049 };
1050 };
1051 webhooks = mkOption {
1052 type = attrsOf str;
1053 description = "Mapping 'name'.php => script for webhooks";
1054 };
1055 csp_reports = mkOption {
1056 description = "CSP report configuration";
1057 type = submodule {
1058 options = {
1059 report_uri = mkOption { type = str; description = "URI to report CSP violations to"; };
1060 policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; };
1061 };
1062 };
1063 };
1064 commento = mkOption {
1065 description = "Commento configuration";
1066 type = submodule {
1067 options = {
1068 listenPort = mkOption { type = port; description = "Port to listen to"; };
1069 postgresql = mkPsqlOptions "Commento";
1070 smtp = mkSmtpOptions "Commento";
1071 };
1072 };
1073 };
1074 cryptpad = mkOption {
1075 description = "Cryptpad configuration";
1076 type = submodule {
1077 options = {
1078 email = mkOption { type = str; description = "Admin e-mail"; };
1079 admins = mkOption { type = listOf str; description = "Instance admin public keys"; };
1080 port = mkOption { type = port; description = "Port to listen to"; };
1081 };
1082 };
1083 };
1084 ympd = mkOption {
1085 description = "Ympd configuration";
1086 type = submodule {
1087 options = {
1088 listenPort = mkOption { type = port; description = "Port to listen to"; };
1089 mpd = mkOption {
1090 description = "MPD configuration";
1091 type = submodule {
1092 options = {
1093 password = mkOption { type = str; description = "Password to access MPD host"; };
1094 host = mkOption { type = str; description = "Host for MPD"; };
1095 port = mkOption { type = port; description = "Port to access MPD host"; };
1096 };
1097 };
1098 };
1099 };
1100 };
1101 };
1102 umami = mkOption {
1103 description = "Umami configuration";
1104 type = submodule {
1105 options = {
1106 listenPort = mkOption { type = port; description = "Port to listen to"; };
1107 postgresql = mkPsqlOptions "Umami";
1108 hashSalt = mkOption { type = str; description = "Hash salt"; };
1109 };
1110 };
1111 };
1112 yourls = mkOption {
1113 description = "Yourls configuration";
1114 type = submodule {
1115 options = {
1116 mysql = mkMysqlOptions "Yourls" {};
1117 ldap = mkLdapOptions "Yourls" {};
1118 cookieKey = mkOption { type = str; description = "Cookie key"; };
1119 };
1120 };
1121 };
1122 };
1123 };
1124 };
1125 serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; };
1126 };
1127 options.hostEnv = mkOption {
1128 readOnly = true;
1129 type = hostEnv;
1130 default = config.myEnv.servers."${name}";
1131 description = "Host environment";
1132 };
1133 };
1134 };
1135}
diff --git a/flakes/private/mail-relay/filter-rewrite-from.py b/flakes/private/mail-relay/filter-rewrite-from.py
new file mode 100755
index 0000000..aad9c69
--- /dev/null
+++ b/flakes/private/mail-relay/filter-rewrite-from.py
@@ -0,0 +1,68 @@
1#! /usr/bin/env python3
2import sys
3
4sys.stdin.reconfigure(encoding='utf-8')
5sys.stdout.reconfigure(encoding='utf-8')
6stdin = sys.stdin
7stdout = sys.stdout
8
9mailaddr = sys.argv[1]
10inheader = {}
11
12# Change to actual file for logging
13logfile = open("/dev/null", "a")
14
15def log(l, i):
16 logfile.write("{} {}\n".format(i, l))
17 logfile.flush()
18
19def send(l):
20 log(l, ">")
21 stdout.write("{}\n".format(l))
22 stdout.flush()
23
24def token_and_sid(version, sid, token):
25 if version < "0.5":
26 return "{}|{}".format(token, sid)
27 else:
28 return "{}|{}".format(sid, token)
29
30log("started", "l")
31while True:
32 line = stdin.readline().strip()
33 log(line, "<")
34 if not line:
35 log("finished", "l")
36 break
37 splitted = line.split("|")
38 if line == "config|ready":
39 log("in config ready", "l")
40 send("register|filter|smtp-in|mail-from")
41 send("register|filter|smtp-in|data-line")
42 send("register|ready")
43 if splitted[0] != "filter":
44 continue
45 if len(splitted) < 7:
46 send("invalid filter command: expected >6 fields!")
47 sys.exit(1)
48 version = splitted[1]
49 action = splitted[4]
50 sid = splitted[5]
51 token = splitted[6]
52 token_sid = token_and_sid(version, sid, token)
53 rest = "|".join(splitted[7:])
54 if action == "mail-from":
55 inheader[sid] = True
56 send("filter-result|{}|rewrite|<{}>".format(token_sid, mailaddr))
57 continue
58 if action == "data-line":
59 if rest == "" and inheader.get(sid, False):
60 inheader[sid] = False
61 if rest == "." and not inheader.get(sid):
62 del(inheader[sid])
63 if inheader.get(sid, False) and rest.upper().startswith("FROM:"):
64 send("filter-dataline|{}|From: {}".format(token_sid, mailaddr))
65 else:
66 send("filter-dataline|{}|{}".format(token_sid, rest))
67 continue
68 send("filter-result|{}|proceed".format(token_sid))
diff --git a/flakes/private/mail-relay/flake.lock b/flakes/private/mail-relay/flake.lock
new file mode 100644
index 0000000..bbb2011
--- /dev/null
+++ b/flakes/private/mail-relay/flake.lock
@@ -0,0 +1,36 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment",
18 "secrets": "secrets"
19 }
20 },
21 "secrets": {
22 "locked": {
23 "lastModified": 1,
24 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
25 "path": "../../secrets",
26 "type": "path"
27 },
28 "original": {
29 "path": "../../secrets",
30 "type": "path"
31 }
32 }
33 },
34 "root": "root",
35 "version": 7
36}
diff --git a/flakes/private/mail-relay/flake.nix b/flakes/private/mail-relay/flake.nix
new file mode 100644
index 0000000..639bd06
--- /dev/null
+++ b/flakes/private/mail-relay/flake.nix
@@ -0,0 +1,58 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets.url = "path:../../secrets";
4
5 outputs = { self, environment, secrets }: {
6 nixosModule = self.nixosModules.mail-relay;
7 nixosModules.mail-relay = { lib, pkgs, config, name, ... }:
8 {
9 imports = [
10 environment.nixosModule
11 secrets.nixosModule
12 ];
13 options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services";
14 config = lib.mkIf config.myServices.mailRelay.enable {
15 secrets.keys."opensmtpd/creds" = {
16 user = "smtpd";
17 group = "smtpd";
18 permissions = "0400";
19 text = ''
20 eldiron ${name}:${config.hostEnv.ldap.password}
21 '';
22 };
23 users.users.smtpd.extraGroups = [ "keys" ];
24 services.opensmtpd = {
25 enable = true;
26 serverConfiguration = let
27 filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" {
28 buildInputs = [ pkgs.python38 ];
29 } ''
30 cp ${./filter-rewrite-from.py} $out
31 patchShebangs $out
32 '';
33 in ''
34 table creds \
35 "${config.secrets.fullPaths."opensmtpd/creds"}"
36 # FIXME: filtering requires 6.6, uncomment following lines when
37 # upgrading
38 # filter "fixfrom" \
39 # proc-exec "${filter-rewrite-from} ${name}@immae.eu"
40 # listen on socket filter "fixfrom"
41 action "relay-rewrite-from" relay \
42 helo ${config.hostEnv.fqdn} \
43 host smtp+tls://eldiron@eldiron.immae.eu:587 \
44 auth <creds> \
45 mail-from ${name}@immae.eu
46 action "relay" relay \
47 helo ${config.hostEnv.fqdn} \
48 host smtp+tls://eldiron@eldiron.immae.eu:587 \
49 auth <creds>
50 match for any !mail-from "@immae.eu" action "relay-rewrite-from"
51 match for any mail-from "@immae.eu" action "relay"
52 '';
53 };
54 environment.systemPackages = [ config.services.opensmtpd.package ];
55 };
56 };
57 };
58}
diff --git a/flakes/private/milters/flake.lock b/flakes/private/milters/flake.lock
new file mode 100644
index 0000000..1a0c138
--- /dev/null
+++ b/flakes/private/milters/flake.lock
@@ -0,0 +1,186 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "files-watcher": {
16 "locked": {
17 "lastModified": 1,
18 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
19 "path": "../../files-watcher",
20 "type": "path"
21 },
22 "original": {
23 "path": "../../files-watcher",
24 "type": "path"
25 }
26 },
27 "flake-utils": {
28 "locked": {
29 "lastModified": 1609246779,
30 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
31 "owner": "numtide",
32 "repo": "flake-utils",
33 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
34 "type": "github"
35 },
36 "original": {
37 "owner": "numtide",
38 "repo": "flake-utils",
39 "type": "github"
40 }
41 },
42 "flake-utils_2": {
43 "locked": {
44 "lastModified": 1609246779,
45 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
46 "owner": "numtide",
47 "repo": "flake-utils",
48 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
49 "type": "github"
50 },
51 "original": {
52 "owner": "numtide",
53 "repo": "flake-utils",
54 "type": "github"
55 }
56 },
57 "myuids": {
58 "locked": {
59 "lastModified": 1,
60 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
61 "path": "../myuids",
62 "type": "path"
63 },
64 "original": {
65 "path": "../myuids",
66 "type": "path"
67 }
68 },
69 "myuids_2": {
70 "locked": {
71 "lastModified": 1,
72 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
73 "path": "../myuids",
74 "type": "path"
75 },
76 "original": {
77 "path": "../myuids",
78 "type": "path"
79 }
80 },
81 "nixpkgs": {
82 "locked": {
83 "lastModified": 1597943282,
84 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
88 "type": "github"
89 },
90 "original": {
91 "owner": "NixOS",
92 "repo": "nixpkgs",
93 "type": "github"
94 }
95 },
96 "nixpkgs_2": {
97 "locked": {
98 "lastModified": 1597943282,
99 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
100 "owner": "NixOS",
101 "repo": "nixpkgs",
102 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
103 "type": "github"
104 },
105 "original": {
106 "owner": "NixOS",
107 "repo": "nixpkgs",
108 "type": "github"
109 }
110 },
111 "openarc": {
112 "inputs": {
113 "flake-utils": "flake-utils",
114 "myuids": "myuids",
115 "nixpkgs": "nixpkgs",
116 "openarc": "openarc_2"
117 },
118 "locked": {
119 "lastModified": 1,
120 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
121 "path": "../../openarc",
122 "type": "path"
123 },
124 "original": {
125 "path": "../../openarc",
126 "type": "path"
127 }
128 },
129 "openarc_2": {
130 "flake": false,
131 "locked": {
132 "lastModified": 1537545083,
133 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
134 "owner": "trusteddomainproject",
135 "repo": "OpenARC",
136 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
137 "type": "github"
138 },
139 "original": {
140 "owner": "trusteddomainproject",
141 "repo": "OpenARC",
142 "type": "github"
143 }
144 },
145 "opendmarc": {
146 "inputs": {
147 "flake-utils": "flake-utils_2",
148 "myuids": "myuids_2",
149 "nixpkgs": "nixpkgs_2"
150 },
151 "locked": {
152 "lastModified": 1,
153 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
154 "path": "../../opendmarc",
155 "type": "path"
156 },
157 "original": {
158 "path": "../../opendmarc",
159 "type": "path"
160 }
161 },
162 "root": {
163 "inputs": {
164 "environment": "environment",
165 "files-watcher": "files-watcher",
166 "openarc": "openarc",
167 "opendmarc": "opendmarc",
168 "secrets": "secrets"
169 }
170 },
171 "secrets": {
172 "locked": {
173 "lastModified": 1,
174 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
175 "path": "../../secrets",
176 "type": "path"
177 },
178 "original": {
179 "path": "../../secrets",
180 "type": "path"
181 }
182 }
183 },
184 "root": "root",
185 "version": 7
186}
diff --git a/flakes/private/milters/flake.nix b/flakes/private/milters/flake.nix
new file mode 100644
index 0000000..c4de5b6
--- /dev/null
+++ b/flakes/private/milters/flake.nix
@@ -0,0 +1,106 @@
1{
2 inputs.secrets.url = "path:../../secrets";
3 inputs.environment.url = "path:../environment";
4 inputs.files-watcher.url = "path:../../files-watcher";
5 inputs.opendmarc.url = "path:../../opendmarc";
6 inputs.openarc.url = "path:../../openarc";
7 outputs = { self, secrets, environment, opendmarc, openarc, files-watcher }: {
8 nixosModule = self.nixosModules.milters;
9 nixosModules.milters = { lib, pkgs, config, nodes, ... }:
10 {
11 imports = [
12 secrets.nixosModule
13 environment.nixosModule
14 files-watcher.nixosModule
15 opendmarc.nixosModule
16 openarc.nixosModule
17 ];
18 options.myServices.mail.milters.enable = lib.mkEnableOption "enable Mail milters";
19 options.myServices.mail.milters.sockets = lib.mkOption {
20 type = lib.types.attrsOf lib.types.path;
21 default = {
22 opendkim = "/run/opendkim/opendkim.sock";
23 opendmarc = config.services.opendmarc.socket;
24 openarc = config.services.openarc.socket;
25 };
26 readOnly = true;
27 description = ''
28 milters sockets
29 '';
30 };
31 config = lib.mkIf config.myServices.mail.milters.enable {
32 secrets.keys = {
33 "opendkim" = {
34 isDir = true;
35 user = config.services.opendkim.user;
36 group = config.services.opendkim.group;
37 permissions = "0550";
38 };
39 "opendkim/eldiron.private" = {
40 user = config.services.opendkim.user;
41 group = config.services.opendkim.group;
42 permissions = "0400";
43 text = config.myEnv.mail.dkim.eldiron.private;
44 };
45 };
46 users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ];
47 services.opendkim = {
48 enable = true;
49 socket = "local:${config.myServices.mail.milters.sockets.opendkim}";
50 domains =
51 let
52 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
53 bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
54 domains' = lib.flatten (builtins.attrValues bydomain);
55 in
56 builtins.concatStringsSep "," domains';
57 keyPath = config.secrets.fullPaths."opendkim";
58 selector = "eldiron";
59 configFile = pkgs.writeText "opendkim.conf" ''
60 SubDomains yes
61 UMask 002
62 AlwaysAddARHeader yes
63 '';
64 group = config.services.postfix.group;
65 };
66 systemd.services.opendkim.serviceConfig.Slice = "mail.slice";
67 systemd.services.opendkim.preStart = lib.mkBefore ''
68 # Skip the prestart script as keys are handled in secrets
69 exit 0
70 '';
71 services.filesWatcher.opendkim = {
72 restart = true;
73 paths = [
74 config.secrets.fullPaths."opendkim/eldiron.private"
75 ];
76 };
77
78 systemd.services.milter_verify_from = {
79 description = "Verify from milter";
80 after = [ "network.target" ];
81 wantedBy = [ "multi-user.target" ];
82
83 serviceConfig = {
84 Slice = "mail.slice";
85 User = "postfix";
86 Group = "postfix";
87 ExecStart = let
88 pymilter = with pkgs.python38Packages; buildPythonPackage rec {
89 pname = "pymilter";
90 version = "1.0.4";
91 src = fetchPypi {
92 inherit pname version;
93 sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
94 };
95 doCheck = false;
96 buildInputs = [ pkgs.libmilter ];
97 };
98 python = pkgs.python38.withPackages (p: [ pymilter ]);
99 in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock";
100 RuntimeDirectory = "milter_verify_from";
101 };
102 };
103 };
104 };
105 };
106}
diff --git a/flakes/private/milters/verify_from.py b/flakes/private/milters/verify_from.py
new file mode 100755
index 0000000..b75001e
--- /dev/null
+++ b/flakes/private/milters/verify_from.py
@@ -0,0 +1,60 @@
1#!/usr/bin/env python3
2import Milter
3import argparse
4from email.header import decode_header
5from email.utils import parseaddr
6
7class CheckMilter(Milter.Base):
8 def __init__(self):
9 self.envelope_from = None
10 self.header_from = None
11
12 @Milter.noreply
13 def connect(self, IPname, family, hostaddr):
14 return Milter.CONTINUE
15
16 def hello(self, heloname):
17 return Milter.CONTINUE
18
19 def envfrom(self, mailfrom, *args):
20 self.envelope_from = parseaddr(mailfrom)[1]
21 return Milter.CONTINUE
22
23 @Milter.noreply
24 def envrcpt(self, to, *str):
25 return Milter.CONTINUE
26
27 @Milter.noreply
28 def header(self, name, hval):
29 if name.lower() == "from":
30 self.header_from = parseaddr(decode_header(hval)[-1][0])[1]
31 return Milter.CONTINUE
32
33 def eoh(self):
34 if self.header_from is not None and self.header_from != "" and self.header_from != self.envelope_from:
35 self.setreply("553", xcode="5.7.1", msg="<%s>: From header rejected: not matching envelope From %s"
36 % (self.header_from, self.envelope_from))
37 return Milter.REJECT
38
39 return Milter.CONTINUE
40
41 @Milter.noreply
42 def body(self, chunk):
43 return Milter.CONTINUE
44
45 def eom(self):
46 return Milter.ACCEPT
47
48 def close(self):
49 return Milter.CONTINUE
50
51 def abort(self):
52 return Milter.CONTINUE
53
54if __name__ == "__main__":
55 parser = argparse.ArgumentParser()
56 parser.add_argument("--socket", "-s", type=str, help="socket to listen to")
57 config = parser.parse_args()
58
59 Milter.factory = CheckMilter
60 Milter.runmilter("check_from", config.socket, timeout=300)
diff --git a/flakes/private/monitoring/flake.lock b/flakes/private/monitoring/flake.lock
new file mode 100644
index 0000000..2e156fb
--- /dev/null
+++ b/flakes/private/monitoring/flake.lock
@@ -0,0 +1,67 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "naemon": {
16 "locked": {
17 "lastModified": 1,
18 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
19 "path": "../../naemon",
20 "type": "path"
21 },
22 "original": {
23 "path": "../../naemon",
24 "type": "path"
25 }
26 },
27 "nixpkgs-lib": {
28 "locked": {
29 "dir": "lib",
30 "lastModified": 1691269286,
31 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
32 "owner": "NixOS",
33 "repo": "nixpkgs",
34 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
35 "type": "github"
36 },
37 "original": {
38 "dir": "lib",
39 "owner": "NixOS",
40 "repo": "nixpkgs",
41 "type": "github"
42 }
43 },
44 "root": {
45 "inputs": {
46 "environment": "environment",
47 "naemon": "naemon",
48 "nixpkgs-lib": "nixpkgs-lib",
49 "secrets": "secrets"
50 }
51 },
52 "secrets": {
53 "locked": {
54 "lastModified": 1,
55 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
56 "path": "../../secrets",
57 "type": "path"
58 },
59 "original": {
60 "path": "../../secrets",
61 "type": "path"
62 }
63 }
64 },
65 "root": "root",
66 "version": 7
67}
diff --git a/flakes/private/monitoring/flake.nix b/flakes/private/monitoring/flake.nix
new file mode 100644
index 0000000..b7c3997
--- /dev/null
+++ b/flakes/private/monitoring/flake.nix
@@ -0,0 +1,267 @@
1{
2 inputs = {
3 environment.url = "path:../environment";
4 secrets.url = "path:../../secrets";
5 naemon.url = "path:../../naemon";
6 nixpkgs-lib.url = "github:NixOS/nixpkgs?dir=lib";
7 };
8 outputs = { self, environment, nixpkgs-lib, secrets, naemon }: {
9 nagios-cli-config = ./nagios-cli.cfg;
10 lib = rec {
11 expandedObject = kind: object: objects:
12 if object ? "use"
13 then expandedObject kind objects.templates.${kind}.${object.use} objects // object
14 else object;
15
16 objectsCommon = import ./objects_common.nix;
17 toObjects = import ./to_objects.nix { inherit (nixpkgs-lib) lib; };
18
19 toMasterPassiveObject = svcTemplate: freshnessThresholdMultiplier: objects:
20 {
21 service = with nixpkgs-lib.lib; map (s:
22 {
23 host_name = (expandedObject "service" s objects).host_name;
24 use = svcTemplate;
25 retry_interval = "1";
26 freshness_threshold = let
27 fs = expandedObject "service" s objects;
28 in if builtins.isInt fs.check_interval
29 then builtins.ceil (freshnessThresholdMultiplier * 60 * fs.check_interval)
30 else fs.check_interval;
31 }
32 // filterAttrs (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_") s
33 // mapAttrs'
34 (n: nameValuePair (removePrefix "__passive_" n))
35 (filterAttrs (k: _: hasPrefix "__passive_" k) s)
36 ) objects.service;
37 host = objects.host;
38 };
39
40 emailCheck = allCfg: host: hostFQDN: let
41 cfg = allCfg."${host}";
42 reverseTargets = builtins.attrNames (nixpkgs-lib.lib.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
43 to_email = cfg': host':
44 let sep = if nixpkgs-lib.lib.hasInfix "+" cfg'.mail_address then "_" else "+";
45 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
46 mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
47 mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
48 command = if cfg.local
49 then
50 [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
51 else
52 [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
53 in
54 {
55 service_description = "${hostFQDN} email service is active";
56 use = "mail-service";
57 host_name = hostFQDN;
58 servicegroups = "webstatus-email";
59 check_command = command;
60 };
61 };
62 nixosModule = self.nixosModules.monitoring;
63 nixosModules.monitoring = { config, pkgs, lib, ... }:
64 let
65 cfg = config.myServices.monitoring;
66 allPluginsConfig = import ./myplugins.nix {
67 inherit pkgs lib config;
68 sudo = "/run/wrappers/bin/sudo";
69 };
70 mypluginsConfig = lib.mapAttrs (n: v:
71 if builtins.isFunction v
72 then v (cfg.pluginsArgs."${n}" or {})
73 else v
74 ) (lib.getAttrs cfg.activatedPlugins allPluginsConfig);
75 myplugins = let
76 mypluginsChunk = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig);
77 in pkgs.runCommand "buildplugins" {
78 buildInputs = [ pkgs.makeWrapper pkgs.perl ];
79 } ''
80 mkdir $out
81 ${mypluginsChunk}
82 '';
83 objectsModule = with lib.types; submodule {
84 options = {
85 command = lib.mkOption {
86 type = attrsOf str;
87 default = {};
88 description = "Command definitions";
89 };
90
91 host = lib.mkOption {
92 type = attrsOf (attrsOf str);
93 default = {};
94 description = "Host definitions";
95 };
96 hostgroup = lib.mkOption {
97 type = attrsOf (attrsOf str);
98 default = {};
99 description = "Host group definitions";
100 };
101 hostdependency = lib.mkOption {
102 type = listOf (attrsOf str);
103 default = [];
104 description = "Host dependency definitions";
105 };
106
107 service = lib.mkOption {
108 type = listOf (attrsOf (oneOf [ str (listOf str) int ]));
109 # str -> string
110 # listOf str -> list to be concatenated with "!"
111 # int -> toString
112 default = [];
113 description = "Service definitions";
114 };
115 servicegroup = lib.mkOption {
116 type = attrsOf (attrsOf str);
117 default = {};
118 description = "Service group definitions";
119 };
120 servicedependency = lib.mkOption {
121 type = listOf (attrsOf str);
122 default = [];
123 description = "Service dependency definitions";
124 };
125
126 contact = lib.mkOption {
127 type = attrsOf (attrsOf str);
128 default = {};
129 description = "Contact definitions";
130 };
131 contactgroup = lib.mkOption {
132 type = attrsOf (attrsOf str);
133 default = {};
134 description = "Contact group definitions";
135 };
136
137 timeperiod = lib.mkOption {
138 type = attrsOf (attrsOf str);
139 default = {};
140 description = "Time period definitions";
141 };
142
143 templates = lib.mkOption {
144 description = "Template definitions";
145 default = {};
146 type = submodule {
147 options = {
148 service = lib.mkOption { type = attrsOf (attrsOf (either str int)); default = {}; };
149 contact = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
150 host = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
151 };
152 };
153 };
154 };
155 };
156 in
157 {
158 options = {
159 myServices.monitoring = {
160 enable = lib.mkOption {
161 type = lib.types.bool;
162 default = false;
163 description = ''
164 Whether to enable monitoring.
165 '';
166 };
167 master = lib.mkOption {
168 type = lib.types.bool;
169 default = false;
170 description = ''
171 This instance is the master instance
172 '';
173 };
174 pluginsArgs = lib.mkOption {
175 default = {};
176 description = "Arguments to pass to the naemon plugin configuration";
177 type = lib.types.attrsOf (lib.types.attrsOf lib.types.unspecified);
178 };
179 activatedPlugins = lib.mkOption {
180 default = [];
181 description = "List of naemon plugins to activate";
182 type = lib.types.listOf (lib.types.enum (builtins.attrNames allPluginsConfig));
183 };
184 fromMasterActivatedPlugins = lib.mkOption {
185 default = [];
186 description = "List of naemon plugins to activate from master";
187 type = lib.types.listOf (lib.types.str);
188 };
189 resources = lib.mkOption {
190 default = {};
191 description = "List of additionnal resources elements";
192 type = lib.types.attrsOf (lib.types.str);
193 };
194 objects = lib.mkOption {
195 default = {};
196 description = "Object definitions";
197 type = objectsModule;
198 };
199 fromMasterObjects = lib.mkOption {
200 default = {};
201 description = "Object definitions of checks that should be executed from master";
202 type = objectsModule;
203 };
204 };
205 };
206
207 imports = [
208 environment.nixosModule
209 secrets.nixosModule
210 naemon.nixosModule
211 ];
212 config = lib.mkIf cfg.enable {
213 myServices.monitoring.objects.command =
214 lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig);
215
216 security.sudo.extraRules = let
217 pluginsSudo = lib.lists.remove null (lib.mapAttrsToList (k: v:
218 if (v ? sudo)
219 then ({ users = [ "naemon" ]; } // (v.sudo myplugins))
220 else null) mypluginsConfig);
221 in pluginsSudo;
222
223 environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios";
224 environment.systemPackages = let
225 nagios-cli = pkgs.writeScriptBin "nagios-cli" ''
226 #!${pkgs.stdenv.shell}
227 sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${self.nagios-cli-config}
228 '';
229 in [
230 pkgs.cnagios
231 nagios-cli
232 ];
233 secrets.keys = {
234 "naemon/id_rsa" = {
235 user = "naemon";
236 group = "naemon";
237 permissions = "0400";
238 text = config.myEnv.monitoring.ssh_secret_key;
239 };
240 "naemon/resources.cfg".keyDependencies = [ myplugins ];
241 };
242 services.naemon = {
243 enable = true;
244 extraConfig = ''
245 use_syslog=1
246 log_initial_states=1
247 date_format=iso8601
248 admin_email=${config.myEnv.monitoring.email}
249 '' + lib.optionalString (!cfg.master) ''
250 obsess_over_services=1
251 ocsp_command=notify-master
252 '';
253 extraResource = let
254 resources = [cfg.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig);
255 joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources;
256 joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined);
257 in ''
258 $USER2$=${myplugins}
259 ${joinedStr}
260 '';
261 objectDefs =
262 self.lib.toObjects cfg.objects;
263 };
264 };
265 };
266 };
267}
diff --git a/flakes/private/monitoring/myplugins.nix b/flakes/private/monitoring/myplugins.nix
new file mode 100644
index 0000000..35730bb
--- /dev/null
+++ b/flakes/private/monitoring/myplugins.nix
@@ -0,0 +1,400 @@
1{ sudo, pkgs, lib, config }:
2let
3 cfg = config.myServices.monitoring;
4in
5{
6 notify-secondary = {
7 resources = {
8 USER200 = config.myEnv.monitoring.status_url;
9 USER201 = config.myEnv.monitoring.status_token;
10 };
11 commands = {
12 notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\"";
13 };
14 chunk = ''
15 cp ${./plugins}/send_nrdp.sh $out
16 patchShebangs $out/send_nrdp.sh
17 wrapProgram $out/send_nrdp.sh --prefix PATH : ${lib.makeBinPath [
18 pkgs.curl pkgs.jq
19 ]}
20 '';
21 };
22 notify-primary = {
23 resources = {
24 USER210 = config.myEnv.monitoring.apprise_urls;
25 };
26 commands = {
27 # $OVE is to force naemon to run via shell instead of execve which fails here
28 notify-host-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
29 # $OVE is to force naemon to run via shell instead of execve which fails here
30 notify-service-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
31 notify-host-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_apprise host \"$ARG1$\"";
32 notify-service-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_apprise service \"$ARG1$\"";
33 };
34 chunk = ''
35 cp ${./plugins}/{notify_by_email,notify_by_apprise} $out
36 patchShebangs $out/{notify_by_email,notify_by_apprise}
37 wrapProgram $out/notify_by_email --prefix PATH : ${lib.makeBinPath [
38 pkgs.mailutils
39 ]}
40 wrapProgram $out/notify_by_apprise --prefix PATH : ${lib.makeBinPath [
41 pkgs.apprise
42 ]}
43 '';
44 };
45 bandwidth = {
46 commands = {
47 check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$";
48 };
49 chunk = ''
50 cp ${./plugins}/check_bandwidth $out/
51 patchShebangs $out/check_bandwidth
52 wrapProgram $out/check_bandwidth --prefix PATH : ${lib.makeBinPath [
53 pkgs.iproute pkgs.bc
54 ]}
55 '';
56 };
57 command = {
58 commands = {
59 check_command_match = "$USER2$/check_command -c \"$ARG1$\" -C \"$ARG2$\" $ARG3$";
60 check_command_output = "$USER2$/check_command -c \"$ARG1$\" -s 0 -o \"$ARG2$\" $ARG3$";
61 check_command_status = "$USER2$/check_command -c \"$ARG1$\" -s \"$ARG2$\" $ARG3$";
62 };
63 chunk = ''
64 cp ${./plugins}/check_command $out/
65 patchShebangs $out/check_command
66 wrapProgram $out/check_command --prefix PATH : ${config.security.wrapperDir}
67 '';
68 };
69 dns = {
70 commands = {
71 check_dns = "$USER1$/check_dns -H $ARG1$ -s $HOSTADDRESS$ $ARG2$";
72 check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$";
73 };
74 };
75 mdadm = {
76 commands = {
77 check_mdadm = "$USER2$/check_command -c \"${pkgs.mdadm}/bin/mdadm --monitor --scan -1\" -s 0 -o \"^$\" -r root";
78 };
79 sudo = _: {
80 commands = [
81 { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; }
82 ];
83 runAs = "root";
84 };
85 };
86 postfix = {
87 commands = {
88 check_mailq = "$USER1$/check_mailq -s -w 1 -c 2";
89 };
90 sudo = _: {
91 commands = [
92 { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; }
93 ];
94 runAs = "root";
95 };
96 };
97 emails = {
98 resources = {
99 USER203 = config.secrets.fullPaths."naemon/id_rsa";
100 };
101 commands = {
102 check_emails = "$USER2$/check_emails -H $HOSTADDRESS$ -i $USER203$ -l $ARG1$ -p $ARG2$ -s $ARG3$ -f $ARG4$";
103 check_emails_local = "$USER2$/check_emails -H $HOSTADDRESS$ -n $ARG1$ -r $ADMINEMAIL$ -s $ARG2$ -f $ARG3$";
104 };
105 chunk = let
106 send_mails = pkgs.runCommand "send_mails" {
107 buildInputs = [ pkgs.makeWrapper ];
108 } ''
109 mkdir -p $out/bin
110 cp ${./send_mails} $out/bin/send_mails
111 patchShebangs $out
112 wrapProgram $out/bin/send_mails --prefix PATH : ${lib.makeBinPath [
113 pkgs.mailutils
114 ]}
115 '';
116 in ''
117 cp ${./plugins}/check_emails $out/
118 patchShebangs $out/check_emails
119 wrapProgram $out/check_emails --prefix PATH : ${lib.makeBinPath [
120 pkgs.openssh send_mails
121 ]} --prefix PERL5LIB : ${pkgs.perlPackages.makePerlPath [
122 pkgs.perlPackages.TimeDate
123 ]}
124 '';
125 };
126 eriomem = {
127 resources = {
128 USER208 = builtins.concatStringsSep "," (map (builtins.concatStringsSep ":") config.myEnv.monitoring.eriomem_keys);
129 };
130 commands = {
131 check_backup_eriomem = "$USER2$/check_eriomem $USER208$";
132 check_backup_eriomem_age = "$USER2$/check_backup_eriomem_age $ARG1$";
133 };
134 chunk = ''
135 cp ${./plugins}/check_eriomem $out/
136 patchShebangs $out/check_eriomem
137 wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [
138 pkgs.s3cmd pkgs.python38
139 ]}
140 cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age
141 patchShebangs $out/check_backup_eriomem_age
142 wrapProgram $out/check_backup_eriomem_age --prefix PATH : ${lib.makeBinPath [
143 pkgs.duplicity
144 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."eriomem_access_key"}
145 '';
146 };
147 file_date = {
148 commands = {
149 check_last_file_date = "${sudo} -u \"$ARG3$\" $USER2$/check_last_file_date \"$ARG1$\" \"$ARG2$\"";
150 };
151 chunk = ''
152 cp ${./plugins}/check_last_file_date $out/
153 patchShebangs $out/check_last_file_date
154 '';
155 sudo = myplugins: {
156 commands = [
157 { command = "${myplugins}/check_last_file_date /backup2/*"; options = [ "NOPASSWD" ]; }
158 ];
159 runAs = "ALL";
160 };
161 };
162 ftp = {
163 commands = {
164 check_ftp_database = "$USER2$/check_ftp_database";
165 };
166 chunk = ''
167 cp ${./plugins}/check_ftp_database $out/
168 patchShebangs $out/check_ftp_database
169 wrapProgram $out/check_ftp_database --prefix PATH : ${lib.makeBinPath [
170 pkgs.lftp
171 ]}
172 '';
173 };
174 git = {
175 resources = {
176 USER203 = config.secrets.fullPaths."naemon/id_rsa";
177 };
178 commands = {
179 check_git = "$USER2$/check_git $USER203$";
180 };
181 chunk = ''
182 cp ${./plugins}/check_git $out/
183 patchShebangs $out/check_git
184 wrapProgram $out/check_git --prefix PATH : ${lib.makeBinPath [
185 pkgs.git pkgs.openssh
186 ]}
187 '';
188 };
189 http = {
190 resources = {
191 USER202 = config.myEnv.monitoring.http_user_password;
192 };
193 commands = {
194 check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
195 check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
196 check_https_4 = "$USER1$/check_http -4 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
197 check_https_6 = "$USER1$/check_http -6 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
198 check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
199 check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15";
200 check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\"";
201 };
202 };
203 imap = {
204 resources = {
205 USER204 = config.myEnv.monitoring.imap_login;
206 USER205 = config.myEnv.monitoring.imap_password;
207 };
208 commands = {
209 check_imap_connection = "$USER2$/check_imap_connection -u \"$USER204$\" -p \"$USER205$\" -H \"imap.immae.eu:143\"";
210 };
211 chunk = ''
212 cp ${./plugins}/check_imap_connection $out/
213 patchShebangs $out/check_imap_connection
214 wrapProgram $out/check_imap_connection --prefix PATH : ${lib.makeBinPath [
215 pkgs.openssl
216 ]}
217 '';
218 };
219 megaraid = let
220 megacli = pkgs.megacli.overrideAttrs(old: { meta = old.meta // { license = null; }; });
221 in {
222 commands = {
223 check_megaraid = "$USER2$/check_megaraid_sas --sudo";
224 };
225 chunk = let
226 megaCliPlugin = pkgs.runCommand "megaCliPlugin" {
227 plugin = pkgs.fetchurl {
228 name = "check_megaraid_sas";
229 url = "https://exchange.nagios.org/components/com_mtree/attachment.php?link_id=6381&cf_id=24";
230 sha256 = "0yf60p4c0hb4q3fng9fc14qc89bqm0f1sijayzygadaqcl44jx4p";
231 };
232 } ''
233 mkdir $out
234 cp $plugin $out/check_megaraid_sas
235 chmod +x $out/check_megaraid_sas
236 patchShebangs $out
237 substituteInPlace $out/check_megaraid_sas --replace /usr/sbin/MegaCli ${megacli}/bin/MegaCli64
238 substituteInPlace $out/check_megaraid_sas --replace 'sudo $megacli' '${sudo} $megacli'
239 sed -i -e "s/use utils qw(%ERRORS);/my %ERRORS = ('OK' => 0, 'WARNING' => 1, 'CRITICAL' => 2, 'UNKNOWN' => 3);/" $out/check_megaraid_sas
240 '';
241 in ''
242 cp ${megaCliPlugin}/check_megaraid_sas $out/
243 patchShebangs $out/check_megaraid_sas
244 '';
245 sudo = _: {
246 commands = [
247 { command = "${megacli}/bin/MegaCli64"; options = [ "NOPASSWD" ]; }
248 ];
249 runAs = "root";
250 };
251 };
252 memory = {
253 commands = {
254 check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
255 };
256 chunk = ''
257 cp ${./plugins}/check_mem.sh $out/
258 patchShebangs $out/check_mem.sh
259 wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [
260 pkgs.gnugrep pkgs.gawk pkgs.procps
261 ]}
262 '';
263 };
264 mysql = {
265 commands = {
266 check_mysql_replication = "${sudo} -u mysql $USER2$/check_mysql_replication \"$ARG1$\" \"$ARG2$\"";
267 };
268 chunk = ''
269 cp ${./plugins}/check_mysql_replication $out/
270 patchShebangs $out/check_mysql_replication
271 wrapProgram $out/check_mysql_replication --prefix PATH : ${lib.makeBinPath [
272 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.mariadb
273 ]}
274 '';
275 sudo = myplugins: {
276 commands = [
277 { command = "${myplugins}/check_mysql_replication *"; options = [ "NOPASSWD" ]; }
278 ];
279 runAs = "mysql";
280 };
281 };
282 openldap = {
283 commands = {
284 check_openldap_replication = "${sudo} -u openldap $USER2$/check_openldap_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\" \"$ARG4$\" \"$ARG5$\"";
285 };
286 chunk = ''
287 cp ${./plugins}/check_openldap_replication $out/
288 patchShebangs $out/check_openldap_replication
289 wrapProgram $out/check_openldap_replication --prefix PATH : ${lib.makeBinPath [
290 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.openldap
291 ]}
292 '';
293 sudo = myplugins: {
294 commands = [
295 { command = "${myplugins}/check_openldap_replication *"; options = [ "NOPASSWD" ]; }
296 ];
297 runAs = "openldap";
298 };
299 };
300 ovh = {
301 resources = {
302 USER209 = builtins.concatStringsSep "," [
303 config.myEnv.monitoring.ovh_sms.endpoint
304 config.myEnv.monitoring.ovh_sms.application_key
305 config.myEnv.monitoring.ovh_sms.application_secret
306 config.myEnv.monitoring.ovh_sms.consumer_key
307 config.myEnv.monitoring.ovh_sms.account
308 ];
309 };
310 commands = {
311 check_backup_ovh_age = "$USER2$/check_backup_ovh_age $ARG1$";
312 check_ovh_sms = "$USER2$/check_ovh_sms \"$USER209$\"";
313 };
314 chunk = ''
315 cp ${./plugins}/check_backup_age $out/check_backup_ovh_age
316 patchShebangs $out/check_backup_ovh_age
317 wrapProgram $out/check_backup_ovh_age --prefix PATH : ${lib.makeBinPath [
318 pkgs.duplicity
319 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."ovh_access_key"}
320 cp ${./plugins}/check_ovh_sms $out/
321 patchShebangs $out/check_ovh_sms
322 wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [
323 (pkgs.python38.withPackages (ps: [ps.ovh]))
324 ]}
325 '';
326 };
327 postgresql = { package }: {
328 commands = {
329 check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
330 check_postgresql_database_count = "$USER2$/check_postgres_database_count \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
331 };
332 chunk = ''
333 cp ${./plugins}/check_postgres_replication $out/
334 patchShebangs $out/check_postgres_replication
335 wrapProgram $out/check_postgres_replication --prefix PATH : ${lib.makeBinPath [
336 package
337 ]}
338 cp ${./plugins}/check_postgres_database_count $out/
339 patchShebangs $out/check_postgres_database_count
340 wrapProgram $out/check_postgres_database_count --prefix PATH : ${lib.makeBinPath [
341 package
342 ]}
343 '';
344
345 sudo = myplugins: {
346 commands = [
347 { command = "${myplugins}/check_postgres_replication *"; options = [ "NOPASSWD" ]; }
348 ];
349 runAs = "postgres";
350 };
351 };
352 redis = {
353 commands = {
354 check_redis_replication = "${sudo} -u redis $USER2$/check_redis_replication \"$ARG1$\"";
355 };
356 chunk = ''
357 cp ${./plugins}/check_redis_replication $out/
358 patchShebangs $out/check_redis_replication
359 wrapProgram $out/check_redis_replication --prefix PATH : ${lib.makeBinPath [
360 pkgs.gnugrep pkgs.coreutils pkgs.redis
361 ]}
362 '';
363 sudo = myplugins: {
364 commands = [
365 { command = "${myplugins}/check_redis_replication *"; options = [ "NOPASSWD" ]; }
366 ];
367 runAs = "redis";
368 };
369 };
370 tcp = {
371 commands = {
372 check_tcp = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -e \"$ARG2$\" -Mcrit";
373 check_tcp_ssl = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -S -D 21,15";
374 };
375 };
376 zfs = {
377 commands = {
378 check_zfs = "$USER2$/check_zpool.sh -p ALL -w 80 -c 90";
379 check_zfs_snapshot = "$USER2$/check_zfs_snapshot -d $ARG1$ -c 18000 -w 14400";
380 };
381 chunk = let
382 zfsPlugin = pkgs.fetchurl {
383 url = "https://www.claudiokuenzler.com/monitoring-plugins/check_zpools.sh";
384 sha256 = "0p9ms9340in80jkds4kfspw62xnzsv5s7ni9m28kxyd0bnzkbzhf";
385 };
386 in ''
387 cp ${zfsPlugin} $out/check_zpool.sh
388 chmod +x $out/check_zpool.sh
389 patchShebangs $out/check_zpool.sh
390 wrapProgram $out/check_zpool.sh --prefix PATH : ${lib.makeBinPath [
391 pkgs.which pkgs.zfs pkgs.gawk
392 ]}
393 cp ${./plugins}/check_zfs_snapshot $out
394 patchShebangs $out/check_zfs_snapshot
395 wrapProgram $out/check_zfs_snapshot --prefix PATH : ${lib.makeBinPath [
396 pkgs.zfs pkgs.coreutils pkgs.gawk pkgs.gnugrep
397 ]}
398 '';
399 };
400}
diff --git a/flakes/private/monitoring/nagios-cli.cfg b/flakes/private/monitoring/nagios-cli.cfg
new file mode 100644
index 0000000..7bd30cb
--- /dev/null
+++ b/flakes/private/monitoring/nagios-cli.cfg
@@ -0,0 +1,68 @@
1# -*- coding: utf-8; -*-
2
3[cli]
4history = /var/lib/naemon/nagios_cli_history
5
6[ui]
7color = 1
8prompt = naemon %s>
9prompt_separator = " → "
10
11[nagios]
12log = /var/log/naemon
13command_file = /run/naemon/naemon.cmd
14log_file = %(log)s/naemon.log
15object_cache_file = /var/lib/naemon/objects.cache
16status_file = /var/lib/naemon/status.dat
17
18[object]
19host.status =
20 host_name
21 current_state
22 plugin_output
23 is_flapping
24 last_check
25 last_time_down
26 last_state_change
27 check_period
28 notification_period
29 current_attempt
30 max_attempts
31service.status =
32 host_name
33 service_description
34 current_state
35 is_flapping
36 plugin_output
37 last_time_down
38 last_state_change
39 last_check
40 next_check
41 check_interval
42 check_latency
43 check_period
44 notification_period
45 current_attempt
46 max_attempts
47
48[string]
49level.ok = ↑ OK
50level.warning = ! WARNING
51level.critical = ↓ CRITICAL
52level.unknown = ↕ UNKNOWN
53
54[color]
55error = bold_red
56
57prompt = normal
58prompt.object = bold
59
60host.host_name = bold
61host.plugin_output = bold
62service.plugin_output = bold
63
64level.ok = bold_green
65level.warning = bold_yellow
66level.critical = bold_red
67level.unknown = bold_magenta
68
diff --git a/flakes/private/monitoring/objects_common.nix b/flakes/private/monitoring/objects_common.nix
new file mode 100644
index 0000000..1da7764
--- /dev/null
+++ b/flakes/private/monitoring/objects_common.nix
@@ -0,0 +1,227 @@
1{ hostFQDN
2, hostName
3, interface ? "eth0"
4, processWarn ? "250"
5, processAlert ? "400"
6, loadWarn ? "0.9"
7, load5Warn ? loadWarn
8, load15Warn ? load5Warn
9, loadAlert ? "1.0"
10, load5Alert ? loadAlert
11, load15Alert ? load5Alert
12, master
13, ...
14}:
15{
16 host = {
17 "${hostFQDN}" = {
18 alias = hostFQDN;
19 address = hostFQDN;
20 use = "linux-server";
21 hostgroups = "webstatus-hosts";
22 _webstatus_name = hostName;
23 _webstatus_vhost = "status.immae.eu";
24 };
25 };
26 service = [
27 {
28 service_description = "Size on root partition";
29 use = "local-service";
30 check_command = ["check_local_disk" "20%" "10%" "/"];
31 __passive_servicegroups = "webstatus-resources";
32 }
33 {
34 service_description = "Total number of process";
35 use = "local-service";
36 check_command = [
37 "check_local_procs"
38 processWarn
39 processAlert
40 "RSZDT"
41 ];
42 __passive_servicegroups = "webstatus-resources";
43 }
44 {
45 service_description = "Network bandwidth";
46 use = "local-service";
47 check_interval = 2;
48 max_check_attempts = "20";
49 retry_interval = "2";
50 check_command = [
51 "check_local_bandwidth"
52 interface
53 "20480" # kb/s
54 "51200" # kb/s
55 ];
56 __passive_servicegroups = "webstatus-resources";
57 }
58 {
59 service_description = "Average load";
60 use = "local-service";
61 check_command = [
62 "check_local_load"
63 "${loadWarn},${load5Warn},${load15Warn}"
64 "${loadAlert},${load5Alert},${load15Alert}"
65 ];
66 __passive_servicegroups = "webstatus-resources";
67 }
68 {
69 service_description = "Swap usage";
70 use = "local-service";
71 check_command = ["check_local_swap" "20" "10"];
72 __passive_servicegroups = "webstatus-resources";
73 }
74 {
75 service_description = "Memory usage";
76 use = "local-service";
77 check_command = ["check_memory" "80" "90"];
78 __passive_servicegroups = "webstatus-resources";
79 }
80 {
81 service_description = "NTP is activated and working";
82 use = "local-service";
83 check_command = ["check_ntp"];
84 __passive_servicegroups = "webstatus-resources";
85 }
86 ];
87 command = {
88 check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
89 check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
90 check_local_load = "$USER1$/check_load -r -w $ARG1$ -c $ARG2$";
91 check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
92 check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
93 check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15";
94
95 check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
96 check_ok = "$USER1$/check_dummy 0 \"Dummy OK\"";
97 check_critical = "$USER1$/check_dummy 2 \"Dummy CRITICAL\"";
98 };
99 timeperiod = {
100 "24x7" = {
101 alias = "24 Hours A Day, 7 Days A Week";
102 monday = "00:00-24:00";
103 tuesday = "00:00-24:00";
104 wednesday = "00:00-24:00";
105 thursday = "00:00-24:00";
106 friday = "00:00-24:00";
107 saturday = "00:00-24:00";
108 sunday = "00:00-24:00";
109 };
110 };
111 servicegroup = {
112 webstatus-webapps = { alias = "Web applications"; };
113 webstatus-websites = { alias = "Personal websites"; };
114 webstatus-ssl = { alias = "SSL certificates"; };
115 webstatus-dns = { alias = "DNS resolution"; };
116 webstatus-remote-services = { alias = "Other remote services"; };
117 webstatus-local-services = { alias = "Other local services"; };
118 webstatus-email = { alias = "E-mail services"; };
119 webstatus-resources = { alias = "Local resources"; };
120 webstatus-databases = { alias = "Databases resources"; };
121 webstatus-backup = { alias = "Backup resources"; };
122 };
123 hostgroup = {
124 webstatus-hosts = { alias = "Hosts"; };
125 };
126 contactgroup = {
127 admins = { alias = "Naemon Administrators"; };
128 };
129 templates = {
130 service = {
131 generic-service = {
132 active_checks_enabled = "1";
133 check_freshness = "0";
134 check_interval = 10;
135 check_period = "24x7";
136 contact_groups = "admins";
137 event_handler_enabled = "1";
138 flap_detection_enabled = "1";
139 is_volatile = "0";
140 max_check_attempts = "3";
141 notification_interval = "60";
142 notification_options = "w,u,c,r,f,s";
143 notification_period = "24x7";
144 notifications_enabled = if master then "1" else "0";
145 obsess_over_service = "1";
146 passive_checks_enabled = "1";
147 process_perf_data = "1";
148 retain_nonstatus_information = "1";
149 retain_status_information = "1";
150 retry_interval = "2";
151 _webstatus_namespace = "immae";
152 };
153 local-service = {
154 use = "generic-service";
155 host_name = hostFQDN;
156 check_interval = 5;
157 max_check_attempts = "4";
158 retry_interval = "1";
159 servicegroups = "webstatus-resources";
160 };
161 external-service = {
162 use = "generic-service";
163 check_interval = 5;
164 max_check_attempts = "4";
165 retry_interval = "1";
166 };
167 web-service = {
168 use = "generic-service";
169 check_interval = 20;
170 max_check_attempts = "2";
171 retry_interval = "1";
172 };
173 external-web-service = {
174 use = "generic-service";
175 check_interval = 20;
176 max_check_attempts = "2";
177 retry_interval = "1";
178 };
179 mail-service = {
180 use = "generic-service";
181 check_interval = 15;
182 max_check_attempts = "1";
183 retry_interval = "1";
184 };
185 dns-service = {
186 use = "generic-service";
187 check_interval = 120;
188 notification_interval = "120";
189 max_check_attempts = "5";
190 retry_interval = "5";
191 };
192 };
193 # No contact, we go through master
194 contact = {
195 generic-contact = {
196 host_notification_commands = "notify-host-by-email";
197 host_notification_options = "d,u,r,f,s";
198 host_notification_period = "24x7";
199 service_notification_commands = "notify-service-by-email";
200 service_notification_options = "w,u,c,r,f,s";
201 service_notification_period = "24x7";
202 };
203 };
204 host = {
205 generic-host = {
206 event_handler_enabled = "1";
207 flap_detection_enabled = "1";
208 notification_period = "24x7";
209 notifications_enabled = "1";
210 process_perf_data = "1";
211 retain_nonstatus_information = "1";
212 retain_status_information = "1";
213 };
214 linux-server = {
215 check_command = "check_host_alive";
216 check_interval = "5";
217 check_period = "24x7";
218 contact_groups = "admins";
219 max_check_attempts = "10";
220 notification_interval = "120";
221 notification_options = "d,u,r,f";
222 retry_interval = "1";
223 _webstatus_namespace = "immae";
224 };
225 };
226 };
227}
diff --git a/flakes/private/monitoring/plugins/check_backup_age b/flakes/private/monitoring/plugins/check_backup_age
new file mode 100755
index 0000000..d873bdc
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_backup_age
@@ -0,0 +1,66 @@
1#!/usr/bin/env bash
2
3set -euo pipefail
4
5source $SECRETS_PATH
6export HOME=$(mktemp -d)
7
8trap "rm -rf $HOME" EXIT
9folder=$1
10
11parse_date() {
12 d=$1
13 echo $d | sed -e "s/^\(....\)\(..\)\(..\)T\(..\)\(..\)\(..\)/\1-\2-\3T\4:\5:\6/"
14}
15
16output=$(duplicity collection-status --log-fd 2 "$BASE_URL$folder" 2>&1 > /dev/null)
17
18output=$(echo "$output" | grep -v "^\.")
19
20last_full=$(parse_date "$(echo "$output" | grep "^ full " | cut -d' ' -f3 | sort | tail -n1)")
21last_bkp=$(parse_date "$(echo "$output" | grep -E "^ (full|inc) " | cut -d' ' -f3 | sort | tail -n1)")
22orphaned_sets=$(echo "$output" | grep "^orphaned-sets-num" | cut -d' ' -f2)
23incomplete_sets=$(echo "$output" | grep "^incomplete-sets-num" | cut -d' ' -f2)
24
25if [[ -z "$last_full" || -z "$last_bkp" || -z "$orphaned_sets" || -z "$incomplete_sets" ]]; then
26 echo "duply-backup $folder UNKNOWN - impossible to parse result"
27 exit 3
28fi
29
30last_full_age=$(( ($(date "+%s") - $(date -d "$last_full" "+%s")) / (60*60*24) ))
31last_bkp_age=$(( ($(date "+%s") - $(date -d "$last_bkp" "+%s")) / (60*60) ))
32
33PERFS="orphan=$orphaned_sets;1;;0; incomplete=$incomplete_sets;1;;0; age=${last_bkp_age}h;30;48;0; full_age=${last_full_age}d;35;45;0;"
34
35
36WARNINGS=""
37ERRORS=""
38if [[ "$incomplete_sets" -gt 0 ]]; then
39 WARNINGS="$WARNINGS - Incomplete sets is $incomplete_sets"
40fi
41
42if [[ "$orphaned_sets" -gt 0 ]]; then
43 WARNINGS="$WARNINGS - Orphaned sets is $orphaned_sets"
44fi
45
46if [[ "$last_full_age" -gt 45 ]]; then
47 ERRORS="$ERRORS - Last full backup is too old $last_full"
48elif [[ "$last_full_age" -gt 35 ]]; then
49 WARNINGS="$WARNINGS - Last full backup is getting old $last_full"
50fi
51
52if [[ "$last_bkp_age" -gt 48 ]]; then
53 ERRORS="$ERRORS - Last backup is too old $last_bkp"
54elif [[ "$last_bkp_age" -gt 30 ]]; then
55 WARNINGS="$WARNINGS - Last backup is getting old $last_bkp"
56fi
57
58if [[ -n "$ERRORS" ]]; then
59 echo "duply-backup $folder CRITICAL$ERRORS$WARNINGS | $PERFS"
60 exit 2
61elif [[ -n "$WARNINGS" ]]; then
62 echo "duply-backup $folder WARNING$WARNINGS | $PERFS"
63 exit 1
64else
65 echo "duply-backup $folder OK | $PERFS"
66fi
diff --git a/flakes/private/monitoring/plugins/check_bandwidth b/flakes/private/monitoring/plugins/check_bandwidth
new file mode 100755
index 0000000..21d01f5
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_bandwidth
@@ -0,0 +1,122 @@
1#!/bin/bash
2
3# ============================== SUMMARY =====================================
4#Author : Ken Roulamellah
5#Date : 19/07/2018
6#Version : 1.0
7# Licence : GPL
8# ===================== INFORMATION ABOUT THIS PLUGIN ========================
9#
10# This plugin checks the average RX and TX bandwidth utilisation. It use
11# kbytes as measure unite.
12#
13# ========================== START OF PROGRAM CODE ===========================
14
15STATE_OK=0
16STATE_WARNING=1
17STATE_CRITICAL=2
18STATE_UNKNOWN=3
19
20interface=$( ip route | grep default | awk '{print $5}' | head -n1)
21function print_usage()
22{
23 echo "Usage :"
24 echo "$0 [ -i=INTERFACE] [ -ct=COUNT ] -w WARNING -c CRITICAL"
25 echo "This script calculate the average bandwith usage."
26 echo "Default values | interface: ${interface}, counter: 10"
27}
28
29counter=10
30warning=-1
31critical=-1
32
33sum_rx=0
34sum_tx=0
35avg_rx=
36avg_tx=
37i=
38
39
40if [[ $# -lt 4 ]];
41then
42 echo "Error: Arguments are missing"
43 print_usage
44 exit $STATE_UNKNOWN
45fi
46
47while [[ $# -gt 0 ]]; do
48 case "$1" in
49 -i=*)
50 interface="$(cut -d'=' -f2 <<<"$1")"
51 shift
52 ;;
53 -ct=*)
54 counter="$(cut -d'=' -f2 <<<"$1")"
55 shift
56 ;;
57 -w)
58 warning=$2
59 shift 2
60 ;;
61 -c)
62 critical=$2
63 shift 2
64 ;;
65 *)
66 printf "\nError: Invalid option '$1'"
67 print_usage
68 exit $STATE_UNKNOWN
69 ;;
70 esac
71done
72
73if [ $warning -lt 0 ] || [ $critical -lt 0 ];
74then
75 echo "Error: You need to specify a warning and critical treshold"
76 print_usage
77 exit $STATE_UNKNOWN
78fi
79
80grep -q "up" /sys/class/net/$interface/operstate || exec echo "$interface: no such device or down"
81
82read rx <"/sys/class/net/$interface/statistics/rx_bytes"
83read tx <"/sys/class/net/$interface/statistics/tx_bytes"
84
85i=$counter
86while [ $i -gt 0 ]; do
87 sleep 1
88 read newrx <"/sys/class/net/$interface/statistics/rx_bytes"
89 read newtx <"/sys/class/net/$interface/statistics/tx_bytes"
90
91 #echo "old rx :$rx"
92 #echo "new rx :$newrx"
93 rx_cal=$(bc <<< "scale=2; ($newrx-$rx) / 1000")
94 tx_cal=$(bc <<< "scale=2; ($newtx-$tx) / 1000")
95
96 sum_rx=$(bc <<< "scale=2;$sum_rx+$rx_cal")
97 sum_tx=$(bc <<< "scale=2;$sum_tx+$tx_cal")
98
99 #echo "$interface {rx: $rx_cal ko/s, tx: $tx_cal ko/s}"
100 rx=$newrx
101 tx=$newtx
102 ((i --))
103done
104
105avg_rx=$(bc <<< "scale=2;$sum_rx/$counter")
106avg_tx=$(bc <<< "scale=2;$sum_tx/$counter")
107
108#echo "$avg_rx"
109#echo "$avg_tx"
110
111
112if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then
113 echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;"
114 exit $STATE_CRITICAL
115elif [ $(bc <<< "$avg_rx > $warning || $avg_tx > $warning") -eq 1 ]; then
116 echo "$interface WARNING - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;"
117 exit $STATE_WARNING
118else
119 echo "$interface - OK AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;"
120 exit $STATE_OK
121fi
122exit 3
diff --git a/flakes/private/monitoring/plugins/check_command b/flakes/private/monitoring/plugins/check_command
new file mode 100755
index 0000000..2b546c1
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_command
@@ -0,0 +1,113 @@
1#!/usr/bin/env perl
2
3use strict;
4use Getopt::Std;
5$| = 1;
6
7my %opts;
8getopts('hr:C:c:s:o:', \%opts);
9
10my $STATE_OK = 0;
11my $STATE_WARNING = 1;
12my $STATE_CRITICAL = 2;
13my $STATE_UNKNOWN = 3;
14
15if ($opts{'h'} || scalar(%opts) == 0) {
16 &print_help();
17 exit($STATE_OK);
18}
19
20my $command = $opts{'c'};
21if ($command eq '') {
22 print "You must provide a command to check.\n";
23 exit($STATE_UNKNOWN);
24}
25
26my $expected_output = $opts{'o'};
27my $expected_status = $opts{'s'};
28my $other_command = $opts{'C'};
29
30if ($other_command eq '' and $expected_status eq '' and $expected_output eq '') {
31 $expected_status = 0;
32}
33
34my $cmd = $command . ' 2>&1';
35my $other_cmd;
36if ($other_command ne '') {
37 $other_cmd = $other_command . ' 2>&1';
38}
39
40my $run_as;
41if ($opts{'r'}) {
42 $run_as = $opts{'r'};
43 $cmd = "sudo -u $run_as -n $cmd";
44
45 if ($other_command ne '') {
46 $other_cmd = "sudo -u $run_as -n $other_cmd";
47 }
48
49}
50
51my $cmd_result = `$cmd`;
52my $other_cmd_result;
53if ($other_command ne '') {
54 $other_cmd_result = `$other_cmd`;
55 chomp($other_cmd_result);
56}
57
58chomp($cmd_result);
59if ($cmd_result =~ /sudo/i) {
60 print "$command CRITICAL - No sudo right to run the command | result=1;;;;\n";
61 exit($STATE_UNKNOWN);
62} elsif ($expected_status ne '') {
63 if ($? != $expected_status) {
64 print "$command CRITICAL - Response status $? | result=1;;;;\n";
65 exit($STATE_CRITICAL);
66 } else {
67 print "$command OK - Response status $? | result=0;;;;\n";
68 exit($STATE_OK);
69 }
70} elsif ($other_command ne '') {
71 if ($cmd_result ne $other_cmd_result) {
72 print "$command CRITICAL - Expected output not matching other command output | result=1;;;;\n";
73 exit($STATE_CRITICAL);
74 } else {
75 print "$command OK - Expected output matching other command output | result=0;;;;\n";
76 exit($STATE_OK);
77 }
78} else {
79 if ($cmd_result !~ /$expected_output/) {
80 print "$command CRITICAL - Expected output not matching | result=1;;;;\n";
81 exit($STATE_CRITICAL);
82 } else {
83 print "$command OK - Expected output matching | result=0;;;;\n";
84 exit($STATE_OK);
85 }
86}
87
88sub print_help() {
89 print << "EOF";
90Check whether the given command responds as expected. One of -o -C or -s must be selected.
91
92Options:
93-h
94 Print detailed help screen
95
96-c
97 command to run (required)
98
99-C
100 other command to compare output
101
102-r user
103 Run as user via sudo.
104
105-s
106 status code to check
107
108-o
109 output to check
110
111EOF
112}
113
diff --git a/flakes/private/monitoring/plugins/check_emails b/flakes/private/monitoring/plugins/check_emails
new file mode 100755
index 0000000..534e5a5
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_emails
@@ -0,0 +1,121 @@
1#!/usr/bin/env perl
2
3use strict;
4use Getopt::Std;
5use File::Basename;
6use Date::Parse;
7use POSIX qw(strftime);
8
9$| = 1;
10
11my %opts;
12getopts('hH:l:s:p:f:i:n:r:', \%opts);
13
14my $STATE_OK = 0;
15my $STATE_WARNING = 1;
16my $STATE_CRITICAL = 2;
17my $STATE_UNKNOWN = 3;
18
19if ($opts{'h'} || scalar(%opts) == 0) {
20 &print_help();
21 exit($STATE_OK);
22}
23
24my $port = $opts{'p'};
25my $host = $opts{'H'};
26my $login = $opts{'l'};
27if ($login ne '') {
28 $login = "$login@";
29}
30
31my $identity = $opts{'i'};
32my $local_directory = $opts{'n'};
33my $return_path = $opts{'r'};
34
35my @emails_to_send = split(/,/, $opts{'s'});
36my @emails_to_expect = split(/,/, $opts{'f'});
37
38my $cmd_result;
39if ($local_directory ne '') {
40 if (@emails_to_expect and ! -d $local_directory) {
41 print "Emails $host UNKNOWN - Could not find local directory";
42 exit($STATE_UNKNOWN);
43 }
44 $cmd_result = `send_mails $local_directory $return_path @emails_to_send 2>&1`;
45} else {
46 $cmd_result = `ssh -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no -p $port -i $identity $login$host send_mails @emails_to_send 2>&1`;
47
48 if ($cmd_result =~ /Host key verification failed./) {
49 print "Emails $host UNKNOWN - Could not connect to host with ssh key\n";
50 exit($STATE_UNKNOWN);
51 }
52}
53
54my @lines = split(/\n/, $cmd_result);
55
56my %found_emails;
57
58foreach my $line (@lines) {
59 my @split_line = split(/;/, $line, 2);
60 $found_emails{$split_line[0]} = $split_line[1];
61}
62
63my $output = "";
64my $old = 0;
65foreach my $email_from (@emails_to_expect) {
66 my @email_split = split(/:/, $email_from);
67 my $email = $email_split[0];
68 my $from = $email_split[1];
69
70 if ( exists $found_emails{$email} ) {
71 my $email_date = str2time($found_emails{$email});
72 my $current_date = strftime "%s", localtime;
73
74 if ($current_date - $email_date > 60*30) {
75 $output = "$output$email ($found_emails{$email} from $from) ";
76 }
77 $old = ($current_date - $email_date) > $old ? ($current_date - $email_date) : $old;
78 } else {
79 $output = "$output$email (missing) "
80 }
81}
82
83if ($output ne '') {
84 print "Emails $host CRITICAL - expecting emails: $output | timestamp=${old}s;;;;\n";
85 exit($STATE_CRITICAL);
86} else {
87 print "Emails $host OK | timestamp=${old}s;;;;\n";
88 exit($STATE_OK);
89}
90
91sub print_help() {
92 print << "EOF";
93Check sent emails
94
95Options:
96-h
97 Print detailed help screen
98
99-H
100 Host to check
101
102-l
103 Login
104
105-i
106 Identity file
107
108-n
109 Don’t use ssh, pass that directory to script
110
111-r
112 Return path for local e-mails
113
114-s
115 Comma separated list of emails to send from the host.
116
117-f
118 Comma separated list of emails to expect on the host.
119EOF
120}
121
diff --git a/flakes/private/monitoring/plugins/check_eriomem b/flakes/private/monitoring/plugins/check_eriomem
new file mode 100755
index 0000000..880b88a
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_eriomem
@@ -0,0 +1,83 @@
1#!/usr/bin/env python
2import os
3import sys
4import getopt
5import signal
6from subprocess import Popen, PIPE
7
8STATE_OK = 0
9STATE_WARNING = 1
10STATE_CRITICAL = 2
11STATE_UNKNOWN = 3
12
13keys = sys.argv[1].split(",")
14
15def to_args(k):
16 access, secret = k.split(":", 1)
17 return [
18 "s3cmd",
19 '-c=/dev/null',
20 '--no-check-certificate',
21 '--access_key={}'.format(access),
22 '--secret_key={}'.format(secret),
23 '--host=e.eriomem.net',
24 '--host-bucket=%(bucket)s.e.eriomem.net',
25 'du'
26 ]
27
28max_size = 1024*1024*1024*1024
29warning_percent = 99.75
30critical_percent = 99.95
31
32def output(code, msg):
33 print(msg)
34 sys.exit(code)
35
36def main():
37 def handler(signum, frame):
38 raise IOError
39 signal.signal(signal.SIGALRM, handler)
40 signal.alarm(60)
41
42 try:
43 ps = [Popen(to_args(a), stdout=PIPE, stderr=PIPE) for a in keys]
44 outs = [p.communicate() for p in ps]
45 rets = [p.wait() for p in ps]
46 except IOError:
47 for p in ps:
48 os.kill(p.pid, signal.SIGTERM)
49 output(STATE_UNKNOWN,
50 "Eriomem UNKNOWN - Command timeout after 60 seconds!")
51
52 signal.alarm(0)
53
54 if sum(rets) == 0:
55 usages = [int(out[0].decode().split("\n")[-2].split()[0]) for out in outs]
56 usage = sum(usages)
57 use_percent = 100 * usage / max_size
58 if use_percent > critical_percent:
59 output(STATE_CRITICAL,
60 "Eriomem CRITICAL - bucket usage: %s (%s%%);| size=%s;;;;" %
61 (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
62 elif use_percent > warning_percent:
63 output(STATE_WARNING,
64 "Eriomem WARNING - bucket usage: %s (%s%%);| size=%s;;;;" %
65 (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
66 else:
67 output(STATE_OK,
68 "Eriomem OK - bucket usage: %s (%d%%);| size=%s;;;;" %
69 (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
70 else:
71 messages = "\n".join([out[0].decode() + out[1].decode() for out in outs])
72 output(STATE_UNKNOWN,
73 "Eriomem UNKNOWN - Error in command")
74
75def sizeof_fmt(num):
76 for unit in ['','ko','Mo','Go','To','Po','Eo','Zo']:
77 if abs(num) < 1024.0:
78 return "%3.1f%s" % (num, unit)
79 num /= 1024.0
80 return "%.1f%s%s" % (num, 'Yo')
81
82if __name__ == '__main__':
83 main()
diff --git a/flakes/private/monitoring/plugins/check_ftp_database b/flakes/private/monitoring/plugins/check_ftp_database
new file mode 100755
index 0000000..f9cf579
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_ftp_database
@@ -0,0 +1,11 @@
1#!/usr/bin/env bash
2
3OUT=$(echo "ls" | lftp -u test_ftp,test_ftp eldiron.immae.eu | grep it_works | wc -l)
4
5if [ "$OUT" -eq 1 ]; then
6 echo "ftp connection OK - access to ftp is working | ftp=1;;;;"
7 exit 0
8else
9 echo "ftp connection CRITICAL - no access to ftp | ftp=0;;;;"
10 exit 2
11fi
diff --git a/flakes/private/monitoring/plugins/check_git b/flakes/private/monitoring/plugins/check_git
new file mode 100755
index 0000000..e8fbb29
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_git
@@ -0,0 +1,81 @@
1#!/usr/bin/env bash
2
3SSH_KEY="$1"
4
5TMPDIR=$(mktemp -d)
6
7if [ ! -d "$TMPDIR" ]; then
8 echo "gitolite UNKNOWN - impossible to create temp dir"
9 exit 3
10fi
11
12trap "rm -rf $TMPDIR" EXIT
13
14ERRORS=""
15OUTPUT=""
16PERFS=""
17
18cd "$TMPDIR"
19OUT=$(git clone -q git://git.immae.eu/perso/Immae/Projets/Ruby/Monitor.git 2>&1)
20ERR=$?
21if [ -n "$OUT" ]; then
22OUTPUT="$OUTPUT
23$OUT"
24fi
25if [ "$ERR" != 0 ]; then
26 PERFS="$PERFS git=0;;;;"
27 ERRORS="$ERRORS git://"
28else
29 PERFS="$PERFS git=1;;;;"
30fi
31rm -rf Monitor
32
33OUT=$(git clone -q http://git.immae.eu/perso/Immae/Projets/Ruby/Monitor.git 2>&1)
34ERR=$?
35if [ -n "$OUT" ]; then
36OUTPUT="$OUTPUT
37$OUT"
38fi
39if [ "$ERR" != 0 ]; then
40 ERRORS="$ERRORS http://"
41 PERFS="$PERFS http=0;;;;"
42else
43 PERFS="$PERFS http=1;;;;"
44fi
45rm -rf Monitor
46
47OUT=$(git clone -q https://git.immae.eu/perso/Immae/Projets/Ruby/Monitor.git 2>&1)
48ERR=$?
49if [ -n "$OUT" ]; then
50OUTPUT="$OUTPUT
51$OUT"
52fi
53if [ "$ERR" != 0 ]; then
54 ERRORS="$ERRORS https://"
55 PERFS="$PERFS https=0;;;;"
56else
57 PERFS="$PERFS https=1;;;;"
58fi
59rm -rf Monitor
60
61OUT=$(GIT_SSH_COMMAND="ssh -i $SSH_KEY -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no" git clone -q gitolite@git.immae.eu:perso/Immae/Projets/Ruby/Monitor 2>&1)
62ERR=$?
63if [ -n "$OUT" ]; then
64OUTPUT="$OUTPUT
65$OUT"
66fi
67if [ "$ERR" != 0 ]; then
68 ERRORS="$ERRORS ssh"
69 PERFS="$PERFS ssh=0;;;;"
70else
71 PERFS="$PERFS ssh=1;;;;"
72fi
73rm -rf Monitor
74
75if [ -n "$ERRORS" ]; then
76 echo "gitolite CRITICAL - impossible to clone via$ERRORS | $PERFS"
77 exit 2
78else
79 echo "gitolite OK - ssh, git, http and https work | $PERFS"
80 exit 0
81fi
diff --git a/flakes/private/monitoring/plugins/check_imap_connection b/flakes/private/monitoring/plugins/check_imap_connection
new file mode 100755
index 0000000..c1ab0dd
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_imap_connection
@@ -0,0 +1,52 @@
1#!/usr/bin/env perl
2
3use strict;
4use Getopt::Std;
5$| = 1;
6
7my %opts;
8getopts('h:u:p:H:', \%opts);
9
10my $STATE_OK = 0;
11my $STATE_WARNING = 1;
12my $STATE_CRITICAL = 2;
13my $STATE_UNKNOWN = 3;
14
15if ($opts{'h'} || !$opts{'u'} || !$opts{'p'} || !$opts{'H'}) {
16 &print_help();
17 exit($STATE_UNKNOWN);
18}
19
20my $user = $opts{'u'};
21my $password = $opts{'p'};
22my $host = $opts{'H'};
23
24my $cmd_result = `(echo "a login $user $password"; echo "b logout") | openssl s_client -quiet -ign_eof -connect $host -starttls imap 2>&1`;
25my $expected_result = "a OK Logged in";
26
27chomp($cmd_result);
28if ($cmd_result !~ /$expected_result/) {
29 print "IMAP CRITICAL - Unable to connect via imaps | imap=0;;;;\n";
30 exit($STATE_CRITICAL);
31} else {
32 print "IMAP OK - imaps connected successfully | imap=1;;;;\n";
33 exit($STATE_OK);
34}
35
36sub print_help() {
37 print << "EOF";
38Check whether imap works via ssl and is able to connect its database.
39
40Options:
41-h
42 Print detailed help screen
43-u
44 User to log in as
45-p
46 Password to log in
47-H
48 Host to log in to
49
50EOF
51}
52
diff --git a/flakes/private/monitoring/plugins/check_last_file_date b/flakes/private/monitoring/plugins/check_last_file_date
new file mode 100755
index 0000000..f51a258
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_last_file_date
@@ -0,0 +1,28 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8base_path=$1
9hours=$2
10
11last_date=$(find $base_path -mindepth 1 -maxdepth 1 -printf "%T@\n" 2>/dev/null | sort | tail -n 1)
12
13if [ -z "$last_date" ]; then
14 echo "UNKNOWN: Could not read folder"
15 exit $STATE_UNKNOWN
16else
17 LC_ALL=C last_date=$(printf "%.*f" 0 $last_date)
18 LC_ALL=C age=$(( $(date "+%s") - $last_date))
19 max_age=$(( $hours * 60 * 60 ))
20 min_date=$(date -d "$hours hours ago" "+%s")
21 if [ "$min_date" -lt "$last_date" ]; then
22 echo "OK: Last file $(date -d @$last_date) | age=${age}s;;$max_age;;"
23 exit $STATE_OK
24 else
25 echo "CRITICAL: Last file $(date -d @$last_date) | age=${age}s;;$max_age;;"
26 exit $STATE_CRITICAL
27 fi
28fi
diff --git a/flakes/private/monitoring/plugins/check_mem.sh b/flakes/private/monitoring/plugins/check_mem.sh
new file mode 100755
index 0000000..3a29040
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_mem.sh
@@ -0,0 +1,31 @@
1#!/usr/bin/env bash
2
3if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then
4 FreeM=`free -m -w`
5 memTotal_m=`echo "$FreeM" |grep Mem |awk '{print $2}'`
6 memUsed_m=`echo "$FreeM" |grep Mem |awk '{print $3}'`
7 memFree_m=`echo "$FreeM" |grep Mem |awk '{print $4}'`
8 memShared_m=`echo "$FreeM" |grep Mem |awk '{print $5}'`
9 memBuffer_m=`echo "$FreeM" |grep Mem |awk '{print $6}'`
10 memCache_m=`echo "$FreeM" |grep Mem |awk '{print $7}'`
11 memAvailable_m=`echo "$FreeM" |grep Mem |awk '{print $8}'`
12 memUsedPrc=`echo $((($memUsed_m-$memBuffer_m-$memCache_m)*100/$memTotal_m))||cut -d. -f1`
13 if [ "$memUsedPrc" -ge "$4" ]; then
14 echo "Memory: CRITICAL Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;"
15 exit 2
16 elif [ "$memUsedPrc" -ge "$2" ]; then
17 echo "Memory: WARNING Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;"
18 exit 1
19 else
20 echo "Memory: OK Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;"
21 exit 0
22 fi
23else # If inputs are not as expected, print help.
24 sName="`echo $0|awk -F '/' '{print $NF}'`"
25 echo -e "\n\n\t\t### $sName Version 2.0###\n"
26 echo -e "# Usage:\t$sName -w <warnlevel> -c <critlevel>"
27 echo -e "\t\t= warnlevel and critlevel is percentage value without %\n"
28 echo "# EXAMPLE:\t/usr/lib64/nagios/plugins/$sName -w 80 -c 90"
29 echo -e "\nCopyright (C) 2012 Lukasz Gogolin (lukasz.gogolin@gmail.com), improved by Nestor 2015\n\n"
30 exit
31fi
diff --git a/flakes/private/monitoring/plugins/check_mysql_replication b/flakes/private/monitoring/plugins/check_mysql_replication
new file mode 100755
index 0000000..1ee5de1
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_mysql_replication
@@ -0,0 +1,41 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8socket=$1
9config_file=$2
10info=$(mysql --defaults-file=${config_file} -S $socket -e "show slave status" --vertical)
11exit_code=$?
12
13lag=$(echo "$info" | grep "\bSeconds_Behind_Master\b" | cut -d':' -f2 | sed -e "s/\s//g")
14
15IO_running=$(echo "$info" | grep "\bSlave_IO_Running\b" | cut -d':' -f2 | sed -e "s/\s//g")
16SQL_running=$(echo "$info" | grep "\bSlave_SQL_Running\b" | cut -d':' -f2 | sed -e "s/\s//g")
17
18if [[ $exit_code -ne 0 ]]; then
19 echo "UNKNOWN - Impossible to run mysql command"
20 exit $STATE_UNKNOWN
21elif [[ -z "$lag" ]]; then
22 echo "UNKNOWN - No replication found for mysql"
23 exit $STATE_UNKNOWN
24elif [[ "$IO_running" != "Yes" || "$SQL_running" != "Yes" ]]; then
25 echo "UNKNOWN - Replication is not running"
26 exit $STATE_UNKNOWN
27else
28 output="Replication lag for mysql is ${lag}s"
29 LC_ALL=C lag=$(printf "%.*f" 0 $lag)
30
31 if [[ $lag -lt 5 ]]; then
32 echo "OK - $output | time=${lag}s;5;10;;"
33 exit $STATE_OK
34 elif [[ $lag -lt 10 ]]; then
35 echo "WARNING - $output | time=${lag}s;5;10;;"
36 exit $STATE_WARNING
37 else
38 echo "CRITICAL - $output | time=${lag}s;5;10;;"
39 exit $STATE_CRITICAL
40 fi
41fi
diff --git a/flakes/private/monitoring/plugins/check_openldap_replication b/flakes/private/monitoring/plugins/check_openldap_replication
new file mode 100755
index 0000000..7136ad5
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_openldap_replication
@@ -0,0 +1,54 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8distant_host="$1"
9replication_dn="$2"
10replication_pw="$3"
11base="$4"
12config="$5"
13
14to_date() {
15 i="$1"
16 i=$(echo "$i" | grep contextCSN | cut -d":" -f2 | sed -e "s/\s//g")
17 i=$(echo "$i" | cut -d"#" -f1)
18 i=$(echo "$i" | cut -d"." -f1)
19 echo "$i"
20}
21
22# ldap
23remote_ldap=$(ldapsearch -H $distant_host -D "$replication_dn" -y "$replication_pw" -b "$base" -s base -LLL contextCSN )
24exit_code_remote=$?
25remote_ldap=$(to_date "$remote_ldap")
26
27# slapcat
28local_ldap=$(slapcat -b "$base" -f "$config" -a "(entryDN=$base)")
29exit_code_local=$?
30local_ldap=$(to_date "$local_ldap")
31
32offset=$(($remote_ldap - $local_ldap))
33
34if [[ $exit_code_remote -ne 0 || $exit_code_local -ne 0 ]]; then
35 echo "UNKNOWN - Impossible to run ldap command"
36 exit $STATE_UNKNOWN
37elif [[ -z "$offset" ]]; then
38 echo "UNKNOWN - No replication found"
39 exit $STATE_UNKNOWN
40else
41 output="Replication lag for openldap is ${offset}s"
42 LC_ALL=C lag=$(printf "%.*f" 0 $lag)
43
44 if [[ $offset -lt 5 ]]; then
45 echo "OK - $output | time=${offset}s;5;10;;"
46 exit $STATE_OK
47 elif [[ $offset -lt 10 ]]; then
48 echo "WARNING - $output | time=${offset}s;5;10;;"
49 exit $STATE_WARNING
50 else
51 echo "CRITICAL - $output | time=${offset}s;5;10;;"
52 exit $STATE_CRITICAL
53 fi
54fi
diff --git a/flakes/private/monitoring/plugins/check_ovh_sms b/flakes/private/monitoring/plugins/check_ovh_sms
new file mode 100755
index 0000000..caf279c
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_ovh_sms
@@ -0,0 +1,25 @@
1#!/usr/bin/env python
2
3import sys
4try:
5 import ovh
6
7 [endpoint, application_key, application_secret, consumer_key, account] = sys.argv[1].split(",")
8 client = ovh.Client(
9 endpoint=endpoint,
10 application_key=application_key,
11 application_secret=application_secret,
12 consumer_key=consumer_key,
13 )
14
15 result = client.get('/sms/{}'.format(account))["creditsLeft"]
16
17 if result < 20:
18 print("SMS OVH Critical - Not enough sms left ({})|SMS={};;;;".format(result, result))
19 sys.exit(2)
20 else:
21 print("SMS OVH Ok - Enough sms left ({})|SMS={};;;;".format(result, result))
22 sys.exit(0)
23except Exception:
24 print("SMS OVH UNKNOWN - Error during script")
25 sys.exit(3)
diff --git a/flakes/private/monitoring/plugins/check_postgres_database_count b/flakes/private/monitoring/plugins/check_postgres_database_count
new file mode 100755
index 0000000..43bdd8c
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_postgres_database_count
@@ -0,0 +1,32 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8host=$1
9port=$2
10min=$3
11
12count=$(psql -h $host -p $port -A -q -c '\t' -c 'select count(datname) from pg_catalog.pg_database' postgres 2>&1)
13exit_code=$?
14
15if [[ $exit_code -ne 0 ]]; then
16 echo "UNKNOWN - Impossible to run psql command: $count"
17 exit $STATE_UNKNOWN
18elif [[ -z "$count" ]]; then
19 echo "UNKNOWN - No database found"
20 exit $STATE_UNKNOWN
21else
22 output="Database count is $count"
23 LC_ALL=C count=$(printf "%.*f" 0 $count)
24
25 if [[ $count -gt $min ]]; then
26 echo "OK - $output | count=${count};$min;$min;0;"
27 exit $STATE_OK
28 else
29 echo "CRITICAL - $output | count=${count};$min;$min;0;"
30 exit $STATE_CRITICAL
31 fi
32fi
diff --git a/flakes/private/monitoring/plugins/check_postgres_replication b/flakes/private/monitoring/plugins/check_postgres_replication
new file mode 100755
index 0000000..ff257a3
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_postgres_replication
@@ -0,0 +1,35 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8user=$1
9host=$2
10port=$3
11
12lag=$(psql -h $host -p $port -A -t -c "SELECT COALESCE(EXTRACT(EPOCH FROM replay_lag),0) FROM pg_stat_replication WHERE usename='$user'" 2>/dev/null)
13exit_code=$?
14
15if [[ $exit_code -ne 0 ]]; then
16 echo "UNKNOWN - Impossible to run psql command"
17 exit $STATE_UNKNOWN
18elif [[ -z "$lag" ]]; then
19 echo "UNKNOWN - No replication found for $user"
20 exit $STATE_UNKNOWN
21else
22 output="Replication lag for $user is ${lag}s"
23 LC_ALL=C lag=$(printf "%.*f" 0 $lag)
24
25 if [[ $lag -lt 5 ]]; then
26 echo "OK - $output | time=${lag}s;5;10;0;"
27 exit $STATE_OK
28 elif [[ $lag -lt 10 ]]; then
29 echo "WARNING - $output | time=${lag}s;5;10;0;"
30 exit $STATE_WARNING
31 else
32 echo "CRITICAL - $output | time=${lag}s;5;10;0;"
33 exit $STATE_CRITICAL
34 fi
35fi
diff --git a/flakes/private/monitoring/plugins/check_redis_replication b/flakes/private/monitoring/plugins/check_redis_replication
new file mode 100755
index 0000000..6dbe4c4
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_redis_replication
@@ -0,0 +1,38 @@
1#!/bin/bash
2
3STATE_OK=0
4STATE_WARNING=1
5STATE_CRITICAL=2
6STATE_UNKNOWN=3
7
8socket=$1
9
10info=$(redis-cli -s $socket info replication)
11lag=$(echo "$info" | grep master_last_io_seconds_ago | cut -d":" -f2 | sed -e "s/\s//g")
12slave_offset=$(echo "$info" | grep slave_repl_offset | cut -d":" -f2 | sed -e "s/\s//g")
13master_offset=$(echo "$info" | grep master_repl_offset | cut -d":" -f2 | sed -e "s/\s//g")
14offset=$(($master_offset - $slave_offset))
15
16exit_code=$?
17
18if [[ $exit_code -ne 0 ]]; then
19 echo "UNKNOWN - Impossible to run redis command"
20 exit $STATE_UNKNOWN
21elif [[ -z "$lag" ]]; then
22 echo "UNKNOWN - No replication found"
23 exit $STATE_UNKNOWN
24else
25 output="Replication lag for redis is ${lag}s and offset is ${offset}"
26 LC_ALL=C lag=$(printf "%.*f" 0 $lag)
27
28 if [[ $lag -lt 5 && $offset -lt 5 ]]; then
29 echo "OK - $output | time=${lag}s;5;10;0; offset=${offset};5;10;0;"
30 exit $STATE_OK
31 elif [[ $lag -lt 10 && $offset -lt 10 ]]; then
32 echo "WARNING - $output | time=${lag}s;5;10;0; offset=${offset};5;10;0;"
33 exit $STATE_WARNING
34 else
35 echo "CRITICAL - $output | time=${lag}s;5;10;0; offset=${offset};5;10;0;"
36 exit $STATE_CRITICAL
37 fi
38fi
diff --git a/flakes/private/monitoring/plugins/check_zfs_snapshot b/flakes/private/monitoring/plugins/check_zfs_snapshot
new file mode 100755
index 0000000..56f8c4f
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_zfs_snapshot
@@ -0,0 +1,325 @@
1#! /bin/sh
2
3OS=$(uname)
4
5# MIT License
6#
7# Copyright (c) 2016 Josef Friedrich <josef@friedrich.rocks>
8#
9# Permission is hereby granted, free of charge, to any person obtaining
10# a copy of this software and associated documentation files (the
11# "Software"), to deal in the Software without restriction, including
12# without limitation the rights to use, copy, modify, merge, publish,
13# distribute, sublicense, and/or sell copies of the Software, and to
14# permit persons to whom the Software is furnished to do so, subject to
15# the following conditions:
16#
17# The above copyright notice and this permission notice shall be
18# included in all copies or substantial portions of the Software.
19#
20# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28########################################################################
29# Date functions
30########################################################################
31
32# This date function must be placed on the top of this file because
33# they are used in some global variables.
34
35# to_year ###
36
37##
38# Get the four digit year integer from now.
39#
40# Return:
41# The current 4 digit year.
42##
43_now_to_year() {
44 date +%Y
45}
46
47##
48# Convert a date in the format YYYY-MM-DD to a four digit year integer.
49#
50# Parameters:
51# a date in the format YYYY-MM-DD
52#
53# Return:
54# four digit year integer
55##
56_date_to_year() {
57 local OPTIONS
58 if [ "$OS" = 'Linux' ]; then
59 OPTIONS="--date $1"
60 # FreeBSD, Darwin
61 else
62 OPTIONS="-j -f %Y-%m-%d $1"
63 fi
64 date $OPTIONS +%Y
65}
66
67# to_datetime ###
68
69##
70# Convert a UNIX timestamp to a datetime string.
71#
72# Parameters:
73# UNIX timestamp
74#
75# Return:
76# %Y-%m-%d.%H:%M:%S
77##
78_timestamp_to_datetime() {
79 local OPTIONS
80 if [ "$OS" = 'Linux' ]; then
81 OPTIONS="--date @$1"
82 # FreeBSD, Darwin
83 else
84 OPTIONS="-j -f %s $1"
85 fi
86 date $OPTIONS +%Y-%m-%d.%H:%M:%S
87}
88
89# to_timestamp ###
90
91##
92# Get the current UNIX timestamp.
93#
94# Return:
95# %current UNIX timestamp
96##
97_now_to_timestamp() {
98 date +%s
99}
100
101PROJECT_PAGES='https://github.com/Josef-Friedrich/check_zfs_snapshot
102https://exchange.icinga.com/joseffriedrich/check_zfs_snapshot
103https://exchange.nagios.org/directory/Plugins/System-Metrics/File-System/check_zfs_snapshot/details'
104
105VERSION=1.2
106FIRST_RELEASE=2016-09-08
107SHORT_DESCRIPTION="Monitoring plugin to check how long ago the last \
108snapshot of a ZFS dataset was created."
109USAGE="check_zfs_snapshot v$VERSION
110Copyright (c) $(_date_to_year $FIRST_RELEASE)-$(_now_to_year) \
111Josef Friedrich <josef@friedrich.rocks>
112
113$SHORT_DESCRIPTION
114
115
116Usage: check_zfs_snapshot <options>
117
118Options:
119 -c, --critical=OPT_CRITICAL
120 Interval in seconds for critical state.
121 -d, --dataset=OPT_DATASET
122 The ZFS dataset to check.
123 -h, --help
124 Show this help.
125 -s, --short-description
126 Show a short description of the command.
127 -v, --version
128 Show the version number.
129 -w, --warning=OPT_WARNING
130 Interval in seconds for warning state. Must be lower than -c
131
132Performance data:
133 - last_ago
134 Time interval in seconds for last snapshot.
135 - warning
136 Interval in seconds.
137 - critical
138 Interval in seconds.
139 - snapshot_count
140 How many snapshot exists in the given dataset and all child
141 datasets exists.
142"
143
144# Exit codes
145STATE_OK=0
146STATE_WARNING=1
147STATE_CRITICAL=2
148STATE_UNKNOWN=3
149
150_get_last_snapshot() {
151 zfs get creation -Hpr -t snapshot "$1" | \
152 awk 'BEGIN {max = 0} {if ($3>max) max=$3} END {print max}'
153}
154
155_getopts() {
156 while getopts ':c:d:hsvw:-:' OPT ; do
157 case $OPT in
158
159 c)
160 OPT_CRITICAL=$OPTARG
161 ;;
162
163 d)
164 OPT_DATASET="$OPTARG"
165 ;;
166
167 h)
168 echo "$USAGE"
169 exit 0
170 ;;
171
172 s)
173 echo "$SHORT_DESCRIPTION"
174 exit 0
175 ;;
176
177 v)
178 echo "$VERSION"
179 exit 0
180 ;;
181
182 w)
183 OPT_WARNING=$OPTARG
184 ;;
185
186 \?)
187 echo "Invalid option “-$OPTARG”!" >&2
188 exit 2
189 ;;
190
191 :)
192 echo "Option “-$OPTARG” requires an argument!" >&2
193 exit 3
194 ;;
195
196 -)
197 LONG_OPTARG="${OPTARG#*=}"
198
199 case $OPTARG in
200
201 critical=?*)
202 OPT_CRITICAL=$LONG_OPTARG
203 ;;
204
205 dataset=?*)
206 OPT_DATASET="$LONG_OPTARG"
207 ;;
208
209 help)
210 echo "$USAGE"
211 exit 0
212 ;;
213
214 short-description)
215 echo "$SHORT_DESCRIPTION"
216 exit 0
217 ;;
218
219 version)
220 echo "$VERSION"
221 exit 0
222 ;;
223
224 warning=?*)
225 OPT_WARNING=$LONG_OPTARG
226 ;;
227
228 critical*|dataset*|warning*)
229 echo "Option “--$OPTARG” requires an argument!" >&2
230 exit 3
231 ;;
232
233 help*|short-description*|version*)
234 echo "No argument allowed for the option “--$OPTARG”!" >&2
235 exit 4
236 ;;
237
238 '') # "--" terminates argument processing
239 break
240 ;;
241
242 *)
243 echo "Invalid option “--$OPTARG”!" >&2
244 exit 2
245 ;;
246
247 esac
248 ;;
249
250 esac
251 done
252}
253
254_snapshot_count() {
255 # FreeBSD wc adds some whitespaces before the number!
256 # cat $HOME/debug | wc -l
257 # 7
258 local COUNT
259 COUNT="$(zfs list -t snapshot | grep "$1" | wc -l)"
260 echo $COUNT
261}
262
263_performance_data() {
264 echo "| \
265last_ago=${DIFF}s;$OPT_WARNING;$OPT_CRITICAL;0 \
266count=$(_snapshot_count "$OPT_DATASET");;;0\
267"
268}
269
270## This SEPARATOR is required for test purposes. Please don’t remove! ##
271
272_getopts $@
273
274if [ -z "$OPT_WARNING" ]; then
275 # 1 day
276 OPT_WARNING=86400
277fi
278
279if [ -z "$OPT_CRITICAL" ]; then
280 # 3 day
281 OPT_CRITICAL=259200
282fi
283
284if [ -z "$OPT_DATASET" ]; then
285 echo "Dataset has to be set! Use option -d <dataset>" >&2
286 echo "$USAGE" >&2
287 exit $STATE_UNKNOWN
288fi
289
290if ! zfs list "$OPT_DATASET" > /dev/null 2>&1; then
291 echo "'$OPT_DATASET' is no ZFS dataset!" >&2
292 echo "$USAGE" >&2
293 exit $STATE_UNKNOWN
294fi
295
296NOW=$(_now_to_timestamp)
297
298CREATION_DATE=$(_get_last_snapshot "$OPT_DATASET")
299
300DIFF=$((NOW - CREATION_DATE))
301
302if [ "$OPT_WARNING" -gt "$OPT_CRITICAL" ]; then
303 echo '-w OPT_WARNING must be smaller than -c OPT_CRITICAL'
304 _usage >&2
305 exit $STATE_UNKNOWN
306fi
307
308RETURN=STATE_UNKNOWN
309
310if [ "$DIFF" -gt "$OPT_CRITICAL" ]; then
311 RETURN=$STATE_CRITICAL
312 MESSAGE="CRITICAL:"
313elif [ "$DIFF" -gt "$OPT_WARNING" ]; then
314 RETURN=$STATE_WARNING
315 MESSAGE="WARNING:"
316else
317 RETURN=$STATE_OK
318 MESSAGE="OK:"
319fi
320
321DATE="$(_timestamp_to_datetime "$CREATION_DATE")"
322
323echo "$MESSAGE Last snapshot for dataset '$OPT_DATASET' was created on $DATE $(_performance_data)"
324
325exit $RETURN
diff --git a/flakes/private/monitoring/plugins/notify_by_apprise b/flakes/private/monitoring/plugins/notify_by_apprise
new file mode 100755
index 0000000..82bc5a3
--- /dev/null
+++ b/flakes/private/monitoring/plugins/notify_by_apprise
@@ -0,0 +1,31 @@
1#!/usr/bin/env bash
2
3APPRISE_USERNAME="Naemon"
4APPRISE_USERICON="https://assets.immae.eu/monitoring.png"
5APPRISE_URLS=$(echo "$2" | sed -e "s/{username}/$APPRISE_USERNAME/g" -e "s@{image_url}@$APPRISE_USERICON@g")
6
7if [ "$SERVICESTATE" = "CRITICAL" ]; then
8 ICON="❗"
9elif [ "$SERVICESTATE" = "WARNING" ]; then
10 ICON="⚠️:"
11elif [ "$SERVICESTATE" = "OK" ]; then
12 ICON="✅"
13elif [ "$SERVICESTATE" = "UNKNOWN" ]; then
14 ICON="❓"
15elif [ "$HOSTSTATE" = "UP" ]; then
16 ICON="✅"
17elif [ "$HOSTSTATE" = "DOWN" ]; then
18 ICON="❗"
19elif [ "$HOSTSTATE" = "UNKNOWN" ]; then
20 ICON="❓"
21elif [ "$HOSTSTATE" = "UNREACHABLE" ]; then
22 ICON="❓"
23else
24 ICON="◻"
25fi
26
27if [ "$1" = "host" ]; then
28 apprise --title "${ICON} ${NOTIFICATIONTYPE} ${HOST} is ${HOSTSTATE}" --body "$HOSTOUTPUT" $APPRISE_URLS
29else
30 apprise --title "${ICON} ${NOTIFICATIONTYPE} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" --body "$SERVICEOUTPUT" $APPRISE_URLS
31fi
diff --git a/flakes/private/monitoring/plugins/notify_by_email b/flakes/private/monitoring/plugins/notify_by_email
new file mode 100755
index 0000000..959db26
--- /dev/null
+++ b/flakes/private/monitoring/plugins/notify_by_email
@@ -0,0 +1,29 @@
1#!/usr/bin/env bash
2
3# $1 = service/host
4
5# $2 = type (PROBLEM RECOVERY ACKNOWLEDGEMENT FLAPPINGSTART FLAPPINGSTOP FLAPPINGDISABLED DOWNTIMESTART DOWNTIMESTOP DOWNTIMECANCELLED)
6# http://www.naemon.org/documentation/usersguide/macrolist.html#notificationtype
7
8# $3 = host alias
9
10# $4 = date (YYYY-MM-DDTHH:MM:SS)
11
12# $5 = E-mail
13
14NOTIFICATION_TYPE="$2"
15HOST_ALIAS="$3"
16DATE="$4"
17CONTACT="$5"
18
19message=""
20
21if [ "$1" = "host" ]; then
22 message=$(printf "%b" "***** Naemon *****\n\nNotification Type: $NOTIFICATION_TYPE\n\nHost: $HOST_ALIAS\nState: $HOSTSTATE\nInfo: $HOSTOUTPUT\n\nDate/Time: $DATE\n")
23 subject="** $NOTIFICATION_TYPE Host Alert: $HOST_ALIAS is $HOSTSTATE **"
24else
25 message=$(printf "%b" "***** Naemon *****\n\nNotification Type: $NOTIFICATION_TYPE\n\nService: $SERVICEDESC\nHost: $HOST_ALIAS\nState: $SERVICESTATE\n\nDate/Time: $DATE\n\nAdditional Info:\n\n$SERVICEOUTPUT\n")
26 subject="** $NOTIFICATION_TYPE Service Alert: $HOST_ALIAS/$SERVICEDESC is $SERVICESTATE **"
27fi
28
29echo "$message" | MAILRC=/dev/null mail -r "$ADMINEMAIL" -n -s "$subject" "$CONTACT"
diff --git a/flakes/private/monitoring/plugins/notify_by_slack b/flakes/private/monitoring/plugins/notify_by_slack
new file mode 100755
index 0000000..1b16a0d
--- /dev/null
+++ b/flakes/private/monitoring/plugins/notify_by_slack
@@ -0,0 +1,46 @@
1#!/usr/bin/env bash
2
3SLACK_CHANNEL="$1"
4SLACK_USERNAME="Naemon"
5SLACK_URL="$2"
6SLACK_USERICON="https://assets.immae.eu/monitoring.png"
7
8if [ "$SERVICESTATE" = "CRITICAL" ]; then
9 ICON=":exclamation:"
10 COLOR="#DA0505"
11elif [ "$SERVICESTATE" = "WARNING" ]; then
12 ICON=":warning:"
13 COLOR="#F1E903"
14elif [ "$SERVICESTATE" = "OK" ]; then
15 ICON=":white_check_mark:"
16 COLOR="#36a64f"
17elif [ "$SERVICESTATE" = "UNKNOWN" ]; then
18 ICON=":question:"
19 COLOR="#000000"
20else
21 ICON=":white_medium_square:"
22 COLOR="#ffffff"
23fi
24
25payload=$(echo "{}" | jq -r \
26 --arg "icon_url" "$SLACK_USERICON" \
27 --arg "channel" "$SLACK_CHANNEL" \
28 --arg "username" "$SLACK_USERNAME" \
29 --arg "text" "${ICON} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" \
30 --arg "color" "$COLOR" \
31 --arg "host" "$HOST" \
32 --arg "desc" "$SERVICEDESC" \
33 --arg "state" "$SERVICESTATE" \
34 --arg "output" "$SERVICEOUTPUT" \
35 '.icon_url = $icon_url |
36 .channel = $channel |
37 .username = $username |
38 .text = $text |
39 .attachments = [{fallback:"", color:$color,fields: [{},{},{},{}]}] |
40 .attachments[0].fields[0] = {title:"Host",value:$host,short:true} |
41 .attachments[0].fields[1] = {title:"Service description",value:$desc,short:true} |
42 .attachments[0].fields[2] = {title:"Status",value:$state,short:true} |
43 .attachments[0].fields[3] = {title:"Message",value:$output,short:false}
44 ')
45
46curl -X POST --data "payload=$payload" $SLACK_URL
diff --git a/flakes/private/monitoring/plugins/send_nrdp.sh b/flakes/private/monitoring/plugins/send_nrdp.sh
new file mode 100755
index 0000000..c83c8cb
--- /dev/null
+++ b/flakes/private/monitoring/plugins/send_nrdp.sh
@@ -0,0 +1,57 @@
1#!/bin/bash
2
3TEMPLATE='{
4 "cmd": "submitcheck",
5 "token": $token,
6 "checkresult": [{
7 "hostname": $hostname,
8 "state": $state,
9 "output": $output,
10 "type": $type,
11 "servicename": $servicename
12 }]
13}'
14
15while getopts "u:t:H:s:S:o:" option
16do
17 case $option in
18 u) url=$OPTARG ;;
19 t) token=$OPTARG ;;
20 H) hostname=$OPTARG ;;
21 s) servicename=$OPTARG ;;
22 S) state=$OPTARG ;;
23 o) output=$OPTARG ;;
24 esac
25done
26
27if [ -n "$servicename" ]; then
28 checktype="service"
29else
30 checktype="host"
31fi
32
33payload=$(jq -n \
34 --arg type "$checktype" \
35 --arg hostname "$hostname" \
36 --arg servicename "$servicename" \
37 --arg output "$output" \
38 --arg token "$token" \
39 --arg state "$state" \
40 "$TEMPLATE")
41
42rslt=$(curl -f --silent --insecure -d "$payload" -H "Content-Type: application/json" "$url")
43ret=$?
44
45if [ $ret != 0 ];then
46 echo "ERROR: could not connect to NRDP server at $url"
47 exit 1
48fi
49
50status=$(echo "$rslt" | jq -r .status)
51message=$(echo "$rslt" | jq -r .message)
52
53if [ "$status" != "ok" ];then
54 echo "ERROR: The NRDP Server said $message"
55 exit 2
56fi
57echo "Sent 1 checks to $url"
diff --git a/flakes/private/monitoring/send_mails b/flakes/private/monitoring/send_mails
new file mode 100755
index 0000000..105c505
--- /dev/null
+++ b/flakes/private/monitoring/send_mails
@@ -0,0 +1,15 @@
1#!/usr/bin/env bash
2
3CHECK_DIR=$1
4shift
5RETURN_PATH=$1
6shift
7
8for mail in "$@"; do
9 echo "Test Mail" | MAILRC=/dev/null mail -n -r "$RETURN_PATH" -s "TestMailImmae " "$mail"
10done
11
12if [ -d "$CHECK_DIR" ]; then
13 cd $CHECK_DIR
14 stat -c '%n;%y' *
15fi
diff --git a/flakes/private/monitoring/to_objects.nix b/flakes/private/monitoring/to_objects.nix
new file mode 100644
index 0000000..57a71ad
--- /dev/null
+++ b/flakes/private/monitoring/to_objects.nix
@@ -0,0 +1,77 @@
1{ lib }:
2 with lib.attrsets;
3 with lib.strings;
4 with lib.lists;
5 with lib.trivial;
6let
7 pad = width: str: let
8 padWidth = width - stringLength str;
9 padding = concatStrings (genList (const " ") padWidth);
10 in str + optionalString (padWidth > 0) padding;
11 toStr = k: v:
12 if k == "check_command" && builtins.isList v
13 then builtins.concatStringsSep "!" v
14 else builtins.toString v;
15
16 toService = service: ''
17 define service {
18 ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v:
19 " ${pad 30 k} ${toStr k v}"
20 ) (filterAttrs (k: v: ! hasPrefix "__passive_" k) service))}
21 }
22 '';
23 toServices = services: builtins.concatStringsSep "\n" (map toService services);
24
25 toCommand = k: v: ''
26 define command {
27 ${pad 30 "command_name"} ${k}
28 ${pad 30 "command_line"} ${v}
29 }
30 '';
31 toCommands = a: builtins.concatStringsSep "\n" (mapAttrsToList toCommand a);
32
33 toOther = keyname: k: v: ''
34 define ${keyname} {
35 ${pad 30 "${keyname}_name"} ${k}
36 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
37 " ${pad 30 kk} ${vv}"
38 ) v)}
39 }
40 '';
41 toOtherNoName = keyname: v: ''
42 define ${keyname} {
43 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
44 " ${pad 30 kk} ${vv}"
45 ) v)}
46 }
47 '';
48 toOthers = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toOther keyname) a);
49 toOthersArray = keyname: a: builtins.concatStringsSep "\n" (map (toOtherNoName keyname) a);
50
51 toTemplate = keyname: k: v: ''
52 define ${keyname} {
53 ${pad 30 "name"} ${k}
54 ${pad 30 "register"} 0
55 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
56 " ${pad 30 kk} ${builtins.toString vv}"
57 ) v)}
58 }
59 '';
60 toTemplates' = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toTemplate keyname) a);
61 toTemplates = v: builtins.concatStringsSep "\n" (mapAttrsToList toTemplates' v);
62
63 toObjects' = keyname: v:
64 if keyname == "service"
65 then toServices v
66 else if keyname == "command"
67 then toCommands v
68 else if keyname == "templates"
69 then toTemplates v
70 else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"]
71 then toOthers keyname v
72 else if builtins.elem keyname ["servicedependency" "hostdependency"]
73 then toOthersArray keyname v
74 else builtins.trace ("Warning: unknown object type " + keyname) "";
75 toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
76in
77 toObjects
diff --git a/flakes/private/openarc/flake.lock b/flakes/private/openarc/flake.lock
index be75993..60b0fdf 100644
--- a/flakes/private/openarc/flake.lock
+++ b/flakes/private/openarc/flake.lock
@@ -2,7 +2,8 @@
2 "nodes": { 2 "nodes": {
3 "files-watcher": { 3 "files-watcher": {
4 "locked": { 4 "locked": {
5 "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", 5 "lastModified": 1,
6 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
6 "path": "../../files-watcher", 7 "path": "../../files-watcher",
7 "type": "path" 8 "type": "path"
8 }, 9 },
@@ -26,69 +27,20 @@
26 "type": "github" 27 "type": "github"
27 } 28 }
28 }, 29 },
29 "my-lib": { 30 "myuids": {
30 "inputs": {
31 "nixpkgs": "nixpkgs"
32 },
33 "locked": { 31 "locked": {
34 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", 32 "lastModified": 1,
35 "path": "../../lib", 33 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
34 "path": "../myuids",
36 "type": "path" 35 "type": "path"
37 }, 36 },
38 "original": { 37 "original": {
39 "path": "../../lib", 38 "path": "../myuids",
40 "type": "path" 39 "type": "path"
41 } 40 }
42 }, 41 },
43 "myuids": {
44 "locked": {
45 "dir": "flakes/myuids",
46 "lastModified": 1628207001,
47 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=",
48 "ref": "master",
49 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
50 "revCount": 865,
51 "type": "git",
52 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
53 },
54 "original": {
55 "dir": "flakes/myuids",
56 "type": "git",
57 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
58 }
59 },
60 "nix-lib": {
61 "locked": {
62 "lastModified": 1633008342,
63 "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=",
64 "owner": "NixOS",
65 "repo": "nixpkgs",
66 "rev": "6eae8a116011f4db0aa5146f364820024411d6bb",
67 "type": "github"
68 },
69 "original": {
70 "owner": "NixOS",
71 "repo": "nixpkgs",
72 "type": "github"
73 }
74 },
75 "nixpkgs": { 42 "nixpkgs": {
76 "locked": { 43 "locked": {
77 "lastModified": 1631570365,
78 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
79 "owner": "NixOS",
80 "repo": "nixpkgs",
81 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
82 "type": "github"
83 },
84 "original": {
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "type": "github"
88 }
89 },
90 "nixpkgs_2": {
91 "locked": {
92 "lastModified": 1597943282, 44 "lastModified": 1597943282,
93 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", 45 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
94 "owner": "NixOS", 46 "owner": "NixOS",
@@ -106,11 +58,12 @@
106 "inputs": { 58 "inputs": {
107 "flake-utils": "flake-utils", 59 "flake-utils": "flake-utils",
108 "myuids": "myuids", 60 "myuids": "myuids",
109 "nixpkgs": "nixpkgs_2", 61 "nixpkgs": "nixpkgs",
110 "openarc": "openarc_2" 62 "openarc": "openarc_2"
111 }, 63 },
112 "locked": { 64 "locked": {
113 "narHash": "sha256-ilrfNs6jpi1OceDE3y1atkovECx6PKNWubwLc0Sjx+s=", 65 "lastModified": 1,
66 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
114 "path": "../../openarc", 67 "path": "../../openarc",
115 "type": "path" 68 "type": "path"
116 }, 69 },
@@ -138,15 +91,14 @@
138 "root": { 91 "root": {
139 "inputs": { 92 "inputs": {
140 "files-watcher": "files-watcher", 93 "files-watcher": "files-watcher",
141 "my-lib": "my-lib",
142 "nix-lib": "nix-lib",
143 "openarc": "openarc", 94 "openarc": "openarc",
144 "secrets": "secrets" 95 "secrets": "secrets"
145 } 96 }
146 }, 97 },
147 "secrets": { 98 "secrets": {
148 "locked": { 99 "locked": {
149 "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", 100 "lastModified": 1,
101 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
150 "path": "../../secrets", 102 "path": "../../secrets",
151 "type": "path" 103 "type": "path"
152 }, 104 },
diff --git a/flakes/private/openarc/flake.nix b/flakes/private/openarc/flake.nix
index b4ab4c8..56c3a1a 100644
--- a/flakes/private/openarc/flake.nix
+++ b/flakes/private/openarc/flake.nix
@@ -1,63 +1,47 @@
1{ 1{
2 inputs.openarc = { 2 inputs.openarc.url = "path:../../openarc";
3 path = "../../openarc"; 3 inputs.secrets.url = "path:../../secrets";
4 type = "path"; 4 inputs.files-watcher.url = "path:../../files-watcher";
5 };
6 inputs.secrets = {
7 path = "../../secrets";
8 type = "path";
9 };
10 inputs.files-watcher = {
11 path = "../../files-watcher";
12 type = "path";
13 };
14 inputs.my-lib = {
15 path = "../../lib";
16 type = "path";
17 };
18 inputs.nix-lib.url = "github:NixOS/nixpkgs";
19 5
20 description = "Private configuration for openarc"; 6 description = "Private configuration for openarc";
21 outputs = { self, nix-lib, my-lib, files-watcher, openarc, secrets }: 7 outputs = { self, files-watcher, openarc, secrets }: {
22 let 8 nixosModule = self.nixosModules.openarc;
23 cfg = name': { config, lib, pkgs, name, ... }: { 9 nixosModules.openarc = { config, pkgs, ... }: {
24 imports = [ 10 imports = [
25 (my-lib.lib.withNarKey files-watcher "nixosModule") 11 files-watcher.nixosModule
26 (my-lib.lib.withNarKey openarc "nixosModule") 12 openarc.nixosModule
27 (my-lib.lib.withNarKey secrets "nixosModule") 13 secrets.nixosModule
28 ]; 14 ];
29 config = lib.mkIf (name == name') { 15 config = {
30 services.openarc = { 16 services.openarc = {
31 enable = true; 17 enable = true;
32 user = "opendkim"; 18 user = "opendkim";
33 socket = "/run/openarc/openarc.sock"; 19 socket = "/run/openarc/openarc.sock";
34 group = config.services.postfix.group; 20 group = config.services.postfix.group;
35 configFile = pkgs.writeText "openarc.conf" '' 21 configFile = pkgs.writeText "openarc.conf" ''
36 AuthservID mail.immae.eu 22 AuthservID mail.immae.eu
37 Domain mail.immae.eu 23 Domain mail.immae.eu
38 KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} 24 KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"}
39 Mode sv 25 Mode sv
40 Selector eldiron 26 Selector eldiron
41 SoftwareHeader yes 27 SoftwareHeader yes
42 Syslog Yes 28 Syslog Yes
43 '';
44 };
45 systemd.services.openarc.serviceConfig.Slice = "mail.slice";
46 systemd.services.openarc.postStart = ''
47 while [ ! -S ${config.services.openarc.socket} ]; do
48 sleep 0.5
49 done
50 chmod g+w ${config.services.openarc.socket}
51 ''; 29 '';
52 services.filesWatcher.openarc = { 30 };
53 restart = true; 31 systemd.services.openarc.serviceConfig.Slice = "mail.slice";
54 paths = [ 32 systemd.services.openarc.postStart = ''
55 config.secrets.fullPaths."opendkim/eldiron.private" 33 while [ ! -S ${config.services.openarc.socket} ]; do
56 ]; 34 sleep 0.5
57 }; 35 done
36 chmod g+w ${config.services.openarc.socket}
37 '';
38 services.filesWatcher.openarc = {
39 restart = true;
40 paths = [
41 config.secrets.fullPaths."opendkim/eldiron.private"
42 ];
58 }; 43 };
59 }; 44 };
60 in 45 };
61 openarc.outputs // 46 };
62 { nixosModules = openarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; };
63} 47}
diff --git a/flakes/private/opendmarc/flake.lock b/flakes/private/opendmarc/flake.lock
index f40e1a9..fdd4d64 100644
--- a/flakes/private/opendmarc/flake.lock
+++ b/flakes/private/opendmarc/flake.lock
@@ -1,8 +1,21 @@
1{ 1{
2 "nodes": { 2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
3 "files-watcher": { 15 "files-watcher": {
4 "locked": { 16 "locked": {
5 "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", 17 "lastModified": 1,
18 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
6 "path": "../../files-watcher", 19 "path": "../../files-watcher",
7 "type": "path" 20 "type": "path"
8 }, 21 },
@@ -26,69 +39,20 @@
26 "type": "github" 39 "type": "github"
27 } 40 }
28 }, 41 },
29 "my-lib": { 42 "myuids": {
30 "inputs": {
31 "nixpkgs": "nixpkgs"
32 },
33 "locked": { 43 "locked": {
34 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", 44 "lastModified": 1,
35 "path": "../../lib", 45 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
46 "path": "../myuids",
36 "type": "path" 47 "type": "path"
37 }, 48 },
38 "original": { 49 "original": {
39 "path": "../../lib", 50 "path": "../myuids",
40 "type": "path" 51 "type": "path"
41 } 52 }
42 }, 53 },
43 "myuids": {
44 "locked": {
45 "dir": "flakes/myuids",
46 "lastModified": 1628207001,
47 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=",
48 "ref": "master",
49 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
50 "revCount": 865,
51 "type": "git",
52 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
53 },
54 "original": {
55 "dir": "flakes/myuids",
56 "type": "git",
57 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
58 }
59 },
60 "nix-lib": {
61 "locked": {
62 "lastModified": 1633008342,
63 "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=",
64 "owner": "NixOS",
65 "repo": "nixpkgs",
66 "rev": "6eae8a116011f4db0aa5146f364820024411d6bb",
67 "type": "github"
68 },
69 "original": {
70 "owner": "NixOS",
71 "repo": "nixpkgs",
72 "type": "github"
73 }
74 },
75 "nixpkgs": { 54 "nixpkgs": {
76 "locked": { 55 "locked": {
77 "lastModified": 1631570365,
78 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
79 "owner": "NixOS",
80 "repo": "nixpkgs",
81 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
82 "type": "github"
83 },
84 "original": {
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "type": "github"
88 }
89 },
90 "nixpkgs_2": {
91 "locked": {
92 "lastModified": 1597943282, 56 "lastModified": 1597943282,
93 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", 57 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
94 "owner": "NixOS", 58 "owner": "NixOS",
@@ -106,10 +70,11 @@
106 "inputs": { 70 "inputs": {
107 "flake-utils": "flake-utils", 71 "flake-utils": "flake-utils",
108 "myuids": "myuids", 72 "myuids": "myuids",
109 "nixpkgs": "nixpkgs_2" 73 "nixpkgs": "nixpkgs"
110 }, 74 },
111 "locked": { 75 "locked": {
112 "narHash": "sha256-7jup/d3+WXXWsNMB7Sp5Py4rJQV30Z5+PJITBISbQ9o=", 76 "lastModified": 1,
77 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
113 "path": "../../opendmarc", 78 "path": "../../opendmarc",
114 "type": "path" 79 "type": "path"
115 }, 80 },
@@ -120,16 +85,16 @@
120 }, 85 },
121 "root": { 86 "root": {
122 "inputs": { 87 "inputs": {
88 "environment": "environment",
123 "files-watcher": "files-watcher", 89 "files-watcher": "files-watcher",
124 "my-lib": "my-lib",
125 "nix-lib": "nix-lib",
126 "opendmarc": "opendmarc", 90 "opendmarc": "opendmarc",
127 "secrets": "secrets" 91 "secrets": "secrets"
128 } 92 }
129 }, 93 },
130 "secrets": { 94 "secrets": {
131 "locked": { 95 "locked": {
132 "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", 96 "lastModified": 1,
97 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
133 "path": "../../secrets", 98 "path": "../../secrets",
134 "type": "path" 99 "type": "path"
135 }, 100 },
diff --git a/flakes/private/opendmarc/flake.nix b/flakes/private/opendmarc/flake.nix
index e2575e7..7e9e8eb 100644
--- a/flakes/private/opendmarc/flake.nix
+++ b/flakes/private/opendmarc/flake.nix
@@ -1,77 +1,62 @@
1{ 1{
2 inputs.opendmarc = { 2 inputs.opendmarc.url = "path:../../opendmarc";
3 path = "../../opendmarc"; 3 inputs.environment.url = "path:../environment";
4 type = "path"; 4 inputs.secrets.url = "path:../../secrets";
5 }; 5 inputs.files-watcher.url = "path:../../files-watcher";
6 inputs.secrets = {
7 path = "../../secrets";
8 type = "path";
9 };
10 inputs.files-watcher = {
11 path = "../../files-watcher";
12 type = "path";
13 };
14 inputs.my-lib = {
15 path = "../../lib";
16 type = "path";
17 };
18 inputs.nix-lib.url = "github:NixOS/nixpkgs";
19 6
20 description = "Private configuration for opendmarc"; 7 description = "Private configuration for opendmarc";
21 outputs = { self, nix-lib, opendmarc, my-lib, files-watcher, secrets }: 8 outputs = { self, environment, opendmarc, files-watcher, secrets }: {
22 let 9 nixosModule = self.nixosModules.opendmarc;
23 cfg = name': { config, lib, pkgs, name, ... }: { 10 nixosModules.opendmarc = { config, lib, pkgs, ... }: {
24 imports = [ 11 imports = [
25 (my-lib.lib.withNarKey files-watcher "nixosModule") 12 environment.nixosModule
26 (my-lib.lib.withNarKey opendmarc "nixosModule") 13 files-watcher.nixosModule
27 (my-lib.lib.withNarKey secrets "nixosModule") 14 opendmarc.nixosModule
28 ]; 15 secrets.nixosModule
29 config = lib.mkIf (name == name') { 16 ];
30 users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; 17 config = {
31 systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; 18 users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ];
32 services.opendmarc = { 19 systemd.services.opendmarc.serviceConfig.Slice = "mail.slice";
33 enable = true; 20 services.opendmarc = {
34 socket = "/run/opendmarc/opendmarc.sock"; 21 enable = true;
35 configFile = pkgs.writeText "opendmarc.conf" '' 22 socket = "/run/opendmarc/opendmarc.sock";
36 AuthservID HOSTNAME 23 configFile = pkgs.writeText "opendmarc.conf" ''
37 FailureReports false 24 AuthservID HOSTNAME
38 FailureReportsBcc postmaster@immae.eu 25 FailureReports false
39 FailureReportsOnNone true 26 FailureReportsBcc postmaster@immae.eu
40 FailureReportsSentBy postmaster@immae.eu 27 FailureReportsOnNone true
41 IgnoreAuthenticatedClients true 28 FailureReportsSentBy postmaster@immae.eu
42 IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} 29 IgnoreAuthenticatedClients true
43 SoftwareHeader true 30 IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"}
44 SPFIgnoreResults true 31 SoftwareHeader true
45 SPFSelfValidate true 32 SPFIgnoreResults true
46 UMask 002 33 SPFSelfValidate true
47 ''; 34 UMask 002
48 group = config.services.postfix.group; 35 '';
49 }; 36 group = config.services.postfix.group;
50 services.filesWatcher.opendmarc = { 37 };
51 restart = true; 38 services.filesWatcher.opendmarc = {
52 paths = [ 39 restart = true;
53 config.secrets.fullPaths."opendmarc/ignore.hosts" 40 paths = [
54 ]; 41 config.secrets.fullPaths."opendmarc/ignore.hosts"
55 }; 42 ];
56 secrets.keys = { 43 };
57 "opendmarc/ignore.hosts" = { 44 secrets.keys = {
58 user = config.services.opendmarc.user; 45 "opendmarc/ignore.hosts" = {
59 group = config.services.opendmarc.group; 46 user = config.services.opendmarc.user;
60 permissions = "0400"; 47 group = config.services.opendmarc.group;
61 text = let 48 permissions = "0400";
62 mxes = lib.attrsets.filterAttrs 49 text = let
63 (n: v: v.mx.enable) 50 mxes = lib.attrsets.filterAttrs
64 config.myEnv.servers; 51 (n: v: v.mx.enable)
65 in 52 config.myEnv.servers;
66 builtins.concatStringsSep "\n" ([ 53 in
67 config.myEnv.mail.dmarc.ignore_hosts 54 builtins.concatStringsSep "\n" ([
68 ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); 55 config.myEnv.mail.dmarc.ignore_hosts
69 }; 56 ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes);
70 }; 57 };
71 }; 58 };
72 }; 59 };
73 in 60 };
74 opendmarc.outputs // 61 };
75 { nixosModules = opendmarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; };
76} 62}
77
diff --git a/flakes/private/openldap/flake.nix b/flakes/private/openldap/flake.nix
new file mode 100644
index 0000000..130312d
--- /dev/null
+++ b/flakes/private/openldap/flake.nix
@@ -0,0 +1,6 @@
1{
2 outputs = { self }: {
3 immae-schema = ./immae.schema;
4 immae-ldif = ./immae.ldif;
5 };
6}
diff --git a/flakes/private/openldap/immae.ldif b/flakes/private/openldap/immae.ldif
new file mode 100644
index 0000000..f1b4cb7
--- /dev/null
+++ b/flakes/private/openldap/immae.ldif
@@ -0,0 +1,83 @@
1# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
2# CRC32 22130f5f
3dn: cn=immae,cn=schema,cn=config
4objectClass: olcSchemaConfig
5cn: immae
6olcObjectIdentifier: {0}Immaeroot 1.3.6.1.4.1.50071
7olcObjectIdentifier: {1}Immae Immaeroot:2
8olcObjectIdentifier: {2}ImmaeattributeType Immae:3
9olcObjectIdentifier: {3}ImmaeobjectClass Immae:4
10olcAttributeTypes: {0}( ImmaeattributeType:1 NAME 'immaeTtrssLogin' DESC 'lo
11 gin for TTRSS' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
12 NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
13olcAttributeTypes: {1}( ImmaeattributeType:2 NAME 'immaeFtpDirectory' DESC '
14 home directory for ftp' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.
15 115.121.1.26 )
16olcAttributeTypes: {2}( ImmaeattributeType:3 NAME 'immaeFtpUid' DESC 'user i
17 d for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
18olcAttributeTypes: {3}( ImmaeattributeType:4 NAME 'immaeFtpGid' DESC 'group
19 id for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
20olcAttributeTypes: {4}( ImmaeattributeType:5 NAME 'immaeSshKey' DESC 'OpenSS
21 H Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.4
22 0 )
23olcAttributeTypes: {5}( ImmaeattributeType:6 NAME 'immaeAccessDn' EQUALITY d
24 istinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
25olcAttributeTypes: {6}( ImmaeattributeType:17 NAME 'immaeAccessWriteDn' EQUA
26 LITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
27olcAttributeTypes: {7}( ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
28 EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
29olcAttributeTypes: {8}( ImmaeattributeType:7 NAME 'immaeXmppUid' DESC 'user
30 part for Xmpp' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
31 NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
32olcAttributeTypes: {9}( ImmaeattributeType:8 NAME 'immaePostfixAddress' DESC
33 'the dovecot address to match as username' EQUALITY caseIgnoreIA5Match SUB
34 STR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
35 )
36olcAttributeTypes: {10}( ImmaeattributeType:9 NAME 'immaePostfixHome' DESC '
37 the postfix home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
38 466.115.121.1.26 SINGLE-VALUE )
39olcAttributeTypes: {11}( ImmaeattributeType:10 NAME 'immaePostfixMail' DESC
40 'the dovecot mail location' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
41 466.115.121.1.26 SINGLE-VALUE )
42olcAttributeTypes: {12}( ImmaeattributeType:11 NAME 'immaePostfixUid' DESC '
43 the dovecot uid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
44 .1.26 SINGLE-VALUE )
45olcAttributeTypes: {13}( ImmaeattributeType:12 NAME 'immaePostfixGid' DESC '
46 the dovecot gid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
47 .1.26 SINGLE-VALUE )
48olcAttributeTypes: {14}( ImmaeattributeType:16 NAME 'immaePuppetJson' DESC '
49 Puppet hiera json' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.12
50 1.1.40 )
51olcAttributeTypes: {15}( ImmaeattributeType:19 NAME 'immaeTaskId' DESC 'Task
52 warrior server Org:Name:Key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs
53 tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
54olcAttributeTypes: {16}( ImmaeattributeType:20 NAME 'immaePeertubeId' DESC '
55 login for Peertube' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat
56 ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
57olcObjectClasses: {0}( ImmaeobjectClass:1 NAME 'immaeTtrssClass' DESC 'Expan
58 sion of the existing object classes for ttrss' SUP top AUXILIARY MUST immae
59 TtrssLogin )
60olcObjectClasses: {1}( ImmaeobjectClass:2 NAME 'immaeFtpClass' DESC 'Expansi
61 on of the existing object classes for ftp' SUP top AUXILIARY MUST ( immaeFt
62 pDirectory $ immaeFtpGid $ immaeFtpUid ) )
63olcObjectClasses: {2}( ImmaeobjectClass:3 NAME 'immaeSshClass' DESC 'OpenSSH
64 class' SUP top AUXILIARY MAY immaeSSHKey )
65olcObjectClasses: {3}( ImmaeobjectClass:4 NAME 'immaeAccessClass' DESC 'Acce
66 ss class' SUP top AUXILIARY MAY ( immaeAccessDn $ immaeAccessWriteDn $ imma
67 eAccessReadSubtree ) )
68olcObjectClasses: {4}( ImmaeobjectClass:5 NAME 'immaeXmppClass' DESC 'Expans
69 ion of the existing object classes for XMPP' SUP top AUXILIARY MUST immaeXm
70 ppUid )
71olcObjectClasses: {5}( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Exp
72 ansion of the existing object classes for Postfix' SUP top AUXILIARY MAY (
73 immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) M
74 UST ( immaePostfixAddress ) )
75olcObjectClasses: {6}( ImmaeobjectClass:8 NAME 'immaePuppetClass' DESC 'Expa
76 nsion of the existing object classes for Puppet' SUP top AUXILIARY MUST imm
77 aePuppetJson )
78olcObjectClasses: {7}( ImmaeobjectClass:9 NAME 'immaeTaskClass' DESC 'Expans
79 ion of the existing object classes for Task' SUP top AUXILIARY MUST immaeTa
80 skId )
81olcObjectClasses: {8}( ImmaeobjectClass:10 NAME 'immaePeertubeClass' DESC 'E
82 xpansion of the existing object classes for peertube' SUP top AUXILIARY MUS
83 T immaePeertubeId )
diff --git a/flakes/private/openldap/immae.schema b/flakes/private/openldap/immae.schema
new file mode 100644
index 0000000..7b3b587
--- /dev/null
+++ b/flakes/private/openldap/immae.schema
@@ -0,0 +1,179 @@
1# vim: set filetype=slapd:
2objectIdentifier Immaeroot 1.3.6.1.4.1.50071
3
4objectIdentifier Immae Immaeroot:2
5objectIdentifier ImmaeattributeType Immae:3
6objectIdentifier ImmaeobjectClass Immae:4
7
8# TT-RSS
9attributetype ( ImmaeattributeType:1 NAME 'immaeTtrssLogin'
10 DESC 'login for TTRSS'
11 EQUALITY caseIgnoreMatch
12 SUBSTR caseIgnoreSubstringsMatch
13 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
14
15objectclass ( ImmaeobjectClass:1 NAME 'immaeTtrssClass'
16 DESC 'Expansion of the existing object classes for ttrss'
17 SUP top AUXILIARY
18 MUST ( immaeTtrssLogin ) )
19
20# FTP
21attributetype ( ImmaeattributeType:2 NAME 'immaeFtpDirectory'
22 DESC 'home directory for ftp'
23 EQUALITY caseExactIA5Match
24 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
25
26attributetype ( ImmaeattributeType:3 NAME 'immaeFtpUid'
27 DESC 'user id for ftp'
28 EQUALITY integerMatch
29 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
30
31attributetype ( ImmaeattributeType:4 NAME 'immaeFtpGid'
32 DESC 'group id for ftp'
33 EQUALITY integerMatch
34 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
35
36objectclass ( ImmaeobjectClass:2 NAME 'immaeFtpClass'
37 DESC 'Expansion of the existing object classes for ftp'
38 SUP top AUXILIARY
39 MUST ( immaeFtpDirectory $ immaeFtpGid $ immaeFtpUid ) )
40
41
42# SSH keys
43attributetype ( ImmaeattributeType:5 NAME 'immaeSshKey'
44 DESC 'OpenSSH Public key'
45 EQUALITY octetStringMatch
46 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
47
48objectClass ( ImmaeobjectClass:3 NAME 'immaeSshClass'
49 DESC 'OpenSSH class'
50 SUP top AUXILIARY
51 MAy ( immaeSSHKey ) )
52
53# Specific access
54attributetype (ImmaeattributeType:6 NAME 'immaeAccessDn'
55 EQUALITY distinguishedNameMatch
56 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
57
58attributetype (ImmaeattributeType:17 NAME 'immaeAccessWriteDn'
59 EQUALITY distinguishedNameMatch
60 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
61
62attributetype (ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
63 EQUALITY distinguishedNameMatch
64 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
65
66objectClass ( ImmaeobjectClass:4 NAME 'immaeAccessClass'
67 DESC 'Access class'
68 SUP top AUXILIARY
69 MAY ( immaeAccessDn $ immaeAccessWriteDn $ immaeAccessReadSubtree ) )
70
71# Xmpp uid
72attributetype ( ImmaeattributeType:7 NAME 'immaeXmppUid'
73 DESC 'user part for Xmpp'
74 EQUALITY caseIgnoreMatch
75 SUBSTR caseIgnoreSubstringsMatch
76 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
77
78objectclass ( ImmaeobjectClass:5 NAME 'immaeXmppClass'
79 DESC 'Expansion of the existing object classes for XMPP'
80 SUP top AUXILIARY
81 MUST ( immaeXmppUid ) )
82
83# Postfix accounts
84attributetype ( ImmaeattributeType:8 NAME 'immaePostfixAddress'
85 DESC 'the dovecot address to match as username'
86 EQUALITY caseIgnoreIA5Match
87 SUBSTR caseIgnoreIA5SubstringsMatch
88 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
89
90attributetype ( ImmaeattributeType:9 NAME 'immaePostfixHome'
91 DESC 'the postfix home directory'
92 EQUALITY caseExactIA5Match
93 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
94
95attributetype ( ImmaeattributeType:10 NAME 'immaePostfixMail'
96 DESC 'the dovecot mail location'
97 EQUALITY caseExactIA5Match
98 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
99
100attributetype ( ImmaeattributeType:11 NAME 'immaePostfixUid'
101 DESC 'the dovecot uid'
102 EQUALITY caseExactIA5Match
103 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
104
105attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid'
106 DESC 'the dovecot gid'
107 EQUALITY caseExactIA5Match
108 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
109
110objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass'
111 DESC 'Expansion of the existing object classes for Postfix'
112 SUP top AUXILIARY
113 MAY ( immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid )
114 MUST ( immaePostfixAddress )
115 )
116
117# Tinc informations
118# Domaine = une classe a part ou une partie du dn ?
119# attributetype ( ImmaeattributeType:13 NAME 'immaeTincIpSegment'
120# DESC 'the internal ip segment in tinc'
121# EQUALITY caseIgnoreIA5Match
122# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
123#
124# attributetype ( ImmaeattributeType:14 NAME 'immaeTincSubdomain'
125# DESC 'the host subdomain'
126# EQUALITY caseIgnoreIA5Match
127# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
128#
129# attributetype ( ImmaeattributeType:15 NAME 'immaeTincHostname'
130# DESC 'the host name'
131# EQUALITY caseIgnoreIA5Match
132# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
133#
134# objectclass ( ImmaeobjectClass:7 NAME 'immaeTincHostClass'
135# DESC 'Expansion of the existing object classes for Tinc'
136# SUP top AUXILIARY
137# MUST ( immaeTincInternalIp $ immaeTincSubdomain $
138# immaeTincHostname )
139# )
140
141attributetype (ImmaeattributeType:16 NAME 'immaePuppetJson'
142 DESC 'Puppet hiera json'
143 EQUALITY octetStringMatch
144 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
145
146objectclass ( ImmaeobjectClass:8 NAME 'immaePuppetClass'
147 DESC 'Expansion of the existing object classes for Puppet'
148 SUP top AUXILIARY
149 MUST ( immaePuppetJson )
150 )
151
152attributetype (ImmaeattributeType:19 NAME 'immaeTaskId'
153 DESC 'Taskwarrior server Org:Name:Key'
154 EQUALITY caseIgnoreMatch
155 SUBSTR caseIgnoreSubstringsMatch
156 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
157
158objectclass ( ImmaeobjectClass:9 NAME 'immaeTaskClass'
159 DESC 'Expansion of the existing object classes for Task'
160 SUP top AUXILIARY
161 MUST ( immaeTaskId )
162 )
163
164# Peertube uid
165attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
166 DESC 'login for Peertube'
167 EQUALITY caseIgnoreMatch
168 SUBSTR caseIgnoreSubstringsMatch
169 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
170
171objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
172 DESC 'Expansion of the existing object classes for peertube'
173 SUP top AUXILIARY
174 MUST ( immaePeertubeId ) )
175
176
177# Last:
178# attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
179# objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
diff --git a/flakes/private/paste/flake.lock b/flakes/private/paste/flake.lock
index 6ad428c..e81b9ee 100644
--- a/flakes/private/paste/flake.lock
+++ b/flakes/private/paste/flake.lock
@@ -15,35 +15,6 @@
15 "type": "github" 15 "type": "github"
16 } 16 }
17 }, 17 },
18 "my-lib": {
19 "inputs": {
20 "nixpkgs": "nixpkgs"
21 },
22 "locked": {
23 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=",
24 "path": "../../lib",
25 "type": "path"
26 },
27 "original": {
28 "path": "../../lib",
29 "type": "path"
30 }
31 },
32 "nix-lib": {
33 "locked": {
34 "lastModified": 1632955135,
35 "narHash": "sha256-MyOBftnLv5UcPCL4AzvlyNEDwGD2cGGM9HMEOno/MZw=",
36 "owner": "NixOS",
37 "repo": "nixpkgs",
38 "rev": "a4d96cd808f13d924988938ecf9a46b2a2787fa3",
39 "type": "github"
40 },
41 "original": {
42 "owner": "NixOS",
43 "repo": "nixpkgs",
44 "type": "github"
45 }
46 },
47 "nixpkgs": { 18 "nixpkgs": {
48 "locked": { 19 "locked": {
49 "lastModified": 1631570365, 20 "lastModified": 1631570365,
@@ -59,28 +30,14 @@
59 "type": "github" 30 "type": "github"
60 } 31 }
61 }, 32 },
62 "nixpkgs_2": {
63 "locked": {
64 "lastModified": 1631570365,
65 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
66 "owner": "NixOS",
67 "repo": "nixpkgs",
68 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
69 "type": "github"
70 },
71 "original": {
72 "owner": "NixOS",
73 "repo": "nixpkgs",
74 "type": "github"
75 }
76 },
77 "paste": { 33 "paste": {
78 "inputs": { 34 "inputs": {
79 "flake-utils": "flake-utils", 35 "flake-utils": "flake-utils",
80 "nixpkgs": "nixpkgs_2" 36 "nixpkgs": "nixpkgs"
81 }, 37 },
82 "locked": { 38 "locked": {
83 "narHash": "sha256-2ylI42ZHfzW6oCsxfFyHf5zVnDsPMwvJCACtcdErtPg=", 39 "lastModified": 1,
40 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
84 "path": "../../paste", 41 "path": "../../paste",
85 "type": "path" 42 "type": "path"
86 }, 43 },
@@ -91,8 +48,6 @@
91 }, 48 },
92 "root": { 49 "root": {
93 "inputs": { 50 "inputs": {
94 "my-lib": "my-lib",
95 "nix-lib": "nix-lib",
96 "paste": "paste" 51 "paste": "paste"
97 } 52 }
98 } 53 }
diff --git a/flakes/private/paste/flake.nix b/flakes/private/paste/flake.nix
index 23f8cd3..97853ea 100644
--- a/flakes/private/paste/flake.nix
+++ b/flakes/private/paste/flake.nix
@@ -1,30 +1,20 @@
1{ 1{
2 inputs.paste = { 2 inputs.paste.url = "path:../../paste";
3 path = "../../paste";
4 type = "path";
5 };
6 inputs.my-lib = {
7 path = "../../lib";
8 type = "path";
9 };
10 inputs.nix-lib.url = "github:NixOS/nixpkgs";
11 3
12 description = "Private configuration for paste"; 4 description = "Private configuration for paste";
13 outputs = { self, my-lib, nix-lib, paste }: 5 outputs = { self, paste }: {
14 let 6 nixosModule = self.nixosModules.paste;
15 cfg = name': { config, lib, pkgs, name, ... }: { 7 nixosModules.paste = { ... }: {
16 imports = [ 8 imports = [
17 (my-lib.lib.withNarKey paste "nixosModule") 9 paste.nixosModule
18 ]; 10 ];
19 config = lib.mkIf (name == name') { 11 config = {
20 services.paste = { 12 services.paste = {
21 enable = true; 13 enable = true;
22 webDirectory = "/paste"; 14 webDirectory = "/paste";
23 };
24 }; 15 };
25 }; 16 };
26 in 17 };
27 paste.outputs // 18 };
28 { nixosModules = paste.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron"] cfg; };
29} 19}
30 20
diff --git a/flakes/private/peertube/flake.lock b/flakes/private/peertube/flake.lock
index 4944da7..0ecec47 100644
--- a/flakes/private/peertube/flake.lock
+++ b/flakes/private/peertube/flake.lock
@@ -32,36 +32,26 @@
32 }, 32 },
33 "myuids": { 33 "myuids": {
34 "locked": { 34 "locked": {
35 "dir": "flakes/myuids", 35 "lastModified": 1,
36 "lastModified": 1628207001, 36 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
37 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 37 "path": "../myuids",
38 "ref": "master", 38 "type": "path"
39 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
40 "revCount": 865,
41 "type": "git",
42 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
43 }, 39 },
44 "original": { 40 "original": {
45 "dir": "flakes/myuids", 41 "path": "../myuids",
46 "type": "git", 42 "type": "path"
47 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
48 } 43 }
49 }, 44 },
50 "myuids_2": { 45 "myuids_2": {
51 "locked": { 46 "locked": {
52 "dir": "flakes/myuids", 47 "lastModified": 1,
53 "lastModified": 1628207001, 48 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
54 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 49 "path": "../myuids",
55 "ref": "master", 50 "type": "path"
56 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
57 "revCount": 865,
58 "type": "git",
59 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
60 }, 51 },
61 "original": { 52 "original": {
62 "dir": "flakes/myuids", 53 "path": "../myuids",
63 "type": "git", 54 "type": "path"
64 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
65 } 55 }
66 }, 56 },
67 "nixpkgs": { 57 "nixpkgs": {
@@ -97,12 +87,13 @@
97 "peertube": { 87 "peertube": {
98 "flake": false, 88 "flake": false,
99 "locked": { 89 "locked": {
100 "lastModified": 1610436329, 90 "lastModified": 1611184594,
101 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", 91 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
102 "owner": "Chocobozzz", 92 "ref": "gitolite_local/open_instance",
103 "repo": "PeerTube", 93 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
104 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", 94 "revCount": 6316,
105 "type": "github" 95 "type": "git",
96 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
106 }, 97 },
107 "original": { 98 "original": {
108 "owner": "Chocobozzz", 99 "owner": "Chocobozzz",
@@ -114,21 +105,21 @@
114 "peertube_2": { 105 "peertube_2": {
115 "flake": false, 106 "flake": false,
116 "locked": { 107 "locked": {
117 "lastModified": 1611184594, 108 "lastModified": 1610436329,
118 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", 109 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
119 "ref": "gitolite_local/syden", 110 "owner": "Chocobozzz",
120 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", 111 "repo": "PeerTube",
121 "revCount": 6316, 112 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
122 "type": "git", 113 "type": "github"
123 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
124 }, 114 },
125 "original": { 115 "original": {
126 "ref": "gitolite_local/syden", 116 "owner": "Chocobozzz",
127 "type": "git", 117 "ref": "v3.0.1",
128 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" 118 "repo": "PeerTube",
119 "type": "github"
129 } 120 }
130 }, 121 },
131 "peertube_origin": { 122 "peertube_open_instance": {
132 "inputs": { 123 "inputs": {
133 "flake-utils": "flake-utils", 124 "flake-utils": "flake-utils",
134 "myuids": "myuids", 125 "myuids": "myuids",
@@ -136,16 +127,17 @@
136 "peertube": "peertube" 127 "peertube": "peertube"
137 }, 128 },
138 "locked": { 129 "locked": {
139 "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", 130 "lastModified": 1,
140 "path": "../../peertube", 131 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
132 "path": "./../../peertube",
141 "type": "path" 133 "type": "path"
142 }, 134 },
143 "original": { 135 "original": {
144 "path": "../../peertube", 136 "path": "./../../peertube",
145 "type": "path" 137 "type": "path"
146 } 138 }
147 }, 139 },
148 "peertube_syden": { 140 "peertube_origin": {
149 "inputs": { 141 "inputs": {
150 "flake-utils": "flake-utils_2", 142 "flake-utils": "flake-utils_2",
151 "myuids": "myuids_2", 143 "myuids": "myuids_2",
@@ -153,19 +145,20 @@
153 "peertube": "peertube_2" 145 "peertube": "peertube_2"
154 }, 146 },
155 "locked": { 147 "locked": {
156 "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", 148 "lastModified": 1,
157 "path": "../../peertube", 149 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
150 "path": "./../../peertube",
158 "type": "path" 151 "type": "path"
159 }, 152 },
160 "original": { 153 "original": {
161 "path": "../../peertube", 154 "path": "./../../peertube",
162 "type": "path" 155 "type": "path"
163 } 156 }
164 }, 157 },
165 "root": { 158 "root": {
166 "inputs": { 159 "inputs": {
167 "peertube_origin": "peertube_origin", 160 "peertube_open_instance": "peertube_open_instance",
168 "peertube_syden": "peertube_syden" 161 "peertube_origin": "peertube_origin"
169 } 162 }
170 } 163 }
171 }, 164 },
diff --git a/flakes/private/peertube/flake.nix b/flakes/private/peertube/flake.nix
index e0e0d54..8eb81e9 100644
--- a/flakes/private/peertube/flake.nix
+++ b/flakes/private/peertube/flake.nix
@@ -1,27 +1,25 @@
1{ 1{
2 description = "Patched peertube"; 2 description = "Patched peertube";
3 inputs.peertube_origin = { 3 inputs.peertube_origin = {
4 path = "../../peertube"; 4 url = "path:./../../peertube";
5 type = "path";
6 }; 5 };
7 inputs.peertube_syden = { 6 inputs.peertube_open_instance = {
8 path = "../../peertube"; 7 url = "path:./../../peertube";
9 type = "path";
10 inputs.peertube = { 8 inputs.peertube = {
11 url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git"; 9 url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git";
12 ref = "gitolite_local/syden"; 10 ref = "gitolite_local/open_instance";
13 flake = false; 11 flake = false;
14 type = "git"; 12 type = "git";
15 }; 13 };
16 }; 14 };
17 15
18 outputs = { self, peertube_origin, peertube_syden }: { 16 outputs = { self, peertube_origin, peertube_open_instance }: {
19 overlays = { 17 overlays = {
20 peertube_syden = final: prev: { peertube_syden = peertube_syden.defaultPackage."${final.system}"; }; 18 peertube_open_instance = final: prev: { peertube_open_instance = peertube_open_instance.defaultPackage."${final.system}"; };
21 peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; }; 19 peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; };
22 }; 20 };
23 packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube; 21 packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube;
24 packages.x86_64-linux.peertube_syden = peertube_syden.packages.x86_64-linux.peertube; 22 packages.x86_64-linux.peertube_open_instance = peertube_open_instance.packages.x86_64-linux.peertube;
25 defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux; 23 defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux;
26 nixosModule = peertube_origin.nixosModule; 24 nixosModule = peertube_origin.nixosModule;
27 }; 25 };
diff --git a/flakes/private/php/flake.lock b/flakes/private/php/flake.lock
new file mode 100644
index 0000000..c9af933
--- /dev/null
+++ b/flakes/private/php/flake.lock
@@ -0,0 +1,62 @@
1{
2 "nodes": {
3 "flake-utils": {
4 "locked": {
5 "lastModified": 1648297722,
6 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
7 "owner": "numtide",
8 "repo": "flake-utils",
9 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
10 "type": "github"
11 },
12 "original": {
13 "owner": "numtide",
14 "repo": "flake-utils",
15 "type": "github"
16 }
17 },
18 "nixpkgs": {
19 "flake": false,
20 "locked": {
21 "lastModified": 1596265691,
22 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
23 "owner": "NixOS",
24 "repo": "nixpkgs",
25 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
26 "type": "github"
27 },
28 "original": {
29 "owner": "NixOS",
30 "repo": "nixpkgs",
31 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
32 "type": "github"
33 }
34 },
35 "nixpkgs-4": {
36 "flake": false,
37 "locked": {
38 "lastModified": 1646497237,
39 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
40 "owner": "NixOS",
41 "repo": "nixpkgs",
42 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
43 "type": "github"
44 },
45 "original": {
46 "owner": "NixOS",
47 "repo": "nixpkgs",
48 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
49 "type": "github"
50 }
51 },
52 "root": {
53 "inputs": {
54 "flake-utils": "flake-utils",
55 "nixpkgs": "nixpkgs",
56 "nixpkgs-4": "nixpkgs-4"
57 }
58 }
59 },
60 "root": "root",
61 "version": 7
62}
diff --git a/flakes/private/php/flake.nix b/flakes/private/php/flake.nix
new file mode 100644
index 0000000..a730b68
--- /dev/null
+++ b/flakes/private/php/flake.nix
@@ -0,0 +1,40 @@
1{
2 description = "Php old versions";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.nixpkgs-4 = {
9 url = "github:NixOS/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026";
10 flake = false;
11 };
12 outputs = { self, nixpkgs, nixpkgs-4, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
13 let
14 pkgs = import nixpkgs { inherit system; overlays = []; };
15 in rec {
16 packages = {
17 php72 = pkgs.php72;
18 php73 = pkgs.php73;
19 php74 = (import nixpkgs-4 { inherit system; overlays = []; }).php74;
20 cryptpad = (import nixpkgs-4 { inherit system; overlays = []; }).cryptpad;
21 python37 = (import nixpkgs-4 { inherit system; overlays = []; }).python37;
22 python37Packages = (import nixpkgs-4 { inherit system; overlays = []; }).python37Packages;
23 telegram-purple = (import nixpkgs-4 { inherit system; overlays = []; }).telegram-purple;
24 };
25 defaultPackage = packages.php73;
26 legacyPackages = packages;
27 }) // rec {
28 overlays = {
29 php = final: prev: {
30 php72 = self.packages."${final.system}".php72;
31 php73 = self.packages."${final.system}".php73;
32 php74 = self.packages."${final.system}".php74;
33 cryptpad = self.packages."${final.system}".cryptpad;
34 python37 = self.packages."${final.system}".python37;
35 telegram-purple = self.packages."${final.system}".telegram-purple;
36 };
37 };
38 overlay = overlays.php;
39 };
40}
diff --git a/flakes/private/ssh/flake.lock b/flakes/private/ssh/flake.lock
new file mode 100644
index 0000000..bbb2011
--- /dev/null
+++ b/flakes/private/ssh/flake.lock
@@ -0,0 +1,36 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment",
18 "secrets": "secrets"
19 }
20 },
21 "secrets": {
22 "locked": {
23 "lastModified": 1,
24 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
25 "path": "../../secrets",
26 "type": "path"
27 },
28 "original": {
29 "path": "../../secrets",
30 "type": "path"
31 }
32 }
33 },
34 "root": "root",
35 "version": 7
36}
diff --git a/flakes/private/ssh/flake.nix b/flakes/private/ssh/flake.nix
new file mode 100644
index 0000000..0ca6d67
--- /dev/null
+++ b/flakes/private/ssh/flake.nix
@@ -0,0 +1,107 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets.url = "path:../../secrets";
4 outputs = { self, environment, secrets }: {
5 nixosModule = self.nixosModules.ssh;
6 nixosModules.ssh = { lib, pkgs, config, ... }:
7 let
8 cfg = config.myServices.ssh;
9 in
10 {
11 imports = [
12 environment.nixosModule
13 secrets.nixosModule
14 ];
15 options.myServices.ssh = let
16 module = lib.types.submodule {
17 options = {
18 vars = lib.mkOption {
19 type = lib.types.attrsOf lib.types.lines;
20 default = {};
21 description = ''
22 variables to interpolate in the script. A `name_` prefix will be prepended
23 '';
24 };
25 snippet = lib.mkOption {
26 type = lib.types.lines;
27 description = ''
28 Snippet to use
29 '';
30 };
31 dependencies = lib.mkOption {
32 type = lib.types.listOf lib.types.package;
33 default = [];
34 description = ''
35 Dependencies of the package
36 '';
37 };
38 };
39 };
40 in {
41 modules = lib.mkOption {
42 type = lib.types.attrsOf module;
43 default = {};
44 description = ''
45 List of modules to enable
46 '';
47 };
48 };
49 config = lib.mkIf (builtins.length (builtins.attrValues cfg.modules) > 0) {
50
51 services.openssh.extraConfig = ''
52 AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys
53 AuthorizedKeysCommandUser nobody
54 '';
55
56 secrets.keys."ssh-ldap" = {
57 user = "nobody";
58 group = "nogroup";
59 permissions = "0400";
60 text = config.myEnv.sshd.ldap.password;
61 };
62 secrets.keys."ssh-psql" = {
63 user = "nobody";
64 group = "nogroup";
65 permissions = "0400";
66 text = config.myEnv.sshd.psql.password;
67 };
68 system.activationScripts.sshd = {
69 deps = [ "secrets" ];
70 text = ''
71 install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password
72 install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-psql"} /etc/ssh/psql_password
73 '';
74 };
75 # ssh is strict about parent directory having correct rights, don't
76 # move it in the nix store.
77 environment.etc."ssh/ldap_authorized_keys" = let
78 deps = lib.lists.unique (
79 [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.postgresql ]
80 ++ lib.flatten (map (v: v.dependencies) (builtins.attrValues cfg.modules))
81 );
82 vars = lib.concatMapAttrs (n: v: (
83 lib.mapAttrs' (n': lib.nameValuePair "${n}_${n'}") v.vars
84 )) cfg.modules;
85 fullScript = pkgs.runCommand "ldap_authorized_keys" (vars // {
86 snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) (builtins.attrValues cfg.modules));
87 }) ''
88 substituteAll ${./ldap_authorized_keys.sh} $out
89 # Second call for the included snippets
90 substituteAllInPlace $out
91 chmod a+x $out
92 '';
93 ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" {
94 buildInputs = [ pkgs.makeWrapper ];
95 } ''
96 makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps}
97 '';
98 in {
99 enable = true;
100 mode = "0755";
101 user = "root";
102 source = ldap_authorized_keys;
103 };
104 };
105 };
106 };
107}
diff --git a/flakes/private/ssh/ldap_authorized_keys.sh b/flakes/private/ssh/ldap_authorized_keys.sh
new file mode 100755
index 0000000..f4395be
--- /dev/null
+++ b/flakes/private/ssh/ldap_authorized_keys.sh
@@ -0,0 +1,62 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4KEY="immaeSshKey"
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap://ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9USER_LDAP_BASE="ou=users,dc=immae,dc=eu"
10
11PSQL_BASE="immae"
12PSQL_HOST="localhost"
13PSQL_USER="immae_auth_read"
14PSQL_PASS=$(cat /etc/ssh/psql_password)
15
16suitable_for() {
17 type_for="$1"
18 key="$2"
19
20 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
21 echo "$key"
22 else
23 key_type=$(cut -d " " -f 1 <<< "$key")
24
25 if grep -q "\b-$type_for\b" <<< "$key_type"; then
26 echo ""
27 elif grep -q "\b$type_for\b" <<< "$key_type"; then
28 echo $(sed -e "s/^[^ ]* //g" <<< "$key")
29 else
30 echo ""
31 fi
32 fi
33}
34
35clean_key_line() {
36 type_for="$1"
37 line="$2"
38
39 if [[ "$line" == $KEY::* ]]; then
40 # base64 keys should't happen, unless wrong copy-pasting
41 key=""
42 else
43 key=$(sed -e "s/^$KEY: *//" -e "s/ *$//" <<< "$line")
44 fi
45
46 suitable_for "$type_for" "$key"
47}
48
49ldap_search() {
50 $LDAPSEARCH -H $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@"
51}
52
53psql_search() {
54 PGPASSWORD="$PSQL_PASS" psql -U "$PSQL_USER" -h "$PSQL_HOST" -X -A -t -d "$PSQL_BASE" -c "$@"
55}
56
57ldap_keys() {
58 user=$1;
59 @snippets@
60}
61
62ldap_keys $@
diff --git a/flakes/private/system/flake.lock b/flakes/private/system/flake.lock
new file mode 100644
index 0000000..3602f00
--- /dev/null
+++ b/flakes/private/system/flake.lock
@@ -0,0 +1,185 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils",
6 "nixpkgs": "nixpkgs"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "environment": {
20 "locked": {
21 "lastModified": 1,
22 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
23 "path": "../environment",
24 "type": "path"
25 },
26 "original": {
27 "path": "../environment",
28 "type": "path"
29 }
30 },
31 "flake-parts": {
32 "inputs": {
33 "nixpkgs-lib": "nixpkgs-lib"
34 },
35 "locked": {
36 "lastModified": 1675295133,
37 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
38 "owner": "hercules-ci",
39 "repo": "flake-parts",
40 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
41 "type": "github"
42 },
43 "original": {
44 "owner": "hercules-ci",
45 "repo": "flake-parts",
46 "type": "github"
47 }
48 },
49 "flake-utils": {
50 "locked": {
51 "lastModified": 1667395993,
52 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
53 "owner": "numtide",
54 "repo": "flake-utils",
55 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
56 "type": "github"
57 },
58 "original": {
59 "owner": "numtide",
60 "repo": "flake-utils",
61 "type": "github"
62 }
63 },
64 "mypackages": {
65 "inputs": {
66 "flake-parts": "flake-parts",
67 "nixpkgs": "nixpkgs_2",
68 "webapps-ttrss": "webapps-ttrss"
69 },
70 "locked": {
71 "lastModified": 1,
72 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
73 "path": "../../mypackages",
74 "type": "path"
75 },
76 "original": {
77 "path": "../../mypackages",
78 "type": "path"
79 }
80 },
81 "myuids": {
82 "locked": {
83 "lastModified": 1,
84 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
85 "path": "../../myuids",
86 "type": "path"
87 },
88 "original": {
89 "path": "../../myuids",
90 "type": "path"
91 }
92 },
93 "nixpkgs": {
94 "locked": {
95 "lastModified": 1687502512,
96 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
97 "owner": "NixOS",
98 "repo": "nixpkgs",
99 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
100 "type": "github"
101 },
102 "original": {
103 "owner": "NixOS",
104 "ref": "nixos-unstable",
105 "repo": "nixpkgs",
106 "type": "github"
107 }
108 },
109 "nixpkgs-lib": {
110 "locked": {
111 "dir": "lib",
112 "lastModified": 1675183161,
113 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
114 "owner": "NixOS",
115 "repo": "nixpkgs",
116 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
117 "type": "github"
118 },
119 "original": {
120 "dir": "lib",
121 "owner": "NixOS",
122 "ref": "nixos-unstable",
123 "repo": "nixpkgs",
124 "type": "github"
125 }
126 },
127 "nixpkgs_2": {
128 "locked": {
129 "lastModified": 1646497237,
130 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
131 "owner": "nixos",
132 "repo": "nixpkgs",
133 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
134 "type": "github"
135 },
136 "original": {
137 "owner": "nixos",
138 "repo": "nixpkgs",
139 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
140 "type": "github"
141 }
142 },
143 "root": {
144 "inputs": {
145 "backports": "backports",
146 "environment": "environment",
147 "mypackages": "mypackages",
148 "myuids": "myuids",
149 "secrets-public": "secrets-public"
150 }
151 },
152 "secrets-public": {
153 "locked": {
154 "lastModified": 1,
155 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
156 "path": "../../secrets",
157 "type": "path"
158 },
159 "original": {
160 "path": "../../secrets",
161 "type": "path"
162 }
163 },
164 "webapps-ttrss": {
165 "flake": false,
166 "locked": {
167 "lastModified": 1546759381,
168 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
169 "ref": "master",
170 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
171 "revCount": 9256,
172 "type": "git",
173 "url": "https://git.tt-rss.org/fox/tt-rss.git"
174 },
175 "original": {
176 "ref": "master",
177 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
178 "type": "git",
179 "url": "https://git.tt-rss.org/fox/tt-rss.git"
180 }
181 }
182 },
183 "root": "root",
184 "version": 7
185}
diff --git a/flakes/private/system/flake.nix b/flakes/private/system/flake.nix
new file mode 100644
index 0000000..04ebbc7
--- /dev/null
+++ b/flakes/private/system/flake.nix
@@ -0,0 +1,168 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets-public.url = "path:../../secrets";
4 inputs.mypackages.url = "path:../../mypackages";
5 inputs.myuids.url = "path:../../myuids";
6 inputs.backports.url = "path:../../backports";
7 outputs = { self, secrets-public, mypackages, backports, environment, myuids }: {
8 nixosModule = self.nixosModules.system;
9 nixosModules.system = { pkgs, lib, config, name, nodes, secrets, options, ... }:
10 {
11 imports = [
12 secrets.nixosModules.users-config-common
13 environment.nixosModule
14 secrets-public.nixosModule
15 ];
16 config = {
17 myEnv = import secrets.environment-file;
18 networking.hostName = name;
19 deployment.keys."vars.yml" = {
20 keyCommand = [ pkgs.stdenv.shell "-c" "cat ${secrets.vars-file}" ];
21 user = "root";
22 group = "root";
23 permissions = "0400";
24 };
25
26 networking.extraHosts = builtins.concatStringsSep "\n"
27 (lib.mapAttrsToList (n: v: "${lib.head v.config.hostEnv.ips.main.ip4} ${n}") nodes);
28
29 users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ];
30 secrets.deleteSecretsVars = true;
31 secrets.gpgKeys = [
32 ./public_keys/Immae.pub
33 ];
34 secrets.secretsVars = "/run/keys/vars.yml";
35
36 services.openssh.enable = true;
37
38 nixpkgs.overlays =
39 builtins.attrValues mypackages.overlays ++
40 builtins.attrValues backports.overlays ++
41 [
42 (self: super: {
43 postgresql = self.postgresql_pam;
44 mariadb = self.mariadb_106.overrideAttrs(old: {
45 passthru = old.passthru // { mysqlVersion = "5.7"; };
46 });
47 }) # don’t put them as generic overlay because of home-manager
48 ];
49
50 services.journald.extraConfig = ''
51 #Should be "warning" but disabled for now, it prevents anything from being stored
52 MaxLevelStore=info
53 MaxRetentionSec=1year
54 '';
55
56 users.groups.acme.gid = myuids.lib.gids.acme;
57 users.users =
58 builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({
59 isNormalUser = true;
60 home = "/home/${x.name}";
61 createHome = true;
62 linger = true;
63 # Enable in latest unstable homeMode = "755";
64 } // x)) (config.hostEnv.users pkgs))
65 // {
66 acme.uid = myuids.lib.uids.acme;
67 };
68 environment.systemPackages = [
69 pkgs.inetutils
70 pkgs.htop
71 pkgs.iftop
72 pkgs.bind.dnsutils
73 pkgs.httpie
74 pkgs.iotop
75 pkgs.whois
76 pkgs.ngrep
77 pkgs.tcpdump
78 pkgs.wireshark-cli
79 pkgs.tcpflow
80 pkgs.mitmproxy
81 pkgs.nmap
82 pkgs.p0f
83 pkgs.socat
84 pkgs.lsof
85 pkgs.psmisc
86 pkgs.openssl
87 pkgs.wget
88
89 pkgs.pv
90 pkgs.smartmontools
91
92 pkgs.git
93 pkgs.vim
94 pkgs.rsync
95 pkgs.strace
96 pkgs.sqlite
97
98 pkgs.jq
99 pkgs.yq
100 ];
101
102 users.mutableUsers = lib.mkDefault false;
103
104 systemd.services."vars.yml-key".enable = lib.mkForce false;
105 systemd.targets.maintenance = {
106 description = "Maintenance target with only sshd";
107 after = [ "network-online.target" "sshd.service" ];
108 requires = [ "network-online.target" "sshd.service" ];
109 unitConfig.AllowIsolate = "yes";
110 };
111
112 security.acme.acceptTerms = true;
113 security.acme.preliminarySelfsigned = true;
114
115 security.acme.certs = {
116 "${name}" = {
117 domain = config.hostEnv.fqdn;
118 };
119 };
120 security.acme.defaults = {
121 email = "ismael@bouya.org";
122 webroot = "/var/lib/acme/acme-challenges";
123 postRun = builtins.concatStringsSep "\n" [
124 (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service")
125 ];
126 extraLegoRenewFlags = [ "--reuse-key" ];
127 keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121
128 #extraLegoRunFlags = [ "--reuse-key" "--preferred-chain" "ISRG Root X1"];
129 #extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"];
130 };
131
132 services.nginx = {
133 recommendedTlsSettings = true;
134 virtualHosts = {
135 "${config.hostEnv.fqdn}" = {
136 acmeRoot = config.security.acme.defaults.webroot;
137 useACMEHost = name;
138 forceSSL = true;
139 };
140 };
141 };
142
143 services.fail2ban.jails.DEFAULT = {
144 settings.bantime = "12h";
145 settings.findtime = "12h";
146 };
147 services.fail2ban = {
148 enable = true;
149 #findtime = "12h";
150 #bantime = "12h";
151 bantime-increment = {
152 enable = true; # Enable increment of bantime after each violation
153 formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
154 #multipliers = "1 2 4 8 16 32 64";
155 maxtime = "168h"; # Do not ban for more than 1 week
156 overalljails = true; # Calculate the bantime based on all the violations
157 };
158 maxretry = 10;
159 ignoreIP = let
160 ip4s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip4 or []) v.ips)) (config.myEnv.servers));
161 ip6s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip6 or []) v.ips)) (config.myEnv.servers));
162 in
163 ip4s ++ ip6s;
164 };
165 };
166 };
167 };
168}
diff --git a/flakes/private/system/public_keys/Immae.pub b/flakes/private/system/public_keys/Immae.pub
new file mode 100644
index 0000000..dd42b04
--- /dev/null
+++ b/flakes/private/system/public_keys/Immae.pub
@@ -0,0 +1,322 @@
1-----BEGIN PGP PUBLIC KEY BLOCK-----
2
3mQINBFvwA+gBEADlchQGPyI2M9RNRUsk8wsL9XLc8qAFWTYlVp5p7177ucxTQf6S
4rny9yRCF69UqtE0ugwt+432sAAsDPi7BRA/JE95bIRBiewOiY1jYiivccP5dR6Jr
558HJ3QOHYPekqZIQhxzCWjdD2nRhhCbbxeWFJsJyaG8idGBiLkgNKxEEmqE5LIat
6tzMpQFwOpL2FoYZ7+e4ZTMc+x+yqpOnGcQD1qwouqx68okSCjrVBWo5S2tK5AzzU
7X8esBLNpgkhpUEZVltiNc4bmj7GZPdy4+mvS33/HQTed8YpatCFVWzcK+/uK0SYE
8P8Hj1mguT9idBhAf+kv7qbTycrFkTBliP3oDNUoARWDmfQdV4nlxqW03QxUY18mL
9KPByduK3hEXAZnD+/8QfVzbNVVP+70/jdSB+ckF88Li2g4bv/9uqjaObKVJB9ocG
10EWslm1h7tvdCLBRgIl8b2+Zl0fComRAMuwUr+LYlWLnfygAi8Uy9hl7UcRWAAj99
11PG4ba0+y8eD8k1J2IE8HpeIzMzRwYTLtvLyJBvrKiQHJb1PGM5cS8iry81wjUPZm
12dO5p5rbC8z99w7UNMaiz6iqAFAaDyLLsBZ5gWD+1ps9XxCA0zf28Z/Tc/Gj4QKAf
13kpMd7lQ+gprsFyRtzcRD4WhsOL2ogKYFHYi4LE0GYduspGdQPlK/YfrKQwARAQAB
14tB9Jc21hZWwgQm91eWEgPGlzbWFlbEBib3V5YS5vcmc+iQJRBBMBCAA7AhsDBQsJ
15CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvw
16BU4CGQEACgkQyfztbKa3lFR/kA//cHVrb/RRTLQZy514vMkOBKgAk+dj+j0lrgvJ
17yR0JK1KjodduSoccPq7qRFAU+KVa3FsXMn8yY/lWaCXYJoF0DT5iEHsEuzJRc7Cn
18N4aq2h42DD7z8dJCXZvtvJs+vZ7G/rlLl322TjLb2OyIybBEoPOmJl0dVG0wKBFC
19r7EJmOKl3ytUWUpEbuxs1U/pP4GKrPT2CK3QcLF8JHKIPkEO347RorseeHcHhMxs
20Bz5JXojts1NyLJh7lErT42atgEdTGzSmkkGm8OifZVIH2rgmnRsPHnCqrXYsa7dE
21yPsC01Ns3DPYk4C5FtbpfiNvATbnkOicEwb2U55OpYUZLsFCKo7Bl+duJVY0nPRN
22WiLCALPcdJL+a6hbh1hSuqHt5eNGxyrDtRPowXRTS1D4nTCgAh6+wpH47xXWEwXZ
23mEnkXqHLIjsW4CSIz2gc+Bza40+wkWz6NQDEb3ncytDZu9vKK1CYwl7RGW4RFkAO
24j3FWZvZp8ETPLNRVy64BhZzHY3uOxbYreE+T6JfiIZux8X+Bh4cPJHizfhSMLLS5
25kwABzalaTD33XnjKn5wQ/DfGJ+fGbF54fMlGFjne5VTNwY1ju2ieXTgVrUyzfKPF
2696zcvnxo/MWwqcQ8+dXFCZjldP76puo1eVATEBeOCQs8Vj7eL9eN/eo+BfzhS3S8
27CfFFYWeIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgDAAoJEG0M
28r/3bHP6Q/TsAnA6vTjmrX4nY3QnevNrKefWaQvf3AJ0TALTqXhTcVYVLxfzRt/Qd
29u5W2/rQvSXNtYWVsIEJvdXlhIChXb3JrKSA8aXNtYWVsLmJvdXlhQGZyZXRsaW5r
30LmNvbT6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreUVAUCW/AFCwIbAwUL
31CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVKlBD/sE/eDbJtL8UKc6
32CN7zmA038RSjxlcJrMRoBoThCFKOFtBsYLPebnIkzCDiUwQJaIMYe2RNBHKKz0p+
332Kvzf7q+xq8W1e72aK1DRhsBTL8/LA1kQkvh3GwMS8z3SOcbXLWqKQuQ7ztYReQG
34wsT2/S8reVM96eV67K9vMHKMDF3NyYZewahX0I44YIbQJfLVG5elCkBrfHjGSeIt
35tSAv56BhN8J8ky+9nGx5jwWmxc/4Oquyfe9Lf0NMTCjw1xess7UoHlzSMp57yF3T
36AaqDcqD2Jdgr2meN9Yo4/Yb9dEvHFy34ppXYanX1nrHGev7YaaQWLoKLVZc3f6gR
37+D7sEJUJm3IxO041CR7DBwQ1CQkx3sa66mcHxe+wchOoXBZdsqyl5Ds+zqh6eMyO
38UiixDcXDxZuimEY0/+7XjlFjtzhGVNKsjV/Azh+Hx3GZnGHMVpTw73qQFHkWeDrX
39FPUbinjtEVTxw0fS9PkDZB5ysgAWlXs2cqoNDMcbdyJn2xszbV5+vjlmcofsQZTr
40PiX+hB6P5RQP5ogtnotvbkPDSfPfqdUk5HjGFrGX08FoP4rCromHvSL6Un2lP4I2
41mJbbQzBU/bQUGzfz6U6VEbUHtOL+7woGuXuzTYsRZ/O7/fKohyi/+qsmOozQpLFN
42k5xocbF1PgpFphrKYpHaSkf6DS2/F4hdBBARAgAdFiEE3DhHSHCdJhn/KGchbQyv
43/dsc/pAFAlvwCAQACgkQbQyv/dsc/pDXWACeKMbL/Dtifpd466TqQP8isfWedtIA
44n2xbEmlpxG8yk0w4HQ4djwgY4RbutCpJc21hZWwgQm91eWEgPGlzbWFlbC5ib3V5
45YUBub3JtYWxlc3VwLm9yZz6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreU
46VAUCW/AEawIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVMGJ
47EAC5hKt5NCanRxEl13nQUu4+n05tdRl9C3sTczR8EUZ30zhpBV4chKgeJSD0r1VA
48zBSQHMNzroGawaQn38qxFtbcSmkGRDd+0y798x1HFHp+UFiYOdQDQJVsyDuwjq4k
49RF7zV+FBj0ffjn5JBy6R3wLmWCFxz1mPmkImdyyS8GEeifwTftC+SSotqfg1lh0K
50C+DSQGYtPk0jLvxVPRllnjltDOSPUt9xRE785I6E9oyYrCa5Om51e0eEMzwpkl4e
51QschAYILb6SNrVyEMRD5E3lJHD2r6dPvIPFNcLxIQuK/Kdco2jNq7dCL6ukdGI40
52j/oZi7XRrlFCQW321BuipJZ/7t9JWOXOrrEndQv+hOb6PeWkwF1rigjbQq+IipdJ
53DUXGBfiIzlpJM5tLhs7BGfLxYNn09rOpkotXrdBzRO62lYyRdQepKpD33v96bQV2
540w64U44+CxuicjGDw/6no54LY4J7bM1lLGwqvHSeqgYoc+Zs9WH95TNNSmaAHGSf
55An4LpzW5nOXbq2rsWVbZpvsVHz3VmC9qmpsYl5tT/ninkLta3tN6TrYUFHXcDWz9
56K+HW+/oARzEmN8eg3iMmWtOnV59YEr/x2vvOHndguUL0tUpRjwuTunH9KOGZE0Kb
57uI3ovgLLO2kCSGk4SdXlntu/eLq9FPYqlOpjM9CtLf9JdIhdBBARAgAdFiEE3DhH
58SHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pCHCQCfdPdGx0FmknAs
59rPvjuUmuCj9Q8xUAn32dsgQYTlgfTdwLSxWGj4mTD2h6tClJc21hZWwgQm91eWEg
60PGJvdXlhQHBoYXJlLm5vcm1hbGVzdXAub3JnPokCTgQTAQgAOBYhBPgoBv2hv1ua
61GzAU58n87Wymt5RUBQJb8ASdAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
62EMn87Wymt5RU58QQALMGlOJzcQj/arHezum5H/PiYIpZ1yY+QMCzpSgPdwupwawW
63VN88aQRfU6k9xwmsU+Ghjreja09AuqYi/D2+61TM/Tmqi/9HdU6NRYw0hvaZnwFc
64vudFBII2XrxmU5k9PnSR6Sq4uLUGkXmvhJddV0q+cjtif+vDi5pl9mqbWBQY8d9S
655Q6ZFZPeEeASUK7Xt/tSq9iXpb1tQsmEJ94Czl5G+gNFJcqj7nlHQ1/c9XeNsvJT
66GZVLGM/cAZNzB6AC8Kz+iWUypFuXifC2PYGpJDJ8klqTmDQikGQtM1HMHda6rnwU
67L7JIfbuwGbMk65CtG2YE8QqB+/GIfkzWySenmIrldn9Vp5EKB0DD529TyOwQWgzz
68+HuVP/4QfkNRxNquWxlAPXmcNfV1SV+/Xn1KwSspb7QlAjiXXOL13J2dwYFpV+21
69vsSW5XqJXfWUU8d4YVOdq1kUTwLjWnWyxwtt8j68KSuTOT4JTA8oNXg87r0B4Fzr
706AoxCM8ePywm5IW55gNAwViTKWBAcNrcwRTP647oNOM5+8D7NZIBpnKffNc/S2S5
71iI1tmaM0yXavmCm0Hb7lkFIsxM2Y2lxwHexPck2ftPXIrjhPYLcFVBdLVx2V2yXe
72cFW2vMGZiasVobFqqp1g8htmAlTkN0cTDY7l96wDuirC6OeCbVomEgxQEd0MiF0E
73EBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kHsv
74AJ4+zdfjTdO1FUWb42bWdPQfiFe9nACeMIRp1Iu3tNVJkfS9CGGqhrChpfu0LUlz
75bWFlbCBCb3V5YSA8aXNtYWVsLmJvdXlhLjA2QG5vcm1hbGVzdXAub3JnPokCTgQT
76AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ASsAhsDBQsJCAcCBhUKCQgL
77AgQWAgMBAh4BAheAAAoJEMn87Wymt5RUxa8P/i7zdQ9i5BfWITbdyCgXNoQYIcE3
78J6lIa15eLUcfDcL707zOrUSbhSkthLjeqZoNRCalqjeDOdgCQC1PNoISdkMGd9PO
79VOwS3G7Pjt4FSjPVHyw9+Su57pwTcLXBhEyBAkv+tx/QrB/UBCFzPUnsl71QH51y
80T8+bNdOiBxssdgn/9IrObn7tu8xDf+d/yGsA493x+mxalai+fhd/t0yzQcdcTrvD
81EKRxAaU8wXe8oSwcW5cRmXIi+N4aEnLRO/so9YDGf4z2FQVSL0ktoZYMqZ1ZvIb0
82MNCNl2NgNXThhrAPk9Rhs+S5nRzazJ+tS+D2S728EPpRHpUE43+vewtCdu5c5NWd
83Lz88o/jxLwcNwQa2iJoFMyqr15lHt+vM7OyD9X650IJwQw24n4tF6TijzH5GhWcN
84SnB7RpLSkftQldpK/zK+tmFH4vVpv+bI3JKAfzRga+5Fu42kB5uHVzXF3qMwYgEO
85sRNL5d4xV4SATce1mb8vFpsQmGOWnZAcCaQYhLKfMl7zR5ukytTjf3hRMRH0GAjh
8606QAoBMJZhWosYehPi1odjTngIf6hFOqA5prz8Cu/AFe/8aftp9UorJOekAj2io0
87CENRv21qrN8R4bNo04aTMD6WrY+mBL8MteR0ooD3ENQEAZ6UUyZwTzUJk2UUl+5M
88ch/HgJ+rQozmRGYeiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
89BAAKCRBtDK/92xz+kPsmAJ4wGQ0Hly2eTVzsU8Ht4609Q5kf2wCdHGuu863a0GHv
90uUdEokzQEsumYPG0OElzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
91ZSkgPGlfYm91eWFAeWFob28uZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfzt
92bKa3lFQFAlvwBMkCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3
93lFQTlxAAjbuDy3prdEBNMYfi/870MO5eeDOCMtiDJDae4fQjj2NANjeuDGNP659B
94/k9uS7o5nrWB7E6rdG4a1J+Qzj5I775xTP/zVbrNSchcLwSoHMMXBm2IdbIanCX0
95JX+dRg2YX6yX+6ZmL8UaWRVICQ84ZxGtYHZ8o8hMCFOuxFklNjYFEPciO9M9m+rv
96fUEihQgcBF7+x9KVntlxad61Aa9AzUJLULgY3snaZK687tHUq3yYwXpF9s1CuJ81
97SfZxH32dKqy+2cpJqwQ38BZrTUwjBxxIMR5TRC7h/O9aRIBKQZKlpLcmxWPv18i7
98DwWlrJVb2Sd2WUh+TwPNa7VQc3NjlGtu74SfZqmirE0FyuB86fnsQaF8zhJnRsqE
99lagnLoW24PCvc8A9TK95tj+0JO8DIeM49Gg+Br/NBtRB8q5q/ICJOREber6Ke+/I
100p90q5VkZafIgeuO+EkyQ6Dq+58NRqC2qEs209xnKOd6exxT+2tEzx6Hy0PKwaay3
101h8WzUamJOTqRv1WG4GmlCeRUQGx8BtdIAEMdww26cN8rmxh5Foh5CH+V75bcybkv
102yH+FBDoKFYSpEPg0axHM/e13/nujgLNnSTHuMf7ILvpwoNkkIcQwSpH17B5hZdgl
103y0xD7aIS5XU9OoP9mKs1unzUKerWQWY6CxgYOqpssyDTUG+fohuIXQQQEQIAHRYh
104BNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgEAAoJEG0Mr/3bHP6QFPAAn3DbFqHo
105hjznqQvg15QjlGFaPJaaAJ4ps0+VWG9BN7UBQPG+fcCRwqLaVLQ0SXNtYWVsIEJv
106dXlhIChEb24ndCBjb250YWN0IG1lIHRoZXJlKSA8Ym91eWFAa3RoLnNlPokCTgQT
107AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ATfAhsDBQsJCAcCBhUKCQgL
108AgQWAgMBAh4BAheAAAoJEMn87Wymt5RU2vAP/12b6S0yJdZ1rgNLj+ZohY36PhCm
10930/amkGPQp7HCBylYIRv+y5m4IdiqynzJoap547cFMWNsCyfyU2VKbcy1Uy44FCI
110PCUcBME95jD1JWviINDKqLhglciKlJnWUhupiolqFcr2ro+rJVc/fBMWJoBjM5fJ
1119eq1ge2LxuYKbu9cpSEtopk7ZBeo69khhrFACdZEqfJtW4qp0hEC0pAKLjN8LhpQ
112EEVcq4zejksB+1e1qkuJ6be3/Q2Sj+1ijaJBElJIVJ8qyYs9XSlTlUA1USfy3Yqu
113jOkFrIaycxYgKooFgwYfYXCniuqXWZ2geCm2IE90lanQC2w7ZDN/JGwwVuAFVi4H
114Mrx6x/yEreqy2AUMesB1eGxqQQG9cgssMLoMAN2IDDJ6FS+e0imWTTMZ6r3ou9W8
115+pFzSIT8LMnBNwp+RxrW3QzBs8sXDw5mS6WroiZMRlfJdA1sUPsrW0GV4/AFuEaK
116PhCUvIvoh6zxYR0lA/gYqtszCHGzHeNLoczOhytUZM+KQpOtO3TSING/+o59HHuM
117niD6k3mWcyk6MkSgIXquJRGUVGVFeLGlXXf7aWEkIOrXeqjBZpBchZUIxZfkg100
118xxmEgNVGG4vxB/UIGeVqV2S4JscJmCyDGs130nRp7Qp5YGfkaTLKyOdutssrqatP
119m5Zcjl2VGr4Xt4uXiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
120BAAKCRBtDK/92xz+kEViAJ9zBTPNNTYIxPxt8BEvb3pUDeZkiQCffsDGKi7kdlTj
121oZ26K7yxdjexaYS0OUlzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
122ZSkgPGJvdXlhQG1lY2gua3RoLnNlPokCTgQTAQgAOBYhBPgoBv2hv1uaGzAU58n8
1237Wymt5RUBQJb8ATwAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMn87Wym
124t5RUIzgP/0/7+y7UOgj4Yja6Lwa+Lm7ESRZnbVmR1ERSAa9RKKr8BbPT4KhgwN2R
125x8c3CedFupS02sG1G57u+4qQbEeZylaMu6rusf/XyQ+esh06cRXfR7Vb2d14yFQg
126xun9PgPR7jL0RiU2fsgvF6O+u9KwnGRmABZXILDBxzGZBXKBIkmqBM8+rBkXFVWc
127gezZqD106KcuGewciuWM7bfyLj+2yV9GhvX8iRyptgkx9/CNEdOqQzKYEbXVTSkh
128tUW4QUmNnIiTnD/pZ4kr3UsQV6y0GC1kf9G5EeQHbD+kVROFM0/sX6qGn99IeC+j
12996MflMnKuXJeXjlxNFZIYPoolBAC7CvpRfdky5q0KB2xWh+x2jQbn3fPpa6lVZdQ
130De14guXdcEsj1QVUMRL3wFCDwHIsi3gqOpCHdy5GmunFRNqUWmoGU+uHt3Kk031w
131DJdQY4YP+8tFWLPG3vKoPSf5EcG2Mf0hZiWiiIAX8sVw13W+oDlAQ0HKah/uxV77
132gM2ScBiiiOr92JIf3ftq2AjMuzrGhpKME/wG2DdcOqmq7U+tcVbambSc7SVa5nTM
133JXm8ZPOSH0Fax1PULPd3pyLLhfF0rnPiDLcVa6UzG1MaSJiGBurIf3D3OCHRjQQ6
134kVpF9VtXhWeziV8wkyt66HNcuqUs6HDBNkpxPTNacKcZmW8J/FlaiF0EEBECAB0W
135IQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kKOiAJ4shO9b
136nZ2Nx9XzBBg4C0nUl05LyQCbBpk7t2NIPMKaNtjsPb+RV5HbiQa0O0lzbWFlbCBC
137b3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVyZSkgPGlzbWFlbC5ib3V5YUBlbnMu
138ZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwBZYCGwMFCwkI
139BwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3lFRK1w//cqsweiuXGPepyn0t
140AL/S/scM6r9IwcjD3HrZqmUNSDAqU6PJ0FFialOPuSQIyEvrpY1GL+TiVtnYyAit
141sbotxNxNQFwiBvqchg6xd1ftpjJihuo7RysNdSNAnlOxFlEz9X+EGkRqq8rCTpoS
142GA9+4uFyFKzfv9CDg7YUVX5GVsE3bsPWymfCW1boW0TQyL7xNrDPfzKpVRHFu7hi
1435OghiTbHbifmIolj5Mo0hGuXxz26gFzrufCjgxK9ycW7LnHEnnK0zX8Qfueir8RV
144EisuAXtKILgS5mmOj0ywsrva4Qtf5JW5SKymhgsKCWskfz0lq6S6ceIKaYBr4Syk
1450MLI82M0zDfGlLuRP6yQ3DTiTC4lWfXHdjyd0w4SwcuAQPCWz34gtUEGfMTyrd6O
146le6pYreL1NPzd/NakYsR1H1fsXVJkgpESktoDIkzooLmBV6Pjr+PEt4DvPZYqgKl
147AyD+aZeZ5HlTZCLbN9O38nDttWdAvsGjq82qvNI8A/d2Vvz4L1ND6NT71+wtC2QT
148a95epSBD64l/JtK99SW/HjLjyvV9O+Nu2p8ESTOEaQhyIudnWYU+er+Vwy7YtLvY
149y8L9/Xu9KvlBMjHBXAAV047KwkIQNrNyoTla5yQFSpv57hFYbx5CKTprpsl9Ic4v
150uPjC/GMgkAJ3yTwIgxa47hgUAtKIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3b
151HP6QBQJb8AgEAAoJEG0Mr/3bHP6QyCcAnRuTQIMOpwxbyzjj+t0C9GdNJYmGAJ9v
1525c5kvNCFiJAFCbUD4OxJBNA28rQ9SXNtYWVsIEJvdXlhIChEb24ndCBjb250YWN0
153IG1lIHRoZXJlKSA8Ym91eWFAbWF0aC5qdXNzaWV1LmZyPokCTgQTAQgAOBYhBPgo
154Bv2hv1uaGzAU58n87Wymt5RUBQJb8AW0AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
155AheAAAoJEMn87Wymt5RUaT8P/2OvKAfgqu0zQX0JhKu/wd9AATVmLa8C48JPQMUn
1565Z9dQyDcFyKKfKbGCz9B5jTOrzHNX0VJfpDujOTiPIk6ci0KqAJ3Fz0gdpxIcEoW
157B2zg0nwDtGHsGMX8togpcbVgKqblp0XSsMAFV2FN5PsAnxkqdXPDmZ5iZSgs9roi
1589nxHPavbcr1cSAjsiRoFxFudzo7Q0Z/KLRlTuTSAX6B+vRAeyRB4NcXThKYZlAi6
159cr+xXTvPFddiQZgVBT+ICZRQY0gwgHpQcj70fNx1w6tTHfThlxInojKGlreOZov9
160A4TVeex/QagVTsjRAQuZ9yLMkx7JxakAxBPZ/OHuv7/K1Qdx90AJ8zQZ6uOXpUNl
161c2MDEBoTI/nbsgMeHI/Mj4ndxCBUMperZ1oCITl+AhaqEZ+LxTKyne41YJedlqjc
1625xnUVigz4ajmZPYmbO6eRDxisx4fMG7hI2HnNWak2xBDVOp1z2aqZY0xsG7o697d
163I9BeR9JxbIusx0Szq6GabwI5beEI1xLlT333Fe3XDtT0NIQQvW9byuYuyfp7H6Xm
164hFj2ut7jVI9xG932sJ8ioRJGCK1UcGYEL0ei4YZRv+mVysEJFjki2nlxspnG4C/V
165Q20jXnLAXOpKLiStkNJ15WsnzeoL4eq0AUOYMMmYKAquXXgpVs+xUDv6XathWA2v
166oZkAiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/9
1672xz+kEBpAJ4x7hASmdnDcyFGTyuRHj6NwsDtNwCfRVfqoiRcGmvDRA8U25cPk5XT
168ZYTRzlXOUwEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBD
169AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp
170LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
171MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAG4D
172AREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcEBQACAwEI/8QAQhAAAQIE
173BAIGBgYIBwEAAAAAAQIDAAQFEQYSITFBURMUImFxsQcjMoGRwUJDUmJjchUlNTaC
174odHwFiYzc4OS4bL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAgEQEBAAID
175AQEBAQEBAAAAAAAAAQIRAyExQRJREyIy/9oADAMBAAIRAxEAPwB2JHaECEjiPGA4
1766GA3kMMgDy8AZAGQAp8XD/Nc5+VP/wAiJT9GeBv3e/5VQ4cEu8M3sAZAGQBFT7Qh
177JSOUBt4DZYww8O0AeQB5cc4AgzNXk5dfRh1Dj1r9Ghab/wAzpE3KQFdiSotTGIph
1784trQFpAFyDwtwjO8mqqYbHeByDQNCD61R0jTGyzcTrQmigyAMsYAyxgCtTNt5hqI
179SUnrKOYgN06yjnCVtnWUc4BtyenmWGVuurSlttJUpR2AGpMGyKbEHpZm3ulapLSW
180GTcIdWm6yOZ1sIj92q0Cf8UVp2Y6b9IOIVtZkkD366xOzkjujFc83mROKZcCjc9M
181kE/1hbV+Yq1VhC3TkUEKvcWNxE6UY3o4xKpueVIuKGRaSoWO5GsXhdXSM59Nhucb
182cbStJFlAEeEa7Q26yj7UPdJ71pv7Qhboedab+0Iexsu2p2ZuD0sJltZom5gkEuaQ
183jldxMPkZuk0gW2E05cetgIvfSJihZY/RcvODKpXr0NntKA4HkCeHdEWrkLBc67fK
184EoF+Khc/CEuMYZn5tYyMFwX0KQRbwtCtkXMbUk4eqBKgpC9eYN4n9xf+Vczh+fYv
185maUoDUHlD/cF47EmlTz0hPtFalsrQsdoGxtx1hs7DpolaTO5JZl7sdHmZPNKbAjx
186Fx7jFY34ys+rcl4/XGL0jbVQmODpgsG2JD/F1UVIVqmRKgcT8YbNcy8qOrqO/ZiL
1876uRLTKAU8WGloF/A3WpgUqjTc8gjOy0Si+2bYQr1C9pAzM469NOuKdUpxxRN766x
188LUXYWw6mYbEw+m9zpeMc8/kdPHh/THp9LaYQAlCR4CMvXRNLASSCbqSOUGha0ekW
189ym2QW8INBRVbCkjUJJ1BbCHCLpcA1SeBiscrEZ4ygLD1XmaFXUNzCypcutSSgnTX
190Q2jbf2OTLH5TvkHGpuVbfTey0hWpvvHRjdxzWdrJiXSraHRi1cZQlVjDhUFGqNgX
191zDaCxAtpjgepRcHFMQvHxaNIzUoG30YF/Cl9JM0sYVW2nNZb6EqI5an5ROXgw9LX
192DEiieniVpBCNLGMuTLUdPHNmzTpdEu2lKUgJHARzW9uqToQy1iBDhpRtaKJ4bFO0
193A+oTygLxKiXxS2WMSqWNFGyzaN8L/wAuXlnY9whWn2qX0SyS2k3bJ5co14/45uXX
194pjYYnOvpcUdcpt/KNazxaVWotys8W1HWwMBX0s0yM8sWyDbTtCK2z0ZNBys0INPO
195thwIsRmEQ0x8XLEzLimhBfazBNvaEJfwtMeU0PYXnCVIOSzicqrm4MK+Fj6XeBmg
1963LuuH2s9o5+V2cRgsz7DashKlHiEi8YadMqwYr9NS4lourSs8FIMVoerxDzTiLg7
197xW4WkWZqkhK9mYm2m1HYKO8IIipyXmFXYeQsDkYiztW+iwxmwheJAyDYrQlV78yY
19834/HNy+jOkUZCqQyEzLbRCbZSNY6OOfXHyW0Y4TXK0lp1ExNt3Uq4+EXU49K3Eja
199ahVS/LTSMmQJhwspuhRc20nUz7dvGIDZmYbWq6ZtKtDteAK1AeW0XElwoG6glRA9
2008JfTkp7MhSOnGoI3MTlLpWNm44YdkhKiYlr3UHLE8zaObO7jswx1dLadROyqkplz
201kSsi6xwiJZb231Z4i081l0zJnnAgIUOg49IL8deWusVlMNdFj/pvsZ0guO0txbg9
202Yi4FuNoz1dKvoPrM1WOtN9Tlm3hm7YNiUjgf75ReEx13U5/rf/MWtPdmzNOMvNhS
203Uq7DgTa45wrZL0NWzsP4ukutYokg3bpFNpzC17gE8PCNuPxy8vq1ammGWg31lQt9
204wxvjLI5rd1IYdMySJdb7pG/RsqV8orsumrs0GHC286+2sbpUyoHygLcQQhpSkHKk
205gnlFMqaOHZdkUI2Zb9k/RETV4+L2ntNijpSEJtk2AhxfwAzbTIdc9UjQn6IgjOg8
206ASlaW1fTQ352J1jhynseljd2X+ixltuYbGZIULcYjTqk6Y9KtMsKUEITpuBBelad
2076SvNT1FI02EOeM/XPqMu+c/RpUR3awo0+OqZZtkWQkCFpNnSfhuiSk3PzFYdZSp6
208XXkaWe5JGngSfjHXwzp53PQfOPFM1Mg7dKoD4x0uQZejxZWzM34OfKFVYIGMr/pw
209AH6seZhxOXoClnCpSQf71gSbmHf2D/CYmrx8XdO/Y6b75YIv4AZ0WcdP3j5xTOl7
210UOtMYkPS3U0U5m1HdQO49x090cvLjJt18Wdup/BfSpglsDhHNvT0ML0ytTWVlCm5
211hKXG1ZshTmze6FO7s8spEalVqeZQ+2uUzIOqFIQRvwsdovxHqdKz6lqz5wHL9pGX
212KbRF3LtpLPE1+ZyIzngLxU7RnlqC7CssZfDDeY3W6OkV4nWO3jx1HmZ5fqlhU05a
213g+k8XFecbRz0aejtIS3M2+2PKFkrBExgi9bB/DHmYIWfpdygs4k+ECThw5rQP4TC
214q8fF1TtaQm/2YS/gAqH+o9+Y+cUyoWxNklaVIzJSi/WVoJ2Psgxjyzrpvw3vtrSZ
2154XzZzkWNDyMcWUehhk7Lpk7Jzhf6wtTLlipIAKx/FBLNaaY49rlpMsWdVzpNtgtO
216/wAItprP+xBNPmUTInFzDnQJUAlpdlFPffv5RGV+M8vfXs9N5gWxYlZypHO8XxY7
217sjDlz1jaaVDFsPsDk2PKO5wTwqKwgmpPH8Q+cWxo09HySG5m/wBseULJeCNjAE1Z
218On0PmYIMi8ZFn0i0NmbeGz+oB+U+cTWmPi6p6gqlAjbLCXPC2xDPJpsnOTa05g1m
219OUfSN9BDt0zk3dF+1XprF9BmGX5Zlhlp3MwpBJUVW1uT7o5+XPVjq4uP1UyFWXIu
220dXfAQ6g+0rYjmIzuP67jWZfnqmXR6tIz8olsrvbTX+sYXCyujDOWLhFNkmLv5la8
221OkNoeulb0HazX2ULLSVZGxcbjwiphazyzkQKMtycfdnHgRlA6FJ5Hj746+HCTtwc
222/JbdHNQ1ZqAyfwx5RpU4+FnUtZ5/T6xXnF7ZaGGBT6t8Wt2h5Qsl4oWK1XrOX8MH
223+ZggsLmUN3UlXdDZG5hz9hC3IxFaY+Leln9Tp/LAv4RnpEqahUxIJPqkErcAO5US
224Nfd5wqWE+oWFZNtmTYlEG6bE35m+scXLv9Xbv4pNPK9hhbt1JbVobpUOELDPR54b
225DDTlTo7pBbK0g7jjGu8cmWssVpMY3qEzLpl0srFhYgA3I+EKYRV5MrHeh0KerlVQ
226/UG1NSvtKSrQqHL3w8spjOk443K9iOj1aVqU3PBgpSQuyUfdT2QR3aCOnj6mnLyz
227vZyUD93mf9sRVGPhbz6gZ18X+tV5xWmWxfgdeZDwtqFfKFkvFVYxWUV5JHFr5wQZ
228eoLHo+m21AmbR/1/9hbT+aNqVTHKdTjLqWFGxFwIVVjNRS1fGdOwpTTJqUJufCbB
229hs6A/ePDw3hKkIGqzj9QemZ15RW46orUfE/KBUTqDVxITjZevkvfSMuTj/U6bcef
2305vZryjrM3LocQpK0LFwRqDHJZ/XXL9jSYpjDuvRI8csJSKaWhBu20gHnYQi1GPI6
231tJulBAWoGyu+KhXwmqa9N0esKbKih9lw5rbf2fIx3Y3fccOWPyvqHB861UsKyr7S
232hZaMqkj6KhoR/fdFbZya6QH8DtPPrdM04CtRVaw4xX6R+FrQ6EmilwJeU4Fm/agt
2332cx0gV3DT1WqImEzCUAIy2y34wbFxBLWO6iUlSsgA3JhaR+rVZW/SJVJ1gyss6WE
234EWWtGi1DlfgPCE0k/oEecU4sklVz3wKQ7WcUyq2VYJT8x84DaS4DjRaX7aNP/YAJ
235sK4lVRpoSk8SZN09le/Rq5+HMRjycf67nrbj5Pz1fDWllNzDCXEKStChdKkm4UOY
236jm18rp3/AB4tnXQQtK2qag2S6G+65gKlJWQhzFs84kdkry+8C0dfF/5cvJ6JMO4w
237qeHWnGpZ31CiFKbUnMkm1r24HbaNWFgrlPSS/NKQkvNt3PaJJ0hzSLL8HWHKoupv
238qzPBxNgRlMOyQsbbe0bEdZnqbUQ1LrbyFN+2qx3hyDLLVJWamweyDoNkxC5jpXrW
239V7QG4lRO1r84DR5hpbqUqSrK4ghST3/0gPTmhwOuIeQLH2VjlASUUh1JSRfXUQGn
240UrGUzhR9ptbinZZau00o3FufcfD+cRlhMl48lxNuk12RrcqJiTdC08Qd0+Mc2WNl
2411XVjlMpuK/EU+mlyz02QCVdlNzbW0TMbbpWVkm6S70+/1t0hpokqvmNySd47ccZJ
242pw223bnKTU4mdbadc6Rp0ELSRsddRDSnq6RhwkXAuFAwGJsLYvn8NzqX2CHWFH1j
243K9ljuPA98BWbG9dqTGJ52Vnqcq7a2LqSrQoObVJ74ueMMuqVSlG+u8Q6HNSiIA8J
244SdYA8NucAQVlUrNlxKFKbXbOEi5B52hBKXMC3qknMRuRDCKqX6W/SDPffNxgDrTl
245zNImumkHXGuYQsix7v6QrJfTls8XFYxBO10s9YASptOWw0BPFXjE44TGqz5LlNVT
246mXGc+MWh6ZZKilRSCU8YA7FG45jSAMaJSgDkbQBd0SsPUxbuUZkKHsnnzh70jLHa
247qHHxiVtV6JvDDjt8YA3ygI4wBrlGf3QBsEjLtAbLDlAG6QIQcrdpR5GGTpYWvAGx
248FlECAPLa35QBooBPSW4C8ASZXVRvyhlX/9mJAk4EEwEIADgWIQT4KAb9ob9bmhsw
249FOfJ/O1spreUVAUCW/AHrgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ
250/O1spreUVJ4nD/9tGS8cg2eUSwd0ExCl0dWsJRdM0mUYh17mXyVNLcvbglIkSdma
251v/Ty3ke533izRN/SkkU8vNthjKAohZmmXlaXrruEyHq2vfXcDg4+C7FJQ+O3PT2B
252S5ft3Ht2GmRpD2lWpeUlJ9BXF2EF5pSnHPOrlTHRUfjBCDU4uuSeKgioSyoc2iWb
253BBaSXyeQAUR+ppM1AYKUlCDxpLbe3nVCOUc+JgJzv+47EqwMyVODwzk7oFO4GMRm
254KTKlctb1ym75oV1tiZi2fL/KA2uAab/RMO0rfxa9HVWnJGvUEDMPlTfs7222zuLB
25555Fzllfx5rQlou+MLBQIV978HRZrDxZesQOOJ4/BwTPgQ42GREf+uf5/SG4Fn3Qh
256NZsvoaePMLN/QQEjM7eqOUzRJRVcdJfRH+LinIFrAqcmbbcp1bvq8LV5lbmlFJLF
257gimvW/shf/6Zu1YsfBhvLWInUCyoOPFa1tASF6qqi1hEOd8tQgNE/H/FSIehmTHT
25874kYPNRm+DzlvrW2JPVl24Nf/SWbOG/IzGBY/pDActTwYqnpXKR7eUt/YcPpmrPi
259kyIKX32U2vTBCE3yvCm0KRzrcSbTJGfVgmlxxqIuOtbeaBtf96m+o5z/xw9ro7Ek
260VZbsx6fPuWuLY/MqeLXl1EuiU6X1sr+skDY8lJeeiRt+Uq5mCZuEgWdM1IhdBBAR
261AgAdFiEE3DhHSHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pABQACf
262YaUOqzlafrzeGdwHwDleootu0UcAn2adbaKJ79QBtDVPkR77zV801JlXuQINBFvw
263A+gBEACt8AiUTMcyNXwN6kiOLPd+85IPlLwEVyofz8p2QBAxJsqKozlXXpnK7ahC
264RSiHt02EK39WiyZpeY1/2dGmdvyI1vc7ld3814Dveh4nf1GRSpDZ427cxayaclh+
265wRQ8nDWFOQUsMB3He/Z+aO6l/ZNvdVdzRUHda1XvN41nwXUL9FQUn/TLYgHbxa7P
266Yy18ZnNzH/xGSwDgRrqPEAZ8KOpbHEbNyYuYuv6IM8Xmbp8Q6bl2RyBNnrlphksJ
267kLvO6RLHUvvw5uX5bt+u3umoZ+yHUkP13NtQHTyZ8VTCQimkB6OisisOTnV8OjLG
268xtLEF/TjeGFAAoEnc8bQAPvrtONQL19rPkMB0gXYXPBbGw7eWYr3QpuOujUXcz9U
2690JSSEov7cUepdTY8LEYFw8U5WimKY6f/uJUVx/ukNPtuAljJji0cjIGEOX2XGlBV
270Ix/U3vywLBfUFW5hT+75z7UB3yG3Zexo0WSaQxxZ5PHxyPYBK1PvVkH0LvkbxJcr
271rouJJQ66chjRglUbv4lf85/cG1ZLu3Ds0UbuD0gE9sAEwXtfdgDmp/HB7mxwJr1O
272BRbTRv0Okx/lovWXkxt+hX+DXZ1u1qdZUW3zjmge8W7xag3epD21jIjFDODgUfDT
273fgJi2FQq+szpagfPN5j5aIQKHCZf0DLbBD+ZWYQdld5JZs2V5QARAQABiQI2BBgB
274CAAgFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwA+gCGwwACgkQyfztbKa3lFTa
275yxAAxQo/9dvOO74J+9XznCYb5iO1B1ksnVegSGVuId45JKXkCkuWvDOkcU8+ma38
276wo3MBoPLpSMCXc/mKQ0p0ntO1tD/Wf4nBBCvseWcsR6RR5Su5jYorm0qZ89IOEPN
277K2W2Z41X6DHyteB1dAyIyexOYoLKD7iWcQzga4/EoUPEwcr8BWWgGLBfRhXsYySz
278F3fQPS7KaemDLGbJfTDZCSqmsZPnlksSvGxEBwUwfCjfY+QHxzWPRFPkuQJJR6YW
279tiZ3z7jBRdRk/R5v2CJZJuGHcPPYQy6j2TYGONojm+ifaq1hz+A0aoy4P9qRW5Nl
280mm6yiqEoJe07DrMLxn3H3ucuOo7DiNWmkkjW8DfhFSd+3pFMSvKGujOJWN27UDEp
281ERWFX50gE15Sq4aPbMPNRejFQ1n75B4jfFQXg6WuwF3kwgHK3Y5T5vTEkbPgce9c
282SyyFWU7EA4DJGnt7/FoaPDTKOWI9WSkmjOSABTBNSaUiMSFA3Wg/T0aS5pETpkv2
283S/GVVX022orAGK8zEY1vr2a24itOAKpQwFRuMjqDCBVgKAsMtlPu8jv3Zm/AMcYM
284sRRnDWJh2TO8bqXXUG/o783fcTE3d1Ff7s4BfmBqpGHigZeehNvu+FshRDYaDrDN
285IS0fTqbsX/JjaCXwU/o2E6G4aE79Ut/IMsCYzItTDh2UmcS5Ag0EW/G8wgEQALBi
2862/A7Ev/92mYi4Gm//IJEKjm2Vc3NcX5LdSyPwdSLlHSRwvzZz7M0VeflcTYqssto
287VPVf4maDtLGbQJn43CLqjvIW/C6jzjfvoZf0gbHpNfKY1ENs5xgE0wd3ZdsqpQC6
288W9Pu+kN31QS9+RUKwiG2bNBIREChL/omqiLhNu3hDbZnB+uSByOk901XVrNmKa8G
289NzXSfJSCt0gP7XU6VpMqjxppA8Y2Vo7jnylbrgVJriTt6jtjDylBBQqmHSOXMT+q
2909kIWDSocKhSFHBMO6LYnAwbMef2kqio5zaKzZAuwis0zjOqKHwW54xL2T7djFav9
291VlgcAYN105iMLUiIl39HLeZnS5pUESOXRUv/qLwiQRvBlWBPIep3+ycM2eK8r5a1
2925EwCgN2nSl3KYjzTOisCmK1nQs+gQ1RMraeBGYEG0uIUvDxfoONTuYkM3dhWq2Xx
293V/OO6yUkfyOlBGUREe1PXAOsP0LtAFJha7kbh7Eg6GGU7gRYh2dG2Ln6Vmx1ldbS
294F3woFYPGNMsQmgEKxwyjKaq0Qhd/sKHrTpPz8PXfGP4dHegExKegS7Yof1VrKBB+
295L8Q8o1Oi8JPCjRp47iga5OYS1Vn3h5a07ajzSAxPsmF0lmF4tYk2MFxSs403ShiE
296BTjN4t6rjmnoQV/b+CuhpmvzxaYr736/jkY7s0I5ABEBAAGJBGwEGAEIACAWIQT4
297KAb9ob9bmhswFOfJ/O1spreUVAUCW/G8wgIbAgJACRDJ/O1spreUVMF0IAQZAQgA
298HRYhBB2wOl45wX3kd77c+/0dTvV/qVkCBQJb8bzCAAoJEP0dTvV/qVkC3tUP/2rR
299VDaSPj9+UYJtHGDfQmYCEqxROm5wGCJbNrUQspLeL8+XrsaUDh1ldNAQtoDqGjRp
300kwjJAS0OZfvCv7pI052NK/KVGaK5Tj2+0lxTAcGbAKoH8E2HWPlERpU9CRLvzvDE
3014GGxw2nw7aobNGbf9d98c9RpZuAul92BOClnpGEU4VzjKUk9IsSjZQVJnggQujxL
302qWWiwfGwVsj2PdgPao/P48cYNl5CACBgY19AAh7WzgJVz/6je/5NLdAAV+E31qSE
303EaZsvTBqrMOtH6iTn1GpJ73FsJ0BYVt9X99bRT0Vi0iWulBuhYfZG4PdCY6fv6uC
304d+6pAC+Y/M9npaLbBHscSlJheTyvfuB7bzYBY+Q87VHSOMuNni7U08FuiILFoF+e
305/ESU/v0Hde44ghiXKSaFO8djxc874KM9UlGWvw9UbmI8Z2uM0kDcrPZ/8tcjXOhp
306PEBib54ab4tKCUCtOmsF9ZiT0hOqYdP9bXW+6OGfCignJ7ABhPpANfx2Sn/28L9l
307PbF1nA5CkHdyo/ku1Z/lNq44yvrB8r0Ljq6s3KS69dUZqqrADeogOdi0/TrghtKU
308DERWGmQagYSzMIvsXoAI56MxXFLriSObmpFLTWq7cr/+Ju3AcaSkrpDSYi3U6vLL
3098NuXPhul1S/+yPwvX6Mk1Zkip9/Wg4SQeiT2R7xj8zMP/RJ8uKbnKpOftY89Kv0Y
310FZ4hE3FeBR3UJvkuPdQYNLQRluzh63Bzc4ClSxB9Ma7fmAEiuFtgEi4HLTMBDOHO
311uVMuWYcgubu9VBlAGLJ++gnKxCAJXEntuB49il8MjMsy+uv/cFCjPG9z/1pmWYrE
312XBNA+vcaOrNTS2IykAbqybcPYbBcN47bm+A4i5yqiahk0q++j4LOW/nf88xXO7xI
313V/4vQgemh7RHgHJOkKfzOPw/Kx3UjV1jA9gEUrusHE4R3Upxh0ZeQW19hUnVlao1
314TxxKEUryrRzckuRfc5ziMWNyJaZsPMkeBEhyY/CizDFPrsSXIAijfu8KFnxCsnaM
315ylFBWOu5FwsKMDXxu0QdwqpL2CM8p+q12z1VruNjpIc8bAc0/YMndjYnxzsqQEMV
316GQIDKWqh/m6v7sqbn65ZQcVAzSAriGcQxCOIoT/TA/J+/4BSk5c8TKlqT8NBT77B
317Z70vMr41mZus1A/ciI8AxgbYwlhuvTehdm74k/c7NSzTxeG3OumTlBR1I18C4AIi
318y4iM3O4H4jvEssWBUzpm3VJG0NvcN/M4YVZHX5yxWQuIFcghzb7sLYddmRvR9B0M
319Xowot//r/sgn43xv54sIvwe9MkCCU6j7ePYUlOUnn+vQ5i7rFN/UPub3V3toI2gg
320DRuKdymWEii1jA9KlmheLTFr
321=r9L+
322-----END PGP PUBLIC KEY BLOCK-----