├── .gitignore
├── .nvmrc
├── .sample-env
├── LICENSE
├── README.md
├── app.js
├── box-img-lg.png
├── box-img-sm.png
├── config
├── config.js
├── development.js
├── production.js
└── testing.js
├── contracts
├── Migrations.sol
└── Peerism.sol
├── controllers
└── usersController.js
├── ethpm.json
├── lib
├── compileContract.js
└── deployContract.js
├── middleware
├── auth.js
└── contracts.js
├── migrations
├── 1_initial_migration.js
└── 2_deploy_contracts.js
├── models
├── Skill.js
├── User.js
├── drop.js
├── init.js
└── seeds.js
├── package-lock.json
├── package.json
├── routes
├── contracts.js
└── users.js
├── server.js
├── test
├── contracts
│ ├── TestPeerism.sol
│ └── peerism.js
├── models
│ └── users_test.js
└── routes
│ └── users_test.js
├── truffle-box.json
├── truffle.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (https://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # Typescript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 | # Visual studio code
61 | .vscode
62 |
63 | # Ganache TestRPC blockchain data
64 | db/
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | v9.3.0
--------------------------------------------------------------------------------
/.sample-env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Peerism
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # README
2 |
3 | ---
4 | PEER-AI
5 | ---
6 |
7 | * About - Peerism API built with Truffle, Node.js, Express.js, Mongoose, MongoDB, Solidity, and Ganache CLI (TestRPC).
8 |
9 | * Instructions - Setup instructions (for macOS) are provided in the [Quick Start Guide](https://github.com/peerism/peerai-api#quick-start-guide-) shown below.
10 |
11 | * Usage Capabilities - Use cURL to simulate a HTTP POST request to a Peerism API endpoint (instead of sending a request from the Peerism React Native ÐApp https://github.com/peerism/peer.ai). Alternatively allows triggering Middleware functions individually. API routes use an Express.js Middleware Chain that allow a request to compile the Peerism Smart Contract using Solidity Compiler (Solc) and Ether Pudding, then deploy it to the Ethereum TestRPC test network blockchain and responds with the contract address.
12 |
13 | # Table of Contents
14 | * [Quick Start Guide](#chapter-0)
15 | * [Log](#chapter-log)
16 | * [FAQ](#chapter-faq)
17 | * [TODO](#chapter-todo)
18 | * [References](#chapter-references)
19 |
20 | ## Quick Start Guide
21 |
22 | * Terminal Tab #1 - Install dependencies including Ganache CLI (TestRPC from the Truffle Suite)
23 | ```
24 | nvm install v9.3.0;
25 | nvm use;
26 | nvm use v9.3.0;
27 | yarn install;
28 | npm install -g ganache-cli
29 | ```
30 |
31 | * Terminal Tab #1 - Run MongoDB Server in a separate Terminal tab
32 | ```
33 | mongod
34 | ```
35 |
36 | * Terminal Tab #2 - Run Ethereum Client using Ganache CLI (TestRPC).
37 |
38 | ```
39 | rm -rf ./db;
40 | mkdir -p db/chaindb;
41 | ganache-cli --account '0x0000000000000000000000000000000000000000000000000000000000000001, 10002471238800000000000' \
42 | --account '0x0000000000000000000000000000000000000000000000000000000000000002, 10004471238800000000000' \
43 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000001' \
44 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000002' \
45 | --unlock '0x7e5f4552091a69125d5dfcb7b8c2659029395bdf' \
46 | --unlock '0x2b5ad5c4795c026514f8317c7a215e218dccd6cf' \
47 | --blocktime 0 \
48 | --deterministic true \
49 | --port 8545 \
50 | --hostname localhost \
51 | --gasPrice 20000000000 \
52 | --gasLimit 0x8000000 \
53 | --debug true \
54 | --mem true \
55 | --networkId 1337 \
56 | --db './db/chaindb'
57 | ```
58 |
59 | * Terminal Tab #3 - Compile and Deploy Smart Contracts to TestRPC blockchain
60 |
61 | * Compile Smart Contracts
62 |
63 | * Option 1: Generates build/contracts/Peerism.sol.js
64 | ```
65 | node lib/compileContract.js Peerism
66 | ```
67 |
68 | * Option 2: Genertes build/contracts/Peerism.json (DEPRECATED)
69 | ```
70 | truffle compile --compile-all;
71 | ```
72 |
73 | * Deploy Smart Contracts
74 |
75 | * Option 1: Deploy without Truffle
76 |
77 | * Modify Bitcore dependency before running the next command to avoid error `Error: More than one instance of bitcore-lib found. Please make sure to require bitcore-lib and check that submodules do not also include their own bitcore-lib dependency.`, as described here: https://github.com/bitpay/bitcore/issues/1454, by opening node_modules/bitcore-mnemonic/node_modules/bitcore-lib/index.js and commented out the following lines of code to avoid an error.
78 | ```
79 | bitcore.versionGuard = function(version) {
80 | // if (version !== undefined) {
81 | // var message = 'More than one instance of bitcore-lib found. ' +
82 | // 'Please make sure to require bitcore-lib and check that submodules do' +
83 | // ' not also include their own bitcore-lib dependency.';
84 | // throw new Error(message);
85 | // }
86 | };
87 | ```
88 |
89 | ```
90 | node lib/deployContract.js Peerism
91 | ```
92 |
93 | * Option 2: Deploy with Truffle (DEPRECATED)
94 | ```
95 | truffle migrate --reset --network development;
96 | ```
97 |
98 | * Note: Watch the deployment transactions being send to the blockchain in Terminal Tab #2
99 |
100 | * Terminal Tab #3 - Run Tests
101 | ```
102 | truffle test;
103 | ```
104 |
105 | * Terminal Tab #4 - Drop the server. Run server, then try cURL requests
106 | ```
107 | yarn run drop; yarn run dev;
108 | ```
109 |
110 | * Terminal Tab #4 - Send request to server and receive response for authentication and authorisation to access specific API endpoints.
111 | * cURL
112 | * Register with email/password. JWT provided in response (i.e. `{"token":"xyz"}`)
113 | ```
114 | curl -v -X POST http://localhost:7000/users/auth/register -d "email=luke@schoen.com&password=123456&name=Luke" -H "Content-Type: application/x-www-form-urlencoded"
115 | curl -v -X POST http://localhost:7000/users/auth/register -d '{"email":"gavin@wood.com", "password":"123456", "name":"Gavin"}' -H "Content-Type: application/json"
116 | ```
117 | * Sign in with email/password. JWT provided in response (i.e. `{"token":"xyz"}`)
118 | ```
119 | curl -v -X POST http://localhost:7000/users/auth -d "email=luke@schoen.com&password=123456" -H "Content-Type: application/x-www-form-urlencoded"
120 | curl -v -X POST http://localhost:7000/users/auth -d '{"email":"gavin@wood.com", "password":"123456"}' -H "Content-Type: application/json"
121 | ```
122 | * Access a restricted endpoint by providing JWT
123 | ```
124 | curl -v -X GET http://localhost:7000/users -H "Content-Type: application/json" -H "Authorization: Bearer "
125 | ```
126 | * Create user by providing JWT
127 | ```
128 | curl -v -X POST http://localhost:7000/users/create --data '[{"email":"test@fake.com", "name":"Test"}]' -H "Content-Type: application/json" -H "Authorization: JWT "
129 | curl -v -X POST http://localhost:7000/users/create -d "email=test2@fake.com&name=Test2" -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: JWT "
130 | ```
131 |
132 | * Terminal Tab #4 - Send request to server with Smart Contract Name to be Compiled and Deployed to the Ethereum TestRPC and receive response with the Contract Address.
133 | * cURL
134 | ```
135 | curl -v -X POST http://localhost:7000/contracts/generate -d '{"contractName":"Peerism"}' -H "Content-Type: application/json"
136 | ```
137 |
138 | * Terminal Tab #4 - Experiment in REPL
139 |
140 | * Use Truffle Console
141 |
142 | * Run Truffle Console
143 | ```
144 | truffle console --network development;
145 | ```
146 |
147 | * Run commands
148 | ```
149 | web3
150 | web3.currentProvider
151 | web3.eth.getBalance('0x7e5f4552091a69125d5dfcb7b8c2659029395bdf')
152 | ```
153 |
154 | * Attach to EthereumJS TestRPC using Go Ethereum (Geth)
155 | * [Install Geth](https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Mac)
156 |
157 | * Start Geth JavaScript console
158 |
159 | ```
160 | geth attach rpc:http://localhost:8545
161 | ```
162 |
163 | * Run commands
164 |
165 | ```
166 | web3
167 | web3.currentProvider
168 | web3.eth.getBalance('0x7e5f4552091a69125d5dfcb7b8c2659029395bdf')
169 | eth.accounts
170 | ```
171 |
172 | * Optional: Try to perform RPC calls to Ganache TestRPC using cURL. https://github.com/trufflesuite/ganache-cli/issues/383
173 |
174 | * Terminal Tab #5 - Run Tests on port 7111
175 | ```
176 | yarn run drop; yarn run test-watch
177 | ```
178 |
179 | * Terminal Tab #1 - Drop the database. Seed the database
180 | ```
181 | yarn run drop;
182 | yarn run seed;
183 | ```
184 |
185 | ## Log
186 |
187 | * Initial setup
188 | ```
189 | git init; touch README.md; touch .gitignore;
190 | code .;
191 | ```
192 | * [Add boilerplate contents to .gitignore for Node.js](https://github.com/github/gitignore/blob/master/Node.gitignore)
193 |
194 | * Setup API
195 | ```
196 | yarn init -y;
197 | yarn add express body-parser;
198 | yarn add nodemon --dev;
199 | touch server.js;
200 | ```
201 | * Add boilerplate contents to server.js
202 | * Add "dev" in "scripts" section of package.json
203 |
204 | * Add Mongoose
205 | ```
206 | yarn add mongoose;
207 | mkdir models; touch models/init.js;
208 | touch models/User.js;
209 | touch models/seeds.js;
210 | touch models/drop.js
211 | ```
212 |
213 | * Create Models for Mongoose
214 | * Add boilerplate contents to models
215 | * Add scripts to package.json
216 |
217 | * Run MongoDB Server
218 | ```
219 | mongod
220 | ```
221 |
222 | * MongoDB Client
223 | ```
224 | mongo
225 |
226 | show dbs
227 | use peerai
228 | show collections
229 | db.users.find({})
230 | db.skills.find({})
231 | ```
232 |
233 | * Create routes
234 | ```
235 | mkdir routes
236 | ```
237 | * Modify server.js. Add routes/users.js
238 |
239 | * Add authentication with [Passport, Passport-Local, and Passport-Local-Mongoose](https://github.com/saintedlama/passport-local-mongoose):
240 | ```
241 | yarn add passport passport-local passport-local-mongoose
242 | ```
243 | * Rename Person and people to User and users
244 | * Add User Registration route
245 | * Add User Sign in route
246 | * Add JWT library to return a token instead of a user
247 | ```
248 | yarn add jsonwebtoken;
249 | ```
250 | * Add Passport JWT library
251 | ```
252 | yarn add passport-jwt
253 | ```
254 | * Add restricted endpoint that requires valid JWT to access
255 | * Add Controllers https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes
256 | * Add Route Tests
257 | ```
258 | yarn add mocha chai chai-http --dev;
259 | mkdir -p test/routes;
260 | touch test/routes/users_test.js;
261 | ```
262 | * Add Model Tests
263 | ```
264 | mkdir test/models;
265 | touch test/models/users_test.js
266 | ```
267 | * Add Dotenv library to use different database in development and testing
268 | ```
269 | yarn add lodash;
270 | yarn add dotenv --dev;
271 | touch .sample-env;
272 | echo 'NODE_ENV=development' >> ./.sample-env;
273 | ```
274 | * Add Ethereum dependencies including TestRPC
275 | ```
276 | yarn add web3@0.19 ethereumjs-util@4.4 ethereumjs-tx@1.3 eth-lightwallet@2.5;
277 | yarn add ethereumjs-testrpc --dev;
278 | yarn add solc ether-pudding --dev;
279 | yarn add truffle-artifactor --dev;
280 | ```
281 | * References
282 | * https://medium.com/@codetractio/try-out-ethereum-using-only-nodejs-and-npm-eabaaaf97c80
283 | * Smart Contracts without Truffle - https://medium.com/@doart3/ethereum-dapps-without-truffle-compile-deploy-use-it-e6daeefcf919
284 | * EthereumJS Util - Library for cryptographic hashes for Ethereum addresses - https://github.com/ethereumjs/ethereumjs-util
285 | * EthereumJS Tx - library to create, edit, and sign Ethereum transactions - https://github.com/ethereumjs/ethereumjs-tx
286 | * EthereumJS LightWallet - https://github.com/ConsenSys/eth-lightwallet
287 | * Solc - Compile Solidity Contract - https://www.npmjs.com/package/solc
288 | * Ether Pudding - Manage Solidity Contracts and Packages - https://www.npmjs.com/package/ether-pudding
289 | * Truffle Artifactor - replaces Ether Pudding - https://github.com/trufflesuite/truffle-artifactor
290 | * Reading from JSON files - https://www.codementor.io/codementorteam/how-to-use-json-files-in-node-js-85hndqt32
291 |
292 | * Problem: Tried to manually compile using Solc with `node lib/compileContract.js ConvertLib`, which generates ConvertLib.solc.js in build/contracts. However it does not compile MetaCoin.sol, as it returns error `1:27: ParserError: Source "ConvertLib.sol" not found: File not supplied initially.\n ... import "./ConvertLib.sol"`.
293 | * Solution: Use Truffle to compile Solidity contracts with `truffle compile --compile-all`
294 |
295 | * Run shell script in new Terminal tab (copy from https://github.com/ltfschoen/solidity_test/blob/master/testrpc.sh)
296 | ```
297 | rm -rf ./db;
298 | mkdir db && mkdir db/chaindb;
299 | cd ~/code/blockchain/solidity_test; testrpc --account '0x0000000000000000000000000000000000000000000000000000000000000001, 10002471238800000000000' \
300 | --account '0x0000000000000000000000000000000000000000000000000000000000000002, 10004471238800000000000' \
301 | --account '0x0000000000000000000000000000000000000000000000000000000000000003, 10004471238800000000000' \
302 | --account '0x0000000000000000000000000000000000000000000000000000000000000004, 10004471238800000000000' \
303 | --account '0x0000000000000000000000000000000000000000000000000000000000000005, 10004471238800000000000' \
304 | --account '0x0000000000000000000000000000000000000000000000000000000000000006, 10004471238800000000000' \
305 | --account '0x0000000000000000000000000000000000000000000000000000000000000007, 10004471238800000000000' \
306 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000001' \
307 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000002' \
308 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000003' \
309 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000004' \
310 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000005' \
311 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000006' \
312 | --unlock '0x0000000000000000000000000000000000000000000000000000000000000007' \
313 | --unlock '0x7e5f4552091a69125d5dfcb7b8c2659029395bdf' \
314 | --unlock '0x2b5ad5c4795c026514f8317c7a215e218dccd6cf' \
315 | --blocktime 0 \
316 | --deterministic true \
317 | --port 8545 \
318 | --hostname localhost \
319 | --gasPrice 20000000000 \
320 | --gasLimit 1000000 \
321 | --debug true \
322 | --mem true \
323 | --db './db/chaindb'
324 | ```
325 | * Install Truffle
326 | ```
327 | npm install -g truffle;
328 | truffle init;
329 | ```
330 | * Run Truffle Unbox in separate directory to get template Metacoin example and move relevant boilerplate contracts and tests into the the root folder
331 | * Update package.json tests script to run tests for Smart Contracts and API tests:
332 | ```
333 | "test": "truffle test; NODE_ENV=testing mocha --recursive test/**/*_test.js",
334 | ```
335 | * Remove truffle-config.js and add the following to truffle.js:
336 | ```
337 | module.exports = {
338 | // http://truffleframework.com/docs/advanced/configuration
339 | networks: {
340 | development: {
341 | host: "localhost",
342 | port: 8545,
343 | network_id: "*" // Match any network id
344 | }
345 | }
346 | };
347 | ```
348 | * Add ethpm.json for EthPM Package Management
349 | ```
350 | {
351 | "package_name": "truffle-box-peerism-api-node-express",
352 | "version": "0.0.1",
353 | "description": "Truffle Box of Peerism API built with Truffle, Node.js, Express.js,
354 | Solidity, Ether Pudding, and Ethereum TestRPC",
355 | "authors": [
356 | "Luke Schoen "
357 | ],
358 | "keywords": [
359 | "ethereum",
360 | "express.js",
361 | "node.js",
362 | "middleware",
363 | "api"
364 | ],
365 | "license": "MIT"
366 | }
367 | ```
368 | * References:
369 | * http://truffleframework.com/docs/getting_started/packages-ethpm
370 |
371 | * Open node_modules/bitcore-mnemonic/node_modules/bitcore-lib/index.js and commented out the following lines of code to avoid an error.
372 | ```
373 | bitcore.versionGuard = function(version) {
374 | // if (version !== undefined) {
375 | // var message = 'More than one instance of bitcore-lib found. ' +
376 | // 'Please make sure to require bitcore-lib and check that submodules do' +
377 | // ' not also include their own bitcore-lib dependency.';
378 | // throw new Error(message);
379 | // }
380 | };
381 | ```
382 |
383 | * Run Truffle Console experimentation
384 | ```
385 | truffle console --network development;
386 | ```
387 |
388 | * Build script for Smart Contract (generates .sol.js file in build/contracts/)
389 | ```
390 | mkdir lib;
391 | node lib/compileContract.js Peerism
392 | ```
393 | * Alternatively compile with Truffle
394 |
395 | * Deployment script for Smart Contract
396 | * Reference: https://medium.com/@codetractio/try-out-ethereum-using-only-nodejs-and-npm-eabaaaf97c80
397 | ```
398 | touch lib/deployContract.js;
399 | node lib/deployContract.js Peerism;
400 | ```
401 | * References:
402 | * http://truffleframework.com/docs/getting_started/contracts
403 | * Gas Limits - https://bitcoin.stackexchange.com/questions/39132/what-is-gas-limit-in-ethereum
404 |
405 | ## FAQ
406 |
407 | * How to understand how to use Passport JWT library?
408 | * Refer to the library codebase on Github or in node_modules/jsonwebtoken/ i.e. [verify.js](https://github.com/auth0/node-jsonwebtoken/blob/master/verify.js)
409 | * Use breakpoints
410 | * Experiment using Node. i.e. Run `node` then
411 | ```
412 | npm install jsonwebtoken
413 |
414 | const JWT = require('jsonwebtoken');
415 | JWT.decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Imx0ZnNjaG9lbkBnbWFpbC5jb20iLCJpYXQiOjE1MTMwNjY3NTEsImV4cCI6MTUxMzY3MTU1MSwic3ViIjoiNWEyZjkwZmZiNTI5YjI0YzM5MTA1NWM3In0.MkcCR1YD2c21x_WOQObyY-UPAQDWTcooOiO69saUVMI")
416 | ```
417 |
418 | ## References
419 |
420 | * [Express.js server API with JWT authorisation](https://www.youtube.com/watch?v=ggv3rnaHuK8)
421 | * [Express.js Routes](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes)
422 |
423 | ## TODO
424 |
425 | * [ ] Integrate with [Peerism React Native app](https://github.com/peerism/peer.ai)
426 | * [X] Integrate Solidity smart contract using TestRPC
427 | * [ ] Create a Truffle Box
428 | * https://github.com/trufflesuite/truffle/issues/433
429 | * http://truffleframework.com/boxes/
430 | * [ ] Upgrade to latest Web3 1.0.0 Beta-27 that has been successfully used in
431 | https://github.com/ltfschoen/geth-node to deploy a FixedSupplyToken.sol smart contract to a Private Network with Geth
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const bodyParser = require('body-parser');
3 | const authMiddleware = require('./middleware/auth');
4 |
5 | const app = express();
6 |
7 | const usersRouter = require('./routes/users');
8 | const contractsRouter = require('./routes/contracts');
9 |
10 | // Middleware Plugins
11 | app.use(bodyParser.json()); // allow JSON uploads
12 | app.use(bodyParser.urlencoded({ extended: true })); // allow Form submissions
13 | app.use(authMiddleware.initialize);
14 | app.use('/users', usersRouter);
15 | app.use('/contracts', contractsRouter);
16 |
17 | // Routes
18 | app.get('/', (req, res) => {
19 | res.status(404).json({
20 | message: 'Error: Server under construction'
21 | });
22 | })
23 |
24 | module.exports = app;
--------------------------------------------------------------------------------
/box-img-lg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peerism/peerai-api/4fd5e82029fbdd37506c03c2048393b6b8caf7e4/box-img-lg.png
--------------------------------------------------------------------------------
/box-img-sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peerism/peerai-api/4fd5e82029fbdd37506c03c2048393b6b8caf7e4/box-img-sm.png
--------------------------------------------------------------------------------
/config/config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const _ = require('lodash');
4 | const fs = require('fs');
5 |
6 | fs.createReadStream('.sample-env')
7 | .pipe(fs.createWriteStream('../.env'));
8 |
9 | const dotenv = require('dotenv');
10 | dotenv.load();
11 |
12 | const config = {
13 | dev: 'development',
14 | test: 'testing',
15 | prod: 'production',
16 | port: process.env.PORT || 7000
17 | };
18 |
19 | // Check if script prefix provided (i.e. `NODE_ENV=development nodemon server.js`)
20 | // console.log(process.env.NODE_ENV);
21 |
22 | // Setup Node environment based on .env file else use default from hash
23 | process.env.NODE_ENV = process.env.NODE_ENV || config.dev;
24 | config.env = process.env.NODE_ENV;
25 |
26 | let envConfig;
27 | try {
28 | envConfig = require('./' + config.env);
29 | // fallback to empty object if file does not exist
30 | envConfig = envConfig || {};
31 | } catch(err) {
32 | envConfig = {};
33 | console.error('Error reading .env file');
34 | }
35 |
36 | // Merge configs so envConfig overwrites the config object
37 | module.exports = _.merge(config, envConfig);
--------------------------------------------------------------------------------
/config/development.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | logging: true,
3 | db: {
4 | url: 'mongodb://localhost/peerai'
5 | },
6 | port: 7000
7 | };
--------------------------------------------------------------------------------
/config/production.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | logging: false
3 | };
--------------------------------------------------------------------------------
/config/testing.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | logging: false,
3 | db: {
4 | url: 'mongodb://localhost/peerai-test'
5 | },
6 | port: 7111
7 | };
--------------------------------------------------------------------------------
/contracts/Migrations.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | contract Migrations {
4 | address public owner;
5 | uint public last_completed_migration;
6 |
7 | modifier restricted() {
8 | if (msg.sender == owner) _;
9 | }
10 |
11 | function Migrations() public {
12 | owner = msg.sender;
13 | }
14 |
15 | function setCompleted(uint completed) public restricted {
16 | last_completed_migration = completed;
17 | }
18 |
19 | function upgrade(address new_address) public restricted {
20 | Migrations upgraded = Migrations(new_address);
21 | upgraded.setCompleted(last_completed_migration);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/contracts/Peerism.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.18;
2 |
3 | contract Peerism {
4 |
5 | uint public numSkills;
6 |
7 | bool public fallbackTriggered;
8 |
9 | event SkillEvent(
10 | address indexed _from,
11 | bytes32 indexed _id,
12 | uint _value
13 | );
14 |
15 | struct Skill {
16 | uint weight;
17 | }
18 |
19 | address public owner;
20 |
21 | function Peerism(uint8 _numSkills) public {
22 | owner = msg.sender;
23 | numSkills = _numSkills;
24 | fallbackTriggered = false;
25 | }
26 |
27 | function skill(bytes32 _id) public payable {
28 | SkillEvent(msg.sender, _id, 1);
29 | }
30 |
31 | function() public payable {
32 | fallbackTriggered = true;
33 | }
34 | }
35 |
36 |
37 |
--------------------------------------------------------------------------------
/controllers/usersController.js:
--------------------------------------------------------------------------------
1 | const User = require('../models/User');
2 |
3 | // GET index -
4 | const userList = (req, res) => {
5 | User.find()
6 | .populate('skill')
7 | .then(users => {
8 | res.body = users;
9 | console.log('Authorised: User list returned in response');
10 | res.json({ data: users });
11 | })
12 | .catch(error => res.status(500).json({ error: error.message }))
13 | };
14 |
15 | // POST create
16 | const userCreate = (req, res) => {
17 | User.create(req.body)
18 | .then((user) => {
19 | res.status(201).json(user).end();
20 | })
21 | .catch(error => res.json({ error }))
22 | };
23 |
24 | module.exports = {
25 | userList: userList,
26 | userCreate: userCreate
27 | }
--------------------------------------------------------------------------------
/ethpm.json:
--------------------------------------------------------------------------------
1 | {
2 | "package_name": "truffle-box-peerism-api-node-express",
3 | "version": "1.0.0",
4 | "description": "Truffle Box of Peerism API built with Truffle, Node.js, Express.js,
5 | Solidity, Ether Pudding, and Ethereum TestRPC",
6 | "authors": [
7 | "Luke Schoen "
8 | ],
9 | "keywords": [
10 | "ethereum",
11 | "express.js",
12 | "node.js",
13 | "middleware",
14 | "api"
15 | ],
16 | "license": "MIT"
17 | }
--------------------------------------------------------------------------------
/lib/compileContract.js:
--------------------------------------------------------------------------------
1 | // FIXME: Running `node scripts/compileContract.js Peerism`
2 | // Bugs: Does not work when use comments in the contract
3 | var solc = require('solc');
4 | var fs = require('fs');
5 | var path = require('path');
6 | var Pudding = require('ether-pudding');
7 |
8 | const compileContract = (contractName) => {
9 | var source = fs.readFileSync(
10 | path.join(__dirname, '../contracts')+'/'+contractName+'.sol',{encoding: 'utf8'}).toString()
11 | .replace(/\n/g,' ');
12 | // console.log(source);
13 |
14 | var compiled = solc.compile(source, 1);
15 | console.log(compiled);
16 | console.log(Object.keys(compiled.contracts))
17 | if(!compiled.contracts[':'+contractName]) {
18 | console.log('Contract must have same name as file!');
19 | process.exit(1);
20 | }
21 | var bytecode = compiled.contracts[':'+contractName].bytecode;
22 | var interface = compiled.contracts[':'+contractName].interface;
23 |
24 | var contract_data = {
25 | abi: JSON.parse(interface),
26 | binary: bytecode,
27 | address: '0x0000011111222223333344444555556666677777'
28 | };
29 |
30 | var expectedFilepath = path.join(__dirname, '../build/contracts')+'/'+contractName+'.sol.js';
31 | //console.log(contract_data);
32 | Pudding.save(contract_data, expectedFilepath)
33 | .then(function() {
34 | console.log('File '+'api/build/contracts/'+contractName+'.sol.js was created with the JS contract!' );
35 | })
36 | .catch(function(err) {
37 | console.log('Error saving contract', err);
38 | });
39 |
40 | }
41 |
42 | run = (contractName) => {
43 | compileContract(contractName);
44 | }
45 |
46 | // Process Routes for API
47 | module.exports = {
48 | compileContract: compileContract
49 | }
50 |
51 | // Process CLI (i.e. `node lib/compileContract.js Peerism`)
52 | // Reference: http://coding.pstodulka.com/2014/10/22/node-modules-as-cli/
53 | if(require.main == module) {
54 | if(process.argv.length < 3) {
55 | console.log('Error: Contract Name as argument is required');
56 | process.exit(1);
57 | }
58 | var contractName = process.argv[2];
59 | run(contractName);
60 | }
--------------------------------------------------------------------------------
/lib/deployContract.js:
--------------------------------------------------------------------------------
1 | var Web3 = require('web3');
2 | var util = require('ethereumjs-util');
3 | var tx = require('ethereumjs-tx');
4 | var lightwallet = require('eth-lightwallet');
5 | var artifactor = require('truffle-artifactor');
6 | var txutils = lightwallet.txutils;
7 |
8 | const deployContract = (contractName) => {
9 | // FIXME - Convert to Singleton
10 | var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
11 |
12 | console.log("Connected to Web3 Status: " + web3.isConnected());
13 |
14 | /**
15 | * IMPORTANT: Obtain an Ethereum address and private key that was created and shown
16 | * in the Ganache CLI (TestRPC) Terminal window
17 | */
18 | var accountAddress = '0x7e5f4552091a69125d5dfcb7b8c2659029395bdf';
19 | var accountPrivateKey = '0000000000000000000000000000000000000000000000000000000000000001';
20 |
21 | /**
22 | * Compile the Smart Contracts with `truffle compile --compile-all`.
23 | * Solidity Contracts .sol are compiled into .json files in the
24 | * build/contracts directory.
25 | */
26 |
27 | /**
28 | * Obtain the Bytecode (used for execution in the EVM) and the
29 | * ABI (provides mapping for JS to interact with Solidity)
30 | */
31 |
32 | // // When compiled using `truffle compile...`
33 | // var Peerism = require("../build/contracts/Peerism.json");
34 | // var contractBytecode = Peerism.bytecode;
35 | // var contractABI = Peerism.abi;
36 |
37 | // When compiled using compileContract.js
38 | var Peerism = require(`../build/contracts/${contractName}.sol.js`);
39 | Peerism.setProvider(web3);
40 | var contractBytecode = Peerism.all_networks.default.unlinked_binary;
41 | var contractABI = Peerism.all_networks.default.abi;
42 | var contractAddress = Peerism.deployed().contract.address;
43 |
44 | // Do not supply more gas than the block gas limit else error: Exceeds block gas limit
45 | console.log('Current Block Gas Limit: ', web3.eth.getBlock('latest'));
46 |
47 | /**
48 | * Function to sign transaction with the private key of our Ethereum address
49 | * and send the transaction to the Ethereum TestRPC (Ganache CLI) network
50 | */
51 | function sendRaw(rawTx) {
52 | var privateKey = new Buffer(accountPrivateKey, 'hex');
53 | var transaction = new tx(rawTx);
54 | transaction.sign(privateKey);
55 | var serializedTx = transaction.serialize().toString('hex');
56 | // https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction
57 | web3.eth.sendRawTransaction(
58 | '0x' + serializedTx, function(err, hash) {
59 | if(err) {
60 | console.log('sendRawTransaction error: ', err);
61 | } else {
62 | console.log('sendRawTransaction transaction address: ', hash);
63 | // https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt
64 | web3.eth.getTransactionReceipt(hash, function(err, receipt) {
65 | if(err) {
66 | console.log('getTransactionReceipt error: ', err);
67 | } else {
68 | console.log('getTransactionReceipt transaction receipt: ', receipt);
69 | console.log('getTransactionReceipt transaction address: ', receipt.contractAddress);
70 | }
71 | })
72 | }
73 | });
74 | }
75 |
76 | /**
77 | * Deploy the Smart Contract by constructing the following transaction
78 | * - nonce - sequential integer to track number of outgoing transactions
79 | * - gasLimit - max gas to pay for the transaction
80 | * - gasPrice - price willing to pay for gas used in the transaction
81 | * (i.e. transaction fee in Ether == gasPrice * gas used)
82 | * - data - instructions for the transaction, which includes:
83 | * - bytecode - to instruct the creation of the Ballot smart contract
84 | * - argument - the argument to the Ballot function in the smart contract
85 | * is zero padded (i.e. where a value of 5 is the argument _numProposals)
86 | */
87 | var rawTx = {
88 | nonce: web3.toHex(web3.eth.getTransactionCount(accountAddress)),
89 | gasLimit: web3.toHex(200000),
90 | gasPrice: web3.toHex(70000000000), // 70 GWei
91 | data: '0x' + contractBytecode + '0000000000000000000000000000000000000000000000000000000000000005'
92 | };
93 |
94 | /**
95 | * Estimate the cost of sending the transaction to a random address
96 | */
97 | var gasEstimate = web3.eth.estimateGas({
98 | to: "0x2b5ad5c4795c026514f8317c7a215e218dccd6cf",
99 | data: rawTx.data
100 | });
101 | console.log(gasEstimate);
102 |
103 | // FIXME - When try to deploy contract by calling `sendRaw` instead of migrating
104 | // the contract using Truffle with `truffle migrate --reset --network development`
105 | // it always results in these errors, where default sender balance: 6666756738730000000000,
106 | // even though the gasEstimate returns only 316120
107 | // - Error: VM Exception while processing transaction: out of gas
108 | // - Error: base fee exceeds gas limit
109 |
110 | /**
111 | * Send the transaction to the Ethereum TestRPC (Ganache CLI)
112 | */
113 | // sendRaw(rawTx);
114 |
115 | /**
116 | * Deploy the contract with Truffle Migrate `truffle migrate --reset --network development`
117 | * then obtain Contract Address with:
118 | */
119 | // contractAddress = '0xf422e821237328257e9ae78d30a6081753cd67be';
120 | const peerismContractABI = web3.eth.contract(contractABI)
121 | const peerismContractInstance = peerismContractABI.at(contractAddress);
122 |
123 | // Assign default account
124 | web3.eth.defaultAccount = web3.eth.accounts[0];
125 | console.log(web3.eth.coinbase);
126 | console.log(web3.eth.defaultAccount);
127 |
128 | // Filter pending
129 | const filter = web3.eth.filter('pending');
130 | filter.watch(function (err, result) {
131 | console.log('Event log watched: ', result);
132 | });
133 | filter.stopWatching();
134 |
135 | // All Events
136 | var allEvents = peerismContractInstance.allEvents({fromBlock: 0, toBlock: 'latest'});
137 | allEvents.watch(function(error, event){
138 | if (!error)
139 | console.log(event);
140 | });
141 | allEvents.stopWatching();
142 |
143 | // Filter
144 | // https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter
145 | web3.eth.filter({
146 | address: contractAddress,
147 | fromBlock: 0,
148 | toBlock: 'latest',
149 | topics: [web3.sha3('SkillEvent(address,bytes32,uint)')]
150 | // topics: [web3.sha3('newtest(string,uint256,string,string,uint256)')]
151 | }).get(function (err, result) {
152 | console.log('Event log filtered: ', result);
153 | });
154 |
155 | // Call event in Peerism Smart Contract
156 | // http://solidity.readthedocs.io/en/develop/contracts.html#events
157 | var event = peerismContractInstance.skill.sendTransaction('3d printing',
158 | {fromBlock: 0, toBlock: 'latest'},
159 | function(error, result) {
160 | if (!error) {
161 | console.log('Event log from contract: ', result);
162 | } else {
163 | console.log('Error logging: ', error);
164 | }
165 | }
166 | );
167 |
168 | return contractAddress;
169 | }
170 |
171 | run = (contractName) => {
172 | deployContract(contractName);
173 | }
174 |
175 | // Process Routes for API
176 | module.exports = {
177 | deployContract: deployContract
178 | }
179 |
180 | // Process CLI (i.e. `node lib/deployContract.js Peerism`)
181 | if(require.main == module) {
182 | if(process.argv.length < 3) {
183 | console.log('Error: Contract Name as argument is required');
184 | process.exit(1);
185 | }
186 | var contractName = process.argv[2];
187 | run(contractName);
188 | }
189 |
--------------------------------------------------------------------------------
/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const passport = require('passport');
2 | const JWT = require('jsonwebtoken');
3 | const PassportJwt = require('passport-jwt');
4 | const User = require('../models/User');
5 |
6 | const JWT_SECRET = 'xyz';
7 | const JWT_ALGORITHM = 'HS256';
8 | const JWT_EXPIRES_IN = '7 days';
9 |
10 | // Use "createStrategy" instead of "authenticate".
11 | // See https://github.com/saintedlama/passport-local-mongoose
12 | passport.use(User.createStrategy());
13 |
14 | // Middleware for Passport Authentication
15 | const register = (req, res, next) => {
16 |
17 | console.log('Middleware for Passport Registration');
18 | // Create new User model
19 | const user = new User({
20 | email: req.body.email,
21 | name: req.body.name
22 | })
23 |
24 | // Pass the User model to the Passport `register` method
25 | User.register(user, req.body.password, (error, user) => {
26 | if (error) {
27 | console.error('Error registering user with middleware: ', error);
28 | next(error);
29 | return;
30 | }
31 | console.log('Success registering user with middleware: ', user);
32 | // Store user so we can access in our handler
33 | req.user = user;
34 | next();
35 | })
36 | }
37 |
38 | const jwtOptions = {
39 | // Authorization: Bearer in request headers
40 | jwtFromRequest: PassportJwt.ExtractJwt.fromAuthHeaderAsBearerToken(),
41 | secretOrKey: JWT_SECRET,
42 | // Algorithms used to sign in
43 | algorithms: [JWT_ALGORITHM]
44 | }
45 |
46 | // Passport JWT Strategy triggered by validateJWTWithPassportJWT
47 | // https://www.npmjs.com/package/passport-jwt
48 | passport.use(new PassportJwt.Strategy(jwtOptions,
49 | // Post-Verified token - https://www.npmjs.com/package/passport-jwt
50 | (jwtPayload, done) => {
51 | console.log('PassportJwt Strategy being processed');
52 | // Find user in MongoDB using the `id` in the JWT
53 | User.findById(jwtPayload.sub)
54 | // User.findById(jwtPayload._doc._id)
55 | .then((user) => {
56 | if (user) {
57 | done(null, user);
58 | } else {
59 | done(null, false);
60 | }
61 | })
62 | .catch((error) => {
63 | done(error, false);
64 | })
65 | }
66 | ))
67 |
68 | const validateJWTManually = (req, res, next) => {
69 | // Extract token without "JWT " or "Bearer " prefix
70 | const token = req.headers.authorization ? req.headers.authorization.split(" ")[1] : null;
71 | if (token) {
72 | // https://github.com/auth0/node-jsonwebtoken
73 | JWT.verify(token, JWT_SECRET, function(error, decodedToken) {
74 | if (error) {
75 | res.status(401).json({
76 | message: 'Error: Token invalid'
77 | });
78 | console.error('Error: Token invalid: ', error);
79 | next(error);
80 | return;
81 | } else {
82 | req.user = decodedToken;
83 | User.find({ email: decodedToken.email })
84 | .then((user) => {
85 | if (user) {
86 | console.log('Success authorising user with middleware: ', decodedToken);
87 | next();
88 | } else {
89 | res.status(403).json({
90 | message: 'Error: Token valid but user no longer exists in database'
91 | });
92 | console.error('Error: Token valid but user no longer exists in database: ', error);
93 | next(error);
94 | return;
95 | }
96 | })
97 | .catch((error) => {
98 | res.status(500).json({
99 | message: 'Error: Token valid but error occurred retrieving user from database'
100 | });
101 | console.error('Error: Token valid but error occurred retrieving user from database: ', error);
102 | next(error);
103 | return;
104 | })
105 | }
106 | });
107 | } else {
108 | res.status(401).json({
109 | message: "Error: No Token provided"
110 | });
111 | console.error('Error: No Token provided: ', error);
112 | next(error);
113 | return;
114 | }
115 | }
116 |
117 | // JWT signed token - http://jwt.io/
118 | const signJWTForUser = (req, res) => {
119 |
120 | // Obtain user from request object
121 | const user = req.user;
122 |
123 | // Create signed JWT
124 | const token = JWT.sign(
125 | // payload
126 | {
127 | email: user.email
128 | },
129 | // secretOrPrivateKey - https://raymii.org/s/snippets/OpenSSL_Password_Generator.html
130 | JWT_SECRET,
131 | // options - https://github.com/auth0/node-jsonwebtoken
132 | {
133 | subject: user._id.toString(),
134 | algorithm: JWT_ALGORITHM,
135 | expiresIn: JWT_EXPIRES_IN
136 | }
137 | )
138 |
139 | // Return token in response object
140 | res.json({
141 | token: token
142 | })
143 | }
144 |
145 | module.exports = {
146 | initialize: passport.initialize(),
147 | register: register,
148 | signIn: passport.authenticate('local', { session: false }),
149 | signJWTForUser: signJWTForUser,
150 | validateJWTWithPassportJWT: passport.authenticate('jwt', { session: false }),
151 | validateJWTManually: validateJWTManually
152 | }
153 |
--------------------------------------------------------------------------------
/middleware/contracts.js:
--------------------------------------------------------------------------------
1 | const { compileContract } = require('../lib/compileContract');
2 | const { deployContract } = require('../lib/deployContract');
3 |
4 | const compile = (req, res, next) => {
5 | if (req.body && req.body.contractName) {
6 | var contractName = req.body.contractName;
7 | compileContract(contractName);
8 | console.log('Successfully compiled the contract using Express.js Middleware');
9 | next();
10 | } else {
11 | res.status(401).json({
12 | message: "Error: No Contract Name provided"
13 | });
14 | console.error('Error: No Contract Name provided: ', error);
15 | next(error);
16 | return;
17 | }
18 | }
19 |
20 | const deploy = (req, res, next) => {
21 | var contractName = req.body.contractName;
22 | var contractAddress = deployContract(contractName);
23 | res.contractAddress = contractAddress;
24 | console.log('Successfully deployed the contract using Express.js Middleware');
25 | next();
26 | }
27 |
28 | const getContractAddress = (req, res) => {
29 | contractAddress = res.contractAddress;
30 | // Return contract address in response object
31 | res.json({
32 | contractAddress: contractAddress
33 | })
34 | }
35 |
36 | module.exports = {
37 | compile: compile,
38 | deploy: deploy,
39 | getContractAddress: getContractAddress
40 | }
41 |
--------------------------------------------------------------------------------
/migrations/1_initial_migration.js:
--------------------------------------------------------------------------------
1 | var Migrations = artifacts.require("./Migrations.sol");
2 |
3 | module.exports = function(deployer) {
4 | deployer.deploy(Migrations);
5 | };
6 |
--------------------------------------------------------------------------------
/migrations/2_deploy_contracts.js:
--------------------------------------------------------------------------------
1 | var Peerism = artifacts.require("./Peerism.sol");
2 |
3 | module.exports = function(deployer) {
4 | deployer.deploy(Peerism);
5 | };
6 |
--------------------------------------------------------------------------------
/models/Skill.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('./init');
2 | const Schema = mongoose.Schema;
3 |
4 | const SkillSchema = Schema({
5 | name: String
6 | });
7 |
8 | const Skill = mongoose.models.Skill || mongoose.model('Skill', SkillSchema);
9 |
10 | module.exports = Skill;
--------------------------------------------------------------------------------
/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('./init');
2 | const Schema = mongoose.Schema;
3 | const ObjectId = Schema.Types.ObjectId;
4 | const passportLocalMongoose = require('passport-local-mongoose');
5 |
6 | const SkillRef = {
7 | type: ObjectId, ref: 'Skill'
8 | }
9 |
10 | const UserSchema = Schema({
11 | name: String,
12 | skills: [{ skill: SkillRef }]
13 | });
14 |
15 | // Plugin to add Passport email/password credentials to the UserSchema
16 | // and adds Passport methods including `register`
17 | UserSchema.plugin(passportLocalMongoose, {
18 | usernameField: 'email', // Override login field to be email instead
19 | usernameLowerCase: true, // Ensure all emails are lowercase
20 | session: false // Disable session cookies since we will use JWTs
21 | })
22 |
23 | UserSchema.methods.fullName = function() {
24 | return `${this.name}`;
25 | }
26 |
27 | const User = mongoose.models.User || mongoose.model('User', UserSchema);
28 |
29 | module.exports = User;
--------------------------------------------------------------------------------
/models/drop.js:
--------------------------------------------------------------------------------
1 | const User = require('./User');
2 |
3 | User.deleteMany()
4 | .then(() => {
5 | console.log('Deleted users');
6 | process.exit();
7 | })
--------------------------------------------------------------------------------
/models/init.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | mongoose.Promise = global.Promise;
3 |
4 | const config = require('../config/config');
5 |
6 | console.log('Connecting to MongoDB database using database: ', config.db.url);
7 |
8 | // Connect to MongoDB local database
9 | mongoose
10 | // config.db.url differs depending on NODE_ENV
11 | .connect(
12 | config.db.url,
13 | { useMongoClient: true }
14 | )
15 | .then(() => {
16 | console.log('Successfully connected to MongoDB database');
17 | })
18 | .catch((error) => {
19 | console.error('Error connecting to MongoDB database: ', error);
20 | process.exit();
21 | })
22 |
23 | module.exports = mongoose;
--------------------------------------------------------------------------------
/models/seeds.js:
--------------------------------------------------------------------------------
1 | const User = require('./User');
2 | const Skill = require('./Skill');
3 |
4 | let firstSkill = Skill.create(
5 | {
6 | skill: 'Ethereum'
7 | }
8 | )
9 |
10 | User.create(
11 | [
12 | {
13 | email: 'luke@schoen.com',
14 | password: '123456',
15 | name: 'Luke',
16 | skills: [firstSkill]
17 | },
18 | {
19 | email: 'nathan@waters.com',
20 | name: 'Nathan',
21 | password: '123456',
22 | skills: [firstSkill]
23 | }
24 | ]
25 | )
26 | .then((users) => {
27 | console.log('Created users: ', users);
28 | process.exit();
29 | })
30 | .catch((error) => {
31 | console.error('Error creating users: ', error);
32 | process.exit();
33 | })
34 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "peerai-api",
3 | "version": "0.1.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@remy/pstree": {
8 | "version": "1.1.0",
9 | "resolved": "https://registry.npmjs.org/@remy/pstree/-/pstree-1.1.0.tgz",
10 | "integrity": "sha512-3rxECj41p0Qkdgoc50VnZpSDTXS+UZGRzTTO+qb3TiZDhuZMmf4z/wApcIeJ878okVq7D9phadgXQD9Kvbq3tQ==",
11 | "dev": true,
12 | "requires": {
13 | "ps-tree": "1.1.0"
14 | }
15 | },
16 | "abbrev": {
17 | "version": "1.1.1",
18 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
19 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
20 | "dev": true
21 | },
22 | "accepts": {
23 | "version": "1.3.4",
24 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
25 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
26 | "requires": {
27 | "mime-types": "2.1.17",
28 | "negotiator": "0.6.1"
29 | }
30 | },
31 | "acorn": {
32 | "version": "5.2.1",
33 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz",
34 | "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==",
35 | "dev": true
36 | },
37 | "acorn-dynamic-import": {
38 | "version": "2.0.2",
39 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
40 | "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
41 | "dev": true,
42 | "requires": {
43 | "acorn": "4.0.13"
44 | },
45 | "dependencies": {
46 | "acorn": {
47 | "version": "4.0.13",
48 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
49 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
50 | "dev": true
51 | }
52 | }
53 | },
54 | "ajv": {
55 | "version": "5.5.1",
56 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz",
57 | "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=",
58 | "dev": true,
59 | "requires": {
60 | "co": "4.6.0",
61 | "fast-deep-equal": "1.0.0",
62 | "fast-json-stable-stringify": "2.0.0",
63 | "json-schema-traverse": "0.3.1"
64 | }
65 | },
66 | "ajv-keywords": {
67 | "version": "2.1.1",
68 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
69 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
70 | "dev": true
71 | },
72 | "align-text": {
73 | "version": "0.1.4",
74 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
75 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
76 | "dev": true,
77 | "requires": {
78 | "kind-of": "3.2.2",
79 | "longest": "1.0.1",
80 | "repeat-string": "1.6.1"
81 | }
82 | },
83 | "ansi-align": {
84 | "version": "2.0.0",
85 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
86 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
87 | "dev": true,
88 | "requires": {
89 | "string-width": "2.1.1"
90 | }
91 | },
92 | "ansi-regex": {
93 | "version": "2.1.1",
94 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
95 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
96 | "dev": true
97 | },
98 | "ansi-styles": {
99 | "version": "3.2.0",
100 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
101 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
102 | "dev": true,
103 | "requires": {
104 | "color-convert": "1.9.1"
105 | }
106 | },
107 | "anymatch": {
108 | "version": "1.3.2",
109 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
110 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
111 | "dev": true,
112 | "requires": {
113 | "micromatch": "2.3.11",
114 | "normalize-path": "2.1.1"
115 | }
116 | },
117 | "arr-diff": {
118 | "version": "2.0.0",
119 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
120 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
121 | "dev": true,
122 | "requires": {
123 | "arr-flatten": "1.1.0"
124 | }
125 | },
126 | "arr-flatten": {
127 | "version": "1.1.0",
128 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
129 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
130 | "dev": true
131 | },
132 | "array-flatten": {
133 | "version": "1.1.1",
134 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
135 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
136 | },
137 | "array-unique": {
138 | "version": "0.2.1",
139 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
140 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
141 | "dev": true
142 | },
143 | "asn1.js": {
144 | "version": "4.9.2",
145 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz",
146 | "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==",
147 | "dev": true,
148 | "requires": {
149 | "bn.js": "4.11.8",
150 | "inherits": "2.0.3",
151 | "minimalistic-assert": "1.0.0"
152 | }
153 | },
154 | "assert": {
155 | "version": "1.4.1",
156 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
157 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
158 | "dev": true,
159 | "requires": {
160 | "util": "0.10.3"
161 | }
162 | },
163 | "assertion-error": {
164 | "version": "1.0.2",
165 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
166 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
167 | "dev": true
168 | },
169 | "async": {
170 | "version": "1.5.2",
171 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
172 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
173 | "dev": true
174 | },
175 | "async-each": {
176 | "version": "1.0.1",
177 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
178 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
179 | "dev": true
180 | },
181 | "balanced-match": {
182 | "version": "1.0.0",
183 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
184 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
185 | "dev": true
186 | },
187 | "base64-js": {
188 | "version": "1.2.1",
189 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
190 | "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
191 | "dev": true
192 | },
193 | "base64url": {
194 | "version": "2.0.0",
195 | "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
196 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
197 | },
198 | "big.js": {
199 | "version": "3.2.0",
200 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
201 | "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
202 | "dev": true
203 | },
204 | "binary-extensions": {
205 | "version": "1.11.0",
206 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
207 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
208 | "dev": true
209 | },
210 | "bluebird": {
211 | "version": "3.5.0",
212 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
213 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw="
214 | },
215 | "bn.js": {
216 | "version": "4.11.8",
217 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
218 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
219 | "dev": true
220 | },
221 | "body-parser": {
222 | "version": "1.18.2",
223 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
224 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
225 | "requires": {
226 | "bytes": "3.0.0",
227 | "content-type": "1.0.4",
228 | "debug": "2.6.9",
229 | "depd": "1.1.1",
230 | "http-errors": "1.6.2",
231 | "iconv-lite": "0.4.19",
232 | "on-finished": "2.3.0",
233 | "qs": "6.5.1",
234 | "raw-body": "2.3.2",
235 | "type-is": "1.6.15"
236 | }
237 | },
238 | "boxen": {
239 | "version": "1.3.0",
240 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
241 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
242 | "dev": true,
243 | "requires": {
244 | "ansi-align": "2.0.0",
245 | "camelcase": "4.1.0",
246 | "chalk": "2.3.0",
247 | "cli-boxes": "1.0.0",
248 | "string-width": "2.1.1",
249 | "term-size": "1.2.0",
250 | "widest-line": "2.0.0"
251 | },
252 | "dependencies": {
253 | "camelcase": {
254 | "version": "4.1.0",
255 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
256 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
257 | "dev": true
258 | }
259 | }
260 | },
261 | "brace-expansion": {
262 | "version": "1.1.8",
263 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
264 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
265 | "dev": true,
266 | "requires": {
267 | "balanced-match": "1.0.0",
268 | "concat-map": "0.0.1"
269 | }
270 | },
271 | "braces": {
272 | "version": "1.8.5",
273 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
274 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
275 | "dev": true,
276 | "requires": {
277 | "expand-range": "1.8.2",
278 | "preserve": "0.2.0",
279 | "repeat-element": "1.1.2"
280 | }
281 | },
282 | "brorand": {
283 | "version": "1.1.0",
284 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
285 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
286 | "dev": true
287 | },
288 | "browser-stdout": {
289 | "version": "1.3.0",
290 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
291 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
292 | "dev": true
293 | },
294 | "browserify-aes": {
295 | "version": "1.1.1",
296 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
297 | "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==",
298 | "dev": true,
299 | "requires": {
300 | "buffer-xor": "1.0.3",
301 | "cipher-base": "1.0.4",
302 | "create-hash": "1.1.3",
303 | "evp_bytestokey": "1.0.3",
304 | "inherits": "2.0.3",
305 | "safe-buffer": "5.1.1"
306 | }
307 | },
308 | "browserify-cipher": {
309 | "version": "1.0.0",
310 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
311 | "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
312 | "dev": true,
313 | "requires": {
314 | "browserify-aes": "1.1.1",
315 | "browserify-des": "1.0.0",
316 | "evp_bytestokey": "1.0.3"
317 | }
318 | },
319 | "browserify-des": {
320 | "version": "1.0.0",
321 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
322 | "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
323 | "dev": true,
324 | "requires": {
325 | "cipher-base": "1.0.4",
326 | "des.js": "1.0.0",
327 | "inherits": "2.0.3"
328 | }
329 | },
330 | "browserify-rsa": {
331 | "version": "4.0.1",
332 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
333 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
334 | "dev": true,
335 | "requires": {
336 | "bn.js": "4.11.8",
337 | "randombytes": "2.0.5"
338 | }
339 | },
340 | "browserify-sign": {
341 | "version": "4.0.4",
342 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
343 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
344 | "dev": true,
345 | "requires": {
346 | "bn.js": "4.11.8",
347 | "browserify-rsa": "4.0.1",
348 | "create-hash": "1.1.3",
349 | "create-hmac": "1.1.6",
350 | "elliptic": "6.4.0",
351 | "inherits": "2.0.3",
352 | "parse-asn1": "5.1.0"
353 | }
354 | },
355 | "browserify-zlib": {
356 | "version": "0.2.0",
357 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
358 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
359 | "dev": true,
360 | "requires": {
361 | "pako": "1.0.6"
362 | }
363 | },
364 | "bson": {
365 | "version": "1.0.4",
366 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz",
367 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw="
368 | },
369 | "buffer": {
370 | "version": "4.9.1",
371 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
372 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
373 | "dev": true,
374 | "requires": {
375 | "base64-js": "1.2.1",
376 | "ieee754": "1.1.8",
377 | "isarray": "1.0.0"
378 | }
379 | },
380 | "buffer-equal-constant-time": {
381 | "version": "1.0.1",
382 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
383 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
384 | },
385 | "buffer-shims": {
386 | "version": "1.0.0",
387 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
388 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
389 | },
390 | "buffer-xor": {
391 | "version": "1.0.3",
392 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
393 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
394 | "dev": true
395 | },
396 | "builtin-modules": {
397 | "version": "1.1.1",
398 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
399 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
400 | "dev": true
401 | },
402 | "builtin-status-codes": {
403 | "version": "3.0.0",
404 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
405 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
406 | "dev": true
407 | },
408 | "bytes": {
409 | "version": "3.0.0",
410 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
411 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
412 | },
413 | "camelcase": {
414 | "version": "1.2.1",
415 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
416 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
417 | "dev": true
418 | },
419 | "capture-stack-trace": {
420 | "version": "1.0.0",
421 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
422 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
423 | "dev": true
424 | },
425 | "center-align": {
426 | "version": "0.1.3",
427 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
428 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
429 | "dev": true,
430 | "requires": {
431 | "align-text": "0.1.4",
432 | "lazy-cache": "1.0.4"
433 | }
434 | },
435 | "chai": {
436 | "version": "4.1.2",
437 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
438 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
439 | "dev": true,
440 | "requires": {
441 | "assertion-error": "1.0.2",
442 | "check-error": "1.0.2",
443 | "deep-eql": "3.0.1",
444 | "get-func-name": "2.0.0",
445 | "pathval": "1.1.0",
446 | "type-detect": "4.0.5"
447 | }
448 | },
449 | "chai-http": {
450 | "version": "3.0.0",
451 | "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz",
452 | "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=",
453 | "dev": true,
454 | "requires": {
455 | "cookiejar": "2.0.6",
456 | "is-ip": "1.0.0",
457 | "methods": "1.1.2",
458 | "qs": "6.5.1",
459 | "superagent": "2.3.0"
460 | }
461 | },
462 | "chalk": {
463 | "version": "2.3.0",
464 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
465 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
466 | "dev": true,
467 | "requires": {
468 | "ansi-styles": "3.2.0",
469 | "escape-string-regexp": "1.0.5",
470 | "supports-color": "4.5.0"
471 | }
472 | },
473 | "check-error": {
474 | "version": "1.0.2",
475 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
476 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
477 | "dev": true
478 | },
479 | "chokidar": {
480 | "version": "1.7.0",
481 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
482 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
483 | "dev": true,
484 | "requires": {
485 | "anymatch": "1.3.2",
486 | "async-each": "1.0.1",
487 | "fsevents": "1.1.3",
488 | "glob-parent": "2.0.0",
489 | "inherits": "2.0.3",
490 | "is-binary-path": "1.0.1",
491 | "is-glob": "2.0.1",
492 | "path-is-absolute": "1.0.1",
493 | "readdirp": "2.1.0"
494 | }
495 | },
496 | "cipher-base": {
497 | "version": "1.0.4",
498 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
499 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
500 | "dev": true,
501 | "requires": {
502 | "inherits": "2.0.3",
503 | "safe-buffer": "5.1.1"
504 | }
505 | },
506 | "cli-boxes": {
507 | "version": "1.0.0",
508 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
509 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
510 | "dev": true
511 | },
512 | "cliui": {
513 | "version": "2.1.0",
514 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
515 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
516 | "dev": true,
517 | "requires": {
518 | "center-align": "0.1.3",
519 | "right-align": "0.1.3",
520 | "wordwrap": "0.0.2"
521 | }
522 | },
523 | "co": {
524 | "version": "4.6.0",
525 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
526 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
527 | "dev": true
528 | },
529 | "code-point-at": {
530 | "version": "1.1.0",
531 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
532 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
533 | "dev": true
534 | },
535 | "color-convert": {
536 | "version": "1.9.1",
537 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
538 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
539 | "dev": true,
540 | "requires": {
541 | "color-name": "1.1.3"
542 | }
543 | },
544 | "color-name": {
545 | "version": "1.1.3",
546 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
547 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
548 | "dev": true
549 | },
550 | "combined-stream": {
551 | "version": "1.0.5",
552 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
553 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
554 | "dev": true,
555 | "requires": {
556 | "delayed-stream": "1.0.0"
557 | }
558 | },
559 | "commander": {
560 | "version": "2.11.0",
561 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
562 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
563 | "dev": true
564 | },
565 | "component-emitter": {
566 | "version": "1.2.1",
567 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
568 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
569 | "dev": true
570 | },
571 | "concat-map": {
572 | "version": "0.0.1",
573 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
574 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
575 | "dev": true
576 | },
577 | "configstore": {
578 | "version": "3.1.1",
579 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
580 | "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
581 | "dev": true,
582 | "requires": {
583 | "dot-prop": "4.2.0",
584 | "graceful-fs": "4.1.11",
585 | "make-dir": "1.1.0",
586 | "unique-string": "1.0.0",
587 | "write-file-atomic": "2.3.0",
588 | "xdg-basedir": "3.0.0"
589 | }
590 | },
591 | "console-browserify": {
592 | "version": "1.1.0",
593 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
594 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
595 | "dev": true,
596 | "requires": {
597 | "date-now": "0.1.4"
598 | }
599 | },
600 | "constants-browserify": {
601 | "version": "1.0.0",
602 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
603 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
604 | "dev": true
605 | },
606 | "content-disposition": {
607 | "version": "0.5.2",
608 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
609 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
610 | },
611 | "content-type": {
612 | "version": "1.0.4",
613 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
614 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
615 | },
616 | "cookie": {
617 | "version": "0.3.1",
618 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
619 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
620 | },
621 | "cookie-signature": {
622 | "version": "1.0.6",
623 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
624 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
625 | },
626 | "cookiejar": {
627 | "version": "2.0.6",
628 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz",
629 | "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=",
630 | "dev": true
631 | },
632 | "core-util-is": {
633 | "version": "1.0.2",
634 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
635 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
636 | },
637 | "create-ecdh": {
638 | "version": "4.0.0",
639 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
640 | "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
641 | "dev": true,
642 | "requires": {
643 | "bn.js": "4.11.8",
644 | "elliptic": "6.4.0"
645 | }
646 | },
647 | "create-error-class": {
648 | "version": "3.0.2",
649 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
650 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
651 | "dev": true,
652 | "requires": {
653 | "capture-stack-trace": "1.0.0"
654 | }
655 | },
656 | "create-hash": {
657 | "version": "1.1.3",
658 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
659 | "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
660 | "dev": true,
661 | "requires": {
662 | "cipher-base": "1.0.4",
663 | "inherits": "2.0.3",
664 | "ripemd160": "2.0.1",
665 | "sha.js": "2.4.9"
666 | }
667 | },
668 | "create-hmac": {
669 | "version": "1.1.6",
670 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
671 | "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
672 | "dev": true,
673 | "requires": {
674 | "cipher-base": "1.0.4",
675 | "create-hash": "1.1.3",
676 | "inherits": "2.0.3",
677 | "ripemd160": "2.0.1",
678 | "safe-buffer": "5.1.1",
679 | "sha.js": "2.4.9"
680 | }
681 | },
682 | "cross-spawn": {
683 | "version": "5.1.0",
684 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
685 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
686 | "dev": true,
687 | "requires": {
688 | "lru-cache": "4.1.1",
689 | "shebang-command": "1.2.0",
690 | "which": "1.3.0"
691 | }
692 | },
693 | "crypto-browserify": {
694 | "version": "3.12.0",
695 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
696 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
697 | "dev": true,
698 | "requires": {
699 | "browserify-cipher": "1.0.0",
700 | "browserify-sign": "4.0.4",
701 | "create-ecdh": "4.0.0",
702 | "create-hash": "1.1.3",
703 | "create-hmac": "1.1.6",
704 | "diffie-hellman": "5.0.2",
705 | "inherits": "2.0.3",
706 | "pbkdf2": "3.0.14",
707 | "public-encrypt": "4.0.0",
708 | "randombytes": "2.0.5",
709 | "randomfill": "1.0.3"
710 | }
711 | },
712 | "crypto-random-string": {
713 | "version": "1.0.0",
714 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
715 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
716 | "dev": true
717 | },
718 | "d": {
719 | "version": "1.0.0",
720 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
721 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
722 | "dev": true,
723 | "requires": {
724 | "es5-ext": "0.10.37"
725 | }
726 | },
727 | "date-now": {
728 | "version": "0.1.4",
729 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
730 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
731 | "dev": true
732 | },
733 | "debug": {
734 | "version": "2.6.9",
735 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
736 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
737 | "requires": {
738 | "ms": "2.0.0"
739 | }
740 | },
741 | "decamelize": {
742 | "version": "1.2.0",
743 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
744 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
745 | "dev": true
746 | },
747 | "deep-eql": {
748 | "version": "3.0.1",
749 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
750 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
751 | "dev": true,
752 | "requires": {
753 | "type-detect": "4.0.5"
754 | }
755 | },
756 | "deep-extend": {
757 | "version": "0.4.2",
758 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
759 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
760 | "dev": true
761 | },
762 | "delayed-stream": {
763 | "version": "1.0.0",
764 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
765 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
766 | "dev": true
767 | },
768 | "depd": {
769 | "version": "1.1.1",
770 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
771 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
772 | },
773 | "des.js": {
774 | "version": "1.0.0",
775 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
776 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
777 | "dev": true,
778 | "requires": {
779 | "inherits": "2.0.3",
780 | "minimalistic-assert": "1.0.0"
781 | }
782 | },
783 | "destroy": {
784 | "version": "1.0.4",
785 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
786 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
787 | },
788 | "diff": {
789 | "version": "3.3.1",
790 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
791 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
792 | "dev": true
793 | },
794 | "diffie-hellman": {
795 | "version": "5.0.2",
796 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
797 | "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
798 | "dev": true,
799 | "requires": {
800 | "bn.js": "4.11.8",
801 | "miller-rabin": "4.0.1",
802 | "randombytes": "2.0.5"
803 | }
804 | },
805 | "domain-browser": {
806 | "version": "1.1.7",
807 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
808 | "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
809 | "dev": true
810 | },
811 | "dot-prop": {
812 | "version": "4.2.0",
813 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
814 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
815 | "dev": true,
816 | "requires": {
817 | "is-obj": "1.0.1"
818 | }
819 | },
820 | "dotenv": {
821 | "version": "4.0.0",
822 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz",
823 | "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=",
824 | "dev": true
825 | },
826 | "duplexer": {
827 | "version": "0.1.1",
828 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
829 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
830 | "dev": true
831 | },
832 | "duplexer3": {
833 | "version": "0.1.4",
834 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
835 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
836 | "dev": true
837 | },
838 | "ecdsa-sig-formatter": {
839 | "version": "1.0.9",
840 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
841 | "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
842 | "requires": {
843 | "base64url": "2.0.0",
844 | "safe-buffer": "5.1.1"
845 | }
846 | },
847 | "ee-first": {
848 | "version": "1.1.1",
849 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
850 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
851 | },
852 | "elliptic": {
853 | "version": "6.4.0",
854 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
855 | "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
856 | "dev": true,
857 | "requires": {
858 | "bn.js": "4.11.8",
859 | "brorand": "1.1.0",
860 | "hash.js": "1.1.3",
861 | "hmac-drbg": "1.0.1",
862 | "inherits": "2.0.3",
863 | "minimalistic-assert": "1.0.0",
864 | "minimalistic-crypto-utils": "1.0.1"
865 | }
866 | },
867 | "emojis-list": {
868 | "version": "2.1.0",
869 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
870 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
871 | "dev": true
872 | },
873 | "encodeurl": {
874 | "version": "1.0.1",
875 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
876 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA="
877 | },
878 | "enhanced-resolve": {
879 | "version": "3.4.1",
880 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
881 | "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
882 | "dev": true,
883 | "requires": {
884 | "graceful-fs": "4.1.11",
885 | "memory-fs": "0.4.1",
886 | "object-assign": "4.1.1",
887 | "tapable": "0.2.8"
888 | }
889 | },
890 | "errno": {
891 | "version": "0.1.6",
892 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
893 | "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==",
894 | "dev": true,
895 | "requires": {
896 | "prr": "1.0.1"
897 | }
898 | },
899 | "error-ex": {
900 | "version": "1.3.1",
901 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
902 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
903 | "dev": true,
904 | "requires": {
905 | "is-arrayish": "0.2.1"
906 | }
907 | },
908 | "es5-ext": {
909 | "version": "0.10.37",
910 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz",
911 | "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
912 | "dev": true,
913 | "requires": {
914 | "es6-iterator": "2.0.3",
915 | "es6-symbol": "3.1.1"
916 | }
917 | },
918 | "es6-iterator": {
919 | "version": "2.0.3",
920 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
921 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
922 | "dev": true,
923 | "requires": {
924 | "d": "1.0.0",
925 | "es5-ext": "0.10.37",
926 | "es6-symbol": "3.1.1"
927 | }
928 | },
929 | "es6-map": {
930 | "version": "0.1.5",
931 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
932 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
933 | "dev": true,
934 | "requires": {
935 | "d": "1.0.0",
936 | "es5-ext": "0.10.37",
937 | "es6-iterator": "2.0.3",
938 | "es6-set": "0.1.5",
939 | "es6-symbol": "3.1.1",
940 | "event-emitter": "0.3.5"
941 | }
942 | },
943 | "es6-promise": {
944 | "version": "3.2.1",
945 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz",
946 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q="
947 | },
948 | "es6-set": {
949 | "version": "0.1.5",
950 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
951 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
952 | "dev": true,
953 | "requires": {
954 | "d": "1.0.0",
955 | "es5-ext": "0.10.37",
956 | "es6-iterator": "2.0.3",
957 | "es6-symbol": "3.1.1",
958 | "event-emitter": "0.3.5"
959 | }
960 | },
961 | "es6-symbol": {
962 | "version": "3.1.1",
963 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
964 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
965 | "dev": true,
966 | "requires": {
967 | "d": "1.0.0",
968 | "es5-ext": "0.10.37"
969 | }
970 | },
971 | "es6-weak-map": {
972 | "version": "2.0.2",
973 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
974 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
975 | "dev": true,
976 | "requires": {
977 | "d": "1.0.0",
978 | "es5-ext": "0.10.37",
979 | "es6-iterator": "2.0.3",
980 | "es6-symbol": "3.1.1"
981 | }
982 | },
983 | "escape-html": {
984 | "version": "1.0.3",
985 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
986 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
987 | },
988 | "escape-string-regexp": {
989 | "version": "1.0.5",
990 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
991 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
992 | "dev": true
993 | },
994 | "escope": {
995 | "version": "3.6.0",
996 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
997 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
998 | "dev": true,
999 | "requires": {
1000 | "es6-map": "0.1.5",
1001 | "es6-weak-map": "2.0.2",
1002 | "esrecurse": "4.2.0",
1003 | "estraverse": "4.2.0"
1004 | }
1005 | },
1006 | "esrecurse": {
1007 | "version": "4.2.0",
1008 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
1009 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
1010 | "dev": true,
1011 | "requires": {
1012 | "estraverse": "4.2.0",
1013 | "object-assign": "4.1.1"
1014 | }
1015 | },
1016 | "estraverse": {
1017 | "version": "4.2.0",
1018 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1019 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1020 | "dev": true
1021 | },
1022 | "etag": {
1023 | "version": "1.8.1",
1024 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1025 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
1026 | },
1027 | "ethereumjs-testrpc": {
1028 | "version": "6.0.3",
1029 | "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz",
1030 | "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==",
1031 | "dev": true,
1032 | "requires": {
1033 | "webpack": "3.10.0"
1034 | }
1035 | },
1036 | "event-emitter": {
1037 | "version": "0.3.5",
1038 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
1039 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
1040 | "dev": true,
1041 | "requires": {
1042 | "d": "1.0.0",
1043 | "es5-ext": "0.10.37"
1044 | }
1045 | },
1046 | "event-stream": {
1047 | "version": "3.3.4",
1048 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
1049 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
1050 | "dev": true,
1051 | "requires": {
1052 | "duplexer": "0.1.1",
1053 | "from": "0.1.7",
1054 | "map-stream": "0.1.0",
1055 | "pause-stream": "0.0.11",
1056 | "split": "0.3.3",
1057 | "stream-combiner": "0.0.4",
1058 | "through": "2.3.8"
1059 | }
1060 | },
1061 | "events": {
1062 | "version": "1.1.1",
1063 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
1064 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
1065 | "dev": true
1066 | },
1067 | "evp_bytestokey": {
1068 | "version": "1.0.3",
1069 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1070 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1071 | "dev": true,
1072 | "requires": {
1073 | "md5.js": "1.3.4",
1074 | "safe-buffer": "5.1.1"
1075 | }
1076 | },
1077 | "execa": {
1078 | "version": "0.7.0",
1079 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
1080 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
1081 | "dev": true,
1082 | "requires": {
1083 | "cross-spawn": "5.1.0",
1084 | "get-stream": "3.0.0",
1085 | "is-stream": "1.1.0",
1086 | "npm-run-path": "2.0.2",
1087 | "p-finally": "1.0.0",
1088 | "signal-exit": "3.0.2",
1089 | "strip-eof": "1.0.0"
1090 | }
1091 | },
1092 | "expand-brackets": {
1093 | "version": "0.1.5",
1094 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
1095 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
1096 | "dev": true,
1097 | "requires": {
1098 | "is-posix-bracket": "0.1.1"
1099 | }
1100 | },
1101 | "expand-range": {
1102 | "version": "1.8.2",
1103 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
1104 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
1105 | "dev": true,
1106 | "requires": {
1107 | "fill-range": "2.2.3"
1108 | }
1109 | },
1110 | "express": {
1111 | "version": "4.16.2",
1112 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz",
1113 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
1114 | "requires": {
1115 | "accepts": "1.3.4",
1116 | "array-flatten": "1.1.1",
1117 | "body-parser": "1.18.2",
1118 | "content-disposition": "0.5.2",
1119 | "content-type": "1.0.4",
1120 | "cookie": "0.3.1",
1121 | "cookie-signature": "1.0.6",
1122 | "debug": "2.6.9",
1123 | "depd": "1.1.1",
1124 | "encodeurl": "1.0.1",
1125 | "escape-html": "1.0.3",
1126 | "etag": "1.8.1",
1127 | "finalhandler": "1.1.0",
1128 | "fresh": "0.5.2",
1129 | "merge-descriptors": "1.0.1",
1130 | "methods": "1.1.2",
1131 | "on-finished": "2.3.0",
1132 | "parseurl": "1.3.2",
1133 | "path-to-regexp": "0.1.7",
1134 | "proxy-addr": "2.0.2",
1135 | "qs": "6.5.1",
1136 | "range-parser": "1.2.0",
1137 | "safe-buffer": "5.1.1",
1138 | "send": "0.16.1",
1139 | "serve-static": "1.13.1",
1140 | "setprototypeof": "1.1.0",
1141 | "statuses": "1.3.1",
1142 | "type-is": "1.6.15",
1143 | "utils-merge": "1.0.1",
1144 | "vary": "1.1.2"
1145 | },
1146 | "dependencies": {
1147 | "setprototypeof": {
1148 | "version": "1.1.0",
1149 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1150 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1151 | },
1152 | "statuses": {
1153 | "version": "1.3.1",
1154 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
1155 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
1156 | }
1157 | }
1158 | },
1159 | "extend": {
1160 | "version": "3.0.1",
1161 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
1162 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
1163 | "dev": true
1164 | },
1165 | "extglob": {
1166 | "version": "0.3.2",
1167 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
1168 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
1169 | "dev": true,
1170 | "requires": {
1171 | "is-extglob": "1.0.0"
1172 | }
1173 | },
1174 | "fast-deep-equal": {
1175 | "version": "1.0.0",
1176 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
1177 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
1178 | "dev": true
1179 | },
1180 | "fast-json-stable-stringify": {
1181 | "version": "2.0.0",
1182 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1183 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1184 | "dev": true
1185 | },
1186 | "filename-regex": {
1187 | "version": "2.0.1",
1188 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
1189 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
1190 | "dev": true
1191 | },
1192 | "fill-range": {
1193 | "version": "2.2.3",
1194 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
1195 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
1196 | "dev": true,
1197 | "requires": {
1198 | "is-number": "2.1.0",
1199 | "isobject": "2.1.0",
1200 | "randomatic": "1.1.7",
1201 | "repeat-element": "1.1.2",
1202 | "repeat-string": "1.6.1"
1203 | }
1204 | },
1205 | "finalhandler": {
1206 | "version": "1.1.0",
1207 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
1208 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
1209 | "requires": {
1210 | "debug": "2.6.9",
1211 | "encodeurl": "1.0.1",
1212 | "escape-html": "1.0.3",
1213 | "on-finished": "2.3.0",
1214 | "parseurl": "1.3.2",
1215 | "statuses": "1.3.1",
1216 | "unpipe": "1.0.0"
1217 | },
1218 | "dependencies": {
1219 | "statuses": {
1220 | "version": "1.3.1",
1221 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
1222 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
1223 | }
1224 | }
1225 | },
1226 | "find-up": {
1227 | "version": "2.1.0",
1228 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1229 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1230 | "dev": true,
1231 | "requires": {
1232 | "locate-path": "2.0.0"
1233 | }
1234 | },
1235 | "for-in": {
1236 | "version": "1.0.2",
1237 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1238 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1239 | "dev": true
1240 | },
1241 | "for-own": {
1242 | "version": "0.1.5",
1243 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
1244 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
1245 | "dev": true,
1246 | "requires": {
1247 | "for-in": "1.0.2"
1248 | }
1249 | },
1250 | "form-data": {
1251 | "version": "1.0.0-rc4",
1252 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz",
1253 | "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=",
1254 | "dev": true,
1255 | "requires": {
1256 | "async": "1.5.2",
1257 | "combined-stream": "1.0.5",
1258 | "mime-types": "2.1.17"
1259 | }
1260 | },
1261 | "formidable": {
1262 | "version": "1.1.1",
1263 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz",
1264 | "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=",
1265 | "dev": true
1266 | },
1267 | "forwarded": {
1268 | "version": "0.1.2",
1269 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1270 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
1271 | },
1272 | "fresh": {
1273 | "version": "0.5.2",
1274 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1275 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
1276 | },
1277 | "from": {
1278 | "version": "0.1.7",
1279 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
1280 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
1281 | "dev": true
1282 | },
1283 | "fs.realpath": {
1284 | "version": "1.0.0",
1285 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1286 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1287 | "dev": true
1288 | },
1289 | "fsevents": {
1290 | "version": "1.1.3",
1291 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
1292 | "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
1293 | "dev": true,
1294 | "optional": true,
1295 | "requires": {
1296 | "nan": "2.8.0",
1297 | "node-pre-gyp": "0.6.39"
1298 | },
1299 | "dependencies": {
1300 | "abbrev": {
1301 | "version": "1.1.0",
1302 | "bundled": true,
1303 | "dev": true,
1304 | "optional": true
1305 | },
1306 | "ajv": {
1307 | "version": "4.11.8",
1308 | "bundled": true,
1309 | "dev": true,
1310 | "optional": true,
1311 | "requires": {
1312 | "co": "4.6.0",
1313 | "json-stable-stringify": "1.0.1"
1314 | }
1315 | },
1316 | "ansi-regex": {
1317 | "version": "2.1.1",
1318 | "bundled": true,
1319 | "dev": true
1320 | },
1321 | "aproba": {
1322 | "version": "1.1.1",
1323 | "bundled": true,
1324 | "dev": true,
1325 | "optional": true
1326 | },
1327 | "are-we-there-yet": {
1328 | "version": "1.1.4",
1329 | "bundled": true,
1330 | "dev": true,
1331 | "optional": true,
1332 | "requires": {
1333 | "delegates": "1.0.0",
1334 | "readable-stream": "2.2.9"
1335 | }
1336 | },
1337 | "asn1": {
1338 | "version": "0.2.3",
1339 | "bundled": true,
1340 | "dev": true,
1341 | "optional": true
1342 | },
1343 | "assert-plus": {
1344 | "version": "0.2.0",
1345 | "bundled": true,
1346 | "dev": true,
1347 | "optional": true
1348 | },
1349 | "asynckit": {
1350 | "version": "0.4.0",
1351 | "bundled": true,
1352 | "dev": true,
1353 | "optional": true
1354 | },
1355 | "aws-sign2": {
1356 | "version": "0.6.0",
1357 | "bundled": true,
1358 | "dev": true,
1359 | "optional": true
1360 | },
1361 | "aws4": {
1362 | "version": "1.6.0",
1363 | "bundled": true,
1364 | "dev": true,
1365 | "optional": true
1366 | },
1367 | "balanced-match": {
1368 | "version": "0.4.2",
1369 | "bundled": true,
1370 | "dev": true
1371 | },
1372 | "bcrypt-pbkdf": {
1373 | "version": "1.0.1",
1374 | "bundled": true,
1375 | "dev": true,
1376 | "optional": true,
1377 | "requires": {
1378 | "tweetnacl": "0.14.5"
1379 | }
1380 | },
1381 | "block-stream": {
1382 | "version": "0.0.9",
1383 | "bundled": true,
1384 | "dev": true,
1385 | "requires": {
1386 | "inherits": "2.0.3"
1387 | }
1388 | },
1389 | "boom": {
1390 | "version": "2.10.1",
1391 | "bundled": true,
1392 | "dev": true,
1393 | "requires": {
1394 | "hoek": "2.16.3"
1395 | }
1396 | },
1397 | "brace-expansion": {
1398 | "version": "1.1.7",
1399 | "bundled": true,
1400 | "dev": true,
1401 | "requires": {
1402 | "balanced-match": "0.4.2",
1403 | "concat-map": "0.0.1"
1404 | }
1405 | },
1406 | "buffer-shims": {
1407 | "version": "1.0.0",
1408 | "bundled": true,
1409 | "dev": true
1410 | },
1411 | "caseless": {
1412 | "version": "0.12.0",
1413 | "bundled": true,
1414 | "dev": true,
1415 | "optional": true
1416 | },
1417 | "co": {
1418 | "version": "4.6.0",
1419 | "bundled": true,
1420 | "dev": true,
1421 | "optional": true
1422 | },
1423 | "code-point-at": {
1424 | "version": "1.1.0",
1425 | "bundled": true,
1426 | "dev": true
1427 | },
1428 | "combined-stream": {
1429 | "version": "1.0.5",
1430 | "bundled": true,
1431 | "dev": true,
1432 | "requires": {
1433 | "delayed-stream": "1.0.0"
1434 | }
1435 | },
1436 | "concat-map": {
1437 | "version": "0.0.1",
1438 | "bundled": true,
1439 | "dev": true
1440 | },
1441 | "console-control-strings": {
1442 | "version": "1.1.0",
1443 | "bundled": true,
1444 | "dev": true
1445 | },
1446 | "core-util-is": {
1447 | "version": "1.0.2",
1448 | "bundled": true,
1449 | "dev": true
1450 | },
1451 | "cryptiles": {
1452 | "version": "2.0.5",
1453 | "bundled": true,
1454 | "dev": true,
1455 | "requires": {
1456 | "boom": "2.10.1"
1457 | }
1458 | },
1459 | "dashdash": {
1460 | "version": "1.14.1",
1461 | "bundled": true,
1462 | "dev": true,
1463 | "optional": true,
1464 | "requires": {
1465 | "assert-plus": "1.0.0"
1466 | },
1467 | "dependencies": {
1468 | "assert-plus": {
1469 | "version": "1.0.0",
1470 | "bundled": true,
1471 | "dev": true,
1472 | "optional": true
1473 | }
1474 | }
1475 | },
1476 | "debug": {
1477 | "version": "2.6.8",
1478 | "bundled": true,
1479 | "dev": true,
1480 | "optional": true,
1481 | "requires": {
1482 | "ms": "2.0.0"
1483 | }
1484 | },
1485 | "deep-extend": {
1486 | "version": "0.4.2",
1487 | "bundled": true,
1488 | "dev": true,
1489 | "optional": true
1490 | },
1491 | "delayed-stream": {
1492 | "version": "1.0.0",
1493 | "bundled": true,
1494 | "dev": true
1495 | },
1496 | "delegates": {
1497 | "version": "1.0.0",
1498 | "bundled": true,
1499 | "dev": true,
1500 | "optional": true
1501 | },
1502 | "detect-libc": {
1503 | "version": "1.0.2",
1504 | "bundled": true,
1505 | "dev": true,
1506 | "optional": true
1507 | },
1508 | "ecc-jsbn": {
1509 | "version": "0.1.1",
1510 | "bundled": true,
1511 | "dev": true,
1512 | "optional": true,
1513 | "requires": {
1514 | "jsbn": "0.1.1"
1515 | }
1516 | },
1517 | "extend": {
1518 | "version": "3.0.1",
1519 | "bundled": true,
1520 | "dev": true,
1521 | "optional": true
1522 | },
1523 | "extsprintf": {
1524 | "version": "1.0.2",
1525 | "bundled": true,
1526 | "dev": true
1527 | },
1528 | "forever-agent": {
1529 | "version": "0.6.1",
1530 | "bundled": true,
1531 | "dev": true,
1532 | "optional": true
1533 | },
1534 | "form-data": {
1535 | "version": "2.1.4",
1536 | "bundled": true,
1537 | "dev": true,
1538 | "optional": true,
1539 | "requires": {
1540 | "asynckit": "0.4.0",
1541 | "combined-stream": "1.0.5",
1542 | "mime-types": "2.1.15"
1543 | }
1544 | },
1545 | "fs.realpath": {
1546 | "version": "1.0.0",
1547 | "bundled": true,
1548 | "dev": true
1549 | },
1550 | "fstream": {
1551 | "version": "1.0.11",
1552 | "bundled": true,
1553 | "dev": true,
1554 | "requires": {
1555 | "graceful-fs": "4.1.11",
1556 | "inherits": "2.0.3",
1557 | "mkdirp": "0.5.1",
1558 | "rimraf": "2.6.1"
1559 | }
1560 | },
1561 | "fstream-ignore": {
1562 | "version": "1.0.5",
1563 | "bundled": true,
1564 | "dev": true,
1565 | "optional": true,
1566 | "requires": {
1567 | "fstream": "1.0.11",
1568 | "inherits": "2.0.3",
1569 | "minimatch": "3.0.4"
1570 | }
1571 | },
1572 | "gauge": {
1573 | "version": "2.7.4",
1574 | "bundled": true,
1575 | "dev": true,
1576 | "optional": true,
1577 | "requires": {
1578 | "aproba": "1.1.1",
1579 | "console-control-strings": "1.1.0",
1580 | "has-unicode": "2.0.1",
1581 | "object-assign": "4.1.1",
1582 | "signal-exit": "3.0.2",
1583 | "string-width": "1.0.2",
1584 | "strip-ansi": "3.0.1",
1585 | "wide-align": "1.1.2"
1586 | }
1587 | },
1588 | "getpass": {
1589 | "version": "0.1.7",
1590 | "bundled": true,
1591 | "dev": true,
1592 | "optional": true,
1593 | "requires": {
1594 | "assert-plus": "1.0.0"
1595 | },
1596 | "dependencies": {
1597 | "assert-plus": {
1598 | "version": "1.0.0",
1599 | "bundled": true,
1600 | "dev": true,
1601 | "optional": true
1602 | }
1603 | }
1604 | },
1605 | "glob": {
1606 | "version": "7.1.2",
1607 | "bundled": true,
1608 | "dev": true,
1609 | "requires": {
1610 | "fs.realpath": "1.0.0",
1611 | "inflight": "1.0.6",
1612 | "inherits": "2.0.3",
1613 | "minimatch": "3.0.4",
1614 | "once": "1.4.0",
1615 | "path-is-absolute": "1.0.1"
1616 | }
1617 | },
1618 | "graceful-fs": {
1619 | "version": "4.1.11",
1620 | "bundled": true,
1621 | "dev": true
1622 | },
1623 | "har-schema": {
1624 | "version": "1.0.5",
1625 | "bundled": true,
1626 | "dev": true,
1627 | "optional": true
1628 | },
1629 | "har-validator": {
1630 | "version": "4.2.1",
1631 | "bundled": true,
1632 | "dev": true,
1633 | "optional": true,
1634 | "requires": {
1635 | "ajv": "4.11.8",
1636 | "har-schema": "1.0.5"
1637 | }
1638 | },
1639 | "has-unicode": {
1640 | "version": "2.0.1",
1641 | "bundled": true,
1642 | "dev": true,
1643 | "optional": true
1644 | },
1645 | "hawk": {
1646 | "version": "3.1.3",
1647 | "bundled": true,
1648 | "dev": true,
1649 | "requires": {
1650 | "boom": "2.10.1",
1651 | "cryptiles": "2.0.5",
1652 | "hoek": "2.16.3",
1653 | "sntp": "1.0.9"
1654 | }
1655 | },
1656 | "hoek": {
1657 | "version": "2.16.3",
1658 | "bundled": true,
1659 | "dev": true
1660 | },
1661 | "http-signature": {
1662 | "version": "1.1.1",
1663 | "bundled": true,
1664 | "dev": true,
1665 | "optional": true,
1666 | "requires": {
1667 | "assert-plus": "0.2.0",
1668 | "jsprim": "1.4.0",
1669 | "sshpk": "1.13.0"
1670 | }
1671 | },
1672 | "inflight": {
1673 | "version": "1.0.6",
1674 | "bundled": true,
1675 | "dev": true,
1676 | "requires": {
1677 | "once": "1.4.0",
1678 | "wrappy": "1.0.2"
1679 | }
1680 | },
1681 | "inherits": {
1682 | "version": "2.0.3",
1683 | "bundled": true,
1684 | "dev": true
1685 | },
1686 | "ini": {
1687 | "version": "1.3.4",
1688 | "bundled": true,
1689 | "dev": true,
1690 | "optional": true
1691 | },
1692 | "is-fullwidth-code-point": {
1693 | "version": "1.0.0",
1694 | "bundled": true,
1695 | "dev": true,
1696 | "requires": {
1697 | "number-is-nan": "1.0.1"
1698 | }
1699 | },
1700 | "is-typedarray": {
1701 | "version": "1.0.0",
1702 | "bundled": true,
1703 | "dev": true,
1704 | "optional": true
1705 | },
1706 | "isarray": {
1707 | "version": "1.0.0",
1708 | "bundled": true,
1709 | "dev": true
1710 | },
1711 | "isstream": {
1712 | "version": "0.1.2",
1713 | "bundled": true,
1714 | "dev": true,
1715 | "optional": true
1716 | },
1717 | "jodid25519": {
1718 | "version": "1.0.2",
1719 | "bundled": true,
1720 | "dev": true,
1721 | "optional": true,
1722 | "requires": {
1723 | "jsbn": "0.1.1"
1724 | }
1725 | },
1726 | "jsbn": {
1727 | "version": "0.1.1",
1728 | "bundled": true,
1729 | "dev": true,
1730 | "optional": true
1731 | },
1732 | "json-schema": {
1733 | "version": "0.2.3",
1734 | "bundled": true,
1735 | "dev": true,
1736 | "optional": true
1737 | },
1738 | "json-stable-stringify": {
1739 | "version": "1.0.1",
1740 | "bundled": true,
1741 | "dev": true,
1742 | "optional": true,
1743 | "requires": {
1744 | "jsonify": "0.0.0"
1745 | }
1746 | },
1747 | "json-stringify-safe": {
1748 | "version": "5.0.1",
1749 | "bundled": true,
1750 | "dev": true,
1751 | "optional": true
1752 | },
1753 | "jsonify": {
1754 | "version": "0.0.0",
1755 | "bundled": true,
1756 | "dev": true,
1757 | "optional": true
1758 | },
1759 | "jsprim": {
1760 | "version": "1.4.0",
1761 | "bundled": true,
1762 | "dev": true,
1763 | "optional": true,
1764 | "requires": {
1765 | "assert-plus": "1.0.0",
1766 | "extsprintf": "1.0.2",
1767 | "json-schema": "0.2.3",
1768 | "verror": "1.3.6"
1769 | },
1770 | "dependencies": {
1771 | "assert-plus": {
1772 | "version": "1.0.0",
1773 | "bundled": true,
1774 | "dev": true,
1775 | "optional": true
1776 | }
1777 | }
1778 | },
1779 | "mime-db": {
1780 | "version": "1.27.0",
1781 | "bundled": true,
1782 | "dev": true
1783 | },
1784 | "mime-types": {
1785 | "version": "2.1.15",
1786 | "bundled": true,
1787 | "dev": true,
1788 | "requires": {
1789 | "mime-db": "1.27.0"
1790 | }
1791 | },
1792 | "minimatch": {
1793 | "version": "3.0.4",
1794 | "bundled": true,
1795 | "dev": true,
1796 | "requires": {
1797 | "brace-expansion": "1.1.7"
1798 | }
1799 | },
1800 | "minimist": {
1801 | "version": "0.0.8",
1802 | "bundled": true,
1803 | "dev": true
1804 | },
1805 | "mkdirp": {
1806 | "version": "0.5.1",
1807 | "bundled": true,
1808 | "dev": true,
1809 | "requires": {
1810 | "minimist": "0.0.8"
1811 | }
1812 | },
1813 | "ms": {
1814 | "version": "2.0.0",
1815 | "bundled": true,
1816 | "dev": true,
1817 | "optional": true
1818 | },
1819 | "node-pre-gyp": {
1820 | "version": "0.6.39",
1821 | "bundled": true,
1822 | "dev": true,
1823 | "optional": true,
1824 | "requires": {
1825 | "detect-libc": "1.0.2",
1826 | "hawk": "3.1.3",
1827 | "mkdirp": "0.5.1",
1828 | "nopt": "4.0.1",
1829 | "npmlog": "4.1.0",
1830 | "rc": "1.2.1",
1831 | "request": "2.81.0",
1832 | "rimraf": "2.6.1",
1833 | "semver": "5.3.0",
1834 | "tar": "2.2.1",
1835 | "tar-pack": "3.4.0"
1836 | }
1837 | },
1838 | "nopt": {
1839 | "version": "4.0.1",
1840 | "bundled": true,
1841 | "dev": true,
1842 | "optional": true,
1843 | "requires": {
1844 | "abbrev": "1.1.0",
1845 | "osenv": "0.1.4"
1846 | }
1847 | },
1848 | "npmlog": {
1849 | "version": "4.1.0",
1850 | "bundled": true,
1851 | "dev": true,
1852 | "optional": true,
1853 | "requires": {
1854 | "are-we-there-yet": "1.1.4",
1855 | "console-control-strings": "1.1.0",
1856 | "gauge": "2.7.4",
1857 | "set-blocking": "2.0.0"
1858 | }
1859 | },
1860 | "number-is-nan": {
1861 | "version": "1.0.1",
1862 | "bundled": true,
1863 | "dev": true
1864 | },
1865 | "oauth-sign": {
1866 | "version": "0.8.2",
1867 | "bundled": true,
1868 | "dev": true,
1869 | "optional": true
1870 | },
1871 | "object-assign": {
1872 | "version": "4.1.1",
1873 | "bundled": true,
1874 | "dev": true,
1875 | "optional": true
1876 | },
1877 | "once": {
1878 | "version": "1.4.0",
1879 | "bundled": true,
1880 | "dev": true,
1881 | "requires": {
1882 | "wrappy": "1.0.2"
1883 | }
1884 | },
1885 | "os-homedir": {
1886 | "version": "1.0.2",
1887 | "bundled": true,
1888 | "dev": true,
1889 | "optional": true
1890 | },
1891 | "os-tmpdir": {
1892 | "version": "1.0.2",
1893 | "bundled": true,
1894 | "dev": true,
1895 | "optional": true
1896 | },
1897 | "osenv": {
1898 | "version": "0.1.4",
1899 | "bundled": true,
1900 | "dev": true,
1901 | "optional": true,
1902 | "requires": {
1903 | "os-homedir": "1.0.2",
1904 | "os-tmpdir": "1.0.2"
1905 | }
1906 | },
1907 | "path-is-absolute": {
1908 | "version": "1.0.1",
1909 | "bundled": true,
1910 | "dev": true
1911 | },
1912 | "performance-now": {
1913 | "version": "0.2.0",
1914 | "bundled": true,
1915 | "dev": true,
1916 | "optional": true
1917 | },
1918 | "process-nextick-args": {
1919 | "version": "1.0.7",
1920 | "bundled": true,
1921 | "dev": true
1922 | },
1923 | "punycode": {
1924 | "version": "1.4.1",
1925 | "bundled": true,
1926 | "dev": true,
1927 | "optional": true
1928 | },
1929 | "qs": {
1930 | "version": "6.4.0",
1931 | "bundled": true,
1932 | "dev": true,
1933 | "optional": true
1934 | },
1935 | "rc": {
1936 | "version": "1.2.1",
1937 | "bundled": true,
1938 | "dev": true,
1939 | "optional": true,
1940 | "requires": {
1941 | "deep-extend": "0.4.2",
1942 | "ini": "1.3.4",
1943 | "minimist": "1.2.0",
1944 | "strip-json-comments": "2.0.1"
1945 | },
1946 | "dependencies": {
1947 | "minimist": {
1948 | "version": "1.2.0",
1949 | "bundled": true,
1950 | "dev": true,
1951 | "optional": true
1952 | }
1953 | }
1954 | },
1955 | "readable-stream": {
1956 | "version": "2.2.9",
1957 | "bundled": true,
1958 | "dev": true,
1959 | "requires": {
1960 | "buffer-shims": "1.0.0",
1961 | "core-util-is": "1.0.2",
1962 | "inherits": "2.0.3",
1963 | "isarray": "1.0.0",
1964 | "process-nextick-args": "1.0.7",
1965 | "string_decoder": "1.0.1",
1966 | "util-deprecate": "1.0.2"
1967 | }
1968 | },
1969 | "request": {
1970 | "version": "2.81.0",
1971 | "bundled": true,
1972 | "dev": true,
1973 | "optional": true,
1974 | "requires": {
1975 | "aws-sign2": "0.6.0",
1976 | "aws4": "1.6.0",
1977 | "caseless": "0.12.0",
1978 | "combined-stream": "1.0.5",
1979 | "extend": "3.0.1",
1980 | "forever-agent": "0.6.1",
1981 | "form-data": "2.1.4",
1982 | "har-validator": "4.2.1",
1983 | "hawk": "3.1.3",
1984 | "http-signature": "1.1.1",
1985 | "is-typedarray": "1.0.0",
1986 | "isstream": "0.1.2",
1987 | "json-stringify-safe": "5.0.1",
1988 | "mime-types": "2.1.15",
1989 | "oauth-sign": "0.8.2",
1990 | "performance-now": "0.2.0",
1991 | "qs": "6.4.0",
1992 | "safe-buffer": "5.0.1",
1993 | "stringstream": "0.0.5",
1994 | "tough-cookie": "2.3.2",
1995 | "tunnel-agent": "0.6.0",
1996 | "uuid": "3.0.1"
1997 | }
1998 | },
1999 | "rimraf": {
2000 | "version": "2.6.1",
2001 | "bundled": true,
2002 | "dev": true,
2003 | "requires": {
2004 | "glob": "7.1.2"
2005 | }
2006 | },
2007 | "safe-buffer": {
2008 | "version": "5.0.1",
2009 | "bundled": true,
2010 | "dev": true
2011 | },
2012 | "semver": {
2013 | "version": "5.3.0",
2014 | "bundled": true,
2015 | "dev": true,
2016 | "optional": true
2017 | },
2018 | "set-blocking": {
2019 | "version": "2.0.0",
2020 | "bundled": true,
2021 | "dev": true,
2022 | "optional": true
2023 | },
2024 | "signal-exit": {
2025 | "version": "3.0.2",
2026 | "bundled": true,
2027 | "dev": true,
2028 | "optional": true
2029 | },
2030 | "sntp": {
2031 | "version": "1.0.9",
2032 | "bundled": true,
2033 | "dev": true,
2034 | "requires": {
2035 | "hoek": "2.16.3"
2036 | }
2037 | },
2038 | "sshpk": {
2039 | "version": "1.13.0",
2040 | "bundled": true,
2041 | "dev": true,
2042 | "optional": true,
2043 | "requires": {
2044 | "asn1": "0.2.3",
2045 | "assert-plus": "1.0.0",
2046 | "bcrypt-pbkdf": "1.0.1",
2047 | "dashdash": "1.14.1",
2048 | "ecc-jsbn": "0.1.1",
2049 | "getpass": "0.1.7",
2050 | "jodid25519": "1.0.2",
2051 | "jsbn": "0.1.1",
2052 | "tweetnacl": "0.14.5"
2053 | },
2054 | "dependencies": {
2055 | "assert-plus": {
2056 | "version": "1.0.0",
2057 | "bundled": true,
2058 | "dev": true,
2059 | "optional": true
2060 | }
2061 | }
2062 | },
2063 | "string-width": {
2064 | "version": "1.0.2",
2065 | "bundled": true,
2066 | "dev": true,
2067 | "requires": {
2068 | "code-point-at": "1.1.0",
2069 | "is-fullwidth-code-point": "1.0.0",
2070 | "strip-ansi": "3.0.1"
2071 | }
2072 | },
2073 | "string_decoder": {
2074 | "version": "1.0.1",
2075 | "bundled": true,
2076 | "dev": true,
2077 | "requires": {
2078 | "safe-buffer": "5.0.1"
2079 | }
2080 | },
2081 | "stringstream": {
2082 | "version": "0.0.5",
2083 | "bundled": true,
2084 | "dev": true,
2085 | "optional": true
2086 | },
2087 | "strip-ansi": {
2088 | "version": "3.0.1",
2089 | "bundled": true,
2090 | "dev": true,
2091 | "requires": {
2092 | "ansi-regex": "2.1.1"
2093 | }
2094 | },
2095 | "strip-json-comments": {
2096 | "version": "2.0.1",
2097 | "bundled": true,
2098 | "dev": true,
2099 | "optional": true
2100 | },
2101 | "tar": {
2102 | "version": "2.2.1",
2103 | "bundled": true,
2104 | "dev": true,
2105 | "requires": {
2106 | "block-stream": "0.0.9",
2107 | "fstream": "1.0.11",
2108 | "inherits": "2.0.3"
2109 | }
2110 | },
2111 | "tar-pack": {
2112 | "version": "3.4.0",
2113 | "bundled": true,
2114 | "dev": true,
2115 | "optional": true,
2116 | "requires": {
2117 | "debug": "2.6.8",
2118 | "fstream": "1.0.11",
2119 | "fstream-ignore": "1.0.5",
2120 | "once": "1.4.0",
2121 | "readable-stream": "2.2.9",
2122 | "rimraf": "2.6.1",
2123 | "tar": "2.2.1",
2124 | "uid-number": "0.0.6"
2125 | }
2126 | },
2127 | "tough-cookie": {
2128 | "version": "2.3.2",
2129 | "bundled": true,
2130 | "dev": true,
2131 | "optional": true,
2132 | "requires": {
2133 | "punycode": "1.4.1"
2134 | }
2135 | },
2136 | "tunnel-agent": {
2137 | "version": "0.6.0",
2138 | "bundled": true,
2139 | "dev": true,
2140 | "optional": true,
2141 | "requires": {
2142 | "safe-buffer": "5.0.1"
2143 | }
2144 | },
2145 | "tweetnacl": {
2146 | "version": "0.14.5",
2147 | "bundled": true,
2148 | "dev": true,
2149 | "optional": true
2150 | },
2151 | "uid-number": {
2152 | "version": "0.0.6",
2153 | "bundled": true,
2154 | "dev": true,
2155 | "optional": true
2156 | },
2157 | "util-deprecate": {
2158 | "version": "1.0.2",
2159 | "bundled": true,
2160 | "dev": true
2161 | },
2162 | "uuid": {
2163 | "version": "3.0.1",
2164 | "bundled": true,
2165 | "dev": true,
2166 | "optional": true
2167 | },
2168 | "verror": {
2169 | "version": "1.3.6",
2170 | "bundled": true,
2171 | "dev": true,
2172 | "optional": true,
2173 | "requires": {
2174 | "extsprintf": "1.0.2"
2175 | }
2176 | },
2177 | "wide-align": {
2178 | "version": "1.1.2",
2179 | "bundled": true,
2180 | "dev": true,
2181 | "optional": true,
2182 | "requires": {
2183 | "string-width": "1.0.2"
2184 | }
2185 | },
2186 | "wrappy": {
2187 | "version": "1.0.2",
2188 | "bundled": true,
2189 | "dev": true
2190 | }
2191 | }
2192 | },
2193 | "ganache-cli": {
2194 | "version": "6.0.3",
2195 | "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz",
2196 | "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==",
2197 | "dev": true,
2198 | "requires": {
2199 | "webpack": "3.10.0"
2200 | }
2201 | },
2202 | "generaterr": {
2203 | "version": "1.5.0",
2204 | "resolved": "https://registry.npmjs.org/generaterr/-/generaterr-1.5.0.tgz",
2205 | "integrity": "sha1-sM62zFFk3yoGEzjMNAqGFTlcUvw="
2206 | },
2207 | "get-caller-file": {
2208 | "version": "1.0.2",
2209 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
2210 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
2211 | "dev": true
2212 | },
2213 | "get-func-name": {
2214 | "version": "2.0.0",
2215 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
2216 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
2217 | "dev": true
2218 | },
2219 | "get-stream": {
2220 | "version": "3.0.0",
2221 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2222 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2223 | "dev": true
2224 | },
2225 | "glob": {
2226 | "version": "7.1.2",
2227 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2228 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2229 | "dev": true,
2230 | "requires": {
2231 | "fs.realpath": "1.0.0",
2232 | "inflight": "1.0.6",
2233 | "inherits": "2.0.3",
2234 | "minimatch": "3.0.4",
2235 | "once": "1.4.0",
2236 | "path-is-absolute": "1.0.1"
2237 | }
2238 | },
2239 | "glob-base": {
2240 | "version": "0.3.0",
2241 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
2242 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
2243 | "dev": true,
2244 | "requires": {
2245 | "glob-parent": "2.0.0",
2246 | "is-glob": "2.0.1"
2247 | }
2248 | },
2249 | "glob-parent": {
2250 | "version": "2.0.0",
2251 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
2252 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
2253 | "dev": true,
2254 | "requires": {
2255 | "is-glob": "2.0.1"
2256 | }
2257 | },
2258 | "global-dirs": {
2259 | "version": "0.1.1",
2260 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
2261 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
2262 | "dev": true,
2263 | "requires": {
2264 | "ini": "1.3.5"
2265 | }
2266 | },
2267 | "got": {
2268 | "version": "6.7.1",
2269 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
2270 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
2271 | "dev": true,
2272 | "requires": {
2273 | "create-error-class": "3.0.2",
2274 | "duplexer3": "0.1.4",
2275 | "get-stream": "3.0.0",
2276 | "is-redirect": "1.0.0",
2277 | "is-retry-allowed": "1.1.0",
2278 | "is-stream": "1.1.0",
2279 | "lowercase-keys": "1.0.0",
2280 | "safe-buffer": "5.1.1",
2281 | "timed-out": "4.0.1",
2282 | "unzip-response": "2.0.1",
2283 | "url-parse-lax": "1.0.0"
2284 | }
2285 | },
2286 | "graceful-fs": {
2287 | "version": "4.1.11",
2288 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2289 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2290 | "dev": true
2291 | },
2292 | "growl": {
2293 | "version": "1.10.3",
2294 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
2295 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
2296 | "dev": true
2297 | },
2298 | "has-flag": {
2299 | "version": "2.0.0",
2300 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
2301 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
2302 | "dev": true
2303 | },
2304 | "hash-base": {
2305 | "version": "2.0.2",
2306 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
2307 | "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
2308 | "dev": true,
2309 | "requires": {
2310 | "inherits": "2.0.3"
2311 | }
2312 | },
2313 | "hash.js": {
2314 | "version": "1.1.3",
2315 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
2316 | "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
2317 | "dev": true,
2318 | "requires": {
2319 | "inherits": "2.0.3",
2320 | "minimalistic-assert": "1.0.0"
2321 | }
2322 | },
2323 | "he": {
2324 | "version": "1.1.1",
2325 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2326 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2327 | "dev": true
2328 | },
2329 | "hmac-drbg": {
2330 | "version": "1.0.1",
2331 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2332 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2333 | "dev": true,
2334 | "requires": {
2335 | "hash.js": "1.1.3",
2336 | "minimalistic-assert": "1.0.0",
2337 | "minimalistic-crypto-utils": "1.0.1"
2338 | }
2339 | },
2340 | "hoek": {
2341 | "version": "2.16.3",
2342 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
2343 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
2344 | },
2345 | "hooks-fixed": {
2346 | "version": "2.0.2",
2347 | "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz",
2348 | "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ=="
2349 | },
2350 | "hosted-git-info": {
2351 | "version": "2.5.0",
2352 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
2353 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
2354 | "dev": true
2355 | },
2356 | "http-errors": {
2357 | "version": "1.6.2",
2358 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
2359 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
2360 | "requires": {
2361 | "depd": "1.1.1",
2362 | "inherits": "2.0.3",
2363 | "setprototypeof": "1.0.3",
2364 | "statuses": "1.4.0"
2365 | }
2366 | },
2367 | "https-browserify": {
2368 | "version": "1.0.0",
2369 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2370 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2371 | "dev": true
2372 | },
2373 | "iconv-lite": {
2374 | "version": "0.4.19",
2375 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
2376 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
2377 | },
2378 | "ieee754": {
2379 | "version": "1.1.8",
2380 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
2381 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
2382 | "dev": true
2383 | },
2384 | "ignore-by-default": {
2385 | "version": "1.0.1",
2386 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
2387 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
2388 | "dev": true
2389 | },
2390 | "import-lazy": {
2391 | "version": "2.1.0",
2392 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
2393 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
2394 | "dev": true
2395 | },
2396 | "imurmurhash": {
2397 | "version": "0.1.4",
2398 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2399 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2400 | "dev": true
2401 | },
2402 | "indexof": {
2403 | "version": "0.0.1",
2404 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2405 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2406 | "dev": true
2407 | },
2408 | "inflight": {
2409 | "version": "1.0.6",
2410 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2411 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2412 | "dev": true,
2413 | "requires": {
2414 | "once": "1.4.0",
2415 | "wrappy": "1.0.2"
2416 | }
2417 | },
2418 | "inherits": {
2419 | "version": "2.0.3",
2420 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2421 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
2422 | },
2423 | "ini": {
2424 | "version": "1.3.5",
2425 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
2426 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
2427 | "dev": true
2428 | },
2429 | "interpret": {
2430 | "version": "1.1.0",
2431 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2432 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2433 | "dev": true
2434 | },
2435 | "invert-kv": {
2436 | "version": "1.0.0",
2437 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
2438 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
2439 | "dev": true
2440 | },
2441 | "ip-regex": {
2442 | "version": "1.0.3",
2443 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
2444 | "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=",
2445 | "dev": true
2446 | },
2447 | "ipaddr.js": {
2448 | "version": "1.5.2",
2449 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz",
2450 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A="
2451 | },
2452 | "is-arrayish": {
2453 | "version": "0.2.1",
2454 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
2455 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
2456 | "dev": true
2457 | },
2458 | "is-binary-path": {
2459 | "version": "1.0.1",
2460 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
2461 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
2462 | "dev": true,
2463 | "requires": {
2464 | "binary-extensions": "1.11.0"
2465 | }
2466 | },
2467 | "is-buffer": {
2468 | "version": "1.1.6",
2469 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
2470 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
2471 | "dev": true
2472 | },
2473 | "is-builtin-module": {
2474 | "version": "1.0.0",
2475 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
2476 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
2477 | "dev": true,
2478 | "requires": {
2479 | "builtin-modules": "1.1.1"
2480 | }
2481 | },
2482 | "is-dotfile": {
2483 | "version": "1.0.3",
2484 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
2485 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
2486 | "dev": true
2487 | },
2488 | "is-equal-shallow": {
2489 | "version": "0.1.3",
2490 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2491 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
2492 | "dev": true,
2493 | "requires": {
2494 | "is-primitive": "2.0.0"
2495 | }
2496 | },
2497 | "is-extendable": {
2498 | "version": "0.1.1",
2499 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2500 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2501 | "dev": true
2502 | },
2503 | "is-extglob": {
2504 | "version": "1.0.0",
2505 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2506 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
2507 | "dev": true
2508 | },
2509 | "is-fullwidth-code-point": {
2510 | "version": "1.0.0",
2511 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
2512 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
2513 | "dev": true,
2514 | "requires": {
2515 | "number-is-nan": "1.0.1"
2516 | }
2517 | },
2518 | "is-glob": {
2519 | "version": "2.0.1",
2520 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2521 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
2522 | "dev": true,
2523 | "requires": {
2524 | "is-extglob": "1.0.0"
2525 | }
2526 | },
2527 | "is-installed-globally": {
2528 | "version": "0.1.0",
2529 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
2530 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
2531 | "dev": true,
2532 | "requires": {
2533 | "global-dirs": "0.1.1",
2534 | "is-path-inside": "1.0.1"
2535 | }
2536 | },
2537 | "is-ip": {
2538 | "version": "1.0.0",
2539 | "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz",
2540 | "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=",
2541 | "dev": true,
2542 | "requires": {
2543 | "ip-regex": "1.0.3"
2544 | }
2545 | },
2546 | "is-npm": {
2547 | "version": "1.0.0",
2548 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
2549 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
2550 | "dev": true
2551 | },
2552 | "is-number": {
2553 | "version": "2.1.0",
2554 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2555 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
2556 | "dev": true,
2557 | "requires": {
2558 | "kind-of": "3.2.2"
2559 | }
2560 | },
2561 | "is-obj": {
2562 | "version": "1.0.1",
2563 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
2564 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
2565 | "dev": true
2566 | },
2567 | "is-path-inside": {
2568 | "version": "1.0.1",
2569 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
2570 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
2571 | "dev": true,
2572 | "requires": {
2573 | "path-is-inside": "1.0.2"
2574 | }
2575 | },
2576 | "is-posix-bracket": {
2577 | "version": "0.1.1",
2578 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
2579 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
2580 | "dev": true
2581 | },
2582 | "is-primitive": {
2583 | "version": "2.0.0",
2584 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
2585 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
2586 | "dev": true
2587 | },
2588 | "is-redirect": {
2589 | "version": "1.0.0",
2590 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
2591 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
2592 | "dev": true
2593 | },
2594 | "is-retry-allowed": {
2595 | "version": "1.1.0",
2596 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
2597 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
2598 | "dev": true
2599 | },
2600 | "is-stream": {
2601 | "version": "1.1.0",
2602 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
2603 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
2604 | "dev": true
2605 | },
2606 | "isarray": {
2607 | "version": "1.0.0",
2608 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2609 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
2610 | },
2611 | "isemail": {
2612 | "version": "1.2.0",
2613 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
2614 | "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
2615 | },
2616 | "isexe": {
2617 | "version": "2.0.0",
2618 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2619 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2620 | "dev": true
2621 | },
2622 | "isobject": {
2623 | "version": "2.1.0",
2624 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2625 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2626 | "dev": true,
2627 | "requires": {
2628 | "isarray": "1.0.0"
2629 | }
2630 | },
2631 | "joi": {
2632 | "version": "6.10.1",
2633 | "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
2634 | "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
2635 | "requires": {
2636 | "hoek": "2.16.3",
2637 | "isemail": "1.2.0",
2638 | "moment": "2.19.4",
2639 | "topo": "1.1.0"
2640 | }
2641 | },
2642 | "json-loader": {
2643 | "version": "0.5.7",
2644 | "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
2645 | "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
2646 | "dev": true
2647 | },
2648 | "json-schema-traverse": {
2649 | "version": "0.3.1",
2650 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
2651 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
2652 | "dev": true
2653 | },
2654 | "json5": {
2655 | "version": "0.5.1",
2656 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
2657 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
2658 | "dev": true
2659 | },
2660 | "jsonwebtoken": {
2661 | "version": "8.1.0",
2662 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz",
2663 | "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=",
2664 | "requires": {
2665 | "jws": "3.1.4",
2666 | "lodash.includes": "4.3.0",
2667 | "lodash.isboolean": "3.0.3",
2668 | "lodash.isinteger": "4.0.4",
2669 | "lodash.isnumber": "3.0.3",
2670 | "lodash.isplainobject": "4.0.6",
2671 | "lodash.isstring": "4.0.1",
2672 | "lodash.once": "4.1.1",
2673 | "ms": "2.0.0",
2674 | "xtend": "4.0.1"
2675 | }
2676 | },
2677 | "jwa": {
2678 | "version": "1.1.5",
2679 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
2680 | "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
2681 | "requires": {
2682 | "base64url": "2.0.0",
2683 | "buffer-equal-constant-time": "1.0.1",
2684 | "ecdsa-sig-formatter": "1.0.9",
2685 | "safe-buffer": "5.1.1"
2686 | }
2687 | },
2688 | "jws": {
2689 | "version": "3.1.4",
2690 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
2691 | "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
2692 | "requires": {
2693 | "base64url": "2.0.0",
2694 | "jwa": "1.1.5",
2695 | "safe-buffer": "5.1.1"
2696 | }
2697 | },
2698 | "kareem": {
2699 | "version": "1.5.0",
2700 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz",
2701 | "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg="
2702 | },
2703 | "kind-of": {
2704 | "version": "3.2.2",
2705 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2706 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2707 | "dev": true,
2708 | "requires": {
2709 | "is-buffer": "1.1.6"
2710 | }
2711 | },
2712 | "latest-version": {
2713 | "version": "3.1.0",
2714 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
2715 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
2716 | "dev": true,
2717 | "requires": {
2718 | "package-json": "4.0.1"
2719 | }
2720 | },
2721 | "lazy-cache": {
2722 | "version": "1.0.4",
2723 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
2724 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
2725 | "dev": true
2726 | },
2727 | "lcid": {
2728 | "version": "1.0.0",
2729 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
2730 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
2731 | "dev": true,
2732 | "requires": {
2733 | "invert-kv": "1.0.0"
2734 | }
2735 | },
2736 | "load-json-file": {
2737 | "version": "2.0.0",
2738 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
2739 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
2740 | "dev": true,
2741 | "requires": {
2742 | "graceful-fs": "4.1.11",
2743 | "parse-json": "2.2.0",
2744 | "pify": "2.3.0",
2745 | "strip-bom": "3.0.0"
2746 | }
2747 | },
2748 | "loader-runner": {
2749 | "version": "2.3.0",
2750 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
2751 | "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=",
2752 | "dev": true
2753 | },
2754 | "loader-utils": {
2755 | "version": "1.1.0",
2756 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
2757 | "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
2758 | "dev": true,
2759 | "requires": {
2760 | "big.js": "3.2.0",
2761 | "emojis-list": "2.1.0",
2762 | "json5": "0.5.1"
2763 | }
2764 | },
2765 | "locate-path": {
2766 | "version": "2.0.0",
2767 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
2768 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2769 | "dev": true,
2770 | "requires": {
2771 | "p-locate": "2.0.0",
2772 | "path-exists": "3.0.0"
2773 | }
2774 | },
2775 | "lodash": {
2776 | "version": "4.17.4",
2777 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
2778 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
2779 | },
2780 | "lodash._baseassign": {
2781 | "version": "3.2.0",
2782 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
2783 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
2784 | "dev": true,
2785 | "requires": {
2786 | "lodash._basecopy": "3.0.1",
2787 | "lodash.keys": "3.1.2"
2788 | }
2789 | },
2790 | "lodash._basecopy": {
2791 | "version": "3.0.1",
2792 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
2793 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
2794 | "dev": true
2795 | },
2796 | "lodash._bindcallback": {
2797 | "version": "3.0.1",
2798 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
2799 | "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
2800 | "dev": true
2801 | },
2802 | "lodash._createassigner": {
2803 | "version": "3.1.1",
2804 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz",
2805 | "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=",
2806 | "dev": true,
2807 | "requires": {
2808 | "lodash._bindcallback": "3.0.1",
2809 | "lodash._isiterateecall": "3.0.9",
2810 | "lodash.restparam": "3.6.1"
2811 | }
2812 | },
2813 | "lodash._getnative": {
2814 | "version": "3.9.1",
2815 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
2816 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
2817 | "dev": true
2818 | },
2819 | "lodash._isiterateecall": {
2820 | "version": "3.0.9",
2821 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
2822 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
2823 | "dev": true
2824 | },
2825 | "lodash.assign": {
2826 | "version": "3.2.0",
2827 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz",
2828 | "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=",
2829 | "dev": true,
2830 | "requires": {
2831 | "lodash._baseassign": "3.2.0",
2832 | "lodash._createassigner": "3.1.1",
2833 | "lodash.keys": "3.1.2"
2834 | }
2835 | },
2836 | "lodash.defaults": {
2837 | "version": "3.1.2",
2838 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz",
2839 | "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=",
2840 | "dev": true,
2841 | "requires": {
2842 | "lodash.assign": "3.2.0",
2843 | "lodash.restparam": "3.6.1"
2844 | }
2845 | },
2846 | "lodash.get": {
2847 | "version": "4.4.2",
2848 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
2849 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
2850 | },
2851 | "lodash.includes": {
2852 | "version": "4.3.0",
2853 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
2854 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
2855 | },
2856 | "lodash.isarguments": {
2857 | "version": "3.1.0",
2858 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
2859 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
2860 | "dev": true
2861 | },
2862 | "lodash.isarray": {
2863 | "version": "3.0.4",
2864 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
2865 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
2866 | "dev": true
2867 | },
2868 | "lodash.isboolean": {
2869 | "version": "3.0.3",
2870 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
2871 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
2872 | },
2873 | "lodash.isinteger": {
2874 | "version": "4.0.4",
2875 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
2876 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
2877 | },
2878 | "lodash.isnumber": {
2879 | "version": "3.0.3",
2880 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
2881 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
2882 | },
2883 | "lodash.isplainobject": {
2884 | "version": "4.0.6",
2885 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
2886 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
2887 | },
2888 | "lodash.isstring": {
2889 | "version": "4.0.1",
2890 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
2891 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
2892 | },
2893 | "lodash.keys": {
2894 | "version": "3.1.2",
2895 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
2896 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
2897 | "dev": true,
2898 | "requires": {
2899 | "lodash._getnative": "3.9.1",
2900 | "lodash.isarguments": "3.1.0",
2901 | "lodash.isarray": "3.0.4"
2902 | }
2903 | },
2904 | "lodash.once": {
2905 | "version": "4.1.1",
2906 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
2907 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
2908 | },
2909 | "lodash.restparam": {
2910 | "version": "3.6.1",
2911 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
2912 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
2913 | "dev": true
2914 | },
2915 | "longest": {
2916 | "version": "1.0.1",
2917 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
2918 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
2919 | "dev": true
2920 | },
2921 | "lowercase-keys": {
2922 | "version": "1.0.0",
2923 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
2924 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
2925 | "dev": true
2926 | },
2927 | "lru-cache": {
2928 | "version": "4.1.1",
2929 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
2930 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
2931 | "dev": true,
2932 | "requires": {
2933 | "pseudomap": "1.0.2",
2934 | "yallist": "2.1.2"
2935 | }
2936 | },
2937 | "make-dir": {
2938 | "version": "1.1.0",
2939 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
2940 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
2941 | "dev": true,
2942 | "requires": {
2943 | "pify": "3.0.0"
2944 | },
2945 | "dependencies": {
2946 | "pify": {
2947 | "version": "3.0.0",
2948 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
2949 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
2950 | "dev": true
2951 | }
2952 | }
2953 | },
2954 | "map-stream": {
2955 | "version": "0.1.0",
2956 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
2957 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
2958 | "dev": true
2959 | },
2960 | "md5.js": {
2961 | "version": "1.3.4",
2962 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
2963 | "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
2964 | "dev": true,
2965 | "requires": {
2966 | "hash-base": "3.0.4",
2967 | "inherits": "2.0.3"
2968 | },
2969 | "dependencies": {
2970 | "hash-base": {
2971 | "version": "3.0.4",
2972 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
2973 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
2974 | "dev": true,
2975 | "requires": {
2976 | "inherits": "2.0.3",
2977 | "safe-buffer": "5.1.1"
2978 | }
2979 | }
2980 | }
2981 | },
2982 | "media-typer": {
2983 | "version": "0.3.0",
2984 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
2985 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
2986 | },
2987 | "mem": {
2988 | "version": "1.1.0",
2989 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
2990 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
2991 | "dev": true,
2992 | "requires": {
2993 | "mimic-fn": "1.1.0"
2994 | }
2995 | },
2996 | "memory-fs": {
2997 | "version": "0.4.1",
2998 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
2999 | "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
3000 | "dev": true,
3001 | "requires": {
3002 | "errno": "0.1.6",
3003 | "readable-stream": "2.3.3"
3004 | }
3005 | },
3006 | "merge-descriptors": {
3007 | "version": "1.0.1",
3008 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
3009 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
3010 | },
3011 | "methods": {
3012 | "version": "1.1.2",
3013 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
3014 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
3015 | },
3016 | "micromatch": {
3017 | "version": "2.3.11",
3018 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
3019 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
3020 | "dev": true,
3021 | "requires": {
3022 | "arr-diff": "2.0.0",
3023 | "array-unique": "0.2.1",
3024 | "braces": "1.8.5",
3025 | "expand-brackets": "0.1.5",
3026 | "extglob": "0.3.2",
3027 | "filename-regex": "2.0.1",
3028 | "is-extglob": "1.0.0",
3029 | "is-glob": "2.0.1",
3030 | "kind-of": "3.2.2",
3031 | "normalize-path": "2.1.1",
3032 | "object.omit": "2.0.1",
3033 | "parse-glob": "3.0.4",
3034 | "regex-cache": "0.4.4"
3035 | }
3036 | },
3037 | "miller-rabin": {
3038 | "version": "4.0.1",
3039 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
3040 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
3041 | "dev": true,
3042 | "requires": {
3043 | "bn.js": "4.11.8",
3044 | "brorand": "1.1.0"
3045 | }
3046 | },
3047 | "mime": {
3048 | "version": "1.6.0",
3049 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
3050 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
3051 | "dev": true
3052 | },
3053 | "mime-db": {
3054 | "version": "1.30.0",
3055 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
3056 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
3057 | },
3058 | "mime-types": {
3059 | "version": "2.1.17",
3060 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
3061 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
3062 | "requires": {
3063 | "mime-db": "1.30.0"
3064 | }
3065 | },
3066 | "mimic-fn": {
3067 | "version": "1.1.0",
3068 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
3069 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
3070 | "dev": true
3071 | },
3072 | "minimalistic-assert": {
3073 | "version": "1.0.0",
3074 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
3075 | "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
3076 | "dev": true
3077 | },
3078 | "minimalistic-crypto-utils": {
3079 | "version": "1.0.1",
3080 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
3081 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
3082 | "dev": true
3083 | },
3084 | "minimatch": {
3085 | "version": "3.0.4",
3086 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3087 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3088 | "dev": true,
3089 | "requires": {
3090 | "brace-expansion": "1.1.8"
3091 | }
3092 | },
3093 | "minimist": {
3094 | "version": "0.0.8",
3095 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3096 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3097 | "dev": true
3098 | },
3099 | "mkdirp": {
3100 | "version": "0.5.1",
3101 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3102 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3103 | "dev": true,
3104 | "requires": {
3105 | "minimist": "0.0.8"
3106 | }
3107 | },
3108 | "mocha": {
3109 | "version": "4.0.1",
3110 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz",
3111 | "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==",
3112 | "dev": true,
3113 | "requires": {
3114 | "browser-stdout": "1.3.0",
3115 | "commander": "2.11.0",
3116 | "debug": "3.1.0",
3117 | "diff": "3.3.1",
3118 | "escape-string-regexp": "1.0.5",
3119 | "glob": "7.1.2",
3120 | "growl": "1.10.3",
3121 | "he": "1.1.1",
3122 | "mkdirp": "0.5.1",
3123 | "supports-color": "4.4.0"
3124 | },
3125 | "dependencies": {
3126 | "debug": {
3127 | "version": "3.1.0",
3128 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
3129 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
3130 | "dev": true,
3131 | "requires": {
3132 | "ms": "2.0.0"
3133 | }
3134 | },
3135 | "supports-color": {
3136 | "version": "4.4.0",
3137 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
3138 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
3139 | "dev": true,
3140 | "requires": {
3141 | "has-flag": "2.0.0"
3142 | }
3143 | }
3144 | }
3145 | },
3146 | "moment": {
3147 | "version": "2.19.4",
3148 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.4.tgz",
3149 | "integrity": "sha512-1xFTAknSLfc47DIxHDUbnJWC+UwgWxATmymaxIPQpmMh7LBm7ZbwVEsuushqwL2GYZU0jie4xO+TK44hJPjNSQ=="
3150 | },
3151 | "mongodb": {
3152 | "version": "2.2.33",
3153 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz",
3154 | "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=",
3155 | "requires": {
3156 | "es6-promise": "3.2.1",
3157 | "mongodb-core": "2.1.17",
3158 | "readable-stream": "2.2.7"
3159 | },
3160 | "dependencies": {
3161 | "readable-stream": {
3162 | "version": "2.2.7",
3163 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
3164 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
3165 | "requires": {
3166 | "buffer-shims": "1.0.0",
3167 | "core-util-is": "1.0.2",
3168 | "inherits": "2.0.3",
3169 | "isarray": "1.0.0",
3170 | "process-nextick-args": "1.0.7",
3171 | "string_decoder": "1.0.3",
3172 | "util-deprecate": "1.0.2"
3173 | }
3174 | }
3175 | }
3176 | },
3177 | "mongodb-core": {
3178 | "version": "2.1.17",
3179 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz",
3180 | "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=",
3181 | "requires": {
3182 | "bson": "1.0.4",
3183 | "require_optional": "1.0.1"
3184 | }
3185 | },
3186 | "mongoose": {
3187 | "version": "4.13.7",
3188 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.7.tgz",
3189 | "integrity": "sha512-3VPcGQWaTzT/OVK+TpE9dGpNHBnEqFX2RmbFr1XvbsKmxPsL9kaRBSHqaQ8QEMd6CUeOYMRdH1pKRrlnCenRsg==",
3190 | "requires": {
3191 | "async": "2.1.4",
3192 | "bson": "1.0.4",
3193 | "hooks-fixed": "2.0.2",
3194 | "kareem": "1.5.0",
3195 | "lodash.get": "4.4.2",
3196 | "mongodb": "2.2.33",
3197 | "mpath": "0.3.0",
3198 | "mpromise": "0.5.5",
3199 | "mquery": "2.3.3",
3200 | "ms": "2.0.0",
3201 | "muri": "1.3.0",
3202 | "regexp-clone": "0.0.1",
3203 | "sliced": "1.0.1"
3204 | },
3205 | "dependencies": {
3206 | "async": {
3207 | "version": "2.1.4",
3208 | "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz",
3209 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=",
3210 | "requires": {
3211 | "lodash": "4.17.4"
3212 | }
3213 | }
3214 | }
3215 | },
3216 | "mpath": {
3217 | "version": "0.3.0",
3218 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz",
3219 | "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q="
3220 | },
3221 | "mpromise": {
3222 | "version": "0.5.5",
3223 | "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz",
3224 | "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY="
3225 | },
3226 | "mquery": {
3227 | "version": "2.3.3",
3228 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.3.tgz",
3229 | "integrity": "sha512-NC8L14kn+qxJbbJ1gbcEMDxF0sC3sv+1cbRReXXwVvowcwY1y9KoVZFq0ebwARibsadu8lx8nWGvm3V0Pf0ZWQ==",
3230 | "requires": {
3231 | "bluebird": "3.5.0",
3232 | "debug": "2.6.9",
3233 | "regexp-clone": "0.0.1",
3234 | "sliced": "0.0.5"
3235 | },
3236 | "dependencies": {
3237 | "sliced": {
3238 | "version": "0.0.5",
3239 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz",
3240 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8="
3241 | }
3242 | }
3243 | },
3244 | "ms": {
3245 | "version": "2.0.0",
3246 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3247 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
3248 | },
3249 | "muri": {
3250 | "version": "1.3.0",
3251 | "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz",
3252 | "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg=="
3253 | },
3254 | "nan": {
3255 | "version": "2.8.0",
3256 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
3257 | "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
3258 | "dev": true,
3259 | "optional": true
3260 | },
3261 | "negotiator": {
3262 | "version": "0.6.1",
3263 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
3264 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
3265 | },
3266 | "node-libs-browser": {
3267 | "version": "2.1.0",
3268 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
3269 | "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
3270 | "dev": true,
3271 | "requires": {
3272 | "assert": "1.4.1",
3273 | "browserify-zlib": "0.2.0",
3274 | "buffer": "4.9.1",
3275 | "console-browserify": "1.1.0",
3276 | "constants-browserify": "1.0.0",
3277 | "crypto-browserify": "3.12.0",
3278 | "domain-browser": "1.1.7",
3279 | "events": "1.1.1",
3280 | "https-browserify": "1.0.0",
3281 | "os-browserify": "0.3.0",
3282 | "path-browserify": "0.0.0",
3283 | "process": "0.11.10",
3284 | "punycode": "1.4.1",
3285 | "querystring-es3": "0.2.1",
3286 | "readable-stream": "2.3.3",
3287 | "stream-browserify": "2.0.1",
3288 | "stream-http": "2.7.2",
3289 | "string_decoder": "1.0.3",
3290 | "timers-browserify": "2.0.4",
3291 | "tty-browserify": "0.0.0",
3292 | "url": "0.11.0",
3293 | "util": "0.10.3",
3294 | "vm-browserify": "0.0.4"
3295 | }
3296 | },
3297 | "nodemon": {
3298 | "version": "1.13.3",
3299 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.13.3.tgz",
3300 | "integrity": "sha512-JTDI4il69J3rQ5aXQdNcDZDfk8JXC2c5Uh9zjTtFGrlP72UDoOEPB7reDMjo27tbLhtxtPAfGwhs28RVMz5rHQ==",
3301 | "dev": true,
3302 | "requires": {
3303 | "@remy/pstree": "1.1.0",
3304 | "chokidar": "1.7.0",
3305 | "debug": "2.6.9",
3306 | "es6-promise": "3.3.1",
3307 | "ignore-by-default": "1.0.1",
3308 | "lodash.defaults": "3.1.2",
3309 | "minimatch": "3.0.4",
3310 | "touch": "3.1.0",
3311 | "undefsafe": "0.0.3",
3312 | "update-notifier": "2.3.0"
3313 | },
3314 | "dependencies": {
3315 | "es6-promise": {
3316 | "version": "3.3.1",
3317 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
3318 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=",
3319 | "dev": true
3320 | }
3321 | }
3322 | },
3323 | "nopt": {
3324 | "version": "1.0.10",
3325 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
3326 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
3327 | "dev": true,
3328 | "requires": {
3329 | "abbrev": "1.1.1"
3330 | }
3331 | },
3332 | "normalize-package-data": {
3333 | "version": "2.4.0",
3334 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
3335 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
3336 | "dev": true,
3337 | "requires": {
3338 | "hosted-git-info": "2.5.0",
3339 | "is-builtin-module": "1.0.0",
3340 | "semver": "5.4.1",
3341 | "validate-npm-package-license": "3.0.1"
3342 | }
3343 | },
3344 | "normalize-path": {
3345 | "version": "2.1.1",
3346 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3347 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3348 | "dev": true,
3349 | "requires": {
3350 | "remove-trailing-separator": "1.1.0"
3351 | }
3352 | },
3353 | "npm-run-path": {
3354 | "version": "2.0.2",
3355 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3356 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3357 | "dev": true,
3358 | "requires": {
3359 | "path-key": "2.0.1"
3360 | }
3361 | },
3362 | "number-is-nan": {
3363 | "version": "1.0.1",
3364 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3365 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3366 | "dev": true
3367 | },
3368 | "object-assign": {
3369 | "version": "4.1.1",
3370 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3371 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3372 | "dev": true
3373 | },
3374 | "object.omit": {
3375 | "version": "2.0.1",
3376 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
3377 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
3378 | "dev": true,
3379 | "requires": {
3380 | "for-own": "0.1.5",
3381 | "is-extendable": "0.1.1"
3382 | }
3383 | },
3384 | "on-finished": {
3385 | "version": "2.3.0",
3386 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
3387 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
3388 | "requires": {
3389 | "ee-first": "1.1.1"
3390 | }
3391 | },
3392 | "once": {
3393 | "version": "1.4.0",
3394 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3395 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3396 | "dev": true,
3397 | "requires": {
3398 | "wrappy": "1.0.2"
3399 | }
3400 | },
3401 | "os-browserify": {
3402 | "version": "0.3.0",
3403 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
3404 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
3405 | "dev": true
3406 | },
3407 | "os-locale": {
3408 | "version": "2.1.0",
3409 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
3410 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
3411 | "dev": true,
3412 | "requires": {
3413 | "execa": "0.7.0",
3414 | "lcid": "1.0.0",
3415 | "mem": "1.1.0"
3416 | }
3417 | },
3418 | "p-finally": {
3419 | "version": "1.0.0",
3420 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3421 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3422 | "dev": true
3423 | },
3424 | "p-limit": {
3425 | "version": "1.1.0",
3426 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
3427 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
3428 | "dev": true
3429 | },
3430 | "p-locate": {
3431 | "version": "2.0.0",
3432 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3433 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3434 | "dev": true,
3435 | "requires": {
3436 | "p-limit": "1.1.0"
3437 | }
3438 | },
3439 | "package-json": {
3440 | "version": "4.0.1",
3441 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
3442 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
3443 | "dev": true,
3444 | "requires": {
3445 | "got": "6.7.1",
3446 | "registry-auth-token": "3.3.1",
3447 | "registry-url": "3.1.0",
3448 | "semver": "5.4.1"
3449 | }
3450 | },
3451 | "pako": {
3452 | "version": "1.0.6",
3453 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
3454 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
3455 | "dev": true
3456 | },
3457 | "parse-asn1": {
3458 | "version": "5.1.0",
3459 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
3460 | "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
3461 | "dev": true,
3462 | "requires": {
3463 | "asn1.js": "4.9.2",
3464 | "browserify-aes": "1.1.1",
3465 | "create-hash": "1.1.3",
3466 | "evp_bytestokey": "1.0.3",
3467 | "pbkdf2": "3.0.14"
3468 | }
3469 | },
3470 | "parse-glob": {
3471 | "version": "3.0.4",
3472 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
3473 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
3474 | "dev": true,
3475 | "requires": {
3476 | "glob-base": "0.3.0",
3477 | "is-dotfile": "1.0.3",
3478 | "is-extglob": "1.0.0",
3479 | "is-glob": "2.0.1"
3480 | }
3481 | },
3482 | "parse-json": {
3483 | "version": "2.2.0",
3484 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
3485 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
3486 | "dev": true,
3487 | "requires": {
3488 | "error-ex": "1.3.1"
3489 | }
3490 | },
3491 | "parseurl": {
3492 | "version": "1.3.2",
3493 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
3494 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
3495 | },
3496 | "passport": {
3497 | "version": "0.4.0",
3498 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz",
3499 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=",
3500 | "requires": {
3501 | "passport-strategy": "1.0.0",
3502 | "pause": "0.0.1"
3503 | }
3504 | },
3505 | "passport-jwt": {
3506 | "version": "3.0.1",
3507 | "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-3.0.1.tgz",
3508 | "integrity": "sha1-5Pcnba2L0lHUPG/DiIMTC5YycvY=",
3509 | "requires": {
3510 | "jsonwebtoken": "7.4.3",
3511 | "passport-strategy": "1.0.0"
3512 | },
3513 | "dependencies": {
3514 | "jsonwebtoken": {
3515 | "version": "7.4.3",
3516 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz",
3517 | "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=",
3518 | "requires": {
3519 | "joi": "6.10.1",
3520 | "jws": "3.1.4",
3521 | "lodash.once": "4.1.1",
3522 | "ms": "2.0.0",
3523 | "xtend": "4.0.1"
3524 | }
3525 | }
3526 | }
3527 | },
3528 | "passport-local": {
3529 | "version": "1.0.0",
3530 | "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
3531 | "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=",
3532 | "requires": {
3533 | "passport-strategy": "1.0.0"
3534 | }
3535 | },
3536 | "passport-local-mongoose": {
3537 | "version": "4.4.0",
3538 | "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-4.4.0.tgz",
3539 | "integrity": "sha512-a0O6Me/4SWI5yhePlQKgvREwGLxJyRWzgfCJW+hbXkIRlct5Xd+upl9IDgkbprDo5j6b4702L/pZ7weSHeKxfA==",
3540 | "requires": {
3541 | "debug": "3.1.0",
3542 | "generaterr": "1.5.0",
3543 | "passport-local": "1.0.0",
3544 | "scmp": "2.0.0",
3545 | "semver": "5.4.1"
3546 | },
3547 | "dependencies": {
3548 | "debug": {
3549 | "version": "3.1.0",
3550 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
3551 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
3552 | "requires": {
3553 | "ms": "2.0.0"
3554 | }
3555 | }
3556 | }
3557 | },
3558 | "passport-strategy": {
3559 | "version": "1.0.0",
3560 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
3561 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
3562 | },
3563 | "path-browserify": {
3564 | "version": "0.0.0",
3565 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
3566 | "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
3567 | "dev": true
3568 | },
3569 | "path-exists": {
3570 | "version": "3.0.0",
3571 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
3572 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
3573 | "dev": true
3574 | },
3575 | "path-is-absolute": {
3576 | "version": "1.0.1",
3577 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3578 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
3579 | "dev": true
3580 | },
3581 | "path-is-inside": {
3582 | "version": "1.0.2",
3583 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
3584 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
3585 | "dev": true
3586 | },
3587 | "path-key": {
3588 | "version": "2.0.1",
3589 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
3590 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
3591 | "dev": true
3592 | },
3593 | "path-to-regexp": {
3594 | "version": "0.1.7",
3595 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
3596 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
3597 | },
3598 | "path-type": {
3599 | "version": "2.0.0",
3600 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
3601 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
3602 | "dev": true,
3603 | "requires": {
3604 | "pify": "2.3.0"
3605 | }
3606 | },
3607 | "pathval": {
3608 | "version": "1.1.0",
3609 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
3610 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
3611 | "dev": true
3612 | },
3613 | "pause": {
3614 | "version": "0.0.1",
3615 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
3616 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
3617 | },
3618 | "pause-stream": {
3619 | "version": "0.0.11",
3620 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
3621 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
3622 | "dev": true,
3623 | "requires": {
3624 | "through": "2.3.8"
3625 | }
3626 | },
3627 | "pbkdf2": {
3628 | "version": "3.0.14",
3629 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
3630 | "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==",
3631 | "dev": true,
3632 | "requires": {
3633 | "create-hash": "1.1.3",
3634 | "create-hmac": "1.1.6",
3635 | "ripemd160": "2.0.1",
3636 | "safe-buffer": "5.1.1",
3637 | "sha.js": "2.4.9"
3638 | }
3639 | },
3640 | "pify": {
3641 | "version": "2.3.0",
3642 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
3643 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
3644 | "dev": true
3645 | },
3646 | "prepend-http": {
3647 | "version": "1.0.4",
3648 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
3649 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
3650 | "dev": true
3651 | },
3652 | "preserve": {
3653 | "version": "0.2.0",
3654 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
3655 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
3656 | "dev": true
3657 | },
3658 | "process": {
3659 | "version": "0.11.10",
3660 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
3661 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
3662 | "dev": true
3663 | },
3664 | "process-nextick-args": {
3665 | "version": "1.0.7",
3666 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
3667 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
3668 | },
3669 | "proxy-addr": {
3670 | "version": "2.0.2",
3671 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz",
3672 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=",
3673 | "requires": {
3674 | "forwarded": "0.1.2",
3675 | "ipaddr.js": "1.5.2"
3676 | }
3677 | },
3678 | "prr": {
3679 | "version": "1.0.1",
3680 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
3681 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
3682 | "dev": true
3683 | },
3684 | "ps-tree": {
3685 | "version": "1.1.0",
3686 | "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
3687 | "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
3688 | "dev": true,
3689 | "requires": {
3690 | "event-stream": "3.3.4"
3691 | }
3692 | },
3693 | "pseudomap": {
3694 | "version": "1.0.2",
3695 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
3696 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
3697 | "dev": true
3698 | },
3699 | "public-encrypt": {
3700 | "version": "4.0.0",
3701 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
3702 | "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
3703 | "dev": true,
3704 | "requires": {
3705 | "bn.js": "4.11.8",
3706 | "browserify-rsa": "4.0.1",
3707 | "create-hash": "1.1.3",
3708 | "parse-asn1": "5.1.0",
3709 | "randombytes": "2.0.5"
3710 | }
3711 | },
3712 | "punycode": {
3713 | "version": "1.4.1",
3714 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3715 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
3716 | "dev": true
3717 | },
3718 | "qs": {
3719 | "version": "6.5.1",
3720 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
3721 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
3722 | },
3723 | "querystring": {
3724 | "version": "0.2.0",
3725 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
3726 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
3727 | "dev": true
3728 | },
3729 | "querystring-es3": {
3730 | "version": "0.2.1",
3731 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
3732 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
3733 | "dev": true
3734 | },
3735 | "randomatic": {
3736 | "version": "1.1.7",
3737 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
3738 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
3739 | "dev": true,
3740 | "requires": {
3741 | "is-number": "3.0.0",
3742 | "kind-of": "4.0.0"
3743 | },
3744 | "dependencies": {
3745 | "is-number": {
3746 | "version": "3.0.0",
3747 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3748 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3749 | "dev": true,
3750 | "requires": {
3751 | "kind-of": "3.2.2"
3752 | },
3753 | "dependencies": {
3754 | "kind-of": {
3755 | "version": "3.2.2",
3756 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3757 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3758 | "dev": true,
3759 | "requires": {
3760 | "is-buffer": "1.1.6"
3761 | }
3762 | }
3763 | }
3764 | },
3765 | "kind-of": {
3766 | "version": "4.0.0",
3767 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
3768 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
3769 | "dev": true,
3770 | "requires": {
3771 | "is-buffer": "1.1.6"
3772 | }
3773 | }
3774 | }
3775 | },
3776 | "randombytes": {
3777 | "version": "2.0.5",
3778 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz",
3779 | "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==",
3780 | "dev": true,
3781 | "requires": {
3782 | "safe-buffer": "5.1.1"
3783 | }
3784 | },
3785 | "randomfill": {
3786 | "version": "1.0.3",
3787 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz",
3788 | "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==",
3789 | "dev": true,
3790 | "requires": {
3791 | "randombytes": "2.0.5",
3792 | "safe-buffer": "5.1.1"
3793 | }
3794 | },
3795 | "range-parser": {
3796 | "version": "1.2.0",
3797 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
3798 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
3799 | },
3800 | "raw-body": {
3801 | "version": "2.3.2",
3802 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
3803 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
3804 | "requires": {
3805 | "bytes": "3.0.0",
3806 | "http-errors": "1.6.2",
3807 | "iconv-lite": "0.4.19",
3808 | "unpipe": "1.0.0"
3809 | }
3810 | },
3811 | "rc": {
3812 | "version": "1.2.2",
3813 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
3814 | "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
3815 | "dev": true,
3816 | "requires": {
3817 | "deep-extend": "0.4.2",
3818 | "ini": "1.3.5",
3819 | "minimist": "1.2.0",
3820 | "strip-json-comments": "2.0.1"
3821 | },
3822 | "dependencies": {
3823 | "minimist": {
3824 | "version": "1.2.0",
3825 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
3826 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
3827 | "dev": true
3828 | }
3829 | }
3830 | },
3831 | "read-pkg": {
3832 | "version": "2.0.0",
3833 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
3834 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
3835 | "dev": true,
3836 | "requires": {
3837 | "load-json-file": "2.0.0",
3838 | "normalize-package-data": "2.4.0",
3839 | "path-type": "2.0.0"
3840 | }
3841 | },
3842 | "read-pkg-up": {
3843 | "version": "2.0.0",
3844 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
3845 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
3846 | "dev": true,
3847 | "requires": {
3848 | "find-up": "2.1.0",
3849 | "read-pkg": "2.0.0"
3850 | }
3851 | },
3852 | "readable-stream": {
3853 | "version": "2.3.3",
3854 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
3855 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
3856 | "dev": true,
3857 | "requires": {
3858 | "core-util-is": "1.0.2",
3859 | "inherits": "2.0.3",
3860 | "isarray": "1.0.0",
3861 | "process-nextick-args": "1.0.7",
3862 | "safe-buffer": "5.1.1",
3863 | "string_decoder": "1.0.3",
3864 | "util-deprecate": "1.0.2"
3865 | }
3866 | },
3867 | "readdirp": {
3868 | "version": "2.1.0",
3869 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
3870 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
3871 | "dev": true,
3872 | "requires": {
3873 | "graceful-fs": "4.1.11",
3874 | "minimatch": "3.0.4",
3875 | "readable-stream": "2.3.3",
3876 | "set-immediate-shim": "1.0.1"
3877 | }
3878 | },
3879 | "regex-cache": {
3880 | "version": "0.4.4",
3881 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
3882 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
3883 | "dev": true,
3884 | "requires": {
3885 | "is-equal-shallow": "0.1.3"
3886 | }
3887 | },
3888 | "regexp-clone": {
3889 | "version": "0.0.1",
3890 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz",
3891 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk="
3892 | },
3893 | "registry-auth-token": {
3894 | "version": "3.3.1",
3895 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
3896 | "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
3897 | "dev": true,
3898 | "requires": {
3899 | "rc": "1.2.2",
3900 | "safe-buffer": "5.1.1"
3901 | }
3902 | },
3903 | "registry-url": {
3904 | "version": "3.1.0",
3905 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
3906 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
3907 | "dev": true,
3908 | "requires": {
3909 | "rc": "1.2.2"
3910 | }
3911 | },
3912 | "remove-trailing-separator": {
3913 | "version": "1.1.0",
3914 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
3915 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
3916 | "dev": true
3917 | },
3918 | "repeat-element": {
3919 | "version": "1.1.2",
3920 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
3921 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
3922 | "dev": true
3923 | },
3924 | "repeat-string": {
3925 | "version": "1.6.1",
3926 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
3927 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
3928 | "dev": true
3929 | },
3930 | "require-directory": {
3931 | "version": "2.1.1",
3932 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
3933 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
3934 | "dev": true
3935 | },
3936 | "require-main-filename": {
3937 | "version": "1.0.1",
3938 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
3939 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
3940 | "dev": true
3941 | },
3942 | "require_optional": {
3943 | "version": "1.0.1",
3944 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
3945 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
3946 | "requires": {
3947 | "resolve-from": "2.0.0",
3948 | "semver": "5.4.1"
3949 | }
3950 | },
3951 | "resolve-from": {
3952 | "version": "2.0.0",
3953 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
3954 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
3955 | },
3956 | "right-align": {
3957 | "version": "0.1.3",
3958 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
3959 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
3960 | "dev": true,
3961 | "requires": {
3962 | "align-text": "0.1.4"
3963 | }
3964 | },
3965 | "ripemd160": {
3966 | "version": "2.0.1",
3967 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
3968 | "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
3969 | "dev": true,
3970 | "requires": {
3971 | "hash-base": "2.0.2",
3972 | "inherits": "2.0.3"
3973 | }
3974 | },
3975 | "safe-buffer": {
3976 | "version": "5.1.1",
3977 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
3978 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
3979 | },
3980 | "scmp": {
3981 | "version": "2.0.0",
3982 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.0.0.tgz",
3983 | "integrity": "sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo="
3984 | },
3985 | "semver": {
3986 | "version": "5.4.1",
3987 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
3988 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
3989 | },
3990 | "semver-diff": {
3991 | "version": "2.1.0",
3992 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
3993 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
3994 | "dev": true,
3995 | "requires": {
3996 | "semver": "5.4.1"
3997 | }
3998 | },
3999 | "send": {
4000 | "version": "0.16.1",
4001 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
4002 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
4003 | "requires": {
4004 | "debug": "2.6.9",
4005 | "depd": "1.1.1",
4006 | "destroy": "1.0.4",
4007 | "encodeurl": "1.0.1",
4008 | "escape-html": "1.0.3",
4009 | "etag": "1.8.1",
4010 | "fresh": "0.5.2",
4011 | "http-errors": "1.6.2",
4012 | "mime": "1.4.1",
4013 | "ms": "2.0.0",
4014 | "on-finished": "2.3.0",
4015 | "range-parser": "1.2.0",
4016 | "statuses": "1.3.1"
4017 | },
4018 | "dependencies": {
4019 | "mime": {
4020 | "version": "1.4.1",
4021 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
4022 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
4023 | },
4024 | "statuses": {
4025 | "version": "1.3.1",
4026 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
4027 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
4028 | }
4029 | }
4030 | },
4031 | "serve-static": {
4032 | "version": "1.13.1",
4033 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
4034 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
4035 | "requires": {
4036 | "encodeurl": "1.0.1",
4037 | "escape-html": "1.0.3",
4038 | "parseurl": "1.3.2",
4039 | "send": "0.16.1"
4040 | }
4041 | },
4042 | "set-blocking": {
4043 | "version": "2.0.0",
4044 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4045 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
4046 | "dev": true
4047 | },
4048 | "set-immediate-shim": {
4049 | "version": "1.0.1",
4050 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
4051 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
4052 | "dev": true
4053 | },
4054 | "setimmediate": {
4055 | "version": "1.0.5",
4056 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
4057 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
4058 | "dev": true
4059 | },
4060 | "setprototypeof": {
4061 | "version": "1.0.3",
4062 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
4063 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
4064 | },
4065 | "sha.js": {
4066 | "version": "2.4.9",
4067 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz",
4068 | "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==",
4069 | "dev": true,
4070 | "requires": {
4071 | "inherits": "2.0.3",
4072 | "safe-buffer": "5.1.1"
4073 | }
4074 | },
4075 | "shebang-command": {
4076 | "version": "1.2.0",
4077 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
4078 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
4079 | "dev": true,
4080 | "requires": {
4081 | "shebang-regex": "1.0.0"
4082 | }
4083 | },
4084 | "shebang-regex": {
4085 | "version": "1.0.0",
4086 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
4087 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
4088 | "dev": true
4089 | },
4090 | "signal-exit": {
4091 | "version": "3.0.2",
4092 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
4093 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
4094 | "dev": true
4095 | },
4096 | "sliced": {
4097 | "version": "1.0.1",
4098 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
4099 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
4100 | },
4101 | "source-list-map": {
4102 | "version": "2.0.0",
4103 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
4104 | "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==",
4105 | "dev": true
4106 | },
4107 | "source-map": {
4108 | "version": "0.5.7",
4109 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4110 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4111 | "dev": true
4112 | },
4113 | "spdx-correct": {
4114 | "version": "1.0.2",
4115 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
4116 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
4117 | "dev": true,
4118 | "requires": {
4119 | "spdx-license-ids": "1.2.2"
4120 | }
4121 | },
4122 | "spdx-expression-parse": {
4123 | "version": "1.0.4",
4124 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
4125 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
4126 | "dev": true
4127 | },
4128 | "spdx-license-ids": {
4129 | "version": "1.2.2",
4130 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
4131 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
4132 | "dev": true
4133 | },
4134 | "split": {
4135 | "version": "0.3.3",
4136 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
4137 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
4138 | "dev": true,
4139 | "requires": {
4140 | "through": "2.3.8"
4141 | }
4142 | },
4143 | "statuses": {
4144 | "version": "1.4.0",
4145 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
4146 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
4147 | },
4148 | "stream-browserify": {
4149 | "version": "2.0.1",
4150 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
4151 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
4152 | "dev": true,
4153 | "requires": {
4154 | "inherits": "2.0.3",
4155 | "readable-stream": "2.3.3"
4156 | }
4157 | },
4158 | "stream-combiner": {
4159 | "version": "0.0.4",
4160 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
4161 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
4162 | "dev": true,
4163 | "requires": {
4164 | "duplexer": "0.1.1"
4165 | }
4166 | },
4167 | "stream-http": {
4168 | "version": "2.7.2",
4169 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz",
4170 | "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==",
4171 | "dev": true,
4172 | "requires": {
4173 | "builtin-status-codes": "3.0.0",
4174 | "inherits": "2.0.3",
4175 | "readable-stream": "2.3.3",
4176 | "to-arraybuffer": "1.0.1",
4177 | "xtend": "4.0.1"
4178 | }
4179 | },
4180 | "string-width": {
4181 | "version": "2.1.1",
4182 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4183 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4184 | "dev": true,
4185 | "requires": {
4186 | "is-fullwidth-code-point": "2.0.0",
4187 | "strip-ansi": "4.0.0"
4188 | },
4189 | "dependencies": {
4190 | "ansi-regex": {
4191 | "version": "3.0.0",
4192 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4193 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4194 | "dev": true
4195 | },
4196 | "is-fullwidth-code-point": {
4197 | "version": "2.0.0",
4198 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
4199 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
4200 | "dev": true
4201 | },
4202 | "strip-ansi": {
4203 | "version": "4.0.0",
4204 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4205 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4206 | "dev": true,
4207 | "requires": {
4208 | "ansi-regex": "3.0.0"
4209 | }
4210 | }
4211 | }
4212 | },
4213 | "string_decoder": {
4214 | "version": "1.0.3",
4215 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
4216 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
4217 | "requires": {
4218 | "safe-buffer": "5.1.1"
4219 | }
4220 | },
4221 | "strip-ansi": {
4222 | "version": "3.0.1",
4223 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
4224 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
4225 | "dev": true,
4226 | "requires": {
4227 | "ansi-regex": "2.1.1"
4228 | }
4229 | },
4230 | "strip-bom": {
4231 | "version": "3.0.0",
4232 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
4233 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
4234 | "dev": true
4235 | },
4236 | "strip-eof": {
4237 | "version": "1.0.0",
4238 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
4239 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
4240 | "dev": true
4241 | },
4242 | "strip-json-comments": {
4243 | "version": "2.0.1",
4244 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
4245 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
4246 | "dev": true
4247 | },
4248 | "superagent": {
4249 | "version": "2.3.0",
4250 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz",
4251 | "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=",
4252 | "dev": true,
4253 | "requires": {
4254 | "component-emitter": "1.2.1",
4255 | "cookiejar": "2.0.6",
4256 | "debug": "2.6.9",
4257 | "extend": "3.0.1",
4258 | "form-data": "1.0.0-rc4",
4259 | "formidable": "1.1.1",
4260 | "methods": "1.1.2",
4261 | "mime": "1.6.0",
4262 | "qs": "6.5.1",
4263 | "readable-stream": "2.3.3"
4264 | }
4265 | },
4266 | "supports-color": {
4267 | "version": "4.5.0",
4268 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
4269 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
4270 | "dev": true,
4271 | "requires": {
4272 | "has-flag": "2.0.0"
4273 | }
4274 | },
4275 | "tapable": {
4276 | "version": "0.2.8",
4277 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
4278 | "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
4279 | "dev": true
4280 | },
4281 | "term-size": {
4282 | "version": "1.2.0",
4283 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
4284 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
4285 | "dev": true,
4286 | "requires": {
4287 | "execa": "0.7.0"
4288 | }
4289 | },
4290 | "through": {
4291 | "version": "2.3.8",
4292 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
4293 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
4294 | "dev": true
4295 | },
4296 | "timed-out": {
4297 | "version": "4.0.1",
4298 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
4299 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
4300 | "dev": true
4301 | },
4302 | "timers-browserify": {
4303 | "version": "2.0.4",
4304 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz",
4305 | "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==",
4306 | "dev": true,
4307 | "requires": {
4308 | "setimmediate": "1.0.5"
4309 | }
4310 | },
4311 | "to-arraybuffer": {
4312 | "version": "1.0.1",
4313 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
4314 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
4315 | "dev": true
4316 | },
4317 | "topo": {
4318 | "version": "1.1.0",
4319 | "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
4320 | "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
4321 | "requires": {
4322 | "hoek": "2.16.3"
4323 | }
4324 | },
4325 | "touch": {
4326 | "version": "3.1.0",
4327 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
4328 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
4329 | "dev": true,
4330 | "requires": {
4331 | "nopt": "1.0.10"
4332 | }
4333 | },
4334 | "tty-browserify": {
4335 | "version": "0.0.0",
4336 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
4337 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
4338 | "dev": true
4339 | },
4340 | "type-detect": {
4341 | "version": "4.0.5",
4342 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz",
4343 | "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==",
4344 | "dev": true
4345 | },
4346 | "type-is": {
4347 | "version": "1.6.15",
4348 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
4349 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
4350 | "requires": {
4351 | "media-typer": "0.3.0",
4352 | "mime-types": "2.1.17"
4353 | }
4354 | },
4355 | "uglify-js": {
4356 | "version": "2.8.29",
4357 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
4358 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
4359 | "dev": true,
4360 | "requires": {
4361 | "source-map": "0.5.7",
4362 | "uglify-to-browserify": "1.0.2",
4363 | "yargs": "3.10.0"
4364 | },
4365 | "dependencies": {
4366 | "yargs": {
4367 | "version": "3.10.0",
4368 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
4369 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
4370 | "dev": true,
4371 | "requires": {
4372 | "camelcase": "1.2.1",
4373 | "cliui": "2.1.0",
4374 | "decamelize": "1.2.0",
4375 | "window-size": "0.1.0"
4376 | }
4377 | }
4378 | }
4379 | },
4380 | "uglify-to-browserify": {
4381 | "version": "1.0.2",
4382 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
4383 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
4384 | "dev": true,
4385 | "optional": true
4386 | },
4387 | "uglifyjs-webpack-plugin": {
4388 | "version": "0.4.6",
4389 | "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
4390 | "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
4391 | "dev": true,
4392 | "requires": {
4393 | "source-map": "0.5.7",
4394 | "uglify-js": "2.8.29",
4395 | "webpack-sources": "1.1.0"
4396 | }
4397 | },
4398 | "undefsafe": {
4399 | "version": "0.0.3",
4400 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz",
4401 | "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=",
4402 | "dev": true
4403 | },
4404 | "unique-string": {
4405 | "version": "1.0.0",
4406 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
4407 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
4408 | "dev": true,
4409 | "requires": {
4410 | "crypto-random-string": "1.0.0"
4411 | }
4412 | },
4413 | "unpipe": {
4414 | "version": "1.0.0",
4415 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
4416 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
4417 | },
4418 | "unzip-response": {
4419 | "version": "2.0.1",
4420 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
4421 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
4422 | "dev": true
4423 | },
4424 | "update-notifier": {
4425 | "version": "2.3.0",
4426 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
4427 | "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
4428 | "dev": true,
4429 | "requires": {
4430 | "boxen": "1.3.0",
4431 | "chalk": "2.3.0",
4432 | "configstore": "3.1.1",
4433 | "import-lazy": "2.1.0",
4434 | "is-installed-globally": "0.1.0",
4435 | "is-npm": "1.0.0",
4436 | "latest-version": "3.1.0",
4437 | "semver-diff": "2.1.0",
4438 | "xdg-basedir": "3.0.0"
4439 | }
4440 | },
4441 | "url": {
4442 | "version": "0.11.0",
4443 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
4444 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
4445 | "dev": true,
4446 | "requires": {
4447 | "punycode": "1.3.2",
4448 | "querystring": "0.2.0"
4449 | },
4450 | "dependencies": {
4451 | "punycode": {
4452 | "version": "1.3.2",
4453 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
4454 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
4455 | "dev": true
4456 | }
4457 | }
4458 | },
4459 | "url-parse-lax": {
4460 | "version": "1.0.0",
4461 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
4462 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
4463 | "dev": true,
4464 | "requires": {
4465 | "prepend-http": "1.0.4"
4466 | }
4467 | },
4468 | "util": {
4469 | "version": "0.10.3",
4470 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
4471 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
4472 | "dev": true,
4473 | "requires": {
4474 | "inherits": "2.0.1"
4475 | },
4476 | "dependencies": {
4477 | "inherits": {
4478 | "version": "2.0.1",
4479 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
4480 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
4481 | "dev": true
4482 | }
4483 | }
4484 | },
4485 | "util-deprecate": {
4486 | "version": "1.0.2",
4487 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
4488 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
4489 | },
4490 | "utils-merge": {
4491 | "version": "1.0.1",
4492 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
4493 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
4494 | },
4495 | "validate-npm-package-license": {
4496 | "version": "3.0.1",
4497 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
4498 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
4499 | "dev": true,
4500 | "requires": {
4501 | "spdx-correct": "1.0.2",
4502 | "spdx-expression-parse": "1.0.4"
4503 | }
4504 | },
4505 | "vary": {
4506 | "version": "1.1.2",
4507 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
4508 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
4509 | },
4510 | "vm-browserify": {
4511 | "version": "0.0.4",
4512 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
4513 | "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
4514 | "dev": true,
4515 | "requires": {
4516 | "indexof": "0.0.1"
4517 | }
4518 | },
4519 | "watchpack": {
4520 | "version": "1.4.0",
4521 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz",
4522 | "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=",
4523 | "dev": true,
4524 | "requires": {
4525 | "async": "2.6.0",
4526 | "chokidar": "1.7.0",
4527 | "graceful-fs": "4.1.11"
4528 | },
4529 | "dependencies": {
4530 | "async": {
4531 | "version": "2.6.0",
4532 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
4533 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
4534 | "dev": true,
4535 | "requires": {
4536 | "lodash": "4.17.4"
4537 | }
4538 | }
4539 | }
4540 | },
4541 | "webpack": {
4542 | "version": "3.10.0",
4543 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz",
4544 | "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==",
4545 | "dev": true,
4546 | "requires": {
4547 | "acorn": "5.2.1",
4548 | "acorn-dynamic-import": "2.0.2",
4549 | "ajv": "5.5.1",
4550 | "ajv-keywords": "2.1.1",
4551 | "async": "2.6.0",
4552 | "enhanced-resolve": "3.4.1",
4553 | "escope": "3.6.0",
4554 | "interpret": "1.1.0",
4555 | "json-loader": "0.5.7",
4556 | "json5": "0.5.1",
4557 | "loader-runner": "2.3.0",
4558 | "loader-utils": "1.1.0",
4559 | "memory-fs": "0.4.1",
4560 | "mkdirp": "0.5.1",
4561 | "node-libs-browser": "2.1.0",
4562 | "source-map": "0.5.7",
4563 | "supports-color": "4.5.0",
4564 | "tapable": "0.2.8",
4565 | "uglifyjs-webpack-plugin": "0.4.6",
4566 | "watchpack": "1.4.0",
4567 | "webpack-sources": "1.1.0",
4568 | "yargs": "8.0.2"
4569 | },
4570 | "dependencies": {
4571 | "async": {
4572 | "version": "2.6.0",
4573 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
4574 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
4575 | "dev": true,
4576 | "requires": {
4577 | "lodash": "4.17.4"
4578 | }
4579 | }
4580 | }
4581 | },
4582 | "webpack-sources": {
4583 | "version": "1.1.0",
4584 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
4585 | "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
4586 | "dev": true,
4587 | "requires": {
4588 | "source-list-map": "2.0.0",
4589 | "source-map": "0.6.1"
4590 | },
4591 | "dependencies": {
4592 | "source-map": {
4593 | "version": "0.6.1",
4594 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
4595 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
4596 | "dev": true
4597 | }
4598 | }
4599 | },
4600 | "which": {
4601 | "version": "1.3.0",
4602 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
4603 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
4604 | "dev": true,
4605 | "requires": {
4606 | "isexe": "2.0.0"
4607 | }
4608 | },
4609 | "which-module": {
4610 | "version": "2.0.0",
4611 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
4612 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
4613 | "dev": true
4614 | },
4615 | "widest-line": {
4616 | "version": "2.0.0",
4617 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
4618 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
4619 | "dev": true,
4620 | "requires": {
4621 | "string-width": "2.1.1"
4622 | }
4623 | },
4624 | "window-size": {
4625 | "version": "0.1.0",
4626 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
4627 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
4628 | "dev": true
4629 | },
4630 | "wordwrap": {
4631 | "version": "0.0.2",
4632 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
4633 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
4634 | "dev": true
4635 | },
4636 | "wrap-ansi": {
4637 | "version": "2.1.0",
4638 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
4639 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
4640 | "dev": true,
4641 | "requires": {
4642 | "string-width": "1.0.2",
4643 | "strip-ansi": "3.0.1"
4644 | },
4645 | "dependencies": {
4646 | "string-width": {
4647 | "version": "1.0.2",
4648 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
4649 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
4650 | "dev": true,
4651 | "requires": {
4652 | "code-point-at": "1.1.0",
4653 | "is-fullwidth-code-point": "1.0.0",
4654 | "strip-ansi": "3.0.1"
4655 | }
4656 | }
4657 | }
4658 | },
4659 | "wrappy": {
4660 | "version": "1.0.2",
4661 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
4662 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
4663 | "dev": true
4664 | },
4665 | "write-file-atomic": {
4666 | "version": "2.3.0",
4667 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
4668 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
4669 | "dev": true,
4670 | "requires": {
4671 | "graceful-fs": "4.1.11",
4672 | "imurmurhash": "0.1.4",
4673 | "signal-exit": "3.0.2"
4674 | }
4675 | },
4676 | "xdg-basedir": {
4677 | "version": "3.0.0",
4678 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
4679 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
4680 | "dev": true
4681 | },
4682 | "xtend": {
4683 | "version": "4.0.1",
4684 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
4685 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
4686 | },
4687 | "y18n": {
4688 | "version": "3.2.1",
4689 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
4690 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
4691 | "dev": true
4692 | },
4693 | "yallist": {
4694 | "version": "2.1.2",
4695 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
4696 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
4697 | "dev": true
4698 | },
4699 | "yargs": {
4700 | "version": "8.0.2",
4701 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
4702 | "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
4703 | "dev": true,
4704 | "requires": {
4705 | "camelcase": "4.1.0",
4706 | "cliui": "3.2.0",
4707 | "decamelize": "1.2.0",
4708 | "get-caller-file": "1.0.2",
4709 | "os-locale": "2.1.0",
4710 | "read-pkg-up": "2.0.0",
4711 | "require-directory": "2.1.1",
4712 | "require-main-filename": "1.0.1",
4713 | "set-blocking": "2.0.0",
4714 | "string-width": "2.1.1",
4715 | "which-module": "2.0.0",
4716 | "y18n": "3.2.1",
4717 | "yargs-parser": "7.0.0"
4718 | },
4719 | "dependencies": {
4720 | "camelcase": {
4721 | "version": "4.1.0",
4722 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
4723 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
4724 | "dev": true
4725 | },
4726 | "cliui": {
4727 | "version": "3.2.0",
4728 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
4729 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
4730 | "dev": true,
4731 | "requires": {
4732 | "string-width": "1.0.2",
4733 | "strip-ansi": "3.0.1",
4734 | "wrap-ansi": "2.1.0"
4735 | },
4736 | "dependencies": {
4737 | "string-width": {
4738 | "version": "1.0.2",
4739 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
4740 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
4741 | "dev": true,
4742 | "requires": {
4743 | "code-point-at": "1.1.0",
4744 | "is-fullwidth-code-point": "1.0.0",
4745 | "strip-ansi": "3.0.1"
4746 | }
4747 | }
4748 | }
4749 | }
4750 | }
4751 | },
4752 | "yargs-parser": {
4753 | "version": "7.0.0",
4754 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
4755 | "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
4756 | "dev": true,
4757 | "requires": {
4758 | "camelcase": "4.1.0"
4759 | },
4760 | "dependencies": {
4761 | "camelcase": {
4762 | "version": "4.1.0",
4763 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
4764 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
4765 | "dev": true
4766 | }
4767 | }
4768 | }
4769 | }
4770 | }
4771 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "peerai-api",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "author": "Luke Schoen",
6 | "license": "MIT",
7 | "dependencies": {
8 | "body-parser": "^1.18.2",
9 | "eth-lightwallet": "2.5",
10 | "ethereumjs-tx": "1.3",
11 | "ethereumjs-util": "4.4",
12 | "express": "^4.16.2",
13 | "jsonwebtoken": "^8.1.0",
14 | "lodash": "^4.17.4",
15 | "mongoose": "^4.13.7",
16 | "passport": "^0.4.0",
17 | "passport-jwt": "^3.0.1",
18 | "passport-local": "^1.0.0",
19 | "passport-local-mongoose": "^4.4.0",
20 | "web3": "0.19"
21 | },
22 | "devDependencies": {
23 | "chai": "^4.1.2",
24 | "chai-http": "^3.0.0",
25 | "dotenv": "^4.0.0",
26 | "ether-pudding": "^3.2.0",
27 | "mocha": "^4.0.1",
28 | "nodemon": "^1.13.3",
29 | "solc": "^0.4.18",
30 | "truffle-artifactor": "^3.0.1"
31 | },
32 | "scripts": {
33 | "mongod": "mongod",
34 | "dev": "NODE_ENV=development nodemon server.js",
35 | "compile": "node lib/compileContract.js Peerism",
36 | "deploy": "node lib/deployContract.js Peerism",
37 | "curl": "curl -v -X POST http://localhost:7000/contracts/generate -d '{\"contractName\":\"Peerism\"}' -H 'Content-Type: application/json'",
38 | "seed": "node ./models/seeds.js",
39 | "drop": "node ./models/drop.js",
40 | "reset": "npm run drop && npm run seed",
41 | "test": "truffle test; NODE_ENV=testing mocha --recursive test/**/*_test.js",
42 | "test-watch": "nodemon --exec \"yarn test\""
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/routes/contracts.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const contractsMiddleware = require('../middleware/contracts');
3 |
4 | const router = new express.Router();
5 |
6 | // ROUTES
7 |
8 | // POST localhost:7000/contracts/generate
9 | router.post('/generate',
10 | contractsMiddleware.compile,
11 | contractsMiddleware.deploy,
12 | contractsMiddleware.getContractAddress
13 | );
14 |
15 | module.exports = router;
--------------------------------------------------------------------------------
/routes/users.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const User = require('../models/User');
3 | const Skill = require('../models/Skill');
4 | const authMiddleware = require('../middleware/auth');
5 |
6 | const router = new express.Router();
7 |
8 | // Require controller modules
9 | const usersController = require('../controllers/usersController');
10 |
11 | // ROUTES
12 |
13 | // Register
14 | router.post('/auth/register',
15 | // Middlware Chain
16 | (req, res, next) => {
17 | console.log('Processing user registration with: ', req.body);
18 | authMiddleware.register(req, res, next);
19 | },
20 | (req, res, next) => {
21 | authMiddleware.signIn;
22 | next();
23 | },
24 | // Handler
25 | authMiddleware.signJWTForUser
26 | )
27 |
28 | router.post('/auth',
29 | authMiddleware.signIn,
30 | authMiddleware.signJWTForUser
31 | )
32 |
33 | // GET localhost:7000/users
34 | router.get('/',
35 | // authMiddleware.validateJWTManually,
36 | authMiddleware.validateJWTWithPassportJWT,
37 | usersController.userList
38 | );
39 |
40 | // POST localhost:7000/users/create
41 | router.post('/create',
42 | // authMiddleware.validateJWTManually,
43 | authMiddleware.validateJWTWithPassportJWT,
44 | usersController.userCreate
45 | );
46 |
47 | module.exports = router;
48 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const app = require('./app');
2 |
3 | const port = 7000;
4 | app.listen(port, (error) => {
5 | if (error) {
6 | console.error('Error starting server: ', error);
7 | } else {
8 | console.log(`Success starting server http://localhost:${port}/`);
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/test/contracts/TestPeerism.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.18;
2 |
3 | import "truffle/Assert.sol";
4 | import "truffle/DeployedAddresses.sol";
5 | import "../../contracts/Peerism.sol";
6 |
7 | contract TestPeerism {
8 |
9 | function testSkillEventUsingDeployedContract() public {
10 | Peerism peerism = Peerism(DeployedAddresses.Peerism());
11 |
12 | uint expected = 1;
13 |
14 | Assert.equal(peerism.skill(tx.origin), expected, "Skill event should have value of 1");
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/test/contracts/peerism.js:
--------------------------------------------------------------------------------
1 | var Peerism = artifacts.require("./Peerism.sol");
2 |
3 | contract('Peerism', function(accounts) {
4 | it("should trigger Skill Event returning event transaction hash", function() {
5 | return Peerism.deployed().then(function(instance) {
6 | return instance.skill('3d printing',
7 | {fromBlock: 0, toBlock: 'latest'},
8 | function(error, result) {
9 | if (!error) {
10 | return result;
11 | } else {
12 | return error;
13 | }
14 | }
15 | }).then(function(result) {
16 | let expectedTxHash = '0x5cafdf008286ad83d0b220bcabe7ade5650babfbb7a3844ba1debd60d2a13ae1';
17 | assert.equal(result, expectedTxHash, "Skill Event did not trigger expected transaction hash");
18 | });
19 | });
20 | });
21 |
22 |
--------------------------------------------------------------------------------
/test/models/users_test.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const chai = require('chai');
4 | const expect = chai.expect;
5 |
6 | const User = require('../../models/User');
7 | const Skill = require('../../models/Skill');
8 |
9 | describe("User Model", function() {
10 | it("should have a full name", function() {
11 | const user = new User({ email: 'a@b.com', name: 'Luke' });
12 | expect(user.fullName()).to.equal('Luke');
13 | })
14 | })
--------------------------------------------------------------------------------
/test/routes/users_test.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const chai = require('chai');
4 | const expect = chai.expect;
5 | const app = require('../../app');
6 | const config = require('../../config/config');
7 |
8 | const User = require('../../models/User');
9 | const Skill = require('../../models/Skill');
10 |
11 | chai.use(require('chai-http'));
12 |
13 | describe("Users Routes API", function(done) {
14 |
15 | // Setup server for tests
16 | let server;
17 | const port = config.port;
18 |
19 | // Asynchronous
20 | before(function(done) {
21 | server = app.listen(port, done);
22 | });
23 |
24 | // Shut down server after the tests
25 | after(function(done) {
26 | server.close(done);
27 | });
28 |
29 | beforeEach(function(done) {
30 |
31 | let firstSkill = Skill.create({
32 | skill: 'Ethereum'
33 | });
34 |
35 | User.create({
36 | email: 'luke@schoen.com',
37 | password: '123456',
38 | name: 'Luke',
39 | skills: [firstSkill]
40 | }, done);
41 | });
42 |
43 | afterEach(function(done) {
44 | User.remove({}, done);
45 | });
46 |
47 | // test the endpoints
48 | it("should return a list of users", function() {
49 | return chai.request(app)
50 | .get('/users')
51 | .then(function(res) {
52 | expect(res).to.have.status(200);
53 | expect(res).to.be.json;
54 | // expect(res.data).to.have.length(1);
55 | })
56 | // .catch((err) => {
57 | // console.log('Error: ', err);
58 | // })
59 | })
60 |
61 | it("should create a user", function() {
62 | return chai.request(app)
63 | .post('/users/create')
64 | .field('email', 'a@b.com')
65 | .field('name', 'Luke')
66 | .then(function(res) {
67 | expect(res).to.have.status(201);
68 | })
69 | });
70 | })
--------------------------------------------------------------------------------
/truffle-box.json:
--------------------------------------------------------------------------------
1 | {
2 | "ignore": [
3 | "README.md",
4 | ".gitignore"
5 | ],
6 | "commands": {
7 | "Run MongoDB server in Terminal #1": "npm run mongod",
8 | "Compile contracts in Terminal #2": "npm run compile",
9 | "Deploy contracts in Terminal #2": "npm run deploy",
10 | "Test contracts in Terminal #2": "truffle test",
11 | "Run dev server in Terminal #2": "npm run drop; npm run dev;",
12 | "Compile and migrate contracts with request to API in Terminal #3": "npm run curl"
13 | },
14 | "hooks": {
15 | "post-unpack": ""
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/truffle.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | // http://truffleframework.com/docs/advanced/configuration
3 | networks: {
4 | development: {
5 | host: "localhost",
6 | port: 8545,
7 | network_id: "*" // Match any network id
8 | }
9 | }
10 | };
11 |
--------------------------------------------------------------------------------