├── .gitignore ├── views ├── index.jade ├── error.jade └── layout.jade ├── public └── stylesheets │ └── style.css ├── routes ├── index.js ├── users.js └── blockchain.js ├── .vscode └── launch.json ├── package.json ├── testing.js ├── testing.py ├── Readme.md ├── app.js ├── bin └── www ├── Blockchain └── Blockchain.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package-lock.json -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.render('index', { title: 'Express' }); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "type": "node", 10 | "request": "launch", 11 | "name": "Launch Program", 12 | "program": "${workspaceFolder}/bin/www" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockchain-trial-javascript", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "async": "^2.5.0", 10 | "body-parser": "~1.17.1", 11 | "cookie-parser": "~1.4.3", 12 | "crypto": "^1.0.1", 13 | "crypto-js": "^3.1.9-1", 14 | "debug": "~2.6.3", 15 | "express": "~4.15.2", 16 | "jade": "~1.11.0", 17 | "json-stable-stringify": "^1.0.1", 18 | "morgan": "~1.8.1", 19 | "request": "^2.83.0", 20 | "request-promise": "^4.2.2", 21 | "serve-favicon": "~2.4.2", 22 | "uuid4": "^1.0.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /testing.js: -------------------------------------------------------------------------------- 1 | const stringify = require('json-stable-stringify'); 2 | 3 | const block = { 4 | 'index': 1, 5 | 'timestamp': 1506057125.900785, 6 | 'transactions': [ 7 | { 8 | 'sender': "8527147fe1f5426f9dd545de4b27ee00", 9 | 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 10 | 'amount': 5, 11 | } 12 | ], 13 | 'proof': 324984774000, 14 | 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" 15 | } 16 | const CryptoJs = require("crypto-js"); 17 | // console.log(JSON.stringify(block,Object.keys(block).sort())); 18 | console.log(stringify(block)); 19 | let c = CryptoJs.SHA256(stringify(block)); 20 | console.log(c.toString(CryptoJs.enc.Hex)); 21 | 22 | 23 | -------------------------------------------------------------------------------- /testing.py: -------------------------------------------------------------------------------- 1 | import json,hashlib 2 | block = { 3 | 'index': 1, 4 | 'timestamp': 1506057125.900785, 5 | 'transactions': [ 6 | { 7 | 'sender': "8527147fe1f5426f9dd545de4b27ee00", 8 | 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 9 | 'amount': 5, 10 | } 11 | ], 12 | 'proof': 324984774000, 13 | 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" 14 | } 15 | 16 | def hash(block): 17 | """ 18 | Creates a SHA-256 hash of a Block 19 | :param block: Block 20 | :return: 21 | """ 22 | 23 | # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes 24 | block_string = json.dumps(block,indent=None,separators=(',', ':'),sort_keys=True).encode() 25 | print(block_string) 26 | return hashlib.sha256(block_string).hexdigest() 27 | 28 | print(hash(block)) 29 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # ExpressChain - NodeJs - Http - Implementation of basic Blockchain 3 | 4 | Expresschain is basic implentation of Blockchain in NodeJs for people who are struggling hard to understand What Blockchain is basically. 5 | 6 | This Repository is inspired by this articly on hackernoon - https://hackernoon.com/learn-blockchains-by-building-one-117428612f46 7 | 8 | ###Running it ? 9 | 10 | $ git clone https://github.com/arihantdaga/blockchain-basic-example-nodeJs.git 11 | $ cd blockchain-basic-example-nodeJs 12 | $ npm install 13 | $ npm start 14 | 15 | By default port no. is 3000. So you should see server running at http://localhost:3000/ 16 | 17 | ###Endpoints 18 | 19 | - /blockchain/transaction/new [POST] - Add a new transaction 20 | - /blockchain/mine [GET] - Mine a new Block 21 | - /blockchain/chain [GET] - Get Full chain 22 | - /blockchain/nodes/register [POST] - Register a new node in the blockchain network 23 | - /blockchain/nodes/resolve [GET] - Resolve Conflict among nodes in the network 24 | 25 | ### Tutorial 26 | You can refer to the original article posted on hackernoon - https://hackernoon.com/learn-blockchains-by-building-one-117428612f46. 27 | 28 | ### Future Plans 29 | Adding Database Support 30 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var favicon = require('serve-favicon'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | var blockchain = require('./routes/blockchain'); 8 | const uuid = require("uuid4"); 9 | 10 | var app = express(); 11 | 12 | const node_id = uuid(); 13 | 14 | app.set("node_id", node_id); 15 | 16 | // view engine setup 17 | app.set('views', path.join(__dirname, 'views')); 18 | app.set('view engine', 'jade'); 19 | 20 | // uncomment after placing your favicon in /public 21 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 22 | app.use(logger('dev')); 23 | app.use(bodyParser.json()); 24 | app.use(bodyParser.urlencoded({ extended: false })); 25 | app.use(cookieParser()); 26 | app.use(express.static(path.join(__dirname, 'public'))); 27 | 28 | 29 | app.use("/blockchain",blockchain); 30 | 31 | // catch 404 and forward to error handler 32 | app.use(function(req, res, next) { 33 | var err = new Error('Not Found'); 34 | err.status = 404; 35 | next(err); 36 | }); 37 | 38 | // error handler 39 | app.use(function(err, req, res, next) { 40 | // set locals, only providing error in development 41 | res.locals.message = err.message; 42 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 43 | 44 | // render the error page 45 | res.status(err.status || 500); 46 | res.render('error'); 47 | }); 48 | 49 | module.exports = app; 50 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('blockchain-trial-javascript:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3003'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /routes/blockchain.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const {BlockChain} = require("../Blockchain/Blockchain"); 4 | 5 | let blockchain = new BlockChain(); 6 | 7 | router.post("/transaction/new",(req,res,next)=>{ 8 | let required = ['sender', 'recipient', 'amount']; 9 | 10 | // Validate input 11 | if(!req.body) return next({status:400,message: "Invalid data"}); 12 | 13 | for(let item of required){ 14 | if(!req.body[item]){ 15 | return next({status:400,message:`${item} is required`}); 16 | } 17 | } 18 | let block = blockchain.newTransaction(req.body.sender,req.body.recipient,req.body.amount); 19 | return res.json({status:1, message: `Transaction will be added in the block index - ${block}`}); 20 | 21 | }); 22 | 23 | router.get("/mine",(req,res,next)=>{ 24 | let last_proof = blockchain.lastBlock().proof; 25 | let proof = blockchain.proofOfWork(last_proof); 26 | let reward_transaction = { 27 | sender: "0", 28 | recipient: req.app.get("node_id"), 29 | amount: 1 30 | } 31 | // Reward The Miner 32 | blockchain.newTransaction(reward_transaction.sender,reward_transaction.recipient,reward_transaction.amount); 33 | 34 | // Forge New Block 35 | let block = blockchain.newBlock(proof); 36 | let response = { 37 | 'status': 1, 38 | 'message': "New Block Forged", 39 | 'index': block['index'], 40 | 'transactions': block['transactions'], 41 | 'proof': block['proof'], 42 | 'previous_hash': block['previous_hash'], 43 | } 44 | return res.json(response); 45 | 46 | 47 | 48 | }); 49 | 50 | router.get("/chain",(req,res,next)=>{ 51 | let fullChain = { 52 | chain: blockchain.chain, 53 | length: blockchain.chain.length 54 | } 55 | return res.json(fullChain); 56 | }); 57 | 58 | router.post("/nodes/register",(req,res,next)=>{ 59 | if(!req.body.nodes){ 60 | return next({status:400,message:"Invalid Nodes List"}); 61 | } 62 | req.body.nodes.map(node=> blockchain.registerNode(node)); 63 | return res.json({ 64 | message:"New Nodes have been added", 65 | "total_nodes": [...blockchain.nodes] 66 | }); 67 | }); 68 | 69 | router.get("/nodes/resolve",(req,res,next)=>{ 70 | let response = {} 71 | blockchain.resolveConflict().then(replaced=>{ 72 | if(replaced){ 73 | response.message = "Our Chain was replaced", 74 | response.new_chain = blockchain.chain 75 | }else{ 76 | response.message = "Our chain is authoritative", 77 | response.chain = blockchain.chain 78 | } 79 | return res.json(response); 80 | }).catch(err=>{ 81 | return next(err); 82 | }) 83 | }); 84 | 85 | module.exports = router; -------------------------------------------------------------------------------- /Blockchain/Blockchain.js: -------------------------------------------------------------------------------- 1 | const CryptoJs = require("crypto-js"); 2 | const request = require("request-promise"); 3 | const async = require("async"); 4 | const url = require("url"); 5 | 6 | // Good for Json Dumps with keys in sorted order - simmilar to python's 7 | // json.dumps(dict, sort_keys=True) 8 | const stringify = require('json-stable-stringify'); 9 | 10 | 11 | class BlockChain{ 12 | constructor(){ 13 | this.chain = []; 14 | this.current_transactions = []; 15 | this.newBlock(100,1); 16 | this.nodes = new Set(); 17 | } 18 | 19 | newBlock(proof,previous_hash=null){ 20 | let block = { 21 | index: this.chain.length, 22 | timestamp : Date.now(), 23 | transactions: this.current_transactions, 24 | proof:proof, 25 | previous_hash : previous_hash || this._hash(this.chain[this.chain.length-1]) 26 | }; 27 | this.chain.push(block); 28 | this.current_transactions = []; 29 | return block; 30 | } 31 | 32 | lastBlock(){ 33 | return this.chain[this.chain.length-1]; 34 | } 35 | 36 | _hash(block){ 37 | return CryptoJs.SHA256(stringify(block)).toString(CryptoJs.enc.Hex); 38 | } 39 | 40 | newTransaction(sender,recipient,amount){ 41 | this.current_transactions.push({sender,recipient,amount}); 42 | return this.lastBlock()["index"] + 1; 43 | } 44 | registerNode(address){ 45 | /** 46 | * Add a new node to the list of nodes 47 | * @param address: Address of node. Eg. 'http://192.168.0.5:5000' 48 | * return: None 49 | */ 50 | let hostaddress = url.parse(address); 51 | hostaddress = hostaddress.host; 52 | this.nodes.add(hostaddress); 53 | } 54 | resolveConflict(){ 55 | /** 56 | * This is our Consensus Algorithm, it resolves conflicts 57 | * by replacing our chain with the longest one in the network. 58 | * @return: Promise with boolean True - if chain replaced, false if chain not replaced. 59 | */ 60 | return new Promise((resolve,reject)=>{ 61 | let index = 1; 62 | let new_chain = null; 63 | let $this = this; 64 | let max_chain_length = this.chain.length; 65 | 66 | async.each([...this.nodes], function(node,callback){ 67 | request({ 68 | uri: `http://${node}/blockchain/chain`, 69 | json: true, 70 | method:"GET" 71 | }).then(data=>{ 72 | 73 | if($this.isValidChain(data.chain) && data.length > max_chain_length){ 74 | max_chain_length = data.length; 75 | new_chain = data.chain; 76 | } 77 | callback(); 78 | }).catch(err=>{ 79 | console.log(err); 80 | callback(err); 81 | }) 82 | }, function(err){ 83 | if(err){ 84 | console.log("Error Occured in verifying chain"); 85 | console.log(err); 86 | return reject(err); 87 | } 88 | if(new_chain){ 89 | $this.chain = new_chain; 90 | return resolve(true);; 91 | } 92 | return resolve(false);; 93 | }) 94 | }); 95 | 96 | 97 | 98 | } 99 | isValidChain(chain){ 100 | let index = 1; 101 | while (index 126 | * :return: 127 | */ 128 | let proof = 0; 129 | while (!this.isValidProof(last_proof,proof)) 130 | proof+=1; 131 | 132 | return proof; 133 | 134 | } 135 | 136 | isValidProof(last_proof,proof){ 137 | let hash = CryptoJs.SHA256(`${last_proof}${proof}`).toString(CryptoJs.enc.Hex); 138 | return hash.substr(0,4) == "0000"; 139 | } 140 | 141 | } 142 | exports.BlockChain = BlockChain; 143 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.3: 6 | version "1.3.4" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" 8 | dependencies: 9 | mime-types "~2.1.16" 10 | negotiator "0.6.1" 11 | 12 | acorn-globals@^1.0.3: 13 | version "1.0.9" 14 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" 15 | dependencies: 16 | acorn "^2.1.0" 17 | 18 | acorn@^1.0.1: 19 | version "1.2.2" 20 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" 21 | 22 | acorn@^2.1.0: 23 | version "2.7.0" 24 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" 25 | 26 | ajv@^5.1.0: 27 | version "5.2.5" 28 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.5.tgz#b637234d3e2675eb5f79fc652242a853a48cb49f" 29 | dependencies: 30 | co "^4.6.0" 31 | fast-deep-equal "^1.0.0" 32 | json-schema-traverse "^0.3.0" 33 | json-stable-stringify "^1.0.1" 34 | 35 | align-text@^0.1.1, align-text@^0.1.3: 36 | version "0.1.4" 37 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 38 | dependencies: 39 | kind-of "^3.0.2" 40 | longest "^1.0.1" 41 | repeat-string "^1.5.2" 42 | 43 | amdefine@>=0.0.4: 44 | version "1.0.1" 45 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 46 | 47 | array-flatten@1.1.1: 48 | version "1.1.1" 49 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 50 | 51 | asap@~1.0.0: 52 | version "1.0.0" 53 | resolved "https://registry.yarnpkg.com/asap/-/asap-1.0.0.tgz#b2a45da5fdfa20b0496fc3768cc27c12fa916a7d" 54 | 55 | asn1@~0.2.3: 56 | version "0.2.3" 57 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 58 | 59 | assert-plus@1.0.0, assert-plus@^1.0.0: 60 | version "1.0.0" 61 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 62 | 63 | async@^2.5.0: 64 | version "2.5.0" 65 | resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" 66 | dependencies: 67 | lodash "^4.14.0" 68 | 69 | asynckit@^0.4.0: 70 | version "0.4.0" 71 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 72 | 73 | aws-sign2@~0.7.0: 74 | version "0.7.0" 75 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 76 | 77 | aws4@^1.6.0: 78 | version "1.6.0" 79 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 80 | 81 | basic-auth@~1.1.0: 82 | version "1.1.0" 83 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" 84 | 85 | bcrypt-pbkdf@^1.0.0: 86 | version "1.0.1" 87 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 88 | dependencies: 89 | tweetnacl "^0.14.3" 90 | 91 | bluebird@^3.5.0: 92 | version "3.5.1" 93 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 94 | 95 | body-parser@~1.17.1: 96 | version "1.17.2" 97 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" 98 | dependencies: 99 | bytes "2.4.0" 100 | content-type "~1.0.2" 101 | debug "2.6.7" 102 | depd "~1.1.0" 103 | http-errors "~1.6.1" 104 | iconv-lite "0.4.15" 105 | on-finished "~2.3.0" 106 | qs "6.4.0" 107 | raw-body "~2.2.0" 108 | type-is "~1.6.15" 109 | 110 | boom@4.x.x: 111 | version "4.3.1" 112 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 113 | dependencies: 114 | hoek "4.x.x" 115 | 116 | boom@5.x.x: 117 | version "5.2.0" 118 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 119 | dependencies: 120 | hoek "4.x.x" 121 | 122 | bytes@2.4.0: 123 | version "2.4.0" 124 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" 125 | 126 | camelcase@^1.0.2: 127 | version "1.2.1" 128 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 129 | 130 | caseless@~0.12.0: 131 | version "0.12.0" 132 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 133 | 134 | center-align@^0.1.1: 135 | version "0.1.3" 136 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 137 | dependencies: 138 | align-text "^0.1.3" 139 | lazy-cache "^1.0.3" 140 | 141 | character-parser@1.2.1: 142 | version "1.2.1" 143 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-1.2.1.tgz#c0dde4ab182713b919b970959a123ecc1a30fcd6" 144 | 145 | clean-css@^3.1.9: 146 | version "3.4.28" 147 | resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" 148 | dependencies: 149 | commander "2.8.x" 150 | source-map "0.4.x" 151 | 152 | cliui@^2.1.0: 153 | version "2.1.0" 154 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 155 | dependencies: 156 | center-align "^0.1.1" 157 | right-align "^0.1.1" 158 | wordwrap "0.0.2" 159 | 160 | co@^4.6.0: 161 | version "4.6.0" 162 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 163 | 164 | combined-stream@^1.0.5, combined-stream@~1.0.5: 165 | version "1.0.5" 166 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 167 | dependencies: 168 | delayed-stream "~1.0.0" 169 | 170 | commander@2.8.x: 171 | version "2.8.1" 172 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" 173 | dependencies: 174 | graceful-readlink ">= 1.0.0" 175 | 176 | commander@~2.6.0: 177 | version "2.6.0" 178 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" 179 | 180 | constantinople@~3.0.1: 181 | version "3.0.2" 182 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.0.2.tgz#4b945d9937907bcd98ee575122c3817516544141" 183 | dependencies: 184 | acorn "^2.1.0" 185 | 186 | content-disposition@0.5.2: 187 | version "0.5.2" 188 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 189 | 190 | content-type@~1.0.2: 191 | version "1.0.4" 192 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 193 | 194 | cookie-parser@~1.4.3: 195 | version "1.4.3" 196 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" 197 | dependencies: 198 | cookie "0.3.1" 199 | cookie-signature "1.0.6" 200 | 201 | cookie-signature@1.0.6: 202 | version "1.0.6" 203 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 204 | 205 | cookie@0.3.1: 206 | version "0.3.1" 207 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 208 | 209 | core-util-is@1.0.2: 210 | version "1.0.2" 211 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 212 | 213 | cryptiles@3.x.x: 214 | version "3.1.2" 215 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 216 | dependencies: 217 | boom "5.x.x" 218 | 219 | crypto-js@^3.1.9-1: 220 | version "3.1.9-1" 221 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" 222 | 223 | crypto@^1.0.1: 224 | version "1.0.1" 225 | resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" 226 | 227 | css-parse@1.0.4: 228 | version "1.0.4" 229 | resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.0.4.tgz#38b0503fbf9da9f54e9c1dbda60e145c77117bdd" 230 | 231 | css-stringify@1.0.5: 232 | version "1.0.5" 233 | resolved "https://registry.yarnpkg.com/css-stringify/-/css-stringify-1.0.5.tgz#b0d042946db2953bb9d292900a6cb5f6d0122031" 234 | 235 | css@~1.0.8: 236 | version "1.0.8" 237 | resolved "https://registry.yarnpkg.com/css/-/css-1.0.8.tgz#9386811ca82bccc9ee7fb5a732b1e2a317c8a3e7" 238 | dependencies: 239 | css-parse "1.0.4" 240 | css-stringify "1.0.5" 241 | 242 | dashdash@^1.12.0: 243 | version "1.14.1" 244 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 245 | dependencies: 246 | assert-plus "^1.0.0" 247 | 248 | debug@2.6.7: 249 | version "2.6.7" 250 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" 251 | dependencies: 252 | ms "2.0.0" 253 | 254 | debug@2.6.8: 255 | version "2.6.8" 256 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 257 | dependencies: 258 | ms "2.0.0" 259 | 260 | debug@2.6.9, debug@~2.6.3: 261 | version "2.6.9" 262 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 263 | dependencies: 264 | ms "2.0.0" 265 | 266 | decamelize@^1.0.0: 267 | version "1.2.0" 268 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 269 | 270 | delayed-stream@~1.0.0: 271 | version "1.0.0" 272 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 273 | 274 | depd@1.1.1, depd@~1.1.0, depd@~1.1.1: 275 | version "1.1.1" 276 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 277 | 278 | destroy@~1.0.4: 279 | version "1.0.4" 280 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 281 | 282 | ecc-jsbn@~0.1.1: 283 | version "0.1.1" 284 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 285 | dependencies: 286 | jsbn "~0.1.0" 287 | 288 | ee-first@1.1.1: 289 | version "1.1.1" 290 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 291 | 292 | encodeurl@~1.0.1: 293 | version "1.0.1" 294 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 295 | 296 | escape-html@~1.0.3: 297 | version "1.0.3" 298 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 299 | 300 | etag@~1.8.0, etag@~1.8.1: 301 | version "1.8.1" 302 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 303 | 304 | express@~4.15.2: 305 | version "4.15.5" 306 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz#670235ca9598890a5ae8170b83db722b842ed927" 307 | dependencies: 308 | accepts "~1.3.3" 309 | array-flatten "1.1.1" 310 | content-disposition "0.5.2" 311 | content-type "~1.0.2" 312 | cookie "0.3.1" 313 | cookie-signature "1.0.6" 314 | debug "2.6.9" 315 | depd "~1.1.1" 316 | encodeurl "~1.0.1" 317 | escape-html "~1.0.3" 318 | etag "~1.8.0" 319 | finalhandler "~1.0.6" 320 | fresh "0.5.2" 321 | merge-descriptors "1.0.1" 322 | methods "~1.1.2" 323 | on-finished "~2.3.0" 324 | parseurl "~1.3.1" 325 | path-to-regexp "0.1.7" 326 | proxy-addr "~1.1.5" 327 | qs "6.5.0" 328 | range-parser "~1.2.0" 329 | send "0.15.6" 330 | serve-static "1.12.6" 331 | setprototypeof "1.0.3" 332 | statuses "~1.3.1" 333 | type-is "~1.6.15" 334 | utils-merge "1.0.0" 335 | vary "~1.1.1" 336 | 337 | extend@~3.0.1: 338 | version "3.0.1" 339 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 340 | 341 | extsprintf@1.3.0, extsprintf@^1.2.0: 342 | version "1.3.0" 343 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 344 | 345 | fast-deep-equal@^1.0.0: 346 | version "1.0.0" 347 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 348 | 349 | finalhandler@~1.0.6: 350 | version "1.0.6" 351 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" 352 | dependencies: 353 | debug "2.6.9" 354 | encodeurl "~1.0.1" 355 | escape-html "~1.0.3" 356 | on-finished "~2.3.0" 357 | parseurl "~1.3.2" 358 | statuses "~1.3.1" 359 | unpipe "~1.0.0" 360 | 361 | forever-agent@~0.6.1: 362 | version "0.6.1" 363 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 364 | 365 | form-data@~2.3.1: 366 | version "2.3.1" 367 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 368 | dependencies: 369 | asynckit "^0.4.0" 370 | combined-stream "^1.0.5" 371 | mime-types "^2.1.12" 372 | 373 | forwarded@~0.1.0: 374 | version "0.1.2" 375 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 376 | 377 | fresh@0.5.2: 378 | version "0.5.2" 379 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 380 | 381 | getpass@^0.1.1: 382 | version "0.1.7" 383 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 384 | dependencies: 385 | assert-plus "^1.0.0" 386 | 387 | "graceful-readlink@>= 1.0.0": 388 | version "1.0.1" 389 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 390 | 391 | har-schema@^2.0.0: 392 | version "2.0.0" 393 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 394 | 395 | har-validator@~5.0.3: 396 | version "5.0.3" 397 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 398 | dependencies: 399 | ajv "^5.1.0" 400 | har-schema "^2.0.0" 401 | 402 | hawk@~6.0.2: 403 | version "6.0.2" 404 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 405 | dependencies: 406 | boom "4.x.x" 407 | cryptiles "3.x.x" 408 | hoek "4.x.x" 409 | sntp "2.x.x" 410 | 411 | hoek@4.x.x: 412 | version "4.2.0" 413 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 414 | 415 | http-errors@~1.6.1, http-errors@~1.6.2: 416 | version "1.6.2" 417 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 418 | dependencies: 419 | depd "1.1.1" 420 | inherits "2.0.3" 421 | setprototypeof "1.0.3" 422 | statuses ">= 1.3.1 < 2" 423 | 424 | http-signature@~1.2.0: 425 | version "1.2.0" 426 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 427 | dependencies: 428 | assert-plus "^1.0.0" 429 | jsprim "^1.2.2" 430 | sshpk "^1.7.0" 431 | 432 | iconv-lite@0.4.15: 433 | version "0.4.15" 434 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" 435 | 436 | inherits@2.0.3: 437 | version "2.0.3" 438 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 439 | 440 | ipaddr.js@1.4.0: 441 | version "1.4.0" 442 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" 443 | 444 | is-buffer@^1.1.5: 445 | version "1.1.5" 446 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 447 | 448 | is-promise@^2.0.0: 449 | version "2.1.0" 450 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 451 | 452 | is-promise@~1: 453 | version "1.0.1" 454 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" 455 | 456 | is-typedarray@~1.0.0: 457 | version "1.0.0" 458 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 459 | 460 | isstream@~0.1.2: 461 | version "0.1.2" 462 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 463 | 464 | jade@~1.11.0: 465 | version "1.11.0" 466 | resolved "https://registry.yarnpkg.com/jade/-/jade-1.11.0.tgz#9c80e538c12d3fb95c8d9bb9559fa0cc040405fd" 467 | dependencies: 468 | character-parser "1.2.1" 469 | clean-css "^3.1.9" 470 | commander "~2.6.0" 471 | constantinople "~3.0.1" 472 | jstransformer "0.0.2" 473 | mkdirp "~0.5.0" 474 | transformers "2.1.0" 475 | uglify-js "^2.4.19" 476 | void-elements "~2.0.1" 477 | with "~4.0.0" 478 | 479 | jsbn@~0.1.0: 480 | version "0.1.1" 481 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 482 | 483 | json-schema-traverse@^0.3.0: 484 | version "0.3.1" 485 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 486 | 487 | json-schema@0.2.3: 488 | version "0.2.3" 489 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 490 | 491 | json-stable-stringify@^1.0.1: 492 | version "1.0.1" 493 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 494 | dependencies: 495 | jsonify "~0.0.0" 496 | 497 | json-stringify-safe@~5.0.1: 498 | version "5.0.1" 499 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 500 | 501 | jsonify@~0.0.0: 502 | version "0.0.0" 503 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 504 | 505 | jsprim@^1.2.2: 506 | version "1.4.1" 507 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 508 | dependencies: 509 | assert-plus "1.0.0" 510 | extsprintf "1.3.0" 511 | json-schema "0.2.3" 512 | verror "1.10.0" 513 | 514 | jstransformer@0.0.2: 515 | version "0.0.2" 516 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-0.0.2.tgz#7aae29a903d196cfa0973d885d3e47947ecd76ab" 517 | dependencies: 518 | is-promise "^2.0.0" 519 | promise "^6.0.1" 520 | 521 | kind-of@^3.0.2: 522 | version "3.2.2" 523 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 524 | dependencies: 525 | is-buffer "^1.1.5" 526 | 527 | lazy-cache@^1.0.3: 528 | version "1.0.4" 529 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 530 | 531 | lodash@^4.13.1, lodash@^4.14.0: 532 | version "4.17.4" 533 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 534 | 535 | longest@^1.0.1: 536 | version "1.0.1" 537 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 538 | 539 | media-typer@0.3.0: 540 | version "0.3.0" 541 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 542 | 543 | merge-descriptors@1.0.1: 544 | version "1.0.1" 545 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 546 | 547 | methods@~1.1.2: 548 | version "1.1.2" 549 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 550 | 551 | mime-db@~1.30.0: 552 | version "1.30.0" 553 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 554 | 555 | mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: 556 | version "2.1.17" 557 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 558 | dependencies: 559 | mime-db "~1.30.0" 560 | 561 | mime@1.3.4: 562 | version "1.3.4" 563 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 564 | 565 | minimist@0.0.8: 566 | version "0.0.8" 567 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 568 | 569 | mkdirp@~0.5.0: 570 | version "0.5.1" 571 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 572 | dependencies: 573 | minimist "0.0.8" 574 | 575 | morgan@~1.8.1: 576 | version "1.8.2" 577 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" 578 | dependencies: 579 | basic-auth "~1.1.0" 580 | debug "2.6.8" 581 | depd "~1.1.0" 582 | on-finished "~2.3.0" 583 | on-headers "~1.0.1" 584 | 585 | ms@2.0.0: 586 | version "2.0.0" 587 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 588 | 589 | negotiator@0.6.1: 590 | version "0.6.1" 591 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 592 | 593 | oauth-sign@~0.8.2: 594 | version "0.8.2" 595 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 596 | 597 | on-finished@~2.3.0: 598 | version "2.3.0" 599 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 600 | dependencies: 601 | ee-first "1.1.1" 602 | 603 | on-headers@~1.0.1: 604 | version "1.0.1" 605 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 606 | 607 | optimist@~0.3.5: 608 | version "0.3.7" 609 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" 610 | dependencies: 611 | wordwrap "~0.0.2" 612 | 613 | parseurl@~1.3.1, parseurl@~1.3.2: 614 | version "1.3.2" 615 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 616 | 617 | path-to-regexp@0.1.7: 618 | version "0.1.7" 619 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 620 | 621 | performance-now@^2.1.0: 622 | version "2.1.0" 623 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 624 | 625 | promise@^6.0.1: 626 | version "6.1.0" 627 | resolved "https://registry.yarnpkg.com/promise/-/promise-6.1.0.tgz#2ce729f6b94b45c26891ad0602c5c90e04c6eef6" 628 | dependencies: 629 | asap "~1.0.0" 630 | 631 | promise@~2.0: 632 | version "2.0.0" 633 | resolved "https://registry.yarnpkg.com/promise/-/promise-2.0.0.tgz#46648aa9d605af5d2e70c3024bf59436da02b80e" 634 | dependencies: 635 | is-promise "~1" 636 | 637 | proxy-addr@~1.1.5: 638 | version "1.1.5" 639 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" 640 | dependencies: 641 | forwarded "~0.1.0" 642 | ipaddr.js "1.4.0" 643 | 644 | punycode@^1.4.1: 645 | version "1.4.1" 646 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 647 | 648 | qs@6.4.0: 649 | version "6.4.0" 650 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 651 | 652 | qs@6.5.0: 653 | version "6.5.0" 654 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" 655 | 656 | qs@~6.5.1: 657 | version "6.5.1" 658 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 659 | 660 | range-parser@~1.2.0: 661 | version "1.2.0" 662 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 663 | 664 | raw-body@~2.2.0: 665 | version "2.2.0" 666 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" 667 | dependencies: 668 | bytes "2.4.0" 669 | iconv-lite "0.4.15" 670 | unpipe "1.0.0" 671 | 672 | repeat-string@^1.5.2: 673 | version "1.6.1" 674 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 675 | 676 | request-promise-core@1.1.1: 677 | version "1.1.1" 678 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 679 | dependencies: 680 | lodash "^4.13.1" 681 | 682 | request-promise@^4.2.2: 683 | version "4.2.2" 684 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" 685 | dependencies: 686 | bluebird "^3.5.0" 687 | request-promise-core "1.1.1" 688 | stealthy-require "^1.1.0" 689 | tough-cookie ">=2.3.3" 690 | 691 | request@^2.83.0: 692 | version "2.83.0" 693 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 694 | dependencies: 695 | aws-sign2 "~0.7.0" 696 | aws4 "^1.6.0" 697 | caseless "~0.12.0" 698 | combined-stream "~1.0.5" 699 | extend "~3.0.1" 700 | forever-agent "~0.6.1" 701 | form-data "~2.3.1" 702 | har-validator "~5.0.3" 703 | hawk "~6.0.2" 704 | http-signature "~1.2.0" 705 | is-typedarray "~1.0.0" 706 | isstream "~0.1.2" 707 | json-stringify-safe "~5.0.1" 708 | mime-types "~2.1.17" 709 | oauth-sign "~0.8.2" 710 | performance-now "^2.1.0" 711 | qs "~6.5.1" 712 | safe-buffer "^5.1.1" 713 | stringstream "~0.0.5" 714 | tough-cookie "~2.3.3" 715 | tunnel-agent "^0.6.0" 716 | uuid "^3.1.0" 717 | 718 | right-align@^0.1.1: 719 | version "0.1.3" 720 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 721 | dependencies: 722 | align-text "^0.1.1" 723 | 724 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1: 725 | version "5.1.1" 726 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 727 | 728 | send@0.15.6: 729 | version "0.15.6" 730 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz#20f23a9c925b762ab82705fe2f9db252ace47e34" 731 | dependencies: 732 | debug "2.6.9" 733 | depd "~1.1.1" 734 | destroy "~1.0.4" 735 | encodeurl "~1.0.1" 736 | escape-html "~1.0.3" 737 | etag "~1.8.1" 738 | fresh "0.5.2" 739 | http-errors "~1.6.2" 740 | mime "1.3.4" 741 | ms "2.0.0" 742 | on-finished "~2.3.0" 743 | range-parser "~1.2.0" 744 | statuses "~1.3.1" 745 | 746 | serve-favicon@~2.4.2: 747 | version "2.4.5" 748 | resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.4.5.tgz#49d9a46863153a9240691c893d2b0e7d85d6d436" 749 | dependencies: 750 | etag "~1.8.1" 751 | fresh "0.5.2" 752 | ms "2.0.0" 753 | parseurl "~1.3.2" 754 | safe-buffer "5.1.1" 755 | 756 | serve-static@1.12.6: 757 | version "1.12.6" 758 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz#b973773f63449934da54e5beba5e31d9f4211577" 759 | dependencies: 760 | encodeurl "~1.0.1" 761 | escape-html "~1.0.3" 762 | parseurl "~1.3.2" 763 | send "0.15.6" 764 | 765 | setprototypeof@1.0.3: 766 | version "1.0.3" 767 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 768 | 769 | sntp@2.x.x: 770 | version "2.0.2" 771 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" 772 | dependencies: 773 | hoek "4.x.x" 774 | 775 | source-map@0.4.x: 776 | version "0.4.4" 777 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 778 | dependencies: 779 | amdefine ">=0.0.4" 780 | 781 | source-map@~0.1.7: 782 | version "0.1.43" 783 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" 784 | dependencies: 785 | amdefine ">=0.0.4" 786 | 787 | source-map@~0.5.1: 788 | version "0.5.7" 789 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 790 | 791 | sshpk@^1.7.0: 792 | version "1.13.1" 793 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 794 | dependencies: 795 | asn1 "~0.2.3" 796 | assert-plus "^1.0.0" 797 | dashdash "^1.12.0" 798 | getpass "^0.1.1" 799 | optionalDependencies: 800 | bcrypt-pbkdf "^1.0.0" 801 | ecc-jsbn "~0.1.1" 802 | jsbn "~0.1.0" 803 | tweetnacl "~0.14.0" 804 | 805 | "statuses@>= 1.3.1 < 2": 806 | version "1.4.0" 807 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 808 | 809 | statuses@~1.3.1: 810 | version "1.3.1" 811 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 812 | 813 | stealthy-require@^1.1.0: 814 | version "1.1.1" 815 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 816 | 817 | stringstream@~0.0.5: 818 | version "0.0.5" 819 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 820 | 821 | tough-cookie@>=2.3.3, tough-cookie@~2.3.3: 822 | version "2.3.3" 823 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 824 | dependencies: 825 | punycode "^1.4.1" 826 | 827 | transformers@2.1.0: 828 | version "2.1.0" 829 | resolved "https://registry.yarnpkg.com/transformers/-/transformers-2.1.0.tgz#5d23cb35561dd85dc67fb8482309b47d53cce9a7" 830 | dependencies: 831 | css "~1.0.8" 832 | promise "~2.0" 833 | uglify-js "~2.2.5" 834 | 835 | tunnel-agent@^0.6.0: 836 | version "0.6.0" 837 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 838 | dependencies: 839 | safe-buffer "^5.0.1" 840 | 841 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 842 | version "0.14.5" 843 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 844 | 845 | type-is@~1.6.15: 846 | version "1.6.15" 847 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 848 | dependencies: 849 | media-typer "0.3.0" 850 | mime-types "~2.1.15" 851 | 852 | uglify-js@^2.4.19: 853 | version "2.8.29" 854 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 855 | dependencies: 856 | source-map "~0.5.1" 857 | yargs "~3.10.0" 858 | optionalDependencies: 859 | uglify-to-browserify "~1.0.0" 860 | 861 | uglify-js@~2.2.5: 862 | version "2.2.5" 863 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7" 864 | dependencies: 865 | optimist "~0.3.5" 866 | source-map "~0.1.7" 867 | 868 | uglify-to-browserify@~1.0.0: 869 | version "1.0.2" 870 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 871 | 872 | unpipe@1.0.0, unpipe@~1.0.0: 873 | version "1.0.0" 874 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 875 | 876 | utils-merge@1.0.0: 877 | version "1.0.0" 878 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 879 | 880 | uuid4@^1.0.0: 881 | version "1.0.0" 882 | resolved "https://registry.yarnpkg.com/uuid4/-/uuid4-1.0.0.tgz#813aaeaf11ea2f68909c5ad57d894f83202d6720" 883 | 884 | uuid@^3.1.0: 885 | version "3.1.0" 886 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 887 | 888 | vary@~1.1.1: 889 | version "1.1.2" 890 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 891 | 892 | verror@1.10.0: 893 | version "1.10.0" 894 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 895 | dependencies: 896 | assert-plus "^1.0.0" 897 | core-util-is "1.0.2" 898 | extsprintf "^1.2.0" 899 | 900 | void-elements@~2.0.1: 901 | version "2.0.1" 902 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" 903 | 904 | window-size@0.1.0: 905 | version "0.1.0" 906 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 907 | 908 | with@~4.0.0: 909 | version "4.0.3" 910 | resolved "https://registry.yarnpkg.com/with/-/with-4.0.3.tgz#eefd154e9e79d2c8d3417b647a8f14d9fecce14e" 911 | dependencies: 912 | acorn "^1.0.1" 913 | acorn-globals "^1.0.3" 914 | 915 | wordwrap@0.0.2: 916 | version "0.0.2" 917 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 918 | 919 | wordwrap@~0.0.2: 920 | version "0.0.3" 921 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 922 | 923 | yargs@~3.10.0: 924 | version "3.10.0" 925 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 926 | dependencies: 927 | camelcase "^1.0.2" 928 | cliui "^2.1.0" 929 | decamelize "^1.0.0" 930 | window-size "0.1.0" 931 | --------------------------------------------------------------------------------