├── .gitignore ├── src ├── index.js ├── Block.js ├── firebaseMiddleware.js └── blockchainRedux.js ├── package.json ├── LICENSE ├── test ├── firebaseMiddleware.js └── index.js ├── dist ├── blockchain-redux.js ├── blockchain-redux.js.map ├── blockchain-redux.m.js.map ├── blockchain-redux.umd.js.map ├── blockchain-redux.m.js └── blockchain-redux.umd.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .reify-cache 3 | yarn-error.log 4 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import createStore from "./blockchainRedux"; 2 | import firebaseMiddleware from "./firebaseMiddleware"; 3 | 4 | export { createStore, firebaseMiddleware }; 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockchain-redux", 3 | "version": "0.3.0", 4 | "description": "A crypto experiment, Redux store backed by blockchain.", 5 | "main": "dist/blockchain-redux.js", 6 | "author": "Swizec Teller", 7 | "license": "MIT", 8 | "private": false, 9 | "dependencies": { 10 | "crypto-js": "^3.1.9-1" 11 | }, 12 | "devDependencies": { 13 | "microbundle": "^0.4.4", 14 | "reify": "^0.13.3", 15 | "tap-spec": "^4.1.1", 16 | "tape": "^4.8.0" 17 | }, 18 | "scripts": { 19 | "build": "microbundle -o dist/ --compress false --external all", 20 | "dev": "microbundle watch", 21 | "test": "tape -r reify test/*.js | tap-spec" 22 | }, 23 | "peerDependencies": { 24 | "firebase": "^4.12.1" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Block.js: -------------------------------------------------------------------------------- 1 | import CryptoJS from "crypto-js"; 2 | 3 | class Block { 4 | constructor({ previousBlock, data }) { 5 | this.index = previousBlock.index + 1; 6 | this.previousHash = previousBlock.hash.toString(); 7 | this.timestamp = new Date().getTime() / 1000; 8 | this.data = data; 9 | 10 | this.hash = Block.calculateHash(this); 11 | } 12 | 13 | set data(data) { 14 | this._data = JSON.stringify(data); 15 | } 16 | 17 | get data() { 18 | return typeof this._data !== "undefined" 19 | ? JSON.parse(this._data) 20 | : undefined; 21 | } 22 | 23 | // this is where a Proof-of-Work or Proof-of-Stake algo comes in, I think 24 | static calculateHash(block) { 25 | return CryptoJS.SHA256( 26 | block.index + block.previousHash + block.timestamp + block._data 27 | ).toString(); 28 | } 29 | } 30 | 31 | export default Block; 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Luke Edwards (lukeed.com) 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/firebaseMiddleware.js: -------------------------------------------------------------------------------- 1 | import test from "tape"; 2 | import * as firebase from "firebase"; 3 | 4 | import createStore from "../src/blockchainRedux"; 5 | import firebaseMiddleware from "../src/firebaseMiddleware"; 6 | 7 | const FirebaseApp = firebase.initializeApp({ 8 | apiKey: "AIzaSyDq_C2aVd0HKMIHjrq95sf2hiIonR9sSqs", 9 | databaseURL: "https://blockchain-redux-test.firebaseio.com", 10 | projectId: "blockchain-redux-test" 11 | }); 12 | 13 | function rootReducer(state = { counter: 0 }, action) { 14 | switch (action.type) { 15 | case "inc": 16 | return { counter: state.counter + 1 }; 17 | case "dec": 18 | return { counter: state.counter - 1 }; 19 | default: 20 | return state; 21 | } 22 | } 23 | 24 | test("announce blocks on firebase", async t => { 25 | const store = await createStore( 26 | rootReducer, 27 | firebaseMiddleware(FirebaseApp) 28 | ); 29 | const db = firebase.database(); 30 | 31 | store.dispatch({ type: "inc" }).then(() => { 32 | const block = store.getLastBlock(); 33 | 34 | db 35 | .ref(`/blockchain/${block.index}`) 36 | .once("value") 37 | .then(snapshot => { 38 | const fbBlock = snapshot.val(); 39 | 40 | t.equal(block.hash, fbBlock.hash); 41 | 42 | t.end(); 43 | }); 44 | }); 45 | }); 46 | 47 | test("initializes from firebase blockchain", async t => { 48 | const store1 = await createStore( 49 | rootReducer, 50 | firebaseMiddleware(FirebaseApp) 51 | ); 52 | 53 | store1.dispatch({ type: "inc" }).then(async () => { 54 | const store2 = await createStore( 55 | rootReducer, 56 | firebaseMiddleware(FirebaseApp) 57 | ); 58 | 59 | const block1 = store1.getLastBlock(), 60 | block2 = store2.getLastBlock(); 61 | 62 | t.equal(block1.hash, block2.hash); 63 | 64 | t.end(); 65 | }); 66 | }); 67 | 68 | test("call subscribers after initialization", async t => { 69 | let called = false; 70 | 71 | const store1 = await createStore( 72 | rootReducer, 73 | firebaseMiddleware(FirebaseApp) 74 | ); 75 | store1.subscribe(() => (called = true)); 76 | 77 | t.ok(called); 78 | t.end(); 79 | }); 80 | -------------------------------------------------------------------------------- /src/firebaseMiddleware.js: -------------------------------------------------------------------------------- 1 | export default function (firebaseApp) { 2 | const db = firebaseApp.database(); 3 | 4 | return createStore => (...args) => { 5 | const store = createStore(...args); 6 | const _dispatch = store.dispatch; 7 | 8 | function dispatch(action) { 9 | _dispatch(action); 10 | 11 | const newBlock = store.getLastBlock(); 12 | return saveBlock(newBlock); 13 | } 14 | 15 | function saveBlock(block) { 16 | block._data = block._data || {}; 17 | 18 | return db 19 | .ref(`blockchain/${block.index}`) 20 | .once("value") 21 | .then(snapshot => { 22 | if (!snapshot.exists()) { 23 | db.ref(`blockchain/${block.index}`).set(block); 24 | return true; 25 | } else { 26 | // collision resolution? 27 | return false; 28 | } 29 | }); 30 | } 31 | 32 | function listenForNextBlock() { 33 | const nextIndex = store.getLastBlock().index + 1; 34 | const valueHandler = function (snapshot) { 35 | if (snapshot.exists()) { 36 | let block = snapshot.val(); 37 | block.data = block._data ? JSON.parse(block._data) : {}; 38 | 39 | console.log("Received block from outside", block); 40 | 41 | // TODO: potential conflict with local last block 42 | store.addBlock(block); 43 | db 44 | .ref(`blockchain/${nextIndex}`) 45 | .off("value", valueHandler); 46 | 47 | listenForNextBlock(); 48 | } 49 | }; 50 | 51 | db.ref(`blockchain/${nextIndex}`).on("value", valueHandler); 52 | console.log("Listening for", nextIndex); 53 | } 54 | 55 | function initFromFirebase() { 56 | return db 57 | .ref("blockchain") 58 | .orderByKey() 59 | .once("value") 60 | .then(snapshot => snapshot.val()) 61 | .then(blockchain => { 62 | blockchain = Object.values(blockchain).map(block => { 63 | block.data = block._data ? JSON.parse(block._data) : {}; 64 | return block; 65 | }); 66 | 67 | console.debug("Got blockchain", blockchain.length); 68 | 69 | store.replaceChain(blockchain); 70 | 71 | listenForNextBlock(); 72 | 73 | return Object.assign(store, { 74 | dispatch 75 | }); 76 | }); 77 | } 78 | 79 | return Promise.all(store.getWholeChain().map(saveBlock)).then( 80 | initFromFirebase 81 | ); 82 | }; 83 | } -------------------------------------------------------------------------------- /src/blockchainRedux.js: -------------------------------------------------------------------------------- 1 | import Block from "./Block"; 2 | 3 | function createStore(reducer, preloadedState, enhancer) { 4 | if ( 5 | typeof preloadedState === "function" && 6 | typeof enhancer === "undefined" 7 | ) { 8 | enhancer = preloadedState; 9 | preloadedState = undefined; 10 | } 11 | 12 | if (typeof enhancer === "function") { 13 | return enhancer(createStore)(reducer, preloadedState); 14 | } 15 | 16 | let blockchain = [ 17 | new Block({ 18 | previousBlock: { 19 | index: 0, 20 | hash: "0", 21 | data: {}, 22 | timestamp: new Date().getTime() 23 | }, 24 | data: preloadedState 25 | }) 26 | ]; 27 | let listeners = []; 28 | 29 | function notifyListeners() { 30 | listeners.forEach(listener => listener()); 31 | } 32 | 33 | function getLastBlock() { 34 | return blockchain[blockchain.length - 1]; 35 | } 36 | 37 | function dispatch(action) { 38 | const lastBlock = getLastBlock(); 39 | const nextData = reducer(lastBlock.data, action); 40 | 41 | addBlock(new Block({ previousBlock: lastBlock, data: nextData })); 42 | } 43 | 44 | function subscribe(listener) { 45 | listeners.push(listener); 46 | 47 | return function unsubscribe() { 48 | listeners.splice(listeners.indexOf(listener), 1); 49 | }; 50 | } 51 | 52 | function addBlock(newBlock) { 53 | if (isValidNewBlock(newBlock, getLastBlock())) { 54 | blockchain.push(newBlock); 55 | notifyListeners(); 56 | } 57 | } 58 | 59 | function isValidNewBlock(newBlock, previousBlock) { 60 | if (previousBlock.index + 1 !== newBlock.index) { 61 | console.log("invalid index"); 62 | return false; 63 | } else if (previousBlock.hash !== newBlock.previousHash) { 64 | console.log("invalid previoushash"); 65 | return false; 66 | } else if (Block.calculateHash(newBlock) !== newBlock.hash) { 67 | console.log( 68 | "invalid hash: ", 69 | Block.calculateHash(newBlock), 70 | newBlock.hash 71 | ); 72 | return false; 73 | } 74 | return true; 75 | } 76 | 77 | function isValidChain(blockchain) { 78 | for (let i = 0; i < blockchain.length - 1; i++) { 79 | if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) { 80 | return false; 81 | } 82 | } 83 | return true; 84 | } 85 | 86 | function replaceChain(newBlocks) { 87 | if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) { 88 | console.debug("Replacing old chain with new"); 89 | blockchain = newBlocks; 90 | } 91 | notifyListeners(); 92 | } 93 | 94 | dispatch({ type: "INIT" }); 95 | 96 | return { 97 | getState: () => getLastBlock().data, 98 | getLastBlock: getLastBlock, 99 | dispatch: dispatch, 100 | subscribe: subscribe, 101 | 102 | addBlock: addBlock, 103 | replaceChain: replaceChain, // primarily used when starting up to take latest available blockchain 104 | getWholeChain: () => blockchain 105 | }; 106 | } 107 | 108 | export default createStore; 109 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import test from "tape"; 2 | 3 | import createStore from "../src/blockchainRedux"; 4 | import Block from "../src/Block"; 5 | 6 | function rootReducer(state = { counter: 0 }, action) { 7 | switch (action.type) { 8 | case "inc": 9 | return { counter: state.counter + 1 }; 10 | case "dec": 11 | return { counter: state.counter - 1 }; 12 | default: 13 | return state; 14 | } 15 | } 16 | 17 | test("count to 5", t => { 18 | const store = createStore(rootReducer); 19 | 20 | for (let i = 0; i < 5; i++) { 21 | store.dispatch({ type: "inc" }); 22 | } 23 | 24 | t.equal(store.getState().counter, 5); 25 | t.end(); 26 | }); 27 | 28 | test("reject bad blocks", t => { 29 | const store = createStore(rootReducer); 30 | 31 | const lastBlock = store.getLastBlock(); 32 | 33 | store.addBlock( 34 | new Block({ previousBlock: lastBlock, data: { counter: 10 } }) 35 | ); 36 | 37 | // this one should be rejected, same index 38 | store.addBlock( 39 | new Block({ previousBlock: lastBlock, data: { counter: 11 } }) 40 | ); 41 | t.equal(store.getState().counter, 10); 42 | 43 | // this one should be rejected, bad previous hash 44 | const block1 = new Block({ 45 | previousBlock: store.getLastBlock(), 46 | data: { counter: 12 } 47 | }); 48 | block1.previousHash = "random"; 49 | store.addBlock(block1); 50 | t.equal(store.getState().counter, 10); 51 | 52 | // this one should be rejected, bad hash 53 | const block2 = new Block({ 54 | previousBlock: store.getLastBlock(), 55 | data: { counter: 13 } 56 | }); 57 | block2.hash = "random"; 58 | store.addBlock(block2); 59 | t.equal(store.getState().counter, 10); 60 | 61 | t.end(); 62 | }); 63 | 64 | test("replaceChain replaces blockchain", t => { 65 | const store1 = createStore(rootReducer); 66 | const store2 = createStore(rootReducer); 67 | 68 | for (let i = 0; i < 5; i++) { 69 | store1.dispatch({ type: "inc" }); 70 | } 71 | 72 | for (let i = 0; i < 10; i++) { 73 | store2.dispatch({ type: "inc" }); 74 | } 75 | 76 | store1.replaceChain(store2.getWholeChain()); 77 | 78 | t.equal(store1.getState().counter, store2.getState().counter); 79 | t.end(); 80 | }); 81 | 82 | test("subscribe to changes", t => { 83 | const store = createStore(rootReducer); 84 | 85 | let called = false; 86 | 87 | store.subscribe(() => (called = true)); 88 | store.dispatch({ type: "inc" }); 89 | 90 | t.ok(called); 91 | t.end(); 92 | }); 93 | 94 | test("unsubscribe from changes", t => { 95 | const store = createStore(rootReducer); 96 | 97 | let called = 0; 98 | 99 | const unsub = store.subscribe(() => (called += 1)); 100 | 101 | store.dispatch({ type: "inc" }); 102 | unsub(); 103 | store.dispatch({ type: "inc" }); 104 | 105 | t.equal(called, 1); 106 | t.end(); 107 | }); 108 | 109 | test("can add middleware", t => { 110 | let called = false; 111 | function middleware() { 112 | return createStore => (...args) => { 113 | const store = createStore(...args); 114 | 115 | return Object.assign(store, { 116 | addedFunc: () => { 117 | called = true; 118 | } 119 | }); 120 | }; 121 | } 122 | 123 | const store = createStore(rootReducer, middleware()); 124 | 125 | store.addedFunc({}); 126 | 127 | t.ok(called); 128 | t.end(); 129 | }); 130 | -------------------------------------------------------------------------------- /dist/blockchain-redux.js: -------------------------------------------------------------------------------- 1 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } 2 | 3 | var CryptoJS = _interopDefault(require('crypto-js')); 4 | 5 | var Block = function Block(ref) { 6 | var previousBlock = ref.previousBlock; 7 | var data = ref.data; 8 | 9 | this.index = previousBlock.index + 1; 10 | this.previousHash = previousBlock.hash.toString(); 11 | this.timestamp = new Date().getTime() / 1000; 12 | this.data = data; 13 | this.hash = Block.calculateHash(this); 14 | }; 15 | 16 | var prototypeAccessors = { data: { configurable: true } }; 17 | prototypeAccessors.data.set = function (data) { 18 | this._data = JSON.stringify(data); 19 | }; 20 | prototypeAccessors.data.get = function () { 21 | return typeof this._data !== "undefined" ? JSON.parse(this._data) : undefined; 22 | }; 23 | Block.calculateHash = function calculateHash (block) { 24 | return CryptoJS.SHA256(block.index + block.previousHash + block.timestamp + block._data).toString(); 25 | }; 26 | 27 | Object.defineProperties( Block.prototype, prototypeAccessors ); 28 | 29 | function createStore(reducer, preloadedState, enhancer) { 30 | if (typeof preloadedState === "function" && typeof enhancer === "undefined") { 31 | enhancer = preloadedState; 32 | preloadedState = undefined; 33 | } 34 | if (typeof enhancer === "function") { 35 | return enhancer(createStore)(reducer, preloadedState); 36 | } 37 | var blockchain = [new Block({ 38 | previousBlock: { 39 | index: 0, 40 | hash: "0", 41 | data: {}, 42 | timestamp: new Date().getTime() 43 | }, 44 | data: preloadedState 45 | })]; 46 | var listeners = []; 47 | function notifyListeners() { 48 | listeners.forEach(function (listener) { return listener(); }); 49 | } 50 | 51 | function getLastBlock() { 52 | return blockchain[blockchain.length - 1]; 53 | } 54 | 55 | function dispatch(action) { 56 | var lastBlock = getLastBlock(); 57 | var nextData = reducer(lastBlock.data, action); 58 | addBlock(new Block({ 59 | previousBlock: lastBlock, 60 | data: nextData 61 | })); 62 | } 63 | 64 | function subscribe(listener) { 65 | listeners.push(listener); 66 | return function unsubscribe() { 67 | listeners.splice(listeners.indexOf(listener), 1); 68 | }; 69 | } 70 | 71 | function addBlock(newBlock) { 72 | if (isValidNewBlock(newBlock, getLastBlock())) { 73 | blockchain.push(newBlock); 74 | notifyListeners(); 75 | } 76 | } 77 | 78 | function isValidNewBlock(newBlock, previousBlock) { 79 | if (previousBlock.index + 1 !== newBlock.index) { 80 | console.log("invalid index"); 81 | return false; 82 | } else if (previousBlock.hash !== newBlock.previousHash) { 83 | console.log("invalid previoushash"); 84 | return false; 85 | } else if (Block.calculateHash(newBlock) !== newBlock.hash) { 86 | console.log("invalid hash: ", Block.calculateHash(newBlock), newBlock.hash); 87 | return false; 88 | } 89 | return true; 90 | } 91 | 92 | function isValidChain(blockchain) { 93 | for (var i = 0;i < blockchain.length - 1; i++) { 94 | if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) { 95 | return false; 96 | } 97 | } 98 | return true; 99 | } 100 | 101 | function replaceChain(newBlocks) { 102 | if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) { 103 | console.debug("Replacing old chain with new"); 104 | blockchain = newBlocks; 105 | } 106 | notifyListeners(); 107 | } 108 | 109 | dispatch({ 110 | type: "INIT" 111 | }); 112 | return { 113 | getState: function () { return getLastBlock().data; }, 114 | getLastBlock: getLastBlock, 115 | dispatch: dispatch, 116 | subscribe: subscribe, 117 | addBlock: addBlock, 118 | replaceChain: replaceChain, 119 | getWholeChain: function () { return blockchain; } 120 | }; 121 | } 122 | 123 | function firebaseMiddleware (firebaseApp) { 124 | var db = firebaseApp.database(); 125 | return function (createStore) { return function () { 126 | var args = [], len = arguments.length; 127 | while ( len-- ) args[ len ] = arguments[ len ]; 128 | 129 | var store = createStore.apply(void 0, args); 130 | var _dispatch = store.dispatch; 131 | function dispatch(action) { 132 | _dispatch(action); 133 | var newBlock = store.getLastBlock(); 134 | return saveBlock(newBlock); 135 | } 136 | 137 | function saveBlock(block) { 138 | block._data = block._data || {}; 139 | return db.ref(("blockchain/" + (block.index))).once("value").then(function (snapshot) { 140 | if (!snapshot.exists()) { 141 | db.ref(("blockchain/" + (block.index))).set(block); 142 | return true; 143 | } else { 144 | return false; 145 | } 146 | }); 147 | } 148 | 149 | function listenForNextBlock() { 150 | var nextIndex = store.getLastBlock().index + 1; 151 | var valueHandler = function (snapshot) { 152 | if (snapshot.exists()) { 153 | var block = snapshot.val(); 154 | block.data = block._data ? JSON.parse(block._data) : {}; 155 | console.log("Received block from outside", block); 156 | store.addBlock(block); 157 | db.ref(("blockchain/" + nextIndex)).off("value", valueHandler); 158 | listenForNextBlock(); 159 | } 160 | }; 161 | db.ref(("blockchain/" + nextIndex)).on("value", valueHandler); 162 | console.log("Listening for", nextIndex); 163 | } 164 | 165 | function initFromFirebase() { 166 | return db.ref("blockchain").orderByKey().once("value").then(function (snapshot) { return snapshot.val(); }).then(function (blockchain) { 167 | blockchain = Object.values(blockchain).map(function (block) { 168 | block.data = block._data ? JSON.parse(block._data) : {}; 169 | return block; 170 | }); 171 | console.debug("Got blockchain", blockchain.length); 172 | store.replaceChain(blockchain); 173 | listenForNextBlock(); 174 | return Object.assign(store, { 175 | dispatch: dispatch 176 | }); 177 | }); 178 | } 179 | 180 | return Promise.all(store.getWholeChain().map(saveBlock)).then(initFromFirebase); 181 | }; }; 182 | } 183 | 184 | exports.createStore = createStore; 185 | exports.firebaseMiddleware = firebaseMiddleware; 186 | //# sourceMappingURL=blockchain-redux.js.map 187 | -------------------------------------------------------------------------------- /dist/blockchain-redux.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"blockchain-redux.js","sources":["../src/Block.js","../src/blockchainRedux.js","../src/firebaseMiddleware.js"],"sourcesContent":["import CryptoJS from \"crypto-js\";\n\nclass Block {\n constructor({ previousBlock, data }) {\n this.index = previousBlock.index + 1;\n this.previousHash = previousBlock.hash.toString();\n this.timestamp = new Date().getTime() / 1000;\n this.data = data;\n\n this.hash = Block.calculateHash(this);\n }\n\n set data(data) {\n this._data = JSON.stringify(data);\n }\n\n get data() {\n return typeof this._data !== \"undefined\"\n ? JSON.parse(this._data)\n : undefined;\n }\n\n // this is where a Proof-of-Work or Proof-of-Stake algo comes in, I think\n static calculateHash(block) {\n return CryptoJS.SHA256(\n block.index + block.previousHash + block.timestamp + block._data\n ).toString();\n }\n}\n\nexport default Block;\n","import Block from \"./Block\";\n\nfunction createStore(reducer, preloadedState, enhancer) {\n if (\n typeof preloadedState === \"function\" &&\n typeof enhancer === \"undefined\"\n ) {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer === \"function\") {\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n let blockchain = [\n new Block({\n previousBlock: {\n index: 0,\n hash: \"0\",\n data: {},\n timestamp: new Date().getTime()\n },\n data: preloadedState\n })\n ];\n let listeners = [];\n\n function notifyListeners() {\n listeners.forEach(listener => listener());\n }\n\n function getLastBlock() {\n return blockchain[blockchain.length - 1];\n }\n\n function dispatch(action) {\n const lastBlock = getLastBlock();\n const nextData = reducer(lastBlock.data, action);\n\n addBlock(new Block({ previousBlock: lastBlock, data: nextData }));\n }\n\n function subscribe(listener) {\n listeners.push(listener);\n\n return function unsubscribe() {\n listeners.splice(listeners.indexOf(listener), 1);\n };\n }\n\n function addBlock(newBlock) {\n if (isValidNewBlock(newBlock, getLastBlock())) {\n blockchain.push(newBlock);\n notifyListeners();\n }\n }\n\n function isValidNewBlock(newBlock, previousBlock) {\n if (previousBlock.index + 1 !== newBlock.index) {\n console.log(\"invalid index\");\n return false;\n } else if (previousBlock.hash !== newBlock.previousHash) {\n console.log(\"invalid previoushash\");\n return false;\n } else if (Block.calculateHash(newBlock) !== newBlock.hash) {\n console.log(\n \"invalid hash: \",\n Block.calculateHash(newBlock),\n newBlock.hash\n );\n return false;\n }\n return true;\n }\n\n function isValidChain(blockchain) {\n for (let i = 0; i < blockchain.length - 1; i++) {\n if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) {\n return false;\n }\n }\n return true;\n }\n\n function replaceChain(newBlocks) {\n if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) {\n console.debug(\"Replacing old chain with new\");\n blockchain = newBlocks;\n }\n notifyListeners();\n }\n\n dispatch({ type: \"INIT\" });\n\n return {\n getState: () => getLastBlock().data,\n getLastBlock: getLastBlock,\n dispatch: dispatch,\n subscribe: subscribe,\n\n addBlock: addBlock,\n replaceChain: replaceChain, // primarily used when starting up to take latest available blockchain\n getWholeChain: () => blockchain\n };\n}\n\nexport default createStore;\n","export default function(firebaseApp) {\n const db = firebaseApp.database();\n\n return createStore => (...args) => {\n const store = createStore(...args);\n const _dispatch = store.dispatch;\n\n function dispatch(action) {\n _dispatch(action);\n\n const newBlock = store.getLastBlock();\n return saveBlock(newBlock);\n }\n\n function saveBlock(block) {\n block._data = block._data || {};\n\n return db\n .ref(`blockchain/${block.index}`)\n .once(\"value\")\n .then(snapshot => {\n if (!snapshot.exists()) {\n db.ref(`blockchain/${block.index}`).set(block);\n return true;\n } else {\n // collision resolution?\n return false;\n }\n });\n }\n\n function listenForNextBlock() {\n const nextIndex = store.getLastBlock().index + 1;\n const valueHandler = function(snapshot) {\n if (snapshot.exists()) {\n let block = snapshot.val();\n block.data = block._data ? JSON.parse(block._data) : {};\n\n console.log(\"Received block from outside\", block);\n\n // TODO: potential conflict with local last block\n store.addBlock(block);\n db\n .ref(`blockchain/${nextIndex}`)\n .off(\"value\", valueHandler);\n\n listenForNextBlock();\n }\n };\n\n db.ref(`blockchain/${nextIndex}`).on(\"value\", valueHandler);\n console.log(\"Listening for\", nextIndex);\n }\n\n function initFromFirebase() {\n return db\n .ref(\"blockchain\")\n .orderByKey()\n .once(\"value\")\n .then(snapshot => snapshot.val())\n .then(blockchain => {\n blockchain = Object.values(blockchain).map(block => {\n block.data = block._data ? JSON.parse(block._data) : {};\n return block;\n });\n\n console.debug(\"Got blockchain\", blockchain.length);\n\n store.replaceChain(blockchain);\n\n listenForNextBlock();\n\n return Object.assign(store, {\n dispatch\n });\n });\n }\n\n return Promise.all(store.getWholeChain().map(saveBlock)).then(\n initFromFirebase\n );\n };\n}\n"],"names":["let","const"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/blockchain-redux.m.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"blockchain-redux.m.js","sources":["../src/Block.js","../src/blockchainRedux.js","../src/firebaseMiddleware.js"],"sourcesContent":["import CryptoJS from \"crypto-js\";\n\nclass Block {\n constructor({ previousBlock, data }) {\n this.index = previousBlock.index + 1;\n this.previousHash = previousBlock.hash.toString();\n this.timestamp = new Date().getTime() / 1000;\n this.data = data;\n\n this.hash = Block.calculateHash(this);\n }\n\n set data(data) {\n this._data = JSON.stringify(data);\n }\n\n get data() {\n return typeof this._data !== \"undefined\"\n ? JSON.parse(this._data)\n : undefined;\n }\n\n // this is where a Proof-of-Work or Proof-of-Stake algo comes in, I think\n static calculateHash(block) {\n return CryptoJS.SHA256(\n block.index + block.previousHash + block.timestamp + block._data\n ).toString();\n }\n}\n\nexport default Block;\n","import Block from \"./Block\";\n\nfunction createStore(reducer, preloadedState, enhancer) {\n if (\n typeof preloadedState === \"function\" &&\n typeof enhancer === \"undefined\"\n ) {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer === \"function\") {\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n let blockchain = [\n new Block({\n previousBlock: {\n index: 0,\n hash: \"0\",\n data: {},\n timestamp: new Date().getTime()\n },\n data: preloadedState\n })\n ];\n let listeners = [];\n\n function notifyListeners() {\n listeners.forEach(listener => listener());\n }\n\n function getLastBlock() {\n return blockchain[blockchain.length - 1];\n }\n\n function dispatch(action) {\n const lastBlock = getLastBlock();\n const nextData = reducer(lastBlock.data, action);\n\n addBlock(new Block({ previousBlock: lastBlock, data: nextData }));\n }\n\n function subscribe(listener) {\n listeners.push(listener);\n\n return function unsubscribe() {\n listeners.splice(listeners.indexOf(listener), 1);\n };\n }\n\n function addBlock(newBlock) {\n if (isValidNewBlock(newBlock, getLastBlock())) {\n blockchain.push(newBlock);\n notifyListeners();\n }\n }\n\n function isValidNewBlock(newBlock, previousBlock) {\n if (previousBlock.index + 1 !== newBlock.index) {\n console.log(\"invalid index\");\n return false;\n } else if (previousBlock.hash !== newBlock.previousHash) {\n console.log(\"invalid previoushash\");\n return false;\n } else if (Block.calculateHash(newBlock) !== newBlock.hash) {\n console.log(\n \"invalid hash: \",\n Block.calculateHash(newBlock),\n newBlock.hash\n );\n return false;\n }\n return true;\n }\n\n function isValidChain(blockchain) {\n for (let i = 0; i < blockchain.length - 1; i++) {\n if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) {\n return false;\n }\n }\n return true;\n }\n\n function replaceChain(newBlocks) {\n if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) {\n console.debug(\"Replacing old chain with new\");\n blockchain = newBlocks;\n }\n notifyListeners();\n }\n\n dispatch({ type: \"INIT\" });\n\n return {\n getState: () => getLastBlock().data,\n getLastBlock: getLastBlock,\n dispatch: dispatch,\n subscribe: subscribe,\n\n addBlock: addBlock,\n replaceChain: replaceChain, // primarily used when starting up to take latest available blockchain\n getWholeChain: () => blockchain\n };\n}\n\nexport default createStore;\n","export default function(firebaseApp) {\n const db = firebaseApp.database();\n\n return createStore => (...args) => {\n const store = createStore(...args);\n const _dispatch = store.dispatch;\n\n function dispatch(action) {\n _dispatch(action);\n\n const newBlock = store.getLastBlock();\n return saveBlock(newBlock);\n }\n\n function saveBlock(block) {\n block._data = block._data || {};\n\n return db\n .ref(`blockchain/${block.index}`)\n .once(\"value\")\n .then(snapshot => {\n if (!snapshot.exists()) {\n db.ref(`blockchain/${block.index}`).set(block);\n return true;\n } else {\n // collision resolution?\n return false;\n }\n });\n }\n\n function listenForNextBlock() {\n const nextIndex = store.getLastBlock().index + 1;\n const valueHandler = function(snapshot) {\n if (snapshot.exists()) {\n let block = snapshot.val();\n block.data = block._data ? JSON.parse(block._data) : {};\n\n console.log(\"Received block from outside\", block);\n\n // TODO: potential conflict with local last block\n store.addBlock(block);\n db\n .ref(`blockchain/${nextIndex}`)\n .off(\"value\", valueHandler);\n\n listenForNextBlock();\n }\n };\n\n db.ref(`blockchain/${nextIndex}`).on(\"value\", valueHandler);\n console.log(\"Listening for\", nextIndex);\n }\n\n function initFromFirebase() {\n return db\n .ref(\"blockchain\")\n .orderByKey()\n .once(\"value\")\n .then(snapshot => snapshot.val())\n .then(blockchain => {\n blockchain = Object.values(blockchain).map(block => {\n block.data = block._data ? JSON.parse(block._data) : {};\n return block;\n });\n\n console.debug(\"Got blockchain\", blockchain.length);\n\n store.replaceChain(blockchain);\n\n listenForNextBlock();\n\n return Object.assign(store, {\n dispatch\n });\n });\n }\n\n return Promise.all(store.getWholeChain().map(saveBlock)).then(\n initFromFirebase\n );\n };\n}\n"],"names":["let","const"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/blockchain-redux.umd.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"blockchain-redux.umd.js","sources":["../src/Block.js","../src/blockchainRedux.js","../src/firebaseMiddleware.js"],"sourcesContent":["import CryptoJS from \"crypto-js\";\n\nclass Block {\n constructor({ previousBlock, data }) {\n this.index = previousBlock.index + 1;\n this.previousHash = previousBlock.hash.toString();\n this.timestamp = new Date().getTime() / 1000;\n this.data = data;\n\n this.hash = Block.calculateHash(this);\n }\n\n set data(data) {\n this._data = JSON.stringify(data);\n }\n\n get data() {\n return typeof this._data !== \"undefined\"\n ? JSON.parse(this._data)\n : undefined;\n }\n\n // this is where a Proof-of-Work or Proof-of-Stake algo comes in, I think\n static calculateHash(block) {\n return CryptoJS.SHA256(\n block.index + block.previousHash + block.timestamp + block._data\n ).toString();\n }\n}\n\nexport default Block;\n","import Block from \"./Block\";\n\nfunction createStore(reducer, preloadedState, enhancer) {\n if (\n typeof preloadedState === \"function\" &&\n typeof enhancer === \"undefined\"\n ) {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer === \"function\") {\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n let blockchain = [\n new Block({\n previousBlock: {\n index: 0,\n hash: \"0\",\n data: {},\n timestamp: new Date().getTime()\n },\n data: preloadedState\n })\n ];\n let listeners = [];\n\n function notifyListeners() {\n listeners.forEach(listener => listener());\n }\n\n function getLastBlock() {\n return blockchain[blockchain.length - 1];\n }\n\n function dispatch(action) {\n const lastBlock = getLastBlock();\n const nextData = reducer(lastBlock.data, action);\n\n addBlock(new Block({ previousBlock: lastBlock, data: nextData }));\n }\n\n function subscribe(listener) {\n listeners.push(listener);\n\n return function unsubscribe() {\n listeners.splice(listeners.indexOf(listener), 1);\n };\n }\n\n function addBlock(newBlock) {\n if (isValidNewBlock(newBlock, getLastBlock())) {\n blockchain.push(newBlock);\n notifyListeners();\n }\n }\n\n function isValidNewBlock(newBlock, previousBlock) {\n if (previousBlock.index + 1 !== newBlock.index) {\n console.log(\"invalid index\");\n return false;\n } else if (previousBlock.hash !== newBlock.previousHash) {\n console.log(\"invalid previoushash\");\n return false;\n } else if (Block.calculateHash(newBlock) !== newBlock.hash) {\n console.log(\n \"invalid hash: \",\n Block.calculateHash(newBlock),\n newBlock.hash\n );\n return false;\n }\n return true;\n }\n\n function isValidChain(blockchain) {\n for (let i = 0; i < blockchain.length - 1; i++) {\n if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) {\n return false;\n }\n }\n return true;\n }\n\n function replaceChain(newBlocks) {\n if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) {\n console.debug(\"Replacing old chain with new\");\n blockchain = newBlocks;\n }\n notifyListeners();\n }\n\n dispatch({ type: \"INIT\" });\n\n return {\n getState: () => getLastBlock().data,\n getLastBlock: getLastBlock,\n dispatch: dispatch,\n subscribe: subscribe,\n\n addBlock: addBlock,\n replaceChain: replaceChain, // primarily used when starting up to take latest available blockchain\n getWholeChain: () => blockchain\n };\n}\n\nexport default createStore;\n","export default function(firebaseApp) {\n const db = firebaseApp.database();\n\n return createStore => (...args) => {\n const store = createStore(...args);\n const _dispatch = store.dispatch;\n\n function dispatch(action) {\n _dispatch(action);\n\n const newBlock = store.getLastBlock();\n return saveBlock(newBlock);\n }\n\n function saveBlock(block) {\n block._data = block._data || {};\n\n return db\n .ref(`blockchain/${block.index}`)\n .once(\"value\")\n .then(snapshot => {\n if (!snapshot.exists()) {\n db.ref(`blockchain/${block.index}`).set(block);\n return true;\n } else {\n // collision resolution?\n return false;\n }\n });\n }\n\n function listenForNextBlock() {\n const nextIndex = store.getLastBlock().index + 1;\n const valueHandler = function(snapshot) {\n if (snapshot.exists()) {\n let block = snapshot.val();\n block.data = block._data ? JSON.parse(block._data) : {};\n\n console.log(\"Received block from outside\", block);\n\n // TODO: potential conflict with local last block\n store.addBlock(block);\n db\n .ref(`blockchain/${nextIndex}`)\n .off(\"value\", valueHandler);\n\n listenForNextBlock();\n }\n };\n\n db.ref(`blockchain/${nextIndex}`).on(\"value\", valueHandler);\n console.log(\"Listening for\", nextIndex);\n }\n\n function initFromFirebase() {\n return db\n .ref(\"blockchain\")\n .orderByKey()\n .once(\"value\")\n .then(snapshot => snapshot.val())\n .then(blockchain => {\n blockchain = Object.values(blockchain).map(block => {\n block.data = block._data ? JSON.parse(block._data) : {};\n return block;\n });\n\n console.debug(\"Got blockchain\", blockchain.length);\n\n store.replaceChain(blockchain);\n\n listenForNextBlock();\n\n return Object.assign(store, {\n dispatch\n });\n });\n }\n\n return Promise.all(store.getWholeChain().map(saveBlock)).then(\n initFromFirebase\n );\n };\n}\n"],"names":["let","const"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/blockchain-redux.m.js: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js'; 2 | 3 | var Block = function Block(ref) { 4 | var previousBlock = ref.previousBlock; 5 | var data = ref.data; 6 | 7 | this.index = previousBlock.index + 1; 8 | this.previousHash = previousBlock.hash.toString(); 9 | this.timestamp = new Date().getTime() / 1000; 10 | this.data = data; 11 | this.hash = Block.calculateHash(this); 12 | }; 13 | 14 | var prototypeAccessors = { data: { configurable: true } }; 15 | prototypeAccessors.data.set = function (data) { 16 | this._data = JSON.stringify(data); 17 | }; 18 | prototypeAccessors.data.get = function () { 19 | return typeof this._data !== "undefined" ? JSON.parse(this._data) : undefined; 20 | }; 21 | Block.calculateHash = function calculateHash (block) { 22 | return CryptoJS.SHA256(block.index + block.previousHash + block.timestamp + block._data).toString(); 23 | }; 24 | 25 | Object.defineProperties( Block.prototype, prototypeAccessors ); 26 | 27 | 28 | 29 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJsb2NrLmpzKG9yaWdpbmFsKSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGNBQWM7QUFFckIsTUFBTSxNQUFNO0lBQ1IsWUFBWSxDQUFFLGVBQWUsT0FBUTtRQUNqQyxJQUFBLENBQUssS0FBTCxDQUFBLENBQUEsQ0FBYSxhQUFBLENBQWMsS0FBZCxDQUFBLENBQUEsQ0FBc0I7UUFDbkMsSUFBQSxDQUFLLFlBQUwsQ0FBQSxDQUFBLENBQW9CLGFBQUEsQ0FBYyxJQUFkLENBQW1CLFFBQW5CO1FBQ3BCLElBQUEsQ0FBSyxTQUFMLENBQUEsQ0FBQSxDQUFpQixJQUFJLElBQUosRUFBQSxDQUFXLE9BQVgsRUFBQSxDQUFBLENBQUEsQ0FBdUI7UUFDeEMsSUFBQSxDQUFLLElBQUwsQ0FBQSxDQUFBLENBQVk7UUFFWixJQUFBLENBQUssSUFBTCxDQUFBLENBQUEsQ0FBWSxLQUFBLENBQU0sYUFBTixDQUFvQjtJQUN4QztJQUVJLEdBQUEsQ0FBSSxLQUFLLE1BQU07UUFDWCxJQUFBLENBQUssS0FBTCxDQUFBLENBQUEsQ0FBYSxJQUFBLENBQUssU0FBTCxDQUFlO0lBQ3BDO0lBRUksR0FBQSxDQUFJLE9BQU87UUFDUCxPQUFPLE1BQUEsQ0FBTyxJQUFBLENBQUssS0FBWixDQUFBLEdBQUEsQ0FBc0IsV0FBdEIsR0FDRCxJQUFBLENBQUssS0FBTCxDQUFXLElBQUEsQ0FBSyxTQUNoQjtJQUNkO0lBR0ksT0FBTyxjQUFjLE9BQU87UUFDeEIsT0FBTyxRQUFBLENBQVMsTUFBVCxDQUNILEtBQUEsQ0FBTSxLQUFOLENBQUEsQ0FBQSxDQUFjLEtBQUEsQ0FBTSxZQUFwQixDQUFBLENBQUEsQ0FBbUMsS0FBQSxDQUFNLFNBQXpDLENBQUEsQ0FBQSxDQUFxRCxLQUFBLENBQU0sTUFEeEQsQ0FFTCxRQUZLO0lBR2Y7QUFDQTtBQUVBLGVBQWU7QUE5QmYiLCJmaWxlIjoiQmxvY2suanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENyeXB0b0pTIGZyb20gXCJjcnlwdG8tanNcIjtcblxuY2xhc3MgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKHsgcHJldmlvdXNCbG9jaywgZGF0YSB9KSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBwcmV2aW91c0Jsb2NrLmluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0hhc2ggPSBwcmV2aW91c0Jsb2NrLmhhc2gudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5oYXNoID0gQmxvY2suY2FsY3VsYXRlSGFzaCh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXQgZGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9kYXRhICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5fZGF0YSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgd2hlcmUgYSBQcm9vZi1vZi1Xb3JrIG9yIFByb29mLW9mLVN0YWtlIGFsZ28gY29tZXMgaW4sIEkgdGhpbmtcbiAgICBzdGF0aWMgY2FsY3VsYXRlSGFzaChibG9jaykge1xuICAgICAgICByZXR1cm4gQ3J5cHRvSlMuU0hBMjU2KFxuICAgICAgICAgICAgYmxvY2suaW5kZXggKyBibG9jay5wcmV2aW91c0hhc2ggKyBibG9jay50aW1lc3RhbXAgKyBibG9jay5fZGF0YVxuICAgICAgICApLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCbG9jaztcbiJdfQ== 30 | 31 | function createStore(reducer, preloadedState, enhancer) { 32 | if (typeof preloadedState === "function" && typeof enhancer === "undefined") { 33 | enhancer = preloadedState; 34 | preloadedState = undefined; 35 | } 36 | if (typeof enhancer === "function") { 37 | return enhancer(createStore)(reducer, preloadedState); 38 | } 39 | var blockchain = [new Block({ 40 | previousBlock: { 41 | index: 0, 42 | hash: "0", 43 | data: {}, 44 | timestamp: new Date().getTime() 45 | }, 46 | data: preloadedState 47 | })]; 48 | var listeners = []; 49 | function notifyListeners() { 50 | listeners.forEach(function (listener) { return listener(); }); 51 | } 52 | 53 | function getLastBlock() { 54 | return blockchain[blockchain.length - 1]; 55 | } 56 | 57 | function dispatch(action) { 58 | var lastBlock = getLastBlock(); 59 | var nextData = reducer(lastBlock.data, action); 60 | addBlock(new Block({ 61 | previousBlock: lastBlock, 62 | data: nextData 63 | })); 64 | } 65 | 66 | function subscribe(listener) { 67 | listeners.push(listener); 68 | return function unsubscribe() { 69 | listeners.splice(listeners.indexOf(listener), 1); 70 | }; 71 | } 72 | 73 | function addBlock(newBlock) { 74 | if (isValidNewBlock(newBlock, getLastBlock())) { 75 | blockchain.push(newBlock); 76 | notifyListeners(); 77 | } 78 | } 79 | 80 | function isValidNewBlock(newBlock, previousBlock) { 81 | if (previousBlock.index + 1 !== newBlock.index) { 82 | console.log("invalid index"); 83 | return false; 84 | } else if (previousBlock.hash !== newBlock.previousHash) { 85 | console.log("invalid previoushash"); 86 | return false; 87 | } else if (Block.calculateHash(newBlock) !== newBlock.hash) { 88 | console.log("invalid hash: ", Block.calculateHash(newBlock), newBlock.hash); 89 | return false; 90 | } 91 | return true; 92 | } 93 | 94 | function isValidChain(blockchain) { 95 | for (var i = 0;i < blockchain.length - 1; i++) { 96 | if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) { 97 | return false; 98 | } 99 | } 100 | return true; 101 | } 102 | 103 | function replaceChain(newBlocks) { 104 | if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) { 105 | console.debug("Replacing old chain with new"); 106 | blockchain = newBlocks; 107 | } 108 | notifyListeners(); 109 | } 110 | 111 | dispatch({ 112 | type: "INIT" 113 | }); 114 | return { 115 | getState: function () { return getLastBlock().data; }, 116 | getLastBlock: getLastBlock, 117 | dispatch: dispatch, 118 | subscribe: subscribe, 119 | addBlock: addBlock, 120 | replaceChain: replaceChain, 121 | getWholeChain: function () { return blockchain; } 122 | }; 123 | } 124 | 125 | 126 | 127 | 128 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJsb2NrY2hhaW5SZWR1eC5qcyhvcmlnaW5hbCkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXO0FBRWxCLFNBQVMsWUFBWSxPQUFTLEVBQUEsY0FBZ0IsRUFBQSxVQUFVO0lBQ3BELElBQ0ksTUFBQSxDQUFPLGNBQVAsQ0FBQSxHQUFBLENBQTBCLFVBQTFCLENBQUEsRUFBQSxDQUNBLE1BQUEsQ0FBTyxRQUFQLENBQUEsR0FBQSxDQUFvQixhQUN0QjtRQUNFLFFBQUEsQ0FBQSxDQUFBLENBQVc7UUFDWCxjQUFBLENBQUEsQ0FBQSxDQUFpQjtJQUN6QjtJQUVJLElBQUksTUFBQSxDQUFPLFFBQVAsQ0FBQSxHQUFBLENBQW9CLFlBQVk7UUFDaEMsT0FBTyxRQUFBLENBQVMsWUFBVCxDQUFzQixTQUFTO0lBQzlDO0lBRUksR0FBQSxDQUFJLGFBQWEsQ0FDYixJQUFJLEtBQUosQ0FBVTtRQUNOLGVBQWU7WUFDWCxPQUFPLENBREksQ0FBQTtZQUVYLE1BQU0sR0FGSyxDQUFBO1lBR1gsTUFBTSxFQUhLLENBQUE7WUFJWCxXQUFXLElBQUksSUFBSixFQUFBLENBQVcsT0FBWDtTQUxULENBQUE7UUFPTixNQUFNOztJQUdkLEdBQUEsQ0FBSSxZQUFZO0lBRWhCLFNBQVMsa0JBQWtCO1FBQ3ZCLFNBQUEsQ0FBVSxPQUFWLENBQWtCLFFBQUEsSUFBWSxRQUFBO0lBQ3RDOztJQUVJLFNBQVMsZUFBZTtRQUNwQixPQUFPLFVBQUEsQ0FBVyxVQUFBLENBQVcsTUFBWCxDQUFBLENBQUEsQ0FBb0I7SUFDOUM7O0lBRUksU0FBUyxTQUFTLFFBQVE7UUFDdEIsS0FBQSxDQUFNLFlBQVksWUFBQTtRQUNsQixLQUFBLENBQU0sV0FBVyxPQUFBLENBQVEsU0FBQSxDQUFVLE1BQU07UUFFekMsUUFBQSxDQUFTLElBQUksS0FBSixDQUFVO1lBQUUsZUFBZSxTQUFqQixDQUFBO1lBQTRCLE1BQU07O0lBQzdEOztJQUVJLFNBQVMsVUFBVSxVQUFVO1FBQ3pCLFNBQUEsQ0FBVSxJQUFWLENBQWU7UUFFZixPQUFPLFNBQVMsY0FBYztZQUMxQixTQUFBLENBQVUsTUFBVixDQUFpQixTQUFBLENBQVUsT0FBVixDQUFrQixXQUFXO1FBQzFEO0lBQ0E7O0lBRUksU0FBUyxTQUFTLFVBQVU7UUFDeEIsSUFBSSxlQUFBLENBQWdCLFVBQVUsWUFBQSxLQUFpQjtZQUMzQyxVQUFBLENBQVcsSUFBWCxDQUFnQjtZQUNoQixlQUFBO1FBQ1o7SUFDQTs7SUFFSSxTQUFTLGdCQUFnQixRQUFVLEVBQUEsZUFBZTtRQUM5QyxJQUFJLGFBQUEsQ0FBYyxLQUFkLENBQUEsQ0FBQSxDQUFzQixDQUF0QixDQUFBLEdBQUEsQ0FBNEIsUUFBQSxDQUFTLE9BQU87WUFDNUMsT0FBQSxDQUFRLEdBQVIsQ0FBWTtZQUNaLE9BQU87UUFDbkIsT0FBZSxJQUFJLGFBQUEsQ0FBYyxJQUFkLENBQUEsR0FBQSxDQUF1QixRQUFBLENBQVMsY0FBYztZQUNyRCxPQUFBLENBQVEsR0FBUixDQUFZO1lBQ1osT0FBTztRQUNuQixPQUFlLElBQUksS0FBQSxDQUFNLGFBQU4sQ0FBb0IsU0FBcEIsQ0FBQSxHQUFBLENBQWtDLFFBQUEsQ0FBUyxNQUFNO1lBQ3hELE9BQUEsQ0FBUSxHQUFSLENBQ0ksa0JBQ0EsS0FBQSxDQUFNLGFBQU4sQ0FBb0IsV0FDcEIsUUFBQSxDQUFTO1lBRWIsT0FBTztRQUNuQjtRQUNRLE9BQU87SUFDZjs7SUFFSSxTQUFTLGFBQWEsWUFBWTtRQUM5QixLQUFLLEdBQUEsQ0FBSSxJQUFJLEVBQUcsQ0FBQSxDQUFBLENBQUEsQ0FBSSxVQUFBLENBQVcsTUFBWCxDQUFBLENBQUEsQ0FBb0IsR0FBRyxDQUFBLElBQUs7WUFDNUMsSUFBSSxDQUFDLGVBQUEsQ0FBZ0IsVUFBQSxDQUFXLENBQUEsQ0FBQSxDQUFBLENBQUksSUFBSSxVQUFBLENBQVcsS0FBSztnQkFDcEQsT0FBTztZQUN2QjtRQUNBO1FBQ1EsT0FBTztJQUNmOztJQUVJLFNBQVMsYUFBYSxXQUFXO1FBQzdCLElBQUksWUFBQSxDQUFhLFVBQWIsQ0FBQSxFQUFBLENBQTJCLFNBQUEsQ0FBVSxNQUFWLENBQUEsQ0FBQSxDQUFtQixVQUFBLENBQVcsUUFBUTtZQUNqRSxPQUFBLENBQVEsS0FBUixDQUFjO1lBQ2QsVUFBQSxDQUFBLENBQUEsQ0FBYTtRQUN6QjtRQUNRLGVBQUE7SUFDUjs7SUFFSSxRQUFBLENBQVM7UUFBRSxNQUFNOztJQUVqQixPQUFPO1FBQ0gsYUFBVSxHQUFNLFlBQUEsRUFBQSxDQUFlLElBRDVCLENBQUE7UUFFSCxjQUFjLFlBRlgsQ0FBQTtRQUdILFVBQVUsUUFIUCxDQUFBO1FBSUgsV0FBVyxTQUpSLENBQUE7UUFNSCxVQUFVLFFBTlAsQ0FBQTtRQU9ILGNBQWMsWUFQWCxDQUFBO1FBUUgsa0JBQWUsR0FBTTs7QUFFN0I7O0FBRUEsZUFBZTtBQTNHZiIsImZpbGUiOiJibG9ja2NoYWluUmVkdXguanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJsb2NrIGZyb20gXCIuL0Jsb2NrXCI7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgICB9XG5cbiAgICBsZXQgYmxvY2tjaGFpbiA9IFtcbiAgICAgICAgbmV3IEJsb2NrKHtcbiAgICAgICAgICAgIHByZXZpb3VzQmxvY2s6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgICBoYXNoOiBcIjBcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YTogcHJlbG9hZGVkU3RhdGVcbiAgICAgICAgfSlcbiAgICBdO1xuICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIG5vdGlmeUxpc3RlbmVycygpIHtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TGFzdEJsb2NrKCkge1xuICAgICAgICByZXR1cm4gYmxvY2tjaGFpbltibG9ja2NoYWluLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0QmxvY2sgPSBnZXRMYXN0QmxvY2soKTtcbiAgICAgICAgY29uc3QgbmV4dERhdGEgPSByZWR1Y2VyKGxhc3RCbG9jay5kYXRhLCBhY3Rpb24pO1xuXG4gICAgICAgIGFkZEJsb2NrKG5ldyBCbG9jayh7IHByZXZpb3VzQmxvY2s6IGxhc3RCbG9jaywgZGF0YTogbmV4dERhdGEgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEJsb2NrKG5ld0Jsb2NrKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkTmV3QmxvY2sobmV3QmxvY2ssIGdldExhc3RCbG9jaygpKSkge1xuICAgICAgICAgICAgYmxvY2tjaGFpbi5wdXNoKG5ld0Jsb2NrKTtcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZE5ld0Jsb2NrKG5ld0Jsb2NrLCBwcmV2aW91c0Jsb2NrKSB7XG4gICAgICAgIGlmIChwcmV2aW91c0Jsb2NrLmluZGV4ICsgMSAhPT0gbmV3QmxvY2suaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW52YWxpZCBpbmRleFwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0Jsb2NrLmhhc2ggIT09IG5ld0Jsb2NrLnByZXZpb3VzSGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJpbnZhbGlkIHByZXZpb3VzaGFzaFwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChCbG9jay5jYWxjdWxhdGVIYXNoKG5ld0Jsb2NrKSAhPT0gbmV3QmxvY2suaGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJpbnZhbGlkIGhhc2g6IFwiLFxuICAgICAgICAgICAgICAgIEJsb2NrLmNhbGN1bGF0ZUhhc2gobmV3QmxvY2spLFxuICAgICAgICAgICAgICAgIG5ld0Jsb2NrLmhhc2hcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZENoYWluKGJsb2NrY2hhaW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2NoYWluLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmV3QmxvY2soYmxvY2tjaGFpbltpICsgMV0sIGJsb2NrY2hhaW5baV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VDaGFpbihuZXdCbG9ja3MpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRDaGFpbihuZXdCbG9ja3MpICYmIG5ld0Jsb2Nrcy5sZW5ndGggPiBibG9ja2NoYWluLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlJlcGxhY2luZyBvbGQgY2hhaW4gd2l0aCBuZXdcIik7XG4gICAgICAgICAgICBibG9ja2NoYWluID0gbmV3QmxvY2tzO1xuICAgICAgICB9XG4gICAgICAgIG5vdGlmeUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJJTklUXCIgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXRTdGF0ZTogKCkgPT4gZ2V0TGFzdEJsb2NrKCkuZGF0YSxcbiAgICAgICAgZ2V0TGFzdEJsb2NrOiBnZXRMYXN0QmxvY2ssXG4gICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICAgICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG5cbiAgICAgICAgYWRkQmxvY2s6IGFkZEJsb2NrLFxuICAgICAgICByZXBsYWNlQ2hhaW46IHJlcGxhY2VDaGFpbiwgLy8gcHJpbWFyaWx5IHVzZWQgd2hlbiBzdGFydGluZyB1cCB0byB0YWtlIGxhdGVzdCBhdmFpbGFibGUgYmxvY2tjaGFpblxuICAgICAgICBnZXRXaG9sZUNoYWluOiAoKSA9PiBibG9ja2NoYWluXG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3RvcmU7XG4iXX0= 129 | 130 | function firebaseMiddleware (firebaseApp) { 131 | var db = firebaseApp.database(); 132 | return function (createStore) { return function () { 133 | var args = [], len = arguments.length; 134 | while ( len-- ) args[ len ] = arguments[ len ]; 135 | 136 | var store = createStore.apply(void 0, args); 137 | var _dispatch = store.dispatch; 138 | function dispatch(action) { 139 | _dispatch(action); 140 | var newBlock = store.getLastBlock(); 141 | return saveBlock(newBlock); 142 | } 143 | 144 | function saveBlock(block) { 145 | block._data = block._data || {}; 146 | return db.ref(("blockchain/" + (block.index))).once("value").then(function (snapshot) { 147 | if (!snapshot.exists()) { 148 | db.ref(("blockchain/" + (block.index))).set(block); 149 | return true; 150 | } else { 151 | return false; 152 | } 153 | }); 154 | } 155 | 156 | function listenForNextBlock() { 157 | var nextIndex = store.getLastBlock().index + 1; 158 | var valueHandler = function (snapshot) { 159 | if (snapshot.exists()) { 160 | var block = snapshot.val(); 161 | block.data = block._data ? JSON.parse(block._data) : {}; 162 | console.log("Received block from outside", block); 163 | store.addBlock(block); 164 | db.ref(("blockchain/" + nextIndex)).off("value", valueHandler); 165 | listenForNextBlock(); 166 | } 167 | }; 168 | db.ref(("blockchain/" + nextIndex)).on("value", valueHandler); 169 | console.log("Listening for", nextIndex); 170 | } 171 | 172 | function initFromFirebase() { 173 | return db.ref("blockchain").orderByKey().once("value").then(function (snapshot) { return snapshot.val(); }).then(function (blockchain) { 174 | blockchain = Object.values(blockchain).map(function (block) { 175 | block.data = block._data ? JSON.parse(block._data) : {}; 176 | return block; 177 | }); 178 | console.debug("Got blockchain", blockchain.length); 179 | store.replaceChain(blockchain); 180 | listenForNextBlock(); 181 | return Object.assign(store, { 182 | dispatch: dispatch 183 | }); 184 | }); 185 | } 186 | 187 | return Promise.all(store.getWholeChain().map(saveBlock)).then(initFromFirebase); 188 | }; }; 189 | } 190 | 191 | 192 | 193 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpcmViYXNlTWlkZGxld2FyZS5qcyhvcmlnaW5hbCkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxVQUFTLGFBQWE7SUFDakMsS0FBQSxDQUFNLEtBQUssV0FBQSxDQUFZLFFBQVo7SUFFWCxPQUFPLFdBQUEsS0FBZ0IsR0FBRyxNQUFKLEdBQWE7UUFDL0IsS0FBQSxDQUFNLFFBQVEsV0FBQSxDQUFZLEdBQUc7UUFDN0IsS0FBQSxDQUFNLFlBQVksS0FBQSxDQUFNO1FBRXhCLFNBQVMsU0FBUyxRQUFRO1lBQ3RCLFNBQUEsQ0FBVTtZQUVWLEtBQUEsQ0FBTSxXQUFXLEtBQUEsQ0FBTSxZQUFOO1lBQ2pCLE9BQU8sU0FBQSxDQUFVO1FBQzdCOztRQUVRLFNBQVMsVUFBVSxPQUFPO1lBQ3RCLEtBQUEsQ0FBTSxLQUFOLENBQUEsQ0FBQSxDQUFjLEtBQUEsQ0FBTSxLQUFOLENBQUEsRUFBQSxDQUFlO1lBRTdCLE9BQU8sRUFBQSxDQUNGLEdBREUsQ0FDRSxjQUFjLEtBQUEsQ0FBTSxNQUFwQixFQURGLENBRUYsSUFGRSxDQUVHLFFBRkgsQ0FHRixJQUhFLENBR0csUUFBQSxJQUFZO2dCQUNkLElBQUksQ0FBQyxRQUFBLENBQVMsTUFBVCxJQUFtQjtvQkFDcEIsRUFBQSxDQUFHLEdBQUgsQ0FBTyxjQUFjLEtBQUEsQ0FBTSxNQUFwQixFQUFQLENBQW9DLEdBQXBDLENBQXdDO29CQUN4QyxPQUFPO2dCQUMvQixPQUEyQjtvQkFFSCxPQUFPO2dCQUMvQjtZQUNBO1FBQ0E7O1FBRVEsU0FBUyxxQkFBcUI7WUFDMUIsS0FBQSxDQUFNLFlBQVksS0FBQSxDQUFNLFlBQU4sRUFBQSxDQUFxQixLQUFyQixDQUFBLENBQUEsQ0FBNkI7WUFDL0MsS0FBQSxDQUFNLGVBQWUsVUFBUyxVQUFVO2dCQUNwQyxJQUFJLFFBQUEsQ0FBUyxNQUFULElBQW1CO29CQUNuQixHQUFBLENBQUksUUFBUSxRQUFBLENBQVMsR0FBVDtvQkFDWixLQUFBLENBQU0sSUFBTixDQUFBLENBQUEsQ0FBYSxLQUFBLENBQU0sS0FBTixHQUFjLElBQUEsQ0FBSyxLQUFMLENBQVcsS0FBQSxDQUFNLFNBQVM7b0JBRXJELE9BQUEsQ0FBUSxHQUFSLENBQVksK0JBQStCO29CQUczQyxLQUFBLENBQU0sUUFBTixDQUFlO29CQUNmLEVBQUEsQ0FDSyxHQURMLENBQ1MsY0FBYyxVQUFkLEVBRFQsQ0FFSyxHQUZMLENBRVMsU0FBUztvQkFFbEIsa0JBQUE7Z0JBQ3BCO1lBQ0E7WUFFWSxFQUFBLENBQUcsR0FBSCxDQUFPLGNBQWMsVUFBZCxFQUFQLENBQWtDLEVBQWxDLENBQXFDLFNBQVM7WUFDOUMsT0FBQSxDQUFRLEdBQVIsQ0FBWSxpQkFBaUI7UUFDekM7O1FBRVEsU0FBUyxtQkFBbUI7WUFDeEIsT0FBTyxFQUFBLENBQ0YsR0FERSxDQUNFLGFBREYsQ0FFRixVQUZFLEVBQUEsQ0FHRixJQUhFLENBR0csUUFISCxDQUlGLElBSkUsQ0FJRyxRQUFBLElBQVksUUFBQSxDQUFTLEdBQVQsR0FKZixDQUtGLElBTEUsQ0FLRyxVQUFBLElBQWM7Z0JBQ2hCLFVBQUEsQ0FBQSxDQUFBLENBQWEsTUFBQSxDQUFPLE1BQVAsQ0FBYyxXQUFkLENBQTBCLEdBQTFCLENBQThCLEtBQUEsSUFBUztvQkFDaEQsS0FBQSxDQUFNLElBQU4sQ0FBQSxDQUFBLENBQWEsS0FBQSxDQUFNLEtBQU4sR0FBYyxJQUFBLENBQUssS0FBTCxDQUFXLEtBQUEsQ0FBTSxTQUFTO29CQUNyRCxPQUFPO2dCQUMvQjtnQkFFb0IsT0FBQSxDQUFRLEtBQVIsQ0FBYyxrQkFBa0IsVUFBQSxDQUFXO2dCQUUzQyxLQUFBLENBQU0sWUFBTixDQUFtQjtnQkFFbkIsa0JBQUE7Z0JBRUEsT0FBTyxNQUFBLENBQU8sTUFBUCxDQUFjLE9BQU87b0JBQ3hCOztZQUV4QjtRQUNBOztRQUVRLE9BQU8sT0FBQSxDQUFRLEdBQVIsQ0FBWSxLQUFBLENBQU0sYUFBTixFQUFBLENBQXNCLEdBQXRCLENBQTBCLFdBQXRDLENBQWtELElBQWxELENBQ0g7SUFFWjtBQUNBOztBQWxGQSIsImZpbGUiOiJmaXJlYmFzZU1pZGRsZXdhcmUuanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZmlyZWJhc2VBcHApIHtcbiAgICBjb25zdCBkYiA9IGZpcmViYXNlQXBwLmRhdGFiYXNlKCk7XG5cbiAgICByZXR1cm4gY3JlYXRlU3RvcmUgPT4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZSguLi5hcmdzKTtcbiAgICAgICAgY29uc3QgX2Rpc3BhdGNoID0gc3RvcmUuZGlzcGF0Y2g7XG5cbiAgICAgICAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgICAgICBfZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgICAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBzdG9yZS5nZXRMYXN0QmxvY2soKTtcbiAgICAgICAgICAgIHJldHVybiBzYXZlQmxvY2sobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2F2ZUJsb2NrKGJsb2NrKSB7XG4gICAgICAgICAgICBibG9jay5fZGF0YSA9IGJsb2NrLl9kYXRhIHx8IHt9O1xuXG4gICAgICAgICAgICByZXR1cm4gZGJcbiAgICAgICAgICAgICAgICAucmVmKGBibG9ja2NoYWluLyR7YmxvY2suaW5kZXh9YClcbiAgICAgICAgICAgICAgICAub25jZShcInZhbHVlXCIpXG4gICAgICAgICAgICAgICAgLnRoZW4oc25hcHNob3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5yZWYoYGJsb2NrY2hhaW4vJHtibG9jay5pbmRleH1gKS5zZXQoYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsaXNpb24gcmVzb2x1dGlvbj9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbGlzdGVuRm9yTmV4dEJsb2NrKCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gc3RvcmUuZ2V0TGFzdEJsb2NrKCkuaW5kZXggKyAxO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVIYW5kbGVyID0gZnVuY3Rpb24oc25hcHNob3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc25hcHNob3QuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gc25hcHNob3QudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmRhdGEgPSBibG9jay5fZGF0YSA/IEpTT04ucGFyc2UoYmxvY2suX2RhdGEpIDoge307XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSZWNlaXZlZCBibG9jayBmcm9tIG91dHNpZGVcIiwgYmxvY2spO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHBvdGVudGlhbCBjb25mbGljdCB3aXRoIGxvY2FsIGxhc3QgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuYWRkQmxvY2soYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICBkYlxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZihgYmxvY2tjaGFpbi8ke25leHRJbmRleH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZihcInZhbHVlXCIsIHZhbHVlSGFuZGxlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuRm9yTmV4dEJsb2NrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZGIucmVmKGBibG9ja2NoYWluLyR7bmV4dEluZGV4fWApLm9uKFwidmFsdWVcIiwgdmFsdWVIYW5kbGVyKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTGlzdGVuaW5nIGZvclwiLCBuZXh0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdEZyb21GaXJlYmFzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYlxuICAgICAgICAgICAgICAgIC5yZWYoXCJibG9ja2NoYWluXCIpXG4gICAgICAgICAgICAgICAgLm9yZGVyQnlLZXkoKVxuICAgICAgICAgICAgICAgIC5vbmNlKFwidmFsdWVcIilcbiAgICAgICAgICAgICAgICAudGhlbihzbmFwc2hvdCA9PiBzbmFwc2hvdC52YWwoKSlcbiAgICAgICAgICAgICAgICAudGhlbihibG9ja2NoYWluID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tjaGFpbiA9IE9iamVjdC52YWx1ZXMoYmxvY2tjaGFpbikubWFwKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmRhdGEgPSBibG9jay5fZGF0YSA/IEpTT04ucGFyc2UoYmxvY2suX2RhdGEpIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJHb3QgYmxvY2tjaGFpblwiLCBibG9ja2NoYWluLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RvcmUucmVwbGFjZUNoYWluKGJsb2NrY2hhaW4pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbkZvck5leHRCbG9jaygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHN0b3JlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzdG9yZS5nZXRXaG9sZUNoYWluKCkubWFwKHNhdmVCbG9jaykpLnRoZW4oXG4gICAgICAgICAgICBpbml0RnJvbUZpcmViYXNlXG4gICAgICAgICk7XG4gICAgfTtcbn1cbiJdfQ== 194 | 195 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzKG9yaWdpbmFsKSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGlCQUFpQjtBQUN4QixPQUFPLHdCQUF3QjtBQUUvQixPQUFBLENBQVMsYUFBYTtBQUh0QiIsImZpbGUiOiJpbmRleC5qcyhvcmlnaW5hbCkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlU3RvcmUgZnJvbSBcIi4vYmxvY2tjaGFpblJlZHV4XCI7XG5pbXBvcnQgZmlyZWJhc2VNaWRkbGV3YXJlIGZyb20gXCIuL2ZpcmViYXNlTWlkZGxld2FyZVwiO1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgZmlyZWJhc2VNaWRkbGV3YXJlIH07XG4iXX0= 196 | 197 | export { createStore, firebaseMiddleware }; 198 | //# sourceMappingURL=blockchain-redux.m.js.map 199 | -------------------------------------------------------------------------------- /dist/blockchain-redux.umd.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('crypto-js')) : 3 | typeof define === 'function' && define.amd ? define(['exports', 'crypto-js'], factory) : 4 | (factory((global.blockchainRedux = {}),global.CryptoJS)); 5 | }(this, (function (exports,CryptoJS) { 6 | 7 | CryptoJS = CryptoJS && CryptoJS.hasOwnProperty('default') ? CryptoJS['default'] : CryptoJS; 8 | 9 | var Block = function Block(ref) { 10 | var previousBlock = ref.previousBlock; 11 | var data = ref.data; 12 | 13 | this.index = previousBlock.index + 1; 14 | this.previousHash = previousBlock.hash.toString(); 15 | this.timestamp = new Date().getTime() / 1000; 16 | this.data = data; 17 | this.hash = Block.calculateHash(this); 18 | }; 19 | 20 | var prototypeAccessors = { data: { configurable: true } }; 21 | prototypeAccessors.data.set = function (data) { 22 | this._data = JSON.stringify(data); 23 | }; 24 | prototypeAccessors.data.get = function () { 25 | return typeof this._data !== "undefined" ? JSON.parse(this._data) : undefined; 26 | }; 27 | Block.calculateHash = function calculateHash (block) { 28 | return CryptoJS.SHA256(block.index + block.previousHash + block.timestamp + block._data).toString(); 29 | }; 30 | 31 | Object.defineProperties( Block.prototype, prototypeAccessors ); 32 | 33 | 34 | 35 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJsb2NrLmpzKG9yaWdpbmFsKSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGNBQWM7QUFFckIsTUFBTSxNQUFNO0lBQ1IsWUFBWSxDQUFFLGVBQWUsT0FBUTtRQUNqQyxJQUFBLENBQUssS0FBTCxDQUFBLENBQUEsQ0FBYSxhQUFBLENBQWMsS0FBZCxDQUFBLENBQUEsQ0FBc0I7UUFDbkMsSUFBQSxDQUFLLFlBQUwsQ0FBQSxDQUFBLENBQW9CLGFBQUEsQ0FBYyxJQUFkLENBQW1CLFFBQW5CO1FBQ3BCLElBQUEsQ0FBSyxTQUFMLENBQUEsQ0FBQSxDQUFpQixJQUFJLElBQUosRUFBQSxDQUFXLE9BQVgsRUFBQSxDQUFBLENBQUEsQ0FBdUI7UUFDeEMsSUFBQSxDQUFLLElBQUwsQ0FBQSxDQUFBLENBQVk7UUFFWixJQUFBLENBQUssSUFBTCxDQUFBLENBQUEsQ0FBWSxLQUFBLENBQU0sYUFBTixDQUFvQjtJQUN4QztJQUVJLEdBQUEsQ0FBSSxLQUFLLE1BQU07UUFDWCxJQUFBLENBQUssS0FBTCxDQUFBLENBQUEsQ0FBYSxJQUFBLENBQUssU0FBTCxDQUFlO0lBQ3BDO0lBRUksR0FBQSxDQUFJLE9BQU87UUFDUCxPQUFPLE1BQUEsQ0FBTyxJQUFBLENBQUssS0FBWixDQUFBLEdBQUEsQ0FBc0IsV0FBdEIsR0FDRCxJQUFBLENBQUssS0FBTCxDQUFXLElBQUEsQ0FBSyxTQUNoQjtJQUNkO0lBR0ksT0FBTyxjQUFjLE9BQU87UUFDeEIsT0FBTyxRQUFBLENBQVMsTUFBVCxDQUNILEtBQUEsQ0FBTSxLQUFOLENBQUEsQ0FBQSxDQUFjLEtBQUEsQ0FBTSxZQUFwQixDQUFBLENBQUEsQ0FBbUMsS0FBQSxDQUFNLFNBQXpDLENBQUEsQ0FBQSxDQUFxRCxLQUFBLENBQU0sTUFEeEQsQ0FFTCxRQUZLO0lBR2Y7QUFDQTtBQUVBLGVBQWU7QUE5QmYiLCJmaWxlIjoiQmxvY2suanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENyeXB0b0pTIGZyb20gXCJjcnlwdG8tanNcIjtcblxuY2xhc3MgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKHsgcHJldmlvdXNCbG9jaywgZGF0YSB9KSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBwcmV2aW91c0Jsb2NrLmluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0hhc2ggPSBwcmV2aW91c0Jsb2NrLmhhc2gudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5oYXNoID0gQmxvY2suY2FsY3VsYXRlSGFzaCh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXQgZGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9kYXRhICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5fZGF0YSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgd2hlcmUgYSBQcm9vZi1vZi1Xb3JrIG9yIFByb29mLW9mLVN0YWtlIGFsZ28gY29tZXMgaW4sIEkgdGhpbmtcbiAgICBzdGF0aWMgY2FsY3VsYXRlSGFzaChibG9jaykge1xuICAgICAgICByZXR1cm4gQ3J5cHRvSlMuU0hBMjU2KFxuICAgICAgICAgICAgYmxvY2suaW5kZXggKyBibG9jay5wcmV2aW91c0hhc2ggKyBibG9jay50aW1lc3RhbXAgKyBibG9jay5fZGF0YVxuICAgICAgICApLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCbG9jaztcbiJdfQ== 36 | 37 | function createStore(reducer, preloadedState, enhancer) { 38 | if (typeof preloadedState === "function" && typeof enhancer === "undefined") { 39 | enhancer = preloadedState; 40 | preloadedState = undefined; 41 | } 42 | if (typeof enhancer === "function") { 43 | return enhancer(createStore)(reducer, preloadedState); 44 | } 45 | var blockchain = [new Block({ 46 | previousBlock: { 47 | index: 0, 48 | hash: "0", 49 | data: {}, 50 | timestamp: new Date().getTime() 51 | }, 52 | data: preloadedState 53 | })]; 54 | var listeners = []; 55 | function notifyListeners() { 56 | listeners.forEach(function (listener) { return listener(); }); 57 | } 58 | 59 | function getLastBlock() { 60 | return blockchain[blockchain.length - 1]; 61 | } 62 | 63 | function dispatch(action) { 64 | var lastBlock = getLastBlock(); 65 | var nextData = reducer(lastBlock.data, action); 66 | addBlock(new Block({ 67 | previousBlock: lastBlock, 68 | data: nextData 69 | })); 70 | } 71 | 72 | function subscribe(listener) { 73 | listeners.push(listener); 74 | return function unsubscribe() { 75 | listeners.splice(listeners.indexOf(listener), 1); 76 | }; 77 | } 78 | 79 | function addBlock(newBlock) { 80 | if (isValidNewBlock(newBlock, getLastBlock())) { 81 | blockchain.push(newBlock); 82 | notifyListeners(); 83 | } 84 | } 85 | 86 | function isValidNewBlock(newBlock, previousBlock) { 87 | if (previousBlock.index + 1 !== newBlock.index) { 88 | console.log("invalid index"); 89 | return false; 90 | } else if (previousBlock.hash !== newBlock.previousHash) { 91 | console.log("invalid previoushash"); 92 | return false; 93 | } else if (Block.calculateHash(newBlock) !== newBlock.hash) { 94 | console.log("invalid hash: ", Block.calculateHash(newBlock), newBlock.hash); 95 | return false; 96 | } 97 | return true; 98 | } 99 | 100 | function isValidChain(blockchain) { 101 | for (var i = 0;i < blockchain.length - 1; i++) { 102 | if (!isValidNewBlock(blockchain[i + 1], blockchain[i])) { 103 | return false; 104 | } 105 | } 106 | return true; 107 | } 108 | 109 | function replaceChain(newBlocks) { 110 | if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) { 111 | console.debug("Replacing old chain with new"); 112 | blockchain = newBlocks; 113 | } 114 | notifyListeners(); 115 | } 116 | 117 | dispatch({ 118 | type: "INIT" 119 | }); 120 | return { 121 | getState: function () { return getLastBlock().data; }, 122 | getLastBlock: getLastBlock, 123 | dispatch: dispatch, 124 | subscribe: subscribe, 125 | addBlock: addBlock, 126 | replaceChain: replaceChain, 127 | getWholeChain: function () { return blockchain; } 128 | }; 129 | } 130 | 131 | 132 | 133 | 134 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJsb2NrY2hhaW5SZWR1eC5qcyhvcmlnaW5hbCkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXO0FBRWxCLFNBQVMsWUFBWSxPQUFTLEVBQUEsY0FBZ0IsRUFBQSxVQUFVO0lBQ3BELElBQ0ksTUFBQSxDQUFPLGNBQVAsQ0FBQSxHQUFBLENBQTBCLFVBQTFCLENBQUEsRUFBQSxDQUNBLE1BQUEsQ0FBTyxRQUFQLENBQUEsR0FBQSxDQUFvQixhQUN0QjtRQUNFLFFBQUEsQ0FBQSxDQUFBLENBQVc7UUFDWCxjQUFBLENBQUEsQ0FBQSxDQUFpQjtJQUN6QjtJQUVJLElBQUksTUFBQSxDQUFPLFFBQVAsQ0FBQSxHQUFBLENBQW9CLFlBQVk7UUFDaEMsT0FBTyxRQUFBLENBQVMsWUFBVCxDQUFzQixTQUFTO0lBQzlDO0lBRUksR0FBQSxDQUFJLGFBQWEsQ0FDYixJQUFJLEtBQUosQ0FBVTtRQUNOLGVBQWU7WUFDWCxPQUFPLENBREksQ0FBQTtZQUVYLE1BQU0sR0FGSyxDQUFBO1lBR1gsTUFBTSxFQUhLLENBQUE7WUFJWCxXQUFXLElBQUksSUFBSixFQUFBLENBQVcsT0FBWDtTQUxULENBQUE7UUFPTixNQUFNOztJQUdkLEdBQUEsQ0FBSSxZQUFZO0lBRWhCLFNBQVMsa0JBQWtCO1FBQ3ZCLFNBQUEsQ0FBVSxPQUFWLENBQWtCLFFBQUEsSUFBWSxRQUFBO0lBQ3RDOztJQUVJLFNBQVMsZUFBZTtRQUNwQixPQUFPLFVBQUEsQ0FBVyxVQUFBLENBQVcsTUFBWCxDQUFBLENBQUEsQ0FBb0I7SUFDOUM7O0lBRUksU0FBUyxTQUFTLFFBQVE7UUFDdEIsS0FBQSxDQUFNLFlBQVksWUFBQTtRQUNsQixLQUFBLENBQU0sV0FBVyxPQUFBLENBQVEsU0FBQSxDQUFVLE1BQU07UUFFekMsUUFBQSxDQUFTLElBQUksS0FBSixDQUFVO1lBQUUsZUFBZSxTQUFqQixDQUFBO1lBQTRCLE1BQU07O0lBQzdEOztJQUVJLFNBQVMsVUFBVSxVQUFVO1FBQ3pCLFNBQUEsQ0FBVSxJQUFWLENBQWU7UUFFZixPQUFPLFNBQVMsY0FBYztZQUMxQixTQUFBLENBQVUsTUFBVixDQUFpQixTQUFBLENBQVUsT0FBVixDQUFrQixXQUFXO1FBQzFEO0lBQ0E7O0lBRUksU0FBUyxTQUFTLFVBQVU7UUFDeEIsSUFBSSxlQUFBLENBQWdCLFVBQVUsWUFBQSxLQUFpQjtZQUMzQyxVQUFBLENBQVcsSUFBWCxDQUFnQjtZQUNoQixlQUFBO1FBQ1o7SUFDQTs7SUFFSSxTQUFTLGdCQUFnQixRQUFVLEVBQUEsZUFBZTtRQUM5QyxJQUFJLGFBQUEsQ0FBYyxLQUFkLENBQUEsQ0FBQSxDQUFzQixDQUF0QixDQUFBLEdBQUEsQ0FBNEIsUUFBQSxDQUFTLE9BQU87WUFDNUMsT0FBQSxDQUFRLEdBQVIsQ0FBWTtZQUNaLE9BQU87UUFDbkIsT0FBZSxJQUFJLGFBQUEsQ0FBYyxJQUFkLENBQUEsR0FBQSxDQUF1QixRQUFBLENBQVMsY0FBYztZQUNyRCxPQUFBLENBQVEsR0FBUixDQUFZO1lBQ1osT0FBTztRQUNuQixPQUFlLElBQUksS0FBQSxDQUFNLGFBQU4sQ0FBb0IsU0FBcEIsQ0FBQSxHQUFBLENBQWtDLFFBQUEsQ0FBUyxNQUFNO1lBQ3hELE9BQUEsQ0FBUSxHQUFSLENBQ0ksa0JBQ0EsS0FBQSxDQUFNLGFBQU4sQ0FBb0IsV0FDcEIsUUFBQSxDQUFTO1lBRWIsT0FBTztRQUNuQjtRQUNRLE9BQU87SUFDZjs7SUFFSSxTQUFTLGFBQWEsWUFBWTtRQUM5QixLQUFLLEdBQUEsQ0FBSSxJQUFJLEVBQUcsQ0FBQSxDQUFBLENBQUEsQ0FBSSxVQUFBLENBQVcsTUFBWCxDQUFBLENBQUEsQ0FBb0IsR0FBRyxDQUFBLElBQUs7WUFDNUMsSUFBSSxDQUFDLGVBQUEsQ0FBZ0IsVUFBQSxDQUFXLENBQUEsQ0FBQSxDQUFBLENBQUksSUFBSSxVQUFBLENBQVcsS0FBSztnQkFDcEQsT0FBTztZQUN2QjtRQUNBO1FBQ1EsT0FBTztJQUNmOztJQUVJLFNBQVMsYUFBYSxXQUFXO1FBQzdCLElBQUksWUFBQSxDQUFhLFVBQWIsQ0FBQSxFQUFBLENBQTJCLFNBQUEsQ0FBVSxNQUFWLENBQUEsQ0FBQSxDQUFtQixVQUFBLENBQVcsUUFBUTtZQUNqRSxPQUFBLENBQVEsS0FBUixDQUFjO1lBQ2QsVUFBQSxDQUFBLENBQUEsQ0FBYTtRQUN6QjtRQUNRLGVBQUE7SUFDUjs7SUFFSSxRQUFBLENBQVM7UUFBRSxNQUFNOztJQUVqQixPQUFPO1FBQ0gsYUFBVSxHQUFNLFlBQUEsRUFBQSxDQUFlLElBRDVCLENBQUE7UUFFSCxjQUFjLFlBRlgsQ0FBQTtRQUdILFVBQVUsUUFIUCxDQUFBO1FBSUgsV0FBVyxTQUpSLENBQUE7UUFNSCxVQUFVLFFBTlAsQ0FBQTtRQU9ILGNBQWMsWUFQWCxDQUFBO1FBUUgsa0JBQWUsR0FBTTs7QUFFN0I7O0FBRUEsZUFBZTtBQTNHZiIsImZpbGUiOiJibG9ja2NoYWluUmVkdXguanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJsb2NrIGZyb20gXCIuL0Jsb2NrXCI7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgICB9XG5cbiAgICBsZXQgYmxvY2tjaGFpbiA9IFtcbiAgICAgICAgbmV3IEJsb2NrKHtcbiAgICAgICAgICAgIHByZXZpb3VzQmxvY2s6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgICBoYXNoOiBcIjBcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YTogcHJlbG9hZGVkU3RhdGVcbiAgICAgICAgfSlcbiAgICBdO1xuICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIG5vdGlmeUxpc3RlbmVycygpIHtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TGFzdEJsb2NrKCkge1xuICAgICAgICByZXR1cm4gYmxvY2tjaGFpbltibG9ja2NoYWluLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0QmxvY2sgPSBnZXRMYXN0QmxvY2soKTtcbiAgICAgICAgY29uc3QgbmV4dERhdGEgPSByZWR1Y2VyKGxhc3RCbG9jay5kYXRhLCBhY3Rpb24pO1xuXG4gICAgICAgIGFkZEJsb2NrKG5ldyBCbG9jayh7IHByZXZpb3VzQmxvY2s6IGxhc3RCbG9jaywgZGF0YTogbmV4dERhdGEgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEJsb2NrKG5ld0Jsb2NrKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkTmV3QmxvY2sobmV3QmxvY2ssIGdldExhc3RCbG9jaygpKSkge1xuICAgICAgICAgICAgYmxvY2tjaGFpbi5wdXNoKG5ld0Jsb2NrKTtcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZE5ld0Jsb2NrKG5ld0Jsb2NrLCBwcmV2aW91c0Jsb2NrKSB7XG4gICAgICAgIGlmIChwcmV2aW91c0Jsb2NrLmluZGV4ICsgMSAhPT0gbmV3QmxvY2suaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW52YWxpZCBpbmRleFwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0Jsb2NrLmhhc2ggIT09IG5ld0Jsb2NrLnByZXZpb3VzSGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJpbnZhbGlkIHByZXZpb3VzaGFzaFwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChCbG9jay5jYWxjdWxhdGVIYXNoKG5ld0Jsb2NrKSAhPT0gbmV3QmxvY2suaGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJpbnZhbGlkIGhhc2g6IFwiLFxuICAgICAgICAgICAgICAgIEJsb2NrLmNhbGN1bGF0ZUhhc2gobmV3QmxvY2spLFxuICAgICAgICAgICAgICAgIG5ld0Jsb2NrLmhhc2hcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZENoYWluKGJsb2NrY2hhaW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2NoYWluLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmV3QmxvY2soYmxvY2tjaGFpbltpICsgMV0sIGJsb2NrY2hhaW5baV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VDaGFpbihuZXdCbG9ja3MpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRDaGFpbihuZXdCbG9ja3MpICYmIG5ld0Jsb2Nrcy5sZW5ndGggPiBibG9ja2NoYWluLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlJlcGxhY2luZyBvbGQgY2hhaW4gd2l0aCBuZXdcIik7XG4gICAgICAgICAgICBibG9ja2NoYWluID0gbmV3QmxvY2tzO1xuICAgICAgICB9XG4gICAgICAgIG5vdGlmeUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJJTklUXCIgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXRTdGF0ZTogKCkgPT4gZ2V0TGFzdEJsb2NrKCkuZGF0YSxcbiAgICAgICAgZ2V0TGFzdEJsb2NrOiBnZXRMYXN0QmxvY2ssXG4gICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICAgICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG5cbiAgICAgICAgYWRkQmxvY2s6IGFkZEJsb2NrLFxuICAgICAgICByZXBsYWNlQ2hhaW46IHJlcGxhY2VDaGFpbiwgLy8gcHJpbWFyaWx5IHVzZWQgd2hlbiBzdGFydGluZyB1cCB0byB0YWtlIGxhdGVzdCBhdmFpbGFibGUgYmxvY2tjaGFpblxuICAgICAgICBnZXRXaG9sZUNoYWluOiAoKSA9PiBibG9ja2NoYWluXG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3RvcmU7XG4iXX0= 135 | 136 | function firebaseMiddleware (firebaseApp) { 137 | var db = firebaseApp.database(); 138 | return function (createStore) { return function () { 139 | var args = [], len = arguments.length; 140 | while ( len-- ) args[ len ] = arguments[ len ]; 141 | 142 | var store = createStore.apply(void 0, args); 143 | var _dispatch = store.dispatch; 144 | function dispatch(action) { 145 | _dispatch(action); 146 | var newBlock = store.getLastBlock(); 147 | return saveBlock(newBlock); 148 | } 149 | 150 | function saveBlock(block) { 151 | block._data = block._data || {}; 152 | return db.ref(("blockchain/" + (block.index))).once("value").then(function (snapshot) { 153 | if (!snapshot.exists()) { 154 | db.ref(("blockchain/" + (block.index))).set(block); 155 | return true; 156 | } else { 157 | return false; 158 | } 159 | }); 160 | } 161 | 162 | function listenForNextBlock() { 163 | var nextIndex = store.getLastBlock().index + 1; 164 | var valueHandler = function (snapshot) { 165 | if (snapshot.exists()) { 166 | var block = snapshot.val(); 167 | block.data = block._data ? JSON.parse(block._data) : {}; 168 | console.log("Received block from outside", block); 169 | store.addBlock(block); 170 | db.ref(("blockchain/" + nextIndex)).off("value", valueHandler); 171 | listenForNextBlock(); 172 | } 173 | }; 174 | db.ref(("blockchain/" + nextIndex)).on("value", valueHandler); 175 | console.log("Listening for", nextIndex); 176 | } 177 | 178 | function initFromFirebase() { 179 | return db.ref("blockchain").orderByKey().once("value").then(function (snapshot) { return snapshot.val(); }).then(function (blockchain) { 180 | blockchain = Object.values(blockchain).map(function (block) { 181 | block.data = block._data ? JSON.parse(block._data) : {}; 182 | return block; 183 | }); 184 | console.debug("Got blockchain", blockchain.length); 185 | store.replaceChain(blockchain); 186 | listenForNextBlock(); 187 | return Object.assign(store, { 188 | dispatch: dispatch 189 | }); 190 | }); 191 | } 192 | 193 | return Promise.all(store.getWholeChain().map(saveBlock)).then(initFromFirebase); 194 | }; }; 195 | } 196 | 197 | 198 | 199 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpcmViYXNlTWlkZGxld2FyZS5qcyhvcmlnaW5hbCkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxVQUFTLGFBQWE7SUFDakMsS0FBQSxDQUFNLEtBQUssV0FBQSxDQUFZLFFBQVo7SUFFWCxPQUFPLFdBQUEsS0FBZ0IsR0FBRyxNQUFKLEdBQWE7UUFDL0IsS0FBQSxDQUFNLFFBQVEsV0FBQSxDQUFZLEdBQUc7UUFDN0IsS0FBQSxDQUFNLFlBQVksS0FBQSxDQUFNO1FBRXhCLFNBQVMsU0FBUyxRQUFRO1lBQ3RCLFNBQUEsQ0FBVTtZQUVWLEtBQUEsQ0FBTSxXQUFXLEtBQUEsQ0FBTSxZQUFOO1lBQ2pCLE9BQU8sU0FBQSxDQUFVO1FBQzdCOztRQUVRLFNBQVMsVUFBVSxPQUFPO1lBQ3RCLEtBQUEsQ0FBTSxLQUFOLENBQUEsQ0FBQSxDQUFjLEtBQUEsQ0FBTSxLQUFOLENBQUEsRUFBQSxDQUFlO1lBRTdCLE9BQU8sRUFBQSxDQUNGLEdBREUsQ0FDRSxjQUFjLEtBQUEsQ0FBTSxNQUFwQixFQURGLENBRUYsSUFGRSxDQUVHLFFBRkgsQ0FHRixJQUhFLENBR0csUUFBQSxJQUFZO2dCQUNkLElBQUksQ0FBQyxRQUFBLENBQVMsTUFBVCxJQUFtQjtvQkFDcEIsRUFBQSxDQUFHLEdBQUgsQ0FBTyxjQUFjLEtBQUEsQ0FBTSxNQUFwQixFQUFQLENBQW9DLEdBQXBDLENBQXdDO29CQUN4QyxPQUFPO2dCQUMvQixPQUEyQjtvQkFFSCxPQUFPO2dCQUMvQjtZQUNBO1FBQ0E7O1FBRVEsU0FBUyxxQkFBcUI7WUFDMUIsS0FBQSxDQUFNLFlBQVksS0FBQSxDQUFNLFlBQU4sRUFBQSxDQUFxQixLQUFyQixDQUFBLENBQUEsQ0FBNkI7WUFDL0MsS0FBQSxDQUFNLGVBQWUsVUFBUyxVQUFVO2dCQUNwQyxJQUFJLFFBQUEsQ0FBUyxNQUFULElBQW1CO29CQUNuQixHQUFBLENBQUksUUFBUSxRQUFBLENBQVMsR0FBVDtvQkFDWixLQUFBLENBQU0sSUFBTixDQUFBLENBQUEsQ0FBYSxLQUFBLENBQU0sS0FBTixHQUFjLElBQUEsQ0FBSyxLQUFMLENBQVcsS0FBQSxDQUFNLFNBQVM7b0JBRXJELE9BQUEsQ0FBUSxHQUFSLENBQVksK0JBQStCO29CQUczQyxLQUFBLENBQU0sUUFBTixDQUFlO29CQUNmLEVBQUEsQ0FDSyxHQURMLENBQ1MsY0FBYyxVQUFkLEVBRFQsQ0FFSyxHQUZMLENBRVMsU0FBUztvQkFFbEIsa0JBQUE7Z0JBQ3BCO1lBQ0E7WUFFWSxFQUFBLENBQUcsR0FBSCxDQUFPLGNBQWMsVUFBZCxFQUFQLENBQWtDLEVBQWxDLENBQXFDLFNBQVM7WUFDOUMsT0FBQSxDQUFRLEdBQVIsQ0FBWSxpQkFBaUI7UUFDekM7O1FBRVEsU0FBUyxtQkFBbUI7WUFDeEIsT0FBTyxFQUFBLENBQ0YsR0FERSxDQUNFLGFBREYsQ0FFRixVQUZFLEVBQUEsQ0FHRixJQUhFLENBR0csUUFISCxDQUlGLElBSkUsQ0FJRyxRQUFBLElBQVksUUFBQSxDQUFTLEdBQVQsR0FKZixDQUtGLElBTEUsQ0FLRyxVQUFBLElBQWM7Z0JBQ2hCLFVBQUEsQ0FBQSxDQUFBLENBQWEsTUFBQSxDQUFPLE1BQVAsQ0FBYyxXQUFkLENBQTBCLEdBQTFCLENBQThCLEtBQUEsSUFBUztvQkFDaEQsS0FBQSxDQUFNLElBQU4sQ0FBQSxDQUFBLENBQWEsS0FBQSxDQUFNLEtBQU4sR0FBYyxJQUFBLENBQUssS0FBTCxDQUFXLEtBQUEsQ0FBTSxTQUFTO29CQUNyRCxPQUFPO2dCQUMvQjtnQkFFb0IsT0FBQSxDQUFRLEtBQVIsQ0FBYyxrQkFBa0IsVUFBQSxDQUFXO2dCQUUzQyxLQUFBLENBQU0sWUFBTixDQUFtQjtnQkFFbkIsa0JBQUE7Z0JBRUEsT0FBTyxNQUFBLENBQU8sTUFBUCxDQUFjLE9BQU87b0JBQ3hCOztZQUV4QjtRQUNBOztRQUVRLE9BQU8sT0FBQSxDQUFRLEdBQVIsQ0FBWSxLQUFBLENBQU0sYUFBTixFQUFBLENBQXNCLEdBQXRCLENBQTBCLFdBQXRDLENBQWtELElBQWxELENBQ0g7SUFFWjtBQUNBOztBQWxGQSIsImZpbGUiOiJmaXJlYmFzZU1pZGRsZXdhcmUuanMob3JpZ2luYWwpIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZmlyZWJhc2VBcHApIHtcbiAgICBjb25zdCBkYiA9IGZpcmViYXNlQXBwLmRhdGFiYXNlKCk7XG5cbiAgICByZXR1cm4gY3JlYXRlU3RvcmUgPT4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZSguLi5hcmdzKTtcbiAgICAgICAgY29uc3QgX2Rpc3BhdGNoID0gc3RvcmUuZGlzcGF0Y2g7XG5cbiAgICAgICAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgICAgICBfZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgICAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBzdG9yZS5nZXRMYXN0QmxvY2soKTtcbiAgICAgICAgICAgIHJldHVybiBzYXZlQmxvY2sobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2F2ZUJsb2NrKGJsb2NrKSB7XG4gICAgICAgICAgICBibG9jay5fZGF0YSA9IGJsb2NrLl9kYXRhIHx8IHt9O1xuXG4gICAgICAgICAgICByZXR1cm4gZGJcbiAgICAgICAgICAgICAgICAucmVmKGBibG9ja2NoYWluLyR7YmxvY2suaW5kZXh9YClcbiAgICAgICAgICAgICAgICAub25jZShcInZhbHVlXCIpXG4gICAgICAgICAgICAgICAgLnRoZW4oc25hcHNob3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5yZWYoYGJsb2NrY2hhaW4vJHtibG9jay5pbmRleH1gKS5zZXQoYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsaXNpb24gcmVzb2x1dGlvbj9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbGlzdGVuRm9yTmV4dEJsb2NrKCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gc3RvcmUuZ2V0TGFzdEJsb2NrKCkuaW5kZXggKyAxO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVIYW5kbGVyID0gZnVuY3Rpb24oc25hcHNob3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc25hcHNob3QuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gc25hcHNob3QudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmRhdGEgPSBibG9jay5fZGF0YSA/IEpTT04ucGFyc2UoYmxvY2suX2RhdGEpIDoge307XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSZWNlaXZlZCBibG9jayBmcm9tIG91dHNpZGVcIiwgYmxvY2spO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHBvdGVudGlhbCBjb25mbGljdCB3aXRoIGxvY2FsIGxhc3QgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuYWRkQmxvY2soYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICBkYlxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZihgYmxvY2tjaGFpbi8ke25leHRJbmRleH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9mZihcInZhbHVlXCIsIHZhbHVlSGFuZGxlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuRm9yTmV4dEJsb2NrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZGIucmVmKGBibG9ja2NoYWluLyR7bmV4dEluZGV4fWApLm9uKFwidmFsdWVcIiwgdmFsdWVIYW5kbGVyKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTGlzdGVuaW5nIGZvclwiLCBuZXh0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdEZyb21GaXJlYmFzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYlxuICAgICAgICAgICAgICAgIC5yZWYoXCJibG9ja2NoYWluXCIpXG4gICAgICAgICAgICAgICAgLm9yZGVyQnlLZXkoKVxuICAgICAgICAgICAgICAgIC5vbmNlKFwidmFsdWVcIilcbiAgICAgICAgICAgICAgICAudGhlbihzbmFwc2hvdCA9PiBzbmFwc2hvdC52YWwoKSlcbiAgICAgICAgICAgICAgICAudGhlbihibG9ja2NoYWluID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tjaGFpbiA9IE9iamVjdC52YWx1ZXMoYmxvY2tjaGFpbikubWFwKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmRhdGEgPSBibG9jay5fZGF0YSA/IEpTT04ucGFyc2UoYmxvY2suX2RhdGEpIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJHb3QgYmxvY2tjaGFpblwiLCBibG9ja2NoYWluLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RvcmUucmVwbGFjZUNoYWluKGJsb2NrY2hhaW4pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbkZvck5leHRCbG9jaygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHN0b3JlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzdG9yZS5nZXRXaG9sZUNoYWluKCkubWFwKHNhdmVCbG9jaykpLnRoZW4oXG4gICAgICAgICAgICBpbml0RnJvbUZpcmViYXNlXG4gICAgICAgICk7XG4gICAgfTtcbn1cbiJdfQ== 200 | 201 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzKG9yaWdpbmFsKSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGlCQUFpQjtBQUN4QixPQUFPLHdCQUF3QjtBQUUvQixPQUFBLENBQVMsYUFBYTtBQUh0QiIsImZpbGUiOiJpbmRleC5qcyhvcmlnaW5hbCkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlU3RvcmUgZnJvbSBcIi4vYmxvY2tjaGFpblJlZHV4XCI7XG5pbXBvcnQgZmlyZWJhc2VNaWRkbGV3YXJlIGZyb20gXCIuL2ZpcmViYXNlTWlkZGxld2FyZVwiO1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgZmlyZWJhc2VNaWRkbGV3YXJlIH07XG4iXX0= 202 | 203 | exports.createStore = createStore; 204 | exports.firebaseMiddleware = firebaseMiddleware; 205 | 206 | }))); 207 | //# sourceMappingURL=blockchain-redux.umd.js.map 208 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@firebase/app-types@0.1.2": 6 | version "0.1.2" 7 | resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.1.2.tgz#a20cb346e3be374c0bdee6b102de0ea5e8e6fa27" 8 | 9 | "@firebase/app@0.1.10": 10 | version "0.1.10" 11 | resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.1.10.tgz#fc80c62dbe4d601cad1495bc095309adb9074f85" 12 | dependencies: 13 | "@firebase/app-types" "0.1.2" 14 | "@firebase/util" "0.1.10" 15 | tslib "^1.9.0" 16 | 17 | "@firebase/auth-types@0.2.0": 18 | version "0.2.0" 19 | resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.2.0.tgz#38f9ce77b7b513eafac7e2e8291f1fe97031895a" 20 | 21 | "@firebase/auth@0.4.1": 22 | version "0.4.1" 23 | resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.4.1.tgz#89adbff1cbd6beebf61dedac95d812f89092be09" 24 | dependencies: 25 | "@firebase/auth-types" "0.2.0" 26 | 27 | "@firebase/database-types@0.2.0": 28 | version "0.2.0" 29 | resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.2.0.tgz#c442af71e4c376e6bb78f6aa62645b5a0e2b87b6" 30 | 31 | "@firebase/database@0.2.1": 32 | version "0.2.1" 33 | resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.2.1.tgz#af4f3b80a7bccd4a561fdc76d8c1867243dd0665" 34 | dependencies: 35 | "@firebase/database-types" "0.2.0" 36 | "@firebase/logger" "0.1.0" 37 | "@firebase/util" "0.1.10" 38 | faye-websocket "0.11.1" 39 | tslib "^1.9.0" 40 | 41 | "@firebase/firestore-types@0.2.2": 42 | version "0.2.2" 43 | resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-0.2.2.tgz#e60b6c7a458538b1bf8ed89d9df981fa17a74871" 44 | 45 | "@firebase/firestore@0.3.7": 46 | version "0.3.7" 47 | resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-0.3.7.tgz#7160ebcd2574ca56521df847086bf291dd216ff0" 48 | dependencies: 49 | "@firebase/firestore-types" "0.2.2" 50 | "@firebase/logger" "0.1.0" 51 | "@firebase/webchannel-wrapper" "0.2.7" 52 | grpc "^1.9.1" 53 | tslib "^1.9.0" 54 | 55 | "@firebase/functions-types@0.1.0": 56 | version "0.1.0" 57 | resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.1.0.tgz#2295f51acc15a9301ab7ff802039cf3c2b9e5a36" 58 | 59 | "@firebase/functions@0.1.0": 60 | version "0.1.0" 61 | resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.1.0.tgz#70794ca535f8ec71781f1e6d44bc7d1ad4715a1a" 62 | dependencies: 63 | "@firebase/functions-types" "0.1.0" 64 | "@firebase/messaging-types" "^0.1.1" 65 | isomorphic-fetch "^2.2.1" 66 | 67 | "@firebase/logger@0.1.0": 68 | version "0.1.0" 69 | resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.1.0.tgz#0a7b3af8a43e4b48cc9b16e518c07d8a2ea290e8" 70 | 71 | "@firebase/messaging-types@0.1.2", "@firebase/messaging-types@^0.1.1": 72 | version "0.1.2" 73 | resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.1.2.tgz#4975eeb31db0a16a9fcc7b9afb2ff60f79160c46" 74 | 75 | "@firebase/messaging@0.2.3": 76 | version "0.2.3" 77 | resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.2.3.tgz#bad9e253dd7cba732d3dde67bde9286482d0968e" 78 | dependencies: 79 | "@firebase/messaging-types" "0.1.2" 80 | "@firebase/util" "0.1.10" 81 | tslib "^1.9.0" 82 | 83 | "@firebase/polyfill@0.3.0": 84 | version "0.3.0" 85 | resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.0.tgz#a28af79ebd99ee96f388a9f51a430b0c5e9efe00" 86 | dependencies: 87 | promise-polyfill "^7.1.0" 88 | tslib "^1.9.0" 89 | whatwg-fetch "^2.0.3" 90 | 91 | "@firebase/storage-types@0.1.2": 92 | version "0.1.2" 93 | resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.1.2.tgz#682a60117ff51ab861830727fb7b52f7998701fd" 94 | 95 | "@firebase/storage@0.1.8": 96 | version "0.1.8" 97 | resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.1.8.tgz#81a71de873130184446f07c813f882fd168cd524" 98 | dependencies: 99 | "@firebase/storage-types" "0.1.2" 100 | tslib "^1.9.0" 101 | 102 | "@firebase/util@0.1.10": 103 | version "0.1.10" 104 | resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.1.10.tgz#7898f6e36c8231c287c4024c313000df677b1363" 105 | dependencies: 106 | tslib "^1.9.0" 107 | 108 | "@firebase/webchannel-wrapper@0.2.7": 109 | version "0.2.7" 110 | resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.7.tgz#0495fd7294348d9887abb182aa27432cb8936488" 111 | 112 | abbrev@1: 113 | version "1.1.1" 114 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 115 | 116 | acorn-dynamic-import@^3.0.0: 117 | version "3.0.0" 118 | resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" 119 | dependencies: 120 | acorn "^5.0.0" 121 | 122 | acorn-es7-plugin@>=1.1.6: 123 | version "1.1.7" 124 | resolved "https://registry.yarnpkg.com/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz#f2ee1f3228a90eead1245f9ab1922eb2e71d336b" 125 | 126 | acorn-jsx@^3.0.1: 127 | version "3.0.1" 128 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 129 | dependencies: 130 | acorn "^3.0.4" 131 | 132 | acorn-jsx@^4.1.1: 133 | version "4.1.1" 134 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" 135 | dependencies: 136 | acorn "^5.0.3" 137 | 138 | acorn5-object-spread@^4.0.0: 139 | version "4.0.0" 140 | resolved "https://registry.yarnpkg.com/acorn5-object-spread/-/acorn5-object-spread-4.0.0.tgz#d5758081eed97121ab0be47e31caaef2aa399697" 141 | dependencies: 142 | acorn "^5.1.2" 143 | 144 | acorn@>=2.5.2, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.2.1: 145 | version "5.5.3" 146 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" 147 | 148 | acorn@^3.0.4: 149 | version "3.3.0" 150 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 151 | 152 | ajv@^5.1.0: 153 | version "5.5.2" 154 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 155 | dependencies: 156 | co "^4.6.0" 157 | fast-deep-equal "^1.0.0" 158 | fast-json-stable-stringify "^2.0.0" 159 | json-schema-traverse "^0.3.0" 160 | 161 | alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: 162 | version "1.0.2" 163 | resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" 164 | 165 | ansi-regex@^2.0.0: 166 | version "2.1.1" 167 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 168 | 169 | ansi-styles@^2.2.1: 170 | version "2.2.1" 171 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 172 | 173 | ansi-styles@^3.2.1: 174 | version "3.2.1" 175 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 176 | dependencies: 177 | color-convert "^1.9.0" 178 | 179 | aproba@^1.0.3: 180 | version "1.2.0" 181 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 182 | 183 | are-we-there-yet@~1.1.2: 184 | version "1.1.4" 185 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 186 | dependencies: 187 | delegates "^1.0.0" 188 | readable-stream "^2.0.6" 189 | 190 | argparse@^1.0.7: 191 | version "1.0.10" 192 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 193 | dependencies: 194 | sprintf-js "~1.0.2" 195 | 196 | arr-diff@^2.0.0: 197 | version "2.0.0" 198 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 199 | dependencies: 200 | arr-flatten "^1.0.1" 201 | 202 | arr-flatten@^1.0.1: 203 | version "1.1.0" 204 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 205 | 206 | array-unique@^0.2.1: 207 | version "0.2.1" 208 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 209 | 210 | ascli@~1: 211 | version "1.0.1" 212 | resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" 213 | dependencies: 214 | colour "~0.7.1" 215 | optjs "~3.2.2" 216 | 217 | asn1@~0.2.3: 218 | version "0.2.3" 219 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 220 | 221 | assert-plus@1.0.0, assert-plus@^1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 224 | 225 | asynckit@^0.4.0: 226 | version "0.4.0" 227 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 228 | 229 | asyncro@^3.0.0: 230 | version "3.0.0" 231 | resolved "https://registry.yarnpkg.com/asyncro/-/asyncro-3.0.0.tgz#3c7a732e263bc4a42499042f48d7d858e9c0134e" 232 | 233 | autoprefixer@^6.3.1: 234 | version "6.7.7" 235 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" 236 | dependencies: 237 | browserslist "^1.7.6" 238 | caniuse-db "^1.0.30000634" 239 | normalize-range "^0.1.2" 240 | num2fraction "^1.2.2" 241 | postcss "^5.2.16" 242 | postcss-value-parser "^3.2.3" 243 | 244 | autoprefixer@^7.2.5: 245 | version "7.2.6" 246 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" 247 | dependencies: 248 | browserslist "^2.11.3" 249 | caniuse-lite "^1.0.30000805" 250 | normalize-range "^0.1.2" 251 | num2fraction "^1.2.2" 252 | postcss "^6.0.17" 253 | postcss-value-parser "^3.2.3" 254 | 255 | aws-sign2@~0.7.0: 256 | version "0.7.0" 257 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 258 | 259 | aws4@^1.6.0: 260 | version "1.6.0" 261 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 262 | 263 | babel-polyfill@^6.26.0: 264 | version "6.26.0" 265 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" 266 | dependencies: 267 | babel-runtime "^6.26.0" 268 | core-js "^2.5.0" 269 | regenerator-runtime "^0.10.5" 270 | 271 | babel-runtime@^6.26.0: 272 | version "6.26.0" 273 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 274 | dependencies: 275 | core-js "^2.4.0" 276 | regenerator-runtime "^0.11.0" 277 | 278 | babylon@^6.15.0: 279 | version "6.18.0" 280 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 281 | 282 | balanced-match@^0.4.2: 283 | version "0.4.2" 284 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 285 | 286 | balanced-match@^1.0.0: 287 | version "1.0.0" 288 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 289 | 290 | bcrypt-pbkdf@^1.0.0: 291 | version "1.0.1" 292 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 293 | dependencies: 294 | tweetnacl "^0.14.3" 295 | 296 | big.js@^3.1.3: 297 | version "3.2.0" 298 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 299 | 300 | block-stream@*: 301 | version "0.0.9" 302 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 303 | dependencies: 304 | inherits "~2.0.0" 305 | 306 | boom@4.x.x: 307 | version "4.3.1" 308 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 309 | dependencies: 310 | hoek "4.x.x" 311 | 312 | boom@5.x.x: 313 | version "5.2.0" 314 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 315 | dependencies: 316 | hoek "4.x.x" 317 | 318 | brace-expansion@^1.1.7: 319 | version "1.1.11" 320 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 321 | dependencies: 322 | balanced-match "^1.0.0" 323 | concat-map "0.0.1" 324 | 325 | braces@^1.8.2: 326 | version "1.8.5" 327 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 328 | dependencies: 329 | expand-range "^1.8.1" 330 | preserve "^0.2.0" 331 | repeat-element "^1.1.2" 332 | 333 | browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 334 | version "1.7.7" 335 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 336 | dependencies: 337 | caniuse-db "^1.0.30000639" 338 | electron-to-chromium "^1.2.7" 339 | 340 | browserslist@^2.11.3: 341 | version "2.11.3" 342 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" 343 | dependencies: 344 | caniuse-lite "^1.0.30000792" 345 | electron-to-chromium "^1.3.30" 346 | 347 | buble@^0.18.0: 348 | version "0.18.0" 349 | resolved "https://registry.yarnpkg.com/buble/-/buble-0.18.0.tgz#63b338b8248c474b46fd3e3546560ae08d8abe91" 350 | dependencies: 351 | acorn "^5.1.2" 352 | acorn-jsx "^3.0.1" 353 | acorn5-object-spread "^4.0.0" 354 | chalk "^2.1.0" 355 | magic-string "^0.22.4" 356 | minimist "^1.2.0" 357 | os-homedir "^1.0.1" 358 | vlq "^0.2.2" 359 | 360 | builtin-modules@^2.0.0: 361 | version "2.0.0" 362 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" 363 | 364 | bytebuffer@~5: 365 | version "5.0.1" 366 | resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" 367 | dependencies: 368 | long "~3" 369 | 370 | camelcase@^2.0.1: 371 | version "2.1.1" 372 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 373 | 374 | camelcase@^4.1.0: 375 | version "4.1.0" 376 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 377 | 378 | caniuse-api@^1.5.2: 379 | version "1.6.1" 380 | resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" 381 | dependencies: 382 | browserslist "^1.3.6" 383 | caniuse-db "^1.0.30000529" 384 | lodash.memoize "^4.1.2" 385 | lodash.uniq "^4.5.0" 386 | 387 | caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: 388 | version "1.0.30000821" 389 | resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000821.tgz#3fcdc67c446a94a9cdd848248a4e3e54b2da7419" 390 | 391 | caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: 392 | version "1.0.30000821" 393 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000821.tgz#0f3223f1e048ed96451c56ca6cf197058c42cb93" 394 | 395 | caseless@~0.12.0: 396 | version "0.12.0" 397 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 398 | 399 | chalk@^1.0.0, chalk@^1.1.3: 400 | version "1.1.3" 401 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 402 | dependencies: 403 | ansi-styles "^2.2.1" 404 | escape-string-regexp "^1.0.2" 405 | has-ansi "^2.0.0" 406 | strip-ansi "^3.0.0" 407 | supports-color "^2.0.0" 408 | 409 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2: 410 | version "2.3.2" 411 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" 412 | dependencies: 413 | ansi-styles "^3.2.1" 414 | escape-string-regexp "^1.0.5" 415 | supports-color "^5.3.0" 416 | 417 | clap@^1.0.9: 418 | version "1.2.3" 419 | resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" 420 | dependencies: 421 | chalk "^1.1.3" 422 | 423 | cliui@^3.0.3: 424 | version "3.2.0" 425 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 426 | dependencies: 427 | string-width "^1.0.1" 428 | strip-ansi "^3.0.1" 429 | wrap-ansi "^2.0.0" 430 | 431 | clone@^1.0.2: 432 | version "1.0.4" 433 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 434 | 435 | co@^4.6.0: 436 | version "4.6.0" 437 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 438 | 439 | coa@~1.0.1: 440 | version "1.0.4" 441 | resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" 442 | dependencies: 443 | q "^1.1.2" 444 | 445 | code-point-at@^1.0.0: 446 | version "1.1.0" 447 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 448 | 449 | color-convert@^1.3.0, color-convert@^1.9.0: 450 | version "1.9.1" 451 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 452 | dependencies: 453 | color-name "^1.1.1" 454 | 455 | color-name@^1.0.0, color-name@^1.1.1: 456 | version "1.1.3" 457 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 458 | 459 | color-string@^0.3.0: 460 | version "0.3.0" 461 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" 462 | dependencies: 463 | color-name "^1.0.0" 464 | 465 | color@^0.11.0: 466 | version "0.11.4" 467 | resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" 468 | dependencies: 469 | clone "^1.0.2" 470 | color-convert "^1.3.0" 471 | color-string "^0.3.0" 472 | 473 | colormin@^1.0.5: 474 | version "1.1.2" 475 | resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" 476 | dependencies: 477 | color "^0.11.0" 478 | css-color-names "0.0.4" 479 | has "^1.0.1" 480 | 481 | colors@~1.1.2: 482 | version "1.1.2" 483 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 484 | 485 | colour@~0.7.1: 486 | version "0.7.1" 487 | resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" 488 | 489 | combined-stream@1.0.6, combined-stream@~1.0.5: 490 | version "1.0.6" 491 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" 492 | dependencies: 493 | delayed-stream "~1.0.0" 494 | 495 | commander@~2.13.0: 496 | version "2.13.0" 497 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" 498 | 499 | concat-map@0.0.1: 500 | version "0.0.1" 501 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 502 | 503 | concat-with-sourcemaps@^1.0.5: 504 | version "1.0.5" 505 | resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.5.tgz#8964bc2347d05819b63798104d87d6e001bed8d0" 506 | dependencies: 507 | source-map "^0.6.1" 508 | 509 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 510 | version "1.1.0" 511 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 512 | 513 | core-js@^2.4.0, core-js@^2.5.0: 514 | version "2.5.4" 515 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0" 516 | 517 | core-util-is@1.0.2, core-util-is@~1.0.0: 518 | version "1.0.2" 519 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 520 | 521 | cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: 522 | version "2.2.2" 523 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" 524 | dependencies: 525 | is-directory "^0.3.1" 526 | js-yaml "^3.4.3" 527 | minimist "^1.2.0" 528 | object-assign "^4.1.0" 529 | os-homedir "^1.0.1" 530 | parse-json "^2.2.0" 531 | require-from-string "^1.1.0" 532 | 533 | cryptiles@3.x.x: 534 | version "3.1.2" 535 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 536 | dependencies: 537 | boom "5.x.x" 538 | 539 | crypto-js@^3.1.9-1: 540 | version "3.1.9-1" 541 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" 542 | 543 | css-color-names@0.0.4: 544 | version "0.0.4" 545 | resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" 546 | 547 | css-modules-loader-core@^1.1.0: 548 | version "1.1.0" 549 | resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" 550 | dependencies: 551 | icss-replace-symbols "1.1.0" 552 | postcss "6.0.1" 553 | postcss-modules-extract-imports "1.1.0" 554 | postcss-modules-local-by-default "1.2.0" 555 | postcss-modules-scope "1.1.0" 556 | postcss-modules-values "1.3.0" 557 | 558 | css-selector-tokenizer@^0.7.0: 559 | version "0.7.0" 560 | resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" 561 | dependencies: 562 | cssesc "^0.1.0" 563 | fastparse "^1.1.1" 564 | regexpu-core "^1.0.0" 565 | 566 | cssesc@^0.1.0: 567 | version "0.1.0" 568 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" 569 | 570 | cssnano@^3.10.0: 571 | version "3.10.0" 572 | resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" 573 | dependencies: 574 | autoprefixer "^6.3.1" 575 | decamelize "^1.1.2" 576 | defined "^1.0.0" 577 | has "^1.0.1" 578 | object-assign "^4.0.1" 579 | postcss "^5.0.14" 580 | postcss-calc "^5.2.0" 581 | postcss-colormin "^2.1.8" 582 | postcss-convert-values "^2.3.4" 583 | postcss-discard-comments "^2.0.4" 584 | postcss-discard-duplicates "^2.0.1" 585 | postcss-discard-empty "^2.0.1" 586 | postcss-discard-overridden "^0.1.1" 587 | postcss-discard-unused "^2.2.1" 588 | postcss-filter-plugins "^2.0.0" 589 | postcss-merge-idents "^2.1.5" 590 | postcss-merge-longhand "^2.0.1" 591 | postcss-merge-rules "^2.0.3" 592 | postcss-minify-font-values "^1.0.2" 593 | postcss-minify-gradients "^1.0.1" 594 | postcss-minify-params "^1.0.4" 595 | postcss-minify-selectors "^2.0.4" 596 | postcss-normalize-charset "^1.1.0" 597 | postcss-normalize-url "^3.0.7" 598 | postcss-ordered-values "^2.1.0" 599 | postcss-reduce-idents "^2.2.2" 600 | postcss-reduce-initial "^1.0.0" 601 | postcss-reduce-transforms "^1.0.3" 602 | postcss-svgo "^2.1.1" 603 | postcss-unique-selectors "^2.0.2" 604 | postcss-value-parser "^3.2.3" 605 | postcss-zindex "^2.0.1" 606 | 607 | csso@~2.3.1: 608 | version "2.3.2" 609 | resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" 610 | dependencies: 611 | clap "^1.0.9" 612 | source-map "^0.5.3" 613 | 614 | dashdash@^1.12.0: 615 | version "1.14.1" 616 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 617 | dependencies: 618 | assert-plus "^1.0.0" 619 | 620 | debug@^2.2.0: 621 | version "2.6.9" 622 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 623 | dependencies: 624 | ms "2.0.0" 625 | 626 | decamelize@^1.1.1, decamelize@^1.1.2: 627 | version "1.2.0" 628 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 629 | 630 | deep-equal@~1.0.1: 631 | version "1.0.1" 632 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 633 | 634 | deep-extend@~0.4.0: 635 | version "0.4.2" 636 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 637 | 638 | define-properties@^1.1.2: 639 | version "1.1.2" 640 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 641 | dependencies: 642 | foreach "^2.0.5" 643 | object-keys "^1.0.8" 644 | 645 | defined@^1.0.0, defined@~1.0.0: 646 | version "1.0.0" 647 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 648 | 649 | delayed-stream@~1.0.0: 650 | version "1.0.0" 651 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 652 | 653 | delegates@^1.0.0: 654 | version "1.0.0" 655 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 656 | 657 | detect-libc@^1.0.2: 658 | version "1.0.3" 659 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 660 | 661 | dom-storage@^2.0.2: 662 | version "2.1.0" 663 | resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" 664 | 665 | duplexer@^0.1.1: 666 | version "0.1.1" 667 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 668 | 669 | ecc-jsbn@~0.1.1: 670 | version "0.1.1" 671 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 672 | dependencies: 673 | jsbn "~0.1.0" 674 | 675 | electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: 676 | version "1.3.41" 677 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.41.tgz#7e33643e00cd85edfd17e04194f6d00e73737235" 678 | 679 | emojis-list@^2.0.0: 680 | version "2.1.0" 681 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 682 | 683 | encoding@^0.1.11: 684 | version "0.1.12" 685 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 686 | dependencies: 687 | iconv-lite "~0.4.13" 688 | 689 | error-ex@^1.2.0: 690 | version "1.3.1" 691 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 692 | dependencies: 693 | is-arrayish "^0.2.1" 694 | 695 | es-abstract@^1.5.0: 696 | version "1.11.0" 697 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" 698 | dependencies: 699 | es-to-primitive "^1.1.1" 700 | function-bind "^1.1.1" 701 | has "^1.0.1" 702 | is-callable "^1.1.3" 703 | is-regex "^1.0.4" 704 | 705 | es-to-primitive@^1.1.1: 706 | version "1.1.1" 707 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 708 | dependencies: 709 | is-callable "^1.1.1" 710 | is-date-object "^1.0.1" 711 | is-symbol "^1.0.1" 712 | 713 | es6-promise@^4.0.3: 714 | version "4.2.4" 715 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" 716 | 717 | es6-promisify@^5.0.0: 718 | version "5.0.0" 719 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 720 | dependencies: 721 | es6-promise "^4.0.3" 722 | 723 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 724 | version "1.0.5" 725 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 726 | 727 | esprima@^2.6.0: 728 | version "2.7.3" 729 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 730 | 731 | esprima@^4.0.0: 732 | version "4.0.0" 733 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 734 | 735 | estree-walker@^0.2.1: 736 | version "0.2.1" 737 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" 738 | 739 | estree-walker@^0.3.0: 740 | version "0.3.1" 741 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" 742 | 743 | estree-walker@^0.5.0: 744 | version "0.5.1" 745 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.1.tgz#64fc375053abc6f57d73e9bd2f004644ad3c5854" 746 | 747 | expand-brackets@^0.1.4: 748 | version "0.1.5" 749 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 750 | dependencies: 751 | is-posix-bracket "^0.1.0" 752 | 753 | expand-range@^1.8.1: 754 | version "1.8.2" 755 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 756 | dependencies: 757 | fill-range "^2.1.0" 758 | 759 | extend@~3.0.1: 760 | version "3.0.1" 761 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 762 | 763 | extglob@^0.3.1: 764 | version "0.3.2" 765 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 766 | dependencies: 767 | is-extglob "^1.0.0" 768 | 769 | extsprintf@1.3.0: 770 | version "1.3.0" 771 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 772 | 773 | extsprintf@^1.2.0: 774 | version "1.4.0" 775 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 776 | 777 | fast-deep-equal@^1.0.0: 778 | version "1.1.0" 779 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 780 | 781 | fast-json-stable-stringify@^2.0.0: 782 | version "2.0.0" 783 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 784 | 785 | fastparse@^1.1.1: 786 | version "1.1.1" 787 | resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" 788 | 789 | faye-websocket@0.11.1: 790 | version "0.11.1" 791 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" 792 | dependencies: 793 | websocket-driver ">=0.5.1" 794 | 795 | figures@^1.0.1, figures@^1.4.0: 796 | version "1.7.0" 797 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 798 | dependencies: 799 | escape-string-regexp "^1.0.5" 800 | object-assign "^4.1.0" 801 | 802 | filename-regex@^2.0.0: 803 | version "2.0.1" 804 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 805 | 806 | filesize@^3.5.11: 807 | version "3.6.1" 808 | resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" 809 | 810 | fill-range@^2.1.0: 811 | version "2.2.3" 812 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 813 | dependencies: 814 | is-number "^2.1.0" 815 | isobject "^2.0.0" 816 | randomatic "^1.1.3" 817 | repeat-element "^1.1.2" 818 | repeat-string "^1.5.2" 819 | 820 | firebase@^4.12.1: 821 | version "4.12.1" 822 | resolved "https://registry.yarnpkg.com/firebase/-/firebase-4.12.1.tgz#973776a6d74d5314a20d8413fe333412082fc919" 823 | dependencies: 824 | "@firebase/app" "0.1.10" 825 | "@firebase/auth" "0.4.1" 826 | "@firebase/database" "0.2.1" 827 | "@firebase/firestore" "0.3.7" 828 | "@firebase/functions" "0.1.0" 829 | "@firebase/messaging" "0.2.3" 830 | "@firebase/polyfill" "0.3.0" 831 | "@firebase/storage" "0.1.8" 832 | dom-storage "^2.0.2" 833 | xmlhttprequest "^1.8.0" 834 | 835 | flatten@^1.0.2: 836 | version "1.0.2" 837 | resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 838 | 839 | flow-remove-types@^1.1.0: 840 | version "1.2.3" 841 | resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-1.2.3.tgz#6131aefc7da43364bb8b479758c9dec7735d1a18" 842 | dependencies: 843 | babylon "^6.15.0" 844 | vlq "^0.2.1" 845 | 846 | for-each@~0.3.2: 847 | version "0.3.2" 848 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" 849 | dependencies: 850 | is-function "~1.0.0" 851 | 852 | for-in@^1.0.1: 853 | version "1.0.2" 854 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 855 | 856 | for-own@^0.1.4: 857 | version "0.1.5" 858 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 859 | dependencies: 860 | for-in "^1.0.1" 861 | 862 | foreach@^2.0.5: 863 | version "2.0.5" 864 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 865 | 866 | forever-agent@~0.6.1: 867 | version "0.6.1" 868 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 869 | 870 | form-data@~2.3.1: 871 | version "2.3.2" 872 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 873 | dependencies: 874 | asynckit "^0.4.0" 875 | combined-stream "1.0.6" 876 | mime-types "^2.1.12" 877 | 878 | fs-extra@^5.0.0: 879 | version "5.0.0" 880 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" 881 | dependencies: 882 | graceful-fs "^4.1.2" 883 | jsonfile "^4.0.0" 884 | universalify "^0.1.0" 885 | 886 | fs.realpath@^1.0.0: 887 | version "1.0.0" 888 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 889 | 890 | fstream-ignore@^1.0.5: 891 | version "1.0.5" 892 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 893 | dependencies: 894 | fstream "^1.0.0" 895 | inherits "2" 896 | minimatch "^3.0.0" 897 | 898 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 899 | version "1.0.11" 900 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 901 | dependencies: 902 | graceful-fs "^4.1.2" 903 | inherits "~2.0.0" 904 | mkdirp ">=0.5 0" 905 | rimraf "2" 906 | 907 | function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: 908 | version "1.1.1" 909 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 910 | 911 | gauge@~2.7.3: 912 | version "2.7.4" 913 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 914 | dependencies: 915 | aproba "^1.0.3" 916 | console-control-strings "^1.0.0" 917 | has-unicode "^2.0.0" 918 | object-assign "^4.1.0" 919 | signal-exit "^3.0.0" 920 | string-width "^1.0.1" 921 | strip-ansi "^3.0.1" 922 | wide-align "^1.1.0" 923 | 924 | generic-names@^1.0.2: 925 | version "1.0.3" 926 | resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.3.tgz#2d786a121aee508876796939e8e3bff836c20917" 927 | dependencies: 928 | loader-utils "^0.2.16" 929 | 930 | getpass@^0.1.1: 931 | version "0.1.7" 932 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 933 | dependencies: 934 | assert-plus "^1.0.0" 935 | 936 | glob-base@^0.3.0: 937 | version "0.3.0" 938 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 939 | dependencies: 940 | glob-parent "^2.0.0" 941 | is-glob "^2.0.0" 942 | 943 | glob-parent@^2.0.0: 944 | version "2.0.0" 945 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 946 | dependencies: 947 | is-glob "^2.0.0" 948 | 949 | glob@^7.0.5, glob@^7.1.2, glob@~7.1.2: 950 | version "7.1.2" 951 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 952 | dependencies: 953 | fs.realpath "^1.0.0" 954 | inflight "^1.0.4" 955 | inherits "2" 956 | minimatch "^3.0.4" 957 | once "^1.3.0" 958 | path-is-absolute "^1.0.0" 959 | 960 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 961 | version "4.1.11" 962 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 963 | 964 | grpc@^1.9.1: 965 | version "1.10.1" 966 | resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.10.1.tgz#90691404aeb769a98784924d08e8fd07c920b2da" 967 | dependencies: 968 | lodash "^4.15.0" 969 | nan "^2.10.0" 970 | node-pre-gyp "0.7.0" 971 | protobufjs "^5.0.0" 972 | 973 | gzip-size@^3.0.0: 974 | version "3.0.0" 975 | resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" 976 | dependencies: 977 | duplexer "^0.1.1" 978 | 979 | gzip-size@^4.1.0: 980 | version "4.1.0" 981 | resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c" 982 | dependencies: 983 | duplexer "^0.1.1" 984 | pify "^3.0.0" 985 | 986 | har-schema@^2.0.0: 987 | version "2.0.0" 988 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 989 | 990 | har-validator@~5.0.3: 991 | version "5.0.3" 992 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 993 | dependencies: 994 | ajv "^5.1.0" 995 | har-schema "^2.0.0" 996 | 997 | has-ansi@^2.0.0: 998 | version "2.0.0" 999 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1000 | dependencies: 1001 | ansi-regex "^2.0.0" 1002 | 1003 | has-flag@^1.0.0: 1004 | version "1.0.0" 1005 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1006 | 1007 | has-flag@^3.0.0: 1008 | version "3.0.0" 1009 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1010 | 1011 | has-unicode@^2.0.0: 1012 | version "2.0.1" 1013 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1014 | 1015 | has@^1.0.1, has@~1.0.1: 1016 | version "1.0.1" 1017 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1018 | dependencies: 1019 | function-bind "^1.0.2" 1020 | 1021 | hawk@~6.0.2: 1022 | version "6.0.2" 1023 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 1024 | dependencies: 1025 | boom "4.x.x" 1026 | cryptiles "3.x.x" 1027 | hoek "4.x.x" 1028 | sntp "2.x.x" 1029 | 1030 | hoek@4.x.x: 1031 | version "4.2.1" 1032 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" 1033 | 1034 | html-comment-regex@^1.1.0: 1035 | version "1.1.1" 1036 | resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" 1037 | 1038 | http-parser-js@>=0.4.0: 1039 | version "0.4.11" 1040 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529" 1041 | 1042 | http-signature@~1.2.0: 1043 | version "1.2.0" 1044 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1045 | dependencies: 1046 | assert-plus "^1.0.0" 1047 | jsprim "^1.2.2" 1048 | sshpk "^1.7.0" 1049 | 1050 | iconv-lite@~0.4.13: 1051 | version "0.4.19" 1052 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1053 | 1054 | icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: 1055 | version "1.1.0" 1056 | resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 1057 | 1058 | import-cwd@^2.1.0: 1059 | version "2.1.0" 1060 | resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" 1061 | dependencies: 1062 | import-from "^2.1.0" 1063 | 1064 | import-from@^2.1.0: 1065 | version "2.1.0" 1066 | resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" 1067 | dependencies: 1068 | resolve-from "^3.0.0" 1069 | 1070 | indexes-of@^1.0.1: 1071 | version "1.0.1" 1072 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 1073 | 1074 | inflight@^1.0.4: 1075 | version "1.0.6" 1076 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1077 | dependencies: 1078 | once "^1.3.0" 1079 | wrappy "1" 1080 | 1081 | inherits@2, inherits@~2.0.0, inherits@~2.0.3: 1082 | version "2.0.3" 1083 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1084 | 1085 | ini@~1.3.0: 1086 | version "1.3.5" 1087 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1088 | 1089 | invert-kv@^1.0.0: 1090 | version "1.0.0" 1091 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1092 | 1093 | is-absolute-url@^2.0.0: 1094 | version "2.1.0" 1095 | resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" 1096 | 1097 | is-arrayish@^0.2.1: 1098 | version "0.2.1" 1099 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1100 | 1101 | is-buffer@^1.1.5: 1102 | version "1.1.6" 1103 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1104 | 1105 | is-callable@^1.1.1, is-callable@^1.1.3: 1106 | version "1.1.3" 1107 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 1108 | 1109 | is-date-object@^1.0.1: 1110 | version "1.0.1" 1111 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1112 | 1113 | is-directory@^0.3.1: 1114 | version "0.3.1" 1115 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 1116 | 1117 | is-dotfile@^1.0.0: 1118 | version "1.0.3" 1119 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1120 | 1121 | is-equal-shallow@^0.1.3: 1122 | version "0.1.3" 1123 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1124 | dependencies: 1125 | is-primitive "^2.0.0" 1126 | 1127 | is-extendable@^0.1.1: 1128 | version "0.1.1" 1129 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1130 | 1131 | is-extglob@^1.0.0: 1132 | version "1.0.0" 1133 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1134 | 1135 | is-finite@^1.0.1: 1136 | version "1.0.2" 1137 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1138 | dependencies: 1139 | number-is-nan "^1.0.0" 1140 | 1141 | is-fullwidth-code-point@^1.0.0: 1142 | version "1.0.0" 1143 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1144 | dependencies: 1145 | number-is-nan "^1.0.0" 1146 | 1147 | is-function@~1.0.0: 1148 | version "1.0.1" 1149 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" 1150 | 1151 | is-glob@^2.0.0, is-glob@^2.0.1: 1152 | version "2.0.1" 1153 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1154 | dependencies: 1155 | is-extglob "^1.0.0" 1156 | 1157 | is-module@^1.0.0: 1158 | version "1.0.0" 1159 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 1160 | 1161 | is-number@^2.1.0: 1162 | version "2.1.0" 1163 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1164 | dependencies: 1165 | kind-of "^3.0.2" 1166 | 1167 | is-number@^3.0.0: 1168 | version "3.0.0" 1169 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1170 | dependencies: 1171 | kind-of "^3.0.2" 1172 | 1173 | is-plain-obj@^1.0.0: 1174 | version "1.1.0" 1175 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1176 | 1177 | is-posix-bracket@^0.1.0: 1178 | version "0.1.1" 1179 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1180 | 1181 | is-primitive@^2.0.0: 1182 | version "2.0.0" 1183 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1184 | 1185 | is-regex@^1.0.4: 1186 | version "1.0.4" 1187 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 1188 | dependencies: 1189 | has "^1.0.1" 1190 | 1191 | is-stream@^1.0.1: 1192 | version "1.1.0" 1193 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1194 | 1195 | is-svg@^2.0.0: 1196 | version "2.1.0" 1197 | resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" 1198 | dependencies: 1199 | html-comment-regex "^1.1.0" 1200 | 1201 | is-symbol@^1.0.1: 1202 | version "1.0.1" 1203 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 1204 | 1205 | is-typedarray@~1.0.0: 1206 | version "1.0.0" 1207 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1208 | 1209 | isarray@1.0.0, isarray@~1.0.0: 1210 | version "1.0.0" 1211 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1212 | 1213 | isobject@^2.0.0: 1214 | version "2.1.0" 1215 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1216 | dependencies: 1217 | isarray "1.0.0" 1218 | 1219 | isomorphic-fetch@^2.2.1: 1220 | version "2.2.1" 1221 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1222 | dependencies: 1223 | node-fetch "^1.0.1" 1224 | whatwg-fetch ">=0.10.0" 1225 | 1226 | isstream@~0.1.2: 1227 | version "0.1.2" 1228 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1229 | 1230 | js-base64@^2.1.9: 1231 | version "2.4.3" 1232 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" 1233 | 1234 | js-yaml@^3.4.3: 1235 | version "3.11.0" 1236 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" 1237 | dependencies: 1238 | argparse "^1.0.7" 1239 | esprima "^4.0.0" 1240 | 1241 | js-yaml@~3.7.0: 1242 | version "3.7.0" 1243 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 1244 | dependencies: 1245 | argparse "^1.0.7" 1246 | esprima "^2.6.0" 1247 | 1248 | jsbn@~0.1.0: 1249 | version "0.1.1" 1250 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1251 | 1252 | jsesc@~0.5.0: 1253 | version "0.5.0" 1254 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1255 | 1256 | json-schema-traverse@^0.3.0: 1257 | version "0.3.1" 1258 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1259 | 1260 | json-schema@0.2.3: 1261 | version "0.2.3" 1262 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1263 | 1264 | json-stringify-safe@~5.0.1: 1265 | version "5.0.1" 1266 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1267 | 1268 | json5@^0.5.0: 1269 | version "0.5.1" 1270 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1271 | 1272 | jsonfile@^4.0.0: 1273 | version "4.0.0" 1274 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1275 | optionalDependencies: 1276 | graceful-fs "^4.1.6" 1277 | 1278 | jsprim@^1.2.2: 1279 | version "1.4.1" 1280 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1281 | dependencies: 1282 | assert-plus "1.0.0" 1283 | extsprintf "1.3.0" 1284 | json-schema "0.2.3" 1285 | verror "1.10.0" 1286 | 1287 | kind-of@^3.0.2: 1288 | version "3.2.2" 1289 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1290 | dependencies: 1291 | is-buffer "^1.1.5" 1292 | 1293 | kind-of@^4.0.0: 1294 | version "4.0.0" 1295 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1296 | dependencies: 1297 | is-buffer "^1.1.5" 1298 | 1299 | lcid@^1.0.0: 1300 | version "1.0.0" 1301 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1302 | dependencies: 1303 | invert-kv "^1.0.0" 1304 | 1305 | loader-utils@^0.2.16: 1306 | version "0.2.17" 1307 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" 1308 | dependencies: 1309 | big.js "^3.1.3" 1310 | emojis-list "^2.0.0" 1311 | json5 "^0.5.0" 1312 | object-assign "^4.0.1" 1313 | 1314 | lodash.foreach@^4.5.0: 1315 | version "4.5.0" 1316 | resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" 1317 | 1318 | lodash.memoize@^4.1.2: 1319 | version "4.1.2" 1320 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 1321 | 1322 | lodash.sumby@^4.6.0: 1323 | version "4.6.0" 1324 | resolved "https://registry.yarnpkg.com/lodash.sumby/-/lodash.sumby-4.6.0.tgz#7d87737ddb216da2f7e5e7cd2dd9c403a7887346" 1325 | 1326 | lodash.uniq@^4.5.0: 1327 | version "4.5.0" 1328 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1329 | 1330 | lodash@^3.6.0: 1331 | version "3.10.1" 1332 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 1333 | 1334 | lodash@^4.15.0: 1335 | version "4.17.5" 1336 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 1337 | 1338 | long@~3: 1339 | version "3.2.0" 1340 | resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" 1341 | 1342 | macaddress@^0.2.8: 1343 | version "0.2.8" 1344 | resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" 1345 | 1346 | magic-string@^0.22.4: 1347 | version "0.22.5" 1348 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" 1349 | dependencies: 1350 | vlq "^0.2.2" 1351 | 1352 | math-expression-evaluator@^1.2.14: 1353 | version "1.2.17" 1354 | resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" 1355 | 1356 | maxmin@^2.1.0: 1357 | version "2.1.0" 1358 | resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-2.1.0.tgz#4d3b220903d95eee7eb7ac7fa864e72dc09a3166" 1359 | dependencies: 1360 | chalk "^1.0.0" 1361 | figures "^1.0.1" 1362 | gzip-size "^3.0.0" 1363 | pretty-bytes "^3.0.0" 1364 | 1365 | microbundle@^0.4.4: 1366 | version "0.4.4" 1367 | resolved "https://registry.yarnpkg.com/microbundle/-/microbundle-0.4.4.tgz#7a9e3d6b05e237ea66a8ec9ac736006f21a23101" 1368 | dependencies: 1369 | acorn-jsx "^4.1.1" 1370 | asyncro "^3.0.0" 1371 | autoprefixer "^7.2.5" 1372 | babel-polyfill "^6.26.0" 1373 | camelcase "^4.1.0" 1374 | chalk "^2.3.0" 1375 | es6-promisify "^5.0.0" 1376 | glob "^7.1.2" 1377 | gzip-size "^4.1.0" 1378 | pretty-bytes "^4.0.2" 1379 | regenerator-runtime "^0.11.1" 1380 | rollup "^0.55.1" 1381 | rollup-plugin-buble "^0.18.0" 1382 | rollup-plugin-bundle-size "^1.0.1" 1383 | rollup-plugin-commonjs "^8.2.6" 1384 | rollup-plugin-es3 "^1.1.0" 1385 | rollup-plugin-flow "^1.1.1" 1386 | rollup-plugin-node-resolve "^3.0.2" 1387 | rollup-plugin-nodent "^0.2.2" 1388 | rollup-plugin-postcss "^1.2.7" 1389 | rollup-plugin-preserve-shebang "^0.1.6" 1390 | rollup-plugin-sizes "^0.4.2" 1391 | rollup-plugin-strict-alias "^1.0.0" 1392 | rollup-plugin-typescript2 "^0.11" 1393 | rollup-plugin-uglify "^3.0.0" 1394 | sade "^1.3.1" 1395 | tslib "^1.9.0" 1396 | typescript "^2.6.2" 1397 | 1398 | micromatch@^2.3.11: 1399 | version "2.3.11" 1400 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1401 | dependencies: 1402 | arr-diff "^2.0.0" 1403 | array-unique "^0.2.1" 1404 | braces "^1.8.2" 1405 | expand-brackets "^0.1.4" 1406 | extglob "^0.3.1" 1407 | filename-regex "^2.0.0" 1408 | is-extglob "^1.0.0" 1409 | is-glob "^2.0.1" 1410 | kind-of "^3.0.2" 1411 | normalize-path "^2.0.1" 1412 | object.omit "^2.0.0" 1413 | parse-glob "^3.0.4" 1414 | regex-cache "^0.4.2" 1415 | 1416 | mime-db@~1.33.0: 1417 | version "1.33.0" 1418 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1419 | 1420 | mime-types@^2.1.12, mime-types@~2.1.17: 1421 | version "2.1.18" 1422 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 1423 | dependencies: 1424 | mime-db "~1.33.0" 1425 | 1426 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 1427 | version "3.0.4" 1428 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1429 | dependencies: 1430 | brace-expansion "^1.1.7" 1431 | 1432 | minimist@0.0.8: 1433 | version "0.0.8" 1434 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1435 | 1436 | minimist@^1.2.0, minimist@~1.2.0: 1437 | version "1.2.0" 1438 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1439 | 1440 | minipass@^2.2.1: 1441 | version "2.2.4" 1442 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" 1443 | dependencies: 1444 | safe-buffer "^5.1.1" 1445 | yallist "^3.0.0" 1446 | 1447 | minizlib@^1.0.4: 1448 | version "1.1.0" 1449 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 1450 | dependencies: 1451 | minipass "^2.2.1" 1452 | 1453 | "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: 1454 | version "0.5.1" 1455 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1456 | dependencies: 1457 | minimist "0.0.8" 1458 | 1459 | module-details-from-path@^1.0.3: 1460 | version "1.0.3" 1461 | resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" 1462 | 1463 | mri@^1.1.0: 1464 | version "1.1.0" 1465 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.0.tgz#5c0a3f29c8ccffbbb1ec941dcec09d71fa32f36a" 1466 | 1467 | ms@2.0.0: 1468 | version "2.0.0" 1469 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1470 | 1471 | nan@^2.10.0: 1472 | version "2.10.0" 1473 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 1474 | 1475 | node-fetch@^1.0.1: 1476 | version "1.7.3" 1477 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1478 | dependencies: 1479 | encoding "^0.1.11" 1480 | is-stream "^1.0.1" 1481 | 1482 | node-pre-gyp@0.7.0: 1483 | version "0.7.0" 1484 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.7.0.tgz#55aeffbaed93b50d0a4657d469198cd80ac9df36" 1485 | dependencies: 1486 | detect-libc "^1.0.2" 1487 | mkdirp "^0.5.1" 1488 | nopt "^4.0.1" 1489 | npmlog "^4.0.2" 1490 | rc "^1.1.7" 1491 | request "2.83.0" 1492 | rimraf "^2.6.1" 1493 | semver "^5.3.0" 1494 | tar "^2.2.1" 1495 | tar-pack "^3.4.0" 1496 | 1497 | nodent-compiler@^3.1.6: 1498 | version "3.1.7" 1499 | resolved "https://registry.yarnpkg.com/nodent-compiler/-/nodent-compiler-3.1.7.tgz#78198d9baacc491b0065b8c65bc0ca83d3fcd2a2" 1500 | dependencies: 1501 | acorn ">=2.5.2" 1502 | acorn-es7-plugin ">=1.1.6" 1503 | source-map "^0.5.6" 1504 | 1505 | nopt@^4.0.1: 1506 | version "4.0.1" 1507 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1508 | dependencies: 1509 | abbrev "1" 1510 | osenv "^0.1.4" 1511 | 1512 | normalize-path@^2.0.1: 1513 | version "2.1.1" 1514 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1515 | dependencies: 1516 | remove-trailing-separator "^1.0.1" 1517 | 1518 | normalize-range@^0.1.2: 1519 | version "0.1.2" 1520 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1521 | 1522 | normalize-url@^1.4.0: 1523 | version "1.9.1" 1524 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 1525 | dependencies: 1526 | object-assign "^4.0.1" 1527 | prepend-http "^1.0.0" 1528 | query-string "^4.1.0" 1529 | sort-keys "^1.0.0" 1530 | 1531 | npmlog@^4.0.2: 1532 | version "4.1.2" 1533 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1534 | dependencies: 1535 | are-we-there-yet "~1.1.2" 1536 | console-control-strings "~1.1.0" 1537 | gauge "~2.7.3" 1538 | set-blocking "~2.0.0" 1539 | 1540 | num2fraction@^1.2.2: 1541 | version "1.2.2" 1542 | resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 1543 | 1544 | number-is-nan@^1.0.0: 1545 | version "1.0.1" 1546 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1547 | 1548 | oauth-sign@~0.8.2: 1549 | version "0.8.2" 1550 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1551 | 1552 | object-assign@^4.0.1, object-assign@^4.1.0: 1553 | version "4.1.1" 1554 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1555 | 1556 | object-inspect@~1.5.0: 1557 | version "1.5.0" 1558 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" 1559 | 1560 | object-keys@^1.0.8: 1561 | version "1.0.11" 1562 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 1563 | 1564 | object.omit@^2.0.0: 1565 | version "2.0.1" 1566 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1567 | dependencies: 1568 | for-own "^0.1.4" 1569 | is-extendable "^0.1.1" 1570 | 1571 | once@^1.3.0, once@^1.3.3: 1572 | version "1.4.0" 1573 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1574 | dependencies: 1575 | wrappy "1" 1576 | 1577 | optjs@~3.2.2: 1578 | version "3.2.2" 1579 | resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" 1580 | 1581 | os-homedir@^1.0.0, os-homedir@^1.0.1: 1582 | version "1.0.2" 1583 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1584 | 1585 | os-locale@^1.4.0: 1586 | version "1.4.0" 1587 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1588 | dependencies: 1589 | lcid "^1.0.0" 1590 | 1591 | os-tmpdir@^1.0.0: 1592 | version "1.0.2" 1593 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1594 | 1595 | osenv@^0.1.4: 1596 | version "0.1.5" 1597 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1598 | dependencies: 1599 | os-homedir "^1.0.0" 1600 | os-tmpdir "^1.0.0" 1601 | 1602 | pad-right@^0.2.2: 1603 | version "0.2.2" 1604 | resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" 1605 | dependencies: 1606 | repeat-string "^1.5.2" 1607 | 1608 | parse-glob@^3.0.4: 1609 | version "3.0.4" 1610 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1611 | dependencies: 1612 | glob-base "^0.3.0" 1613 | is-dotfile "^1.0.0" 1614 | is-extglob "^1.0.0" 1615 | is-glob "^2.0.0" 1616 | 1617 | parse-json@^2.2.0: 1618 | version "2.2.0" 1619 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1620 | dependencies: 1621 | error-ex "^1.2.0" 1622 | 1623 | parse-ms@^1.0.0: 1624 | version "1.0.1" 1625 | resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" 1626 | 1627 | path-is-absolute@^1.0.0: 1628 | version "1.0.1" 1629 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1630 | 1631 | path-parse@^1.0.5: 1632 | version "1.0.5" 1633 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1634 | 1635 | performance-now@^2.1.0: 1636 | version "2.1.0" 1637 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1638 | 1639 | pify@^3.0.0: 1640 | version "3.0.0" 1641 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1642 | 1643 | plur@^1.0.0: 1644 | version "1.0.0" 1645 | resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" 1646 | 1647 | postcss-calc@^5.2.0: 1648 | version "5.3.1" 1649 | resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" 1650 | dependencies: 1651 | postcss "^5.0.2" 1652 | postcss-message-helpers "^2.0.0" 1653 | reduce-css-calc "^1.2.6" 1654 | 1655 | postcss-colormin@^2.1.8: 1656 | version "2.2.2" 1657 | resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" 1658 | dependencies: 1659 | colormin "^1.0.5" 1660 | postcss "^5.0.13" 1661 | postcss-value-parser "^3.2.3" 1662 | 1663 | postcss-convert-values@^2.3.4: 1664 | version "2.6.1" 1665 | resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" 1666 | dependencies: 1667 | postcss "^5.0.11" 1668 | postcss-value-parser "^3.1.2" 1669 | 1670 | postcss-discard-comments@^2.0.4: 1671 | version "2.0.4" 1672 | resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" 1673 | dependencies: 1674 | postcss "^5.0.14" 1675 | 1676 | postcss-discard-duplicates@^2.0.1: 1677 | version "2.1.0" 1678 | resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" 1679 | dependencies: 1680 | postcss "^5.0.4" 1681 | 1682 | postcss-discard-empty@^2.0.1: 1683 | version "2.1.0" 1684 | resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" 1685 | dependencies: 1686 | postcss "^5.0.14" 1687 | 1688 | postcss-discard-overridden@^0.1.1: 1689 | version "0.1.1" 1690 | resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" 1691 | dependencies: 1692 | postcss "^5.0.16" 1693 | 1694 | postcss-discard-unused@^2.2.1: 1695 | version "2.2.3" 1696 | resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" 1697 | dependencies: 1698 | postcss "^5.0.14" 1699 | uniqs "^2.0.0" 1700 | 1701 | postcss-filter-plugins@^2.0.0: 1702 | version "2.0.2" 1703 | resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" 1704 | dependencies: 1705 | postcss "^5.0.4" 1706 | uniqid "^4.0.0" 1707 | 1708 | postcss-load-config@^1.2.0: 1709 | version "1.2.0" 1710 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" 1711 | dependencies: 1712 | cosmiconfig "^2.1.0" 1713 | object-assign "^4.1.0" 1714 | postcss-load-options "^1.2.0" 1715 | postcss-load-plugins "^2.3.0" 1716 | 1717 | postcss-load-options@^1.2.0: 1718 | version "1.2.0" 1719 | resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" 1720 | dependencies: 1721 | cosmiconfig "^2.1.0" 1722 | object-assign "^4.1.0" 1723 | 1724 | postcss-load-plugins@^2.3.0: 1725 | version "2.3.0" 1726 | resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" 1727 | dependencies: 1728 | cosmiconfig "^2.1.1" 1729 | object-assign "^4.1.0" 1730 | 1731 | postcss-merge-idents@^2.1.5: 1732 | version "2.1.7" 1733 | resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" 1734 | dependencies: 1735 | has "^1.0.1" 1736 | postcss "^5.0.10" 1737 | postcss-value-parser "^3.1.1" 1738 | 1739 | postcss-merge-longhand@^2.0.1: 1740 | version "2.0.2" 1741 | resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" 1742 | dependencies: 1743 | postcss "^5.0.4" 1744 | 1745 | postcss-merge-rules@^2.0.3: 1746 | version "2.1.2" 1747 | resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" 1748 | dependencies: 1749 | browserslist "^1.5.2" 1750 | caniuse-api "^1.5.2" 1751 | postcss "^5.0.4" 1752 | postcss-selector-parser "^2.2.2" 1753 | vendors "^1.0.0" 1754 | 1755 | postcss-message-helpers@^2.0.0: 1756 | version "2.0.0" 1757 | resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" 1758 | 1759 | postcss-minify-font-values@^1.0.2: 1760 | version "1.0.5" 1761 | resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" 1762 | dependencies: 1763 | object-assign "^4.0.1" 1764 | postcss "^5.0.4" 1765 | postcss-value-parser "^3.0.2" 1766 | 1767 | postcss-minify-gradients@^1.0.1: 1768 | version "1.0.5" 1769 | resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" 1770 | dependencies: 1771 | postcss "^5.0.12" 1772 | postcss-value-parser "^3.3.0" 1773 | 1774 | postcss-minify-params@^1.0.4: 1775 | version "1.2.2" 1776 | resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" 1777 | dependencies: 1778 | alphanum-sort "^1.0.1" 1779 | postcss "^5.0.2" 1780 | postcss-value-parser "^3.0.2" 1781 | uniqs "^2.0.0" 1782 | 1783 | postcss-minify-selectors@^2.0.4: 1784 | version "2.1.1" 1785 | resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" 1786 | dependencies: 1787 | alphanum-sort "^1.0.2" 1788 | has "^1.0.1" 1789 | postcss "^5.0.14" 1790 | postcss-selector-parser "^2.0.0" 1791 | 1792 | postcss-modules-extract-imports@1.1.0: 1793 | version "1.1.0" 1794 | resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" 1795 | dependencies: 1796 | postcss "^6.0.1" 1797 | 1798 | postcss-modules-local-by-default@1.2.0: 1799 | version "1.2.0" 1800 | resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" 1801 | dependencies: 1802 | css-selector-tokenizer "^0.7.0" 1803 | postcss "^6.0.1" 1804 | 1805 | postcss-modules-scope@1.1.0: 1806 | version "1.1.0" 1807 | resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" 1808 | dependencies: 1809 | css-selector-tokenizer "^0.7.0" 1810 | postcss "^6.0.1" 1811 | 1812 | postcss-modules-values@1.3.0: 1813 | version "1.3.0" 1814 | resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" 1815 | dependencies: 1816 | icss-replace-symbols "^1.1.0" 1817 | postcss "^6.0.1" 1818 | 1819 | postcss-modules@^1.1.0: 1820 | version "1.1.0" 1821 | resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-1.1.0.tgz#c9f94f76ff6addf7c35b842e69ed442118156bb0" 1822 | dependencies: 1823 | css-modules-loader-core "^1.1.0" 1824 | generic-names "^1.0.2" 1825 | postcss "^6.0.1" 1826 | string-hash "^1.1.1" 1827 | 1828 | postcss-normalize-charset@^1.1.0: 1829 | version "1.1.1" 1830 | resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" 1831 | dependencies: 1832 | postcss "^5.0.5" 1833 | 1834 | postcss-normalize-url@^3.0.7: 1835 | version "3.0.8" 1836 | resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" 1837 | dependencies: 1838 | is-absolute-url "^2.0.0" 1839 | normalize-url "^1.4.0" 1840 | postcss "^5.0.14" 1841 | postcss-value-parser "^3.2.3" 1842 | 1843 | postcss-ordered-values@^2.1.0: 1844 | version "2.2.3" 1845 | resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" 1846 | dependencies: 1847 | postcss "^5.0.4" 1848 | postcss-value-parser "^3.0.1" 1849 | 1850 | postcss-reduce-idents@^2.2.2: 1851 | version "2.4.0" 1852 | resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" 1853 | dependencies: 1854 | postcss "^5.0.4" 1855 | postcss-value-parser "^3.0.2" 1856 | 1857 | postcss-reduce-initial@^1.0.0: 1858 | version "1.0.1" 1859 | resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" 1860 | dependencies: 1861 | postcss "^5.0.4" 1862 | 1863 | postcss-reduce-transforms@^1.0.3: 1864 | version "1.0.4" 1865 | resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" 1866 | dependencies: 1867 | has "^1.0.1" 1868 | postcss "^5.0.8" 1869 | postcss-value-parser "^3.0.1" 1870 | 1871 | postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: 1872 | version "2.2.3" 1873 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" 1874 | dependencies: 1875 | flatten "^1.0.2" 1876 | indexes-of "^1.0.1" 1877 | uniq "^1.0.1" 1878 | 1879 | postcss-svgo@^2.1.1: 1880 | version "2.1.6" 1881 | resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" 1882 | dependencies: 1883 | is-svg "^2.0.0" 1884 | postcss "^5.0.14" 1885 | postcss-value-parser "^3.2.3" 1886 | svgo "^0.7.0" 1887 | 1888 | postcss-unique-selectors@^2.0.2: 1889 | version "2.0.2" 1890 | resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" 1891 | dependencies: 1892 | alphanum-sort "^1.0.1" 1893 | postcss "^5.0.4" 1894 | uniqs "^2.0.0" 1895 | 1896 | postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: 1897 | version "3.3.0" 1898 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" 1899 | 1900 | postcss-zindex@^2.0.1: 1901 | version "2.2.0" 1902 | resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" 1903 | dependencies: 1904 | has "^1.0.1" 1905 | postcss "^5.0.4" 1906 | uniqs "^2.0.0" 1907 | 1908 | postcss@6.0.1: 1909 | version "6.0.1" 1910 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" 1911 | dependencies: 1912 | chalk "^1.1.3" 1913 | source-map "^0.5.6" 1914 | supports-color "^3.2.3" 1915 | 1916 | postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: 1917 | version "5.2.18" 1918 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" 1919 | dependencies: 1920 | chalk "^1.1.3" 1921 | js-base64 "^2.1.9" 1922 | source-map "^0.5.6" 1923 | supports-color "^3.2.3" 1924 | 1925 | postcss@^6.0.1, postcss@^6.0.17: 1926 | version "6.0.21" 1927 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.21.tgz#8265662694eddf9e9a5960db6da33c39e4cd069d" 1928 | dependencies: 1929 | chalk "^2.3.2" 1930 | source-map "^0.6.1" 1931 | supports-color "^5.3.0" 1932 | 1933 | prepend-http@^1.0.0: 1934 | version "1.0.4" 1935 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1936 | 1937 | preserve@^0.2.0: 1938 | version "0.2.0" 1939 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1940 | 1941 | pretty-bytes@^3.0.0: 1942 | version "3.0.1" 1943 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" 1944 | dependencies: 1945 | number-is-nan "^1.0.0" 1946 | 1947 | pretty-bytes@^4.0.2: 1948 | version "4.0.2" 1949 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" 1950 | 1951 | pretty-ms@^2.1.0: 1952 | version "2.1.0" 1953 | resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" 1954 | dependencies: 1955 | is-finite "^1.0.1" 1956 | parse-ms "^1.0.0" 1957 | plur "^1.0.0" 1958 | 1959 | process-nextick-args@~2.0.0: 1960 | version "2.0.0" 1961 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1962 | 1963 | promise-polyfill@^7.1.0: 1964 | version "7.1.1" 1965 | resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-7.1.1.tgz#3af26a57795f270c6f546f9a7497c7a204556729" 1966 | 1967 | promise.series@^0.2.0: 1968 | version "0.2.0" 1969 | resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" 1970 | 1971 | protobufjs@^5.0.0: 1972 | version "5.0.2" 1973 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.2.tgz#59748d7dcf03d2db22c13da9feb024e16ab80c91" 1974 | dependencies: 1975 | ascli "~1" 1976 | bytebuffer "~5" 1977 | glob "^7.0.5" 1978 | yargs "^3.10.0" 1979 | 1980 | punycode@^1.4.1: 1981 | version "1.4.1" 1982 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1983 | 1984 | q@^1.1.2: 1985 | version "1.5.1" 1986 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 1987 | 1988 | qs@~6.5.1: 1989 | version "6.5.1" 1990 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 1991 | 1992 | query-string@^4.1.0: 1993 | version "4.3.4" 1994 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" 1995 | dependencies: 1996 | object-assign "^4.1.0" 1997 | strict-uri-encode "^1.0.0" 1998 | 1999 | randomatic@^1.1.3: 2000 | version "1.1.7" 2001 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 2002 | dependencies: 2003 | is-number "^3.0.0" 2004 | kind-of "^4.0.0" 2005 | 2006 | rc@^1.1.7: 2007 | version "1.2.6" 2008 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" 2009 | dependencies: 2010 | deep-extend "~0.4.0" 2011 | ini "~1.3.0" 2012 | minimist "^1.2.0" 2013 | strip-json-comments "~2.0.1" 2014 | 2015 | re-emitter@^1.0.0: 2016 | version "1.1.3" 2017 | resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" 2018 | 2019 | readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: 2020 | version "2.3.5" 2021 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" 2022 | dependencies: 2023 | core-util-is "~1.0.0" 2024 | inherits "~2.0.3" 2025 | isarray "~1.0.0" 2026 | process-nextick-args "~2.0.0" 2027 | safe-buffer "~5.1.1" 2028 | string_decoder "~1.0.3" 2029 | util-deprecate "~1.0.1" 2030 | 2031 | reduce-css-calc@^1.2.6: 2032 | version "1.3.0" 2033 | resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" 2034 | dependencies: 2035 | balanced-match "^0.4.2" 2036 | math-expression-evaluator "^1.2.14" 2037 | reduce-function-call "^1.0.1" 2038 | 2039 | reduce-function-call@^1.0.1: 2040 | version "1.0.2" 2041 | resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" 2042 | dependencies: 2043 | balanced-match "^0.4.2" 2044 | 2045 | regenerate@^1.2.1: 2046 | version "1.3.3" 2047 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" 2048 | 2049 | regenerator-runtime@^0.10.5: 2050 | version "0.10.5" 2051 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 2052 | 2053 | regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: 2054 | version "0.11.1" 2055 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 2056 | 2057 | regex-cache@^0.4.2: 2058 | version "0.4.4" 2059 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 2060 | dependencies: 2061 | is-equal-shallow "^0.1.3" 2062 | 2063 | regexpu-core@^1.0.0: 2064 | version "1.0.0" 2065 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 2066 | dependencies: 2067 | regenerate "^1.2.1" 2068 | regjsgen "^0.2.0" 2069 | regjsparser "^0.1.4" 2070 | 2071 | regjsgen@^0.2.0: 2072 | version "0.2.0" 2073 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 2074 | 2075 | regjsparser@^0.1.4: 2076 | version "0.1.5" 2077 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 2078 | dependencies: 2079 | jsesc "~0.5.0" 2080 | 2081 | reify@^0.13.3: 2082 | version "0.13.7" 2083 | resolved "https://registry.yarnpkg.com/reify/-/reify-0.13.7.tgz#905db9e14f0c3d34cbcdf1a80dfb68d654c71d7c" 2084 | dependencies: 2085 | acorn "^5.2.1" 2086 | minizlib "^1.0.4" 2087 | semver "^5.4.1" 2088 | 2089 | remove-trailing-separator@^1.0.1: 2090 | version "1.1.0" 2091 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2092 | 2093 | repeat-element@^1.1.2: 2094 | version "1.1.2" 2095 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2096 | 2097 | repeat-string@^1.5.2: 2098 | version "1.6.1" 2099 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2100 | 2101 | request@2.83.0: 2102 | version "2.83.0" 2103 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 2104 | dependencies: 2105 | aws-sign2 "~0.7.0" 2106 | aws4 "^1.6.0" 2107 | caseless "~0.12.0" 2108 | combined-stream "~1.0.5" 2109 | extend "~3.0.1" 2110 | forever-agent "~0.6.1" 2111 | form-data "~2.3.1" 2112 | har-validator "~5.0.3" 2113 | hawk "~6.0.2" 2114 | http-signature "~1.2.0" 2115 | is-typedarray "~1.0.0" 2116 | isstream "~0.1.2" 2117 | json-stringify-safe "~5.0.1" 2118 | mime-types "~2.1.17" 2119 | oauth-sign "~0.8.2" 2120 | performance-now "^2.1.0" 2121 | qs "~6.5.1" 2122 | safe-buffer "^5.1.1" 2123 | stringstream "~0.0.5" 2124 | tough-cookie "~2.3.3" 2125 | tunnel-agent "^0.6.0" 2126 | uuid "^3.1.0" 2127 | 2128 | require-from-string@^1.1.0: 2129 | version "1.2.1" 2130 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" 2131 | 2132 | reserved-words@^0.1.2: 2133 | version "0.1.2" 2134 | resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" 2135 | 2136 | resolve-from@^3.0.0: 2137 | version "3.0.0" 2138 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 2139 | 2140 | resolve@^1.1.6, resolve@^1.4.0, resolve@^1.5.0: 2141 | version "1.6.0" 2142 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" 2143 | dependencies: 2144 | path-parse "^1.0.5" 2145 | 2146 | resolve@~1.5.0: 2147 | version "1.5.0" 2148 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 2149 | dependencies: 2150 | path-parse "^1.0.5" 2151 | 2152 | resumer@~0.0.0: 2153 | version "0.0.0" 2154 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 2155 | dependencies: 2156 | through "~2.3.4" 2157 | 2158 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 2159 | version "2.6.2" 2160 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2161 | dependencies: 2162 | glob "^7.0.5" 2163 | 2164 | rollup-plugin-buble@^0.18.0: 2165 | version "0.18.0" 2166 | resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.18.0.tgz#6e20d1b2840c59eb496b9f954f75243e51786ac1" 2167 | dependencies: 2168 | buble "^0.18.0" 2169 | rollup-pluginutils "^2.0.1" 2170 | 2171 | rollup-plugin-bundle-size@^1.0.1: 2172 | version "1.0.1" 2173 | resolved "https://registry.yarnpkg.com/rollup-plugin-bundle-size/-/rollup-plugin-bundle-size-1.0.1.tgz#40d805a0cbbcc67a5dd9336912d3059c6d7d094b" 2174 | dependencies: 2175 | chalk "^1.1.3" 2176 | maxmin "^2.1.0" 2177 | 2178 | rollup-plugin-commonjs@^8.2.6: 2179 | version "8.4.1" 2180 | resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" 2181 | dependencies: 2182 | acorn "^5.2.1" 2183 | estree-walker "^0.5.0" 2184 | magic-string "^0.22.4" 2185 | resolve "^1.4.0" 2186 | rollup-pluginutils "^2.0.1" 2187 | 2188 | rollup-plugin-es3@^1.1.0: 2189 | version "1.1.0" 2190 | resolved "https://registry.yarnpkg.com/rollup-plugin-es3/-/rollup-plugin-es3-1.1.0.tgz#f866f91b4db839e5b475d8e4a7b9d4c77ecade14" 2191 | dependencies: 2192 | magic-string "^0.22.4" 2193 | 2194 | rollup-plugin-flow@^1.1.1: 2195 | version "1.1.1" 2196 | resolved "https://registry.yarnpkg.com/rollup-plugin-flow/-/rollup-plugin-flow-1.1.1.tgz#6ce568f1dd559666b77ab76b4bae251407528db6" 2197 | dependencies: 2198 | flow-remove-types "^1.1.0" 2199 | rollup-pluginutils "^1.5.1" 2200 | 2201 | rollup-plugin-node-resolve@^3.0.2: 2202 | version "3.3.0" 2203 | resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz#c26d110a36812cbefa7ce117cadcd3439aa1c713" 2204 | dependencies: 2205 | builtin-modules "^2.0.0" 2206 | is-module "^1.0.0" 2207 | resolve "^1.1.6" 2208 | 2209 | rollup-plugin-nodent@^0.2.2: 2210 | version "0.2.2" 2211 | resolved "https://registry.yarnpkg.com/rollup-plugin-nodent/-/rollup-plugin-nodent-0.2.2.tgz#73e9b974b5ac375eb298495541fc72b095784fac" 2212 | dependencies: 2213 | acorn-dynamic-import "^3.0.0" 2214 | nodent-compiler "^3.1.6" 2215 | rollup-pluginutils "^2.0.1" 2216 | 2217 | rollup-plugin-postcss@^1.2.7: 2218 | version "1.4.1" 2219 | resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-1.4.1.tgz#b8c1a0516a43100e1a48d88327bf5631b28a9d8e" 2220 | dependencies: 2221 | chalk "^2.0.0" 2222 | concat-with-sourcemaps "^1.0.5" 2223 | cssnano "^3.10.0" 2224 | fs-extra "^5.0.0" 2225 | import-cwd "^2.1.0" 2226 | pify "^3.0.0" 2227 | postcss "^6.0.1" 2228 | postcss-load-config "^1.2.0" 2229 | postcss-modules "^1.1.0" 2230 | promise.series "^0.2.0" 2231 | reserved-words "^0.1.2" 2232 | resolve "^1.5.0" 2233 | rollup-pluginutils "^2.0.1" 2234 | style-inject "^0.3.0" 2235 | 2236 | rollup-plugin-preserve-shebang@^0.1.6: 2237 | version "0.1.6" 2238 | resolved "https://registry.yarnpkg.com/rollup-plugin-preserve-shebang/-/rollup-plugin-preserve-shebang-0.1.6.tgz#8cfc4c555d4ca87b9fbb7712869158db0e080d4a" 2239 | dependencies: 2240 | magic-string "^0.22.4" 2241 | 2242 | rollup-plugin-sizes@^0.4.2: 2243 | version "0.4.2" 2244 | resolved "https://registry.yarnpkg.com/rollup-plugin-sizes/-/rollup-plugin-sizes-0.4.2.tgz#1d97ecda2667a43afbb19d801e2476f80f67d12f" 2245 | dependencies: 2246 | filesize "^3.5.11" 2247 | lodash.foreach "^4.5.0" 2248 | lodash.sumby "^4.6.0" 2249 | module-details-from-path "^1.0.3" 2250 | 2251 | rollup-plugin-strict-alias@^1.0.0: 2252 | version "1.0.0" 2253 | resolved "https://registry.yarnpkg.com/rollup-plugin-strict-alias/-/rollup-plugin-strict-alias-1.0.0.tgz#7079ee25785c5f9506e4430b5abff4c581ac8cfc" 2254 | 2255 | rollup-plugin-typescript2@^0.11: 2256 | version "0.11.1" 2257 | resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.11.1.tgz#c308de734baaed8ed8316dc8501a82a0ced674f4" 2258 | dependencies: 2259 | fs-extra "^5.0.0" 2260 | resolve "^1.5.0" 2261 | rollup-pluginutils "^2.0.1" 2262 | tslib "^1.9.0" 2263 | 2264 | rollup-plugin-uglify@^3.0.0: 2265 | version "3.0.0" 2266 | resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz#a34eca24617709c6bf1778e9653baafa06099b86" 2267 | dependencies: 2268 | uglify-es "^3.3.7" 2269 | 2270 | rollup-pluginutils@^1.5.1: 2271 | version "1.5.2" 2272 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" 2273 | dependencies: 2274 | estree-walker "^0.2.1" 2275 | minimatch "^3.0.2" 2276 | 2277 | rollup-pluginutils@^2.0.1: 2278 | version "2.0.1" 2279 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" 2280 | dependencies: 2281 | estree-walker "^0.3.0" 2282 | micromatch "^2.3.11" 2283 | 2284 | rollup@^0.55.1: 2285 | version "0.55.5" 2286 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.55.5.tgz#2f88c300f7cf24b5ec2dca8a6aba73b04e087e93" 2287 | 2288 | sade@^1.3.1: 2289 | version "1.4.0" 2290 | resolved "https://registry.yarnpkg.com/sade/-/sade-1.4.0.tgz#51874eb18600aa54ee39c8f566c2f4c999a7cd47" 2291 | dependencies: 2292 | mri "^1.1.0" 2293 | pad-right "^0.2.2" 2294 | 2295 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2296 | version "5.1.1" 2297 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2298 | 2299 | sax@~1.2.1: 2300 | version "1.2.4" 2301 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2302 | 2303 | semver@^5.3.0, semver@^5.4.1: 2304 | version "5.5.0" 2305 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 2306 | 2307 | set-blocking@~2.0.0: 2308 | version "2.0.0" 2309 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2310 | 2311 | signal-exit@^3.0.0: 2312 | version "3.0.2" 2313 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2314 | 2315 | sntp@2.x.x: 2316 | version "2.1.0" 2317 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 2318 | dependencies: 2319 | hoek "4.x.x" 2320 | 2321 | sort-keys@^1.0.0: 2322 | version "1.1.2" 2323 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 2324 | dependencies: 2325 | is-plain-obj "^1.0.0" 2326 | 2327 | source-map@^0.5.3, source-map@^0.5.6: 2328 | version "0.5.7" 2329 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2330 | 2331 | source-map@^0.6.1, source-map@~0.6.1: 2332 | version "0.6.1" 2333 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2334 | 2335 | split@^1.0.0: 2336 | version "1.0.1" 2337 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 2338 | dependencies: 2339 | through "2" 2340 | 2341 | sprintf-js@~1.0.2: 2342 | version "1.0.3" 2343 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2344 | 2345 | sshpk@^1.7.0: 2346 | version "1.14.1" 2347 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" 2348 | dependencies: 2349 | asn1 "~0.2.3" 2350 | assert-plus "^1.0.0" 2351 | dashdash "^1.12.0" 2352 | getpass "^0.1.1" 2353 | optionalDependencies: 2354 | bcrypt-pbkdf "^1.0.0" 2355 | ecc-jsbn "~0.1.1" 2356 | jsbn "~0.1.0" 2357 | tweetnacl "~0.14.0" 2358 | 2359 | strict-uri-encode@^1.0.0: 2360 | version "1.1.0" 2361 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 2362 | 2363 | string-hash@^1.1.1: 2364 | version "1.1.3" 2365 | resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" 2366 | 2367 | string-width@^1.0.1, string-width@^1.0.2: 2368 | version "1.0.2" 2369 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2370 | dependencies: 2371 | code-point-at "^1.0.0" 2372 | is-fullwidth-code-point "^1.0.0" 2373 | strip-ansi "^3.0.0" 2374 | 2375 | string.prototype.trim@~1.1.2: 2376 | version "1.1.2" 2377 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" 2378 | dependencies: 2379 | define-properties "^1.1.2" 2380 | es-abstract "^1.5.0" 2381 | function-bind "^1.0.2" 2382 | 2383 | string_decoder@~1.0.3: 2384 | version "1.0.3" 2385 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2386 | dependencies: 2387 | safe-buffer "~5.1.0" 2388 | 2389 | stringstream@~0.0.5: 2390 | version "0.0.5" 2391 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2392 | 2393 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2394 | version "3.0.1" 2395 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2396 | dependencies: 2397 | ansi-regex "^2.0.0" 2398 | 2399 | strip-json-comments@~2.0.1: 2400 | version "2.0.1" 2401 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2402 | 2403 | style-inject@^0.3.0: 2404 | version "0.3.0" 2405 | resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" 2406 | 2407 | supports-color@^2.0.0: 2408 | version "2.0.0" 2409 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2410 | 2411 | supports-color@^3.2.3: 2412 | version "3.2.3" 2413 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 2414 | dependencies: 2415 | has-flag "^1.0.0" 2416 | 2417 | supports-color@^5.3.0: 2418 | version "5.3.0" 2419 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" 2420 | dependencies: 2421 | has-flag "^3.0.0" 2422 | 2423 | svgo@^0.7.0: 2424 | version "0.7.2" 2425 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" 2426 | dependencies: 2427 | coa "~1.0.1" 2428 | colors "~1.1.2" 2429 | csso "~2.3.1" 2430 | js-yaml "~3.7.0" 2431 | mkdirp "~0.5.1" 2432 | sax "~1.2.1" 2433 | whet.extend "~0.9.9" 2434 | 2435 | tap-out@^1.4.1: 2436 | version "1.4.2" 2437 | resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-1.4.2.tgz#c907ec1bf9405111d088263e92f5608b88cbb37a" 2438 | dependencies: 2439 | re-emitter "^1.0.0" 2440 | readable-stream "^2.0.0" 2441 | split "^1.0.0" 2442 | trim "0.0.1" 2443 | 2444 | tap-spec@^4.1.1: 2445 | version "4.1.1" 2446 | resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-4.1.1.tgz#e2e9f26f5208232b1f562288c97624d58a88f05a" 2447 | dependencies: 2448 | chalk "^1.0.0" 2449 | duplexer "^0.1.1" 2450 | figures "^1.4.0" 2451 | lodash "^3.6.0" 2452 | pretty-ms "^2.1.0" 2453 | repeat-string "^1.5.2" 2454 | tap-out "^1.4.1" 2455 | through2 "^2.0.0" 2456 | 2457 | tape@^4.8.0: 2458 | version "4.9.0" 2459 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a" 2460 | dependencies: 2461 | deep-equal "~1.0.1" 2462 | defined "~1.0.0" 2463 | for-each "~0.3.2" 2464 | function-bind "~1.1.1" 2465 | glob "~7.1.2" 2466 | has "~1.0.1" 2467 | inherits "~2.0.3" 2468 | minimist "~1.2.0" 2469 | object-inspect "~1.5.0" 2470 | resolve "~1.5.0" 2471 | resumer "~0.0.0" 2472 | string.prototype.trim "~1.1.2" 2473 | through "~2.3.8" 2474 | 2475 | tar-pack@^3.4.0: 2476 | version "3.4.1" 2477 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" 2478 | dependencies: 2479 | debug "^2.2.0" 2480 | fstream "^1.0.10" 2481 | fstream-ignore "^1.0.5" 2482 | once "^1.3.3" 2483 | readable-stream "^2.1.4" 2484 | rimraf "^2.5.1" 2485 | tar "^2.2.1" 2486 | uid-number "^0.0.6" 2487 | 2488 | tar@^2.2.1: 2489 | version "2.2.1" 2490 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2491 | dependencies: 2492 | block-stream "*" 2493 | fstream "^1.0.2" 2494 | inherits "2" 2495 | 2496 | through2@^2.0.0: 2497 | version "2.0.3" 2498 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 2499 | dependencies: 2500 | readable-stream "^2.1.5" 2501 | xtend "~4.0.1" 2502 | 2503 | through@2, through@~2.3.4, through@~2.3.8: 2504 | version "2.3.8" 2505 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2506 | 2507 | tough-cookie@~2.3.3: 2508 | version "2.3.4" 2509 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" 2510 | dependencies: 2511 | punycode "^1.4.1" 2512 | 2513 | trim@0.0.1: 2514 | version "0.0.1" 2515 | resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" 2516 | 2517 | tslib@^1.9.0: 2518 | version "1.9.0" 2519 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 2520 | 2521 | tunnel-agent@^0.6.0: 2522 | version "0.6.0" 2523 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2524 | dependencies: 2525 | safe-buffer "^5.0.1" 2526 | 2527 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2528 | version "0.14.5" 2529 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2530 | 2531 | typescript@^2.6.2: 2532 | version "2.8.1" 2533 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" 2534 | 2535 | uglify-es@^3.3.7: 2536 | version "3.3.9" 2537 | resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" 2538 | dependencies: 2539 | commander "~2.13.0" 2540 | source-map "~0.6.1" 2541 | 2542 | uid-number@^0.0.6: 2543 | version "0.0.6" 2544 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2545 | 2546 | uniq@^1.0.1: 2547 | version "1.0.1" 2548 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 2549 | 2550 | uniqid@^4.0.0: 2551 | version "4.1.1" 2552 | resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" 2553 | dependencies: 2554 | macaddress "^0.2.8" 2555 | 2556 | uniqs@^2.0.0: 2557 | version "2.0.0" 2558 | resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" 2559 | 2560 | universalify@^0.1.0: 2561 | version "0.1.1" 2562 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" 2563 | 2564 | util-deprecate@~1.0.1: 2565 | version "1.0.2" 2566 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2567 | 2568 | uuid@^3.1.0: 2569 | version "3.2.1" 2570 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" 2571 | 2572 | vendors@^1.0.0: 2573 | version "1.0.1" 2574 | resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" 2575 | 2576 | verror@1.10.0: 2577 | version "1.10.0" 2578 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2579 | dependencies: 2580 | assert-plus "^1.0.0" 2581 | core-util-is "1.0.2" 2582 | extsprintf "^1.2.0" 2583 | 2584 | vlq@^0.2.1, vlq@^0.2.2: 2585 | version "0.2.3" 2586 | resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" 2587 | 2588 | websocket-driver@>=0.5.1: 2589 | version "0.7.0" 2590 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" 2591 | dependencies: 2592 | http-parser-js ">=0.4.0" 2593 | websocket-extensions ">=0.1.1" 2594 | 2595 | websocket-extensions@>=0.1.1: 2596 | version "0.1.3" 2597 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" 2598 | 2599 | whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.3: 2600 | version "2.0.4" 2601 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" 2602 | 2603 | whet.extend@~0.9.9: 2604 | version "0.9.9" 2605 | resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" 2606 | 2607 | wide-align@^1.1.0: 2608 | version "1.1.2" 2609 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2610 | dependencies: 2611 | string-width "^1.0.2" 2612 | 2613 | window-size@^0.1.4: 2614 | version "0.1.4" 2615 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" 2616 | 2617 | wrap-ansi@^2.0.0: 2618 | version "2.1.0" 2619 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2620 | dependencies: 2621 | string-width "^1.0.1" 2622 | strip-ansi "^3.0.1" 2623 | 2624 | wrappy@1: 2625 | version "1.0.2" 2626 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2627 | 2628 | xmlhttprequest@^1.8.0: 2629 | version "1.8.0" 2630 | resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" 2631 | 2632 | xtend@~4.0.1: 2633 | version "4.0.1" 2634 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2635 | 2636 | y18n@^3.2.0: 2637 | version "3.2.1" 2638 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2639 | 2640 | yallist@^3.0.0: 2641 | version "3.0.2" 2642 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 2643 | 2644 | yargs@^3.10.0: 2645 | version "3.32.0" 2646 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" 2647 | dependencies: 2648 | camelcase "^2.0.1" 2649 | cliui "^3.0.3" 2650 | decamelize "^1.1.1" 2651 | os-locale "^1.4.0" 2652 | string-width "^1.0.1" 2653 | window-size "^0.1.4" 2654 | y18n "^3.2.0" 2655 | --------------------------------------------------------------------------------