├── .dockerignore ├── .gitignore ├── .vscode └── launch.json ├── CHANGLOG.md ├── Dockerfile ├── LICENSE ├── README.md ├── app.js ├── docker-compose.testnet.yaml ├── docker-compose.yaml ├── generate-keypair.js ├── lib ├── account.js ├── block.js ├── db.js ├── encryption.js ├── server.js ├── transaction.js └── tx │ ├── index.js │ └── v1.js ├── package.json ├── proto ├── abci.proto ├── descriptor.proto ├── gogo.proto ├── merkle.proto ├── timestamp.proto └── types.proto ├── sample-key ├── tendermint └── config │ ├── config.toml │ └── genesis.json ├── testnet └── config │ ├── config.toml │ ├── genesis.json │ ├── node_key.json │ └── priv_validator.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .git 3 | tendermint 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # parcel-bundler cache (https://parceljs.org/) 61 | .cache 62 | 63 | # next.js build output 64 | .next 65 | 66 | # nuxt.js build output 67 | .nuxt 68 | 69 | # vuepress build output 70 | .vuepress/dist 71 | 72 | # Serverless directories 73 | .serverless 74 | 75 | # FuseBox cache 76 | .fusebox/ 77 | 78 | # forest.network 79 | tendermint/config/node_key.json 80 | tendermint/config/priv_validator.json 81 | addrbook.json 82 | tendermint/data 83 | testnet/data 84 | 85 | # OS X 86 | .DS_Store -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "Launch Program", 8 | "program": "${workspaceFolder}/app.js", 9 | "outFiles": [ 10 | "${workspaceFolder}/**/*.js" 11 | ] 12 | }, 13 | { 14 | "type": "node", 15 | "request": "attach", 16 | "name": "Attach to docker", 17 | "port": 9229, 18 | "address": "localhost", 19 | "localRoot": "${workspaceFolder}", 20 | "remoteRoot": "/usr/src/app/", 21 | "protocol": "inspector" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /CHANGLOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.0.3 4 | 5 | - Add address tag to interact operation 6 | - Update log app hash to uppercase 7 | - Add changelog 8 | 9 | ## 0.0.2 10 | 11 | - Add transaction table 12 | - Add post, update_account, interact operation 13 | 14 | ## 0.0.1 15 | 16 | - Initial version 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10.13 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY package.json yarn.lock ./ 6 | 7 | RUN yarn 8 | 9 | COPY . . 10 | 11 | USER node 12 | 13 | EXPOSE 26658 14 | 15 | CMD [ "yarn", "start" ] 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2018 Kha Do. https://kha.do 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # forest.network - decentralized social network 2 | 3 | ## Requirements 4 | 5 | - Install Docker CE: [https://docs.docker.com/install/](https://docs.docker.com/install/) 6 | 7 | ## Mainnet 8 | 9 | 1. Init tendermint 10 | 11 | ```bash 12 | docker-compose run --rm tendermint init 13 | ``` 14 | 15 | 2. Run node 16 | 17 | ```bash 18 | docker-compose up --build 19 | ``` 20 | 21 | ## Testnet 22 | 23 | 1. Run node 24 | 25 | ```bash 26 | docker-compose -f docker-compose.testnet.yaml up --build 27 | ``` 28 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const grpc = require('grpc'); 2 | const db = require('./lib/db'); 3 | const Account = require('./lib/account'); 4 | const server = require('./lib/server'); 5 | 6 | db.sync().then(async () => { 7 | console.log('Database schema synced!'); 8 | // Try to init genesis account 9 | const count = await Account.count(); 10 | if (count === 0) { 11 | await Account.create({ 12 | address: process.env.GENESIS_ADDRESS, 13 | balance: Number.MAX_SAFE_INTEGER, 14 | sequence: 0, 15 | bandwidth: 0, 16 | }); 17 | } 18 | const port = process.env.PORT || 26658; 19 | server.bind(`0.0.0.0:${port}`, grpc.ServerCredentials.createInsecure()); 20 | server.start(); 21 | console.log(`Server is listening on port ${port}`); 22 | }).catch(console.error); 23 | -------------------------------------------------------------------------------- /docker-compose.testnet.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | app: 4 | depends_on: 5 | - db 6 | ports: 7 | - 9229:9229 8 | - 26658:26658 9 | environment: 10 | PORT: 26658 11 | DATABASE_URL: postgres://postgres:@db:5432/postgres 12 | GENESIS_ADDRESS: GAS3UFFXDUNZ57526OEY7D7642ELZ2DXIKAYHP6IR6PGM2UGEO7RXZDX 13 | build: . 14 | command: yarn inspect 15 | db: 16 | ports: 17 | - 5432:5432 18 | image: postgres:alpine 19 | tendermint: 20 | image: tendermint/tendermint:0.27.3 21 | volumes: 22 | - ./testnet:/tendermint 23 | depends_on: 24 | - app 25 | ports: 26 | - 26656:26656 27 | - 26657:26657 28 | command: "node --proxy_app=tcp://app:26658" 29 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | app: 4 | depends_on: 5 | - db 6 | ports: 7 | - 9229:9229 8 | - 26658:26658 9 | environment: 10 | PORT: 26658 11 | DATABASE_URL: postgres://postgres:@db:5432/postgres 12 | GENESIS_ADDRESS: GA6IW2JOWMP4WGI6LYAZ76ZPMFQSJAX4YLJLOQOWFC5VF5C6IGNV2IW7 13 | build: . 14 | command: yarn inspect 15 | db: 16 | ports: 17 | - 5432:5432 18 | image: postgres:alpine 19 | tendermint: 20 | image: tendermint/tendermint:0.27.3 21 | volumes: 22 | - ./tendermint:/tendermint 23 | depends_on: 24 | - app 25 | ports: 26 | - 26656:26656 27 | - 26657:26657 28 | command: "node --proxy_app=tcp://app:26658" 29 | -------------------------------------------------------------------------------- /generate-keypair.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const { Keypair } = require('stellar-base'); 4 | const { createHash } = require('crypto') 5 | 6 | const key = Keypair.random(); 7 | console.log('Secret key:', key.secret()); 8 | console.log('Public key:', key.publicKey()); 9 | 10 | console.log('Secret key (base64):', key._secretKey.toString('base64')); 11 | console.log('Public key (base64):', key._publicKey.toString('base64')); 12 | console.log('Tenermint address:', createHash('sha256') 13 | .update(key._publicKey) 14 | .digest().slice(0, 20) 15 | .toString('hex') 16 | .toUpperCase()); -------------------------------------------------------------------------------- /lib/account.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | const db = require('./db'); 3 | 4 | const Account = db.define('account', { 5 | address: { 6 | type: Sequelize.STRING, 7 | primaryKey: true, 8 | }, 9 | balance: { 10 | type: Sequelize.BIGINT, 11 | allowNull: false, 12 | defaultValue: 0, 13 | }, 14 | sequence: { 15 | type: Sequelize.BIGINT, 16 | allowNull: false, 17 | defaultValue: 0, 18 | }, 19 | bandwidth: { 20 | type: Sequelize.INTEGER, 21 | allowNull: false, 22 | defaultValue: 0, 23 | }, 24 | // Last transaction date for bandwidth calculate 25 | bandwidthTime: { 26 | type: Sequelize.DATE, 27 | } 28 | }); 29 | 30 | module.exports = Account; 31 | -------------------------------------------------------------------------------- /lib/block.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | const db = require('./db'); 3 | 4 | const Block = db.define('block', { 5 | height: { 6 | type: Sequelize.BIGINT, 7 | primaryKey: true, 8 | }, 9 | time: { 10 | type: Sequelize.DATE, 11 | allowNull: false, 12 | }, 13 | hash: { 14 | type: Sequelize.STRING, 15 | allowNull: false, 16 | unique: true, 17 | }, 18 | appHash: { 19 | type: Sequelize.STRING, 20 | allowNull: false, 21 | } 22 | }); 23 | 24 | module.exports = Block; 25 | -------------------------------------------------------------------------------- /lib/db.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | 3 | const db = new Sequelize(process.env.DATABASE_URL, { 4 | logging: process.env.SHOW_SEQUELIZE_LOG, 5 | }); 6 | 7 | module.exports = db; 8 | -------------------------------------------------------------------------------- /lib/encryption.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | 3 | const CIPHER_ALGORITHM = 'aes-256-cbc'; 4 | 5 | function encrypt(content, key, iv) { 6 | const cipher = crypto.createCipheriv(CIPHER_ALGORITHM, key, iv); 7 | return Buffer.concat([cipher.update(content), cipher.final()]); 8 | } 9 | 10 | function decrypt(content, key, iv) { 11 | const decipher = crypto.createDecipheriv(CIPHER_ALGORITHM, key, iv); 12 | return Buffer.concat([decipher.update(content), decipher.final()]); 13 | } 14 | 15 | module.exports = { encrypt, decrypt }; 16 | -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | const grpc = require('grpc'); 2 | const protoLoader = require('@grpc/proto-loader'); 3 | const path = require('path'); 4 | const moment = require('moment'); 5 | const Decimal = require('decimal.js'); 6 | const crypto = require('crypto'); 7 | const _ = require('lodash'); 8 | const db = require('./db'); 9 | const Block = require('./block'); 10 | const Account = require('./account'); 11 | const Transaction = require('./transaction'); 12 | const { decode, verify, hash } = require('./tx'); 13 | 14 | // 24 hours 15 | const BANDWIDTH_PERIOD = 86400; 16 | const INITIAL_APP_HASH = Buffer.from('forest.network by Kha Do'); 17 | const ACCOUNT_KEY = Buffer.from('account'); 18 | const OBJECT_KEY = Buffer.from('object'); 19 | const MAX_BLOCK_SIZE = 22020096; 20 | const RESERVE_RATIO = 1; 21 | const MAX_CELLULOSE = Number.MAX_SAFE_INTEGER; 22 | const NETWORK_BANDWIDTH = RESERVE_RATIO * MAX_BLOCK_SIZE * BANDWIDTH_PERIOD; 23 | const PROTO_PATH = path.join(__dirname, '..', 'proto', 'abci.proto'); 24 | 25 | const app = { 26 | async info(req) { 27 | const latestBlock = await Block.findOne({ 28 | order: [['time', 'DESC']], 29 | }); 30 | if (latestBlock) { 31 | return { 32 | last_block_height: latestBlock.height, 33 | last_block_app_hash: Buffer.from(latestBlock.appHash, 'hex'), 34 | }; 35 | } 36 | return { 37 | last_block_height: 0, 38 | last_block_app_hash: INITIAL_APP_HASH, 39 | } 40 | }, 41 | 42 | async beginBlock(req) { 43 | const hash = req.hash.toString('hex').toUpperCase(); 44 | const height = req.header.height.toString(); 45 | const time = moment 46 | .unix(Number(req.header.time.seconds)) 47 | .toDate(); 48 | console.log(`Begin block ${height} hash ${hash}`); 49 | this.blockTransaction = await db.transaction(); 50 | const previousBlock = await Block.findOne({ 51 | order: [['time', 'DESC']], 52 | }, { transaction: this.blockTransaction }); 53 | this.appHash = previousBlock ? Buffer.from(previousBlock.appHash, 'hex') : INITIAL_APP_HASH; 54 | // Add block to db 55 | this.currentBlock = { height, hash, time }; 56 | return {}; 57 | }, 58 | 59 | async endBlock(_req) { 60 | console.log('End block'); 61 | await Block.create({ 62 | ...this.currentBlock, 63 | appHash: this.appHash.toString('hex').toUpperCase(), 64 | }, { transaction: this.blockTransaction }); 65 | return {}; 66 | }, 67 | 68 | async commit(_req) { 69 | console.log(`Commit block with app hash ${this.appHash.toString('hex').toUpperCase()}`); 70 | await this.blockTransaction.commit(); 71 | return { 72 | data: this.appHash, 73 | }; 74 | }, 75 | 76 | async executeTx(req, dbTransaction, isCheckTx) { 77 | // Tag by source account and to account 78 | const tags = []; 79 | 80 | if (isCheckTx) { 81 | console.log('Check tx'); 82 | } else { 83 | console.log('Deliver tx'); 84 | } 85 | const tx = decode(req.tx); 86 | const txSize = req.tx.length; 87 | tx.hash = hash(tx); 88 | const { operation } = tx; 89 | // Check signature 90 | if (!verify(tx)) { 91 | throw Error('Wrong signature'); 92 | } 93 | // Check account 94 | const account = await Account.findByPk(tx.account, { transaction: dbTransaction }); 95 | if (!account) { 96 | throw Error('Account does not exists'); 97 | } 98 | // Check sequence 99 | const nextSequence = new Decimal(account.sequence).add(1); 100 | if (!nextSequence.equals(tx.sequence)) { 101 | throw Error('Sequence mismatch'); 102 | } 103 | account.sequence = nextSequence.toFixed(); 104 | // Check memo 105 | if (tx.memo.length > 32) { 106 | throw Error('Memo has more than 32 bytes.'); 107 | } 108 | // Update bandwidth 109 | if (this.currentBlock) { 110 | const diff = account.bandwidthTime 111 | ? moment(this.currentBlock.time).unix() - moment(account.bandwidthTime).unix() 112 | : BANDWIDTH_PERIOD; 113 | const bandwidthLimit = account.balance / MAX_CELLULOSE * NETWORK_BANDWIDTH; 114 | // 24 hours window max 65kB 115 | account.bandwidth = Math.ceil(Math.max(0, (BANDWIDTH_PERIOD - diff) / BANDWIDTH_PERIOD) * account.bandwidth + txSize); 116 | if (account.bandwidth > bandwidthLimit) { 117 | throw Error('Bandwidth limit exceeded'); 118 | } 119 | // Check bandwidth 120 | account.bandwidthTime = this.currentBlock.time; 121 | } 122 | await account.save({ transaction: dbTransaction }); 123 | 124 | // Process operation 125 | if (operation === 'create_account') { 126 | const { address } = tx.params; 127 | const found = await Account.findByPk(address, { transaction: dbTransaction }); 128 | if (found) { 129 | throw Error('Account address existed'); 130 | } 131 | await Account.create({ 132 | address, 133 | balance: 0, 134 | sequence: 0, 135 | bandwidth: 0, 136 | }, { transaction: dbTransaction }); 137 | console.log(`${tx.hash}: ${account.address} created ${address}`); 138 | } else if (operation === 'payment') { 139 | const { address, amount } = tx.params; 140 | const found = await Account.findByPk(address, { transaction: dbTransaction }); 141 | if (!found) { 142 | throw Error('Destination address does not exist'); 143 | } 144 | if (address === tx.account) { 145 | throw Error('Cannot transfer to the same address'); 146 | } 147 | if (amount <= 0) { 148 | throw Error('Amount must be greater than 0'); 149 | } 150 | if (new Decimal(amount).gt(account.balance)) { 151 | throw Error('Amount must be less or equal to source balance'); 152 | } 153 | found.balance = new Decimal(found.balance).add(amount).toFixed(); 154 | account.balance = new Decimal(account.balance).sub(amount).toFixed(); 155 | await found.save({ transaction: dbTransaction }); 156 | await account.save({ transaction: dbTransaction }); 157 | console.log(`${tx.hash}: ${account.address} transfered ${amount} to ${address}`); 158 | } else if (operation === 'post') { 159 | const { content, keys } = tx.params; 160 | console.log(`${tx.hash}: ${account.address} posted ${content.length} bytes with ${keys.length} keys`); 161 | } else if (operation === 'update_account') { 162 | const { key, value } = tx.params; 163 | console.log(`${tx.hash}: ${account.address} update ${key} with ${value.length} bytes`); 164 | } else if (operation === 'interact') { 165 | const { object, content } = tx.params; 166 | // Check if object exists 167 | const transaction = await Transaction.findByPk(object, { transaction: dbTransaction }); 168 | if (!transaction) { 169 | throw Error('Object does not exist'); 170 | } 171 | tx.params.address = transaction.author; 172 | console.log(`${tx.hash}: ${account.address} interact ${object} with ${content.length} bytes`); 173 | } else { 174 | throw Error('Operation is not support.'); 175 | } 176 | 177 | // Check bandwidth usage < account balance 178 | const blockedAmount = Math.ceil(account.bandwidth / NETWORK_BANDWIDTH * MAX_CELLULOSE); 179 | console.log('Blocked amount:', blockedAmount); 180 | if (new Decimal(account.balance).lt(blockedAmount)) { 181 | throw Error('Account balance must greater blocked amount due to bandwidth used'); 182 | } 183 | 184 | // Add transaction to db 185 | await Transaction.create({ 186 | hash: tx.hash, 187 | author: account.address, 188 | }, { 189 | transaction: dbTransaction, 190 | }); 191 | 192 | if (tx.account) { 193 | tags.push({ key: ACCOUNT_KEY, value: Buffer.from(tx.account) }); 194 | } 195 | if (tx.params && tx.params.address && tx.params.address !== tx.account) { 196 | tags.push({ key: ACCOUNT_KEY, value: Buffer.from(tx.params.address) }); 197 | } 198 | if (tx.params && tx.params.object) { 199 | tags.push({ key: OBJECT_KEY, value: Buffer.from(tx.params.object) }); 200 | } 201 | tx.tags = tags; 202 | return tx; 203 | }, 204 | 205 | async checkTx(req) { 206 | // Create new transaction then rollback to old state 207 | const checkTransaction = await db.transaction(); 208 | try { 209 | const tx = await this.executeTx(req, checkTransaction, true); 210 | await checkTransaction.rollback(); 211 | return {}; 212 | } catch (err) { 213 | await checkTransaction.rollback(); 214 | return { code: 1, log: err.toString() }; 215 | } 216 | }, 217 | 218 | async deliverTx(req) { 219 | // Execute within block db transaction 220 | const deliverTransaction = await db.transaction({ 221 | transaction: this.blockTransaction, 222 | }); 223 | try { 224 | const tx = await this.executeTx(req, deliverTransaction); 225 | await deliverTransaction.commit(); 226 | // Update app hash 227 | this.appHash = crypto.createHash('sha256') 228 | .update(Buffer.concat([this.appHash, Buffer.from(tx.hash, 'hex')])) 229 | .digest(); 230 | return { 231 | tags: tx.tags, 232 | }; 233 | } catch (err) { 234 | await deliverTransaction.rollback(); 235 | return { code: 1, log: err.toString() }; 236 | } 237 | }, 238 | 239 | async query(req) { 240 | try { 241 | const parts = req.path.split('/'); 242 | if (parts.length === 3 && parts[1] === 'accounts') { 243 | const account = await Account.findByPk(parts[2]); 244 | if (!account) { 245 | throw Error('Account not found'); 246 | } 247 | return { 248 | value: Buffer.from(JSON.stringify({ 249 | address: account.address, 250 | balance: Number(account.balance), 251 | sequence: Number(account.sequence), 252 | bandwidth: Number(account.bandwidth), 253 | bandwidthTime: account.bandwidthTime, 254 | })), 255 | } 256 | } 257 | } catch (err) { 258 | return { code: 1, log: err.toString() }; 259 | } 260 | } 261 | }; 262 | 263 | const options = { 264 | keepCase: true, 265 | longs: String, 266 | enums: String, 267 | defaults: true, 268 | oneofs: true, 269 | }; 270 | 271 | const protoDefinition = protoLoader.loadSync(PROTO_PATH, options)['types.ABCIApplication']; 272 | 273 | const server = new grpc.Server(); 274 | 275 | const services = {}; 276 | 277 | Object.keys(protoDefinition).forEach((k) => { 278 | const method = _.lowerFirst(k); 279 | if (app[method]) { 280 | services[method] = (call, callback) => { 281 | app[method](call.request).then(res => callback(null, res)).catch(callback); 282 | }; 283 | } else { 284 | services[method] = (_call, callback) => { 285 | callback(null, {}); 286 | }; 287 | } 288 | }); 289 | 290 | server.addService(protoDefinition, services); 291 | 292 | module.exports = server; 293 | -------------------------------------------------------------------------------- /lib/transaction.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | const db = require('./db'); 3 | const Account = require('./account'); 4 | 5 | const Transaction = db.define('transaction', { 6 | hash: { 7 | type: Sequelize.STRING, 8 | primaryKey: true, 9 | }, 10 | author: { 11 | type: Sequelize.STRING, 12 | allowNull: false, 13 | } 14 | }); 15 | 16 | Transaction.belongsTo(Account, { 17 | foreignKey: 'author', 18 | }); 19 | 20 | module.exports = Transaction; 21 | -------------------------------------------------------------------------------- /lib/tx/index.js: -------------------------------------------------------------------------------- 1 | const vstruct = require('varstruct'); 2 | const crypto = require('crypto'); 3 | const { Keypair } = require('stellar-base'); 4 | const v1 = require('./v1'); 5 | 6 | const Transaction = vstruct([ 7 | { name: 'version', type: vstruct.UInt8 }, 8 | ]); 9 | 10 | function encode(tx) { 11 | switch (tx.version) { 12 | case 1: 13 | return v1.encode(tx); 14 | 15 | default: 16 | throw Error('Unsupport version'); 17 | }; 18 | } 19 | 20 | function decode(data) { 21 | const versionTx = Transaction.decode(data); 22 | switch (versionTx.version) { 23 | case 1: 24 | return v1.decode(data); 25 | 26 | default: 27 | throw Error('Unsupport version'); 28 | } 29 | } 30 | 31 | function getUnsignedHash(tx) { 32 | return crypto 33 | .createHash('sha256') 34 | .update(encode({ 35 | ...tx, 36 | signature: Buffer.alloc(64, 0), 37 | })) 38 | .digest(); 39 | } 40 | 41 | function sign(tx, secret) { 42 | const key = Keypair.fromSecret(secret); 43 | tx.account = key.publicKey(); 44 | tx.signature = key.sign(getUnsignedHash(tx)); 45 | } 46 | 47 | function verify(tx) { 48 | const key = Keypair.fromPublicKey(tx.account); 49 | return key.verify(getUnsignedHash(tx), tx.signature); 50 | } 51 | 52 | function hash(tx) { 53 | return tx.hash = crypto.createHash('sha256') 54 | .update(encode(tx)) 55 | .digest() 56 | .toString('hex') 57 | .toUpperCase(); 58 | } 59 | 60 | module.exports = { encode, decode, verify, sign, hash }; 61 | -------------------------------------------------------------------------------- /lib/tx/v1.js: -------------------------------------------------------------------------------- 1 | const vstruct = require('varstruct'); 2 | const base32 = require('base32.js'); 3 | const { Keypair } = require('stellar-base'); 4 | 5 | const Transaction = vstruct([ 6 | { name: 'version', type: vstruct.UInt8 }, 7 | { name: 'account', type: vstruct.Buffer(35) }, 8 | { name: 'sequence', type: vstruct.UInt64BE }, 9 | { name: 'memo', type: vstruct.VarBuffer(vstruct.UInt8) }, 10 | { name: 'operation', type: vstruct.UInt8 }, 11 | { name: 'params', type: vstruct.VarBuffer(vstruct.UInt16BE) }, 12 | { name: 'signature', type: vstruct.Buffer(64) }, 13 | ]); 14 | 15 | const CreateAccountParams = vstruct([ 16 | { name: 'address', type: vstruct.Buffer(35) }, 17 | ]); 18 | 19 | const PaymentParams = vstruct([ 20 | { name: 'address', type: vstruct.Buffer(35) }, 21 | { name: 'amount', type: vstruct.UInt64BE }, 22 | ]); 23 | 24 | const PostParams = vstruct([ 25 | // Maximum length 65536 in bytes 26 | { name: 'content', type: vstruct.VarBuffer(vstruct.UInt16BE) }, 27 | // Private share no more than 256 - 1 (me) people 28 | // 0 key => public post 29 | // >= 1 key => share with specific people, may including me. First 16/24 bytes of content are nonce/iv 30 | { name: 'keys', type: vstruct.VarArray(vstruct.UInt8, vstruct.Buffer(42)) }, 31 | ]); 32 | 33 | const UpdateAccountParams = vstruct([ 34 | { name: 'key', type: vstruct.VarString(vstruct.UInt8) }, 35 | { name: 'value', type: vstruct.VarBuffer(vstruct.UInt16BE) }, 36 | ]); 37 | 38 | const InteractParams = vstruct([ 39 | // Post or comment (or something else?) 40 | { name: 'object', type: vstruct.Buffer(32) }, 41 | // Encrypt with same post key (if any) 42 | // Depend on object on parent object keys. First 16 bytes of content are nonce/iv 43 | { name: 'content', type: vstruct.VarBuffer(vstruct.UInt16BE) }, 44 | // React if '', like, love, haha, anrgy, sad, wow 45 | ]); 46 | 47 | function encode(tx) { 48 | let params, operation; 49 | if (tx.version !== 1) { 50 | throw Error('Wrong version'); 51 | } 52 | switch (tx.operation) { 53 | case 'create_account': 54 | params = CreateAccountParams.encode({ 55 | ...tx.params, 56 | address: Buffer.from(base32.decode(tx.params.address)), 57 | }); 58 | operation = 1; 59 | break; 60 | 61 | case 'payment': 62 | params = PaymentParams.encode({ 63 | ...tx.params, 64 | address: Buffer.from(base32.decode(tx.params.address)), 65 | }); 66 | operation = 2; 67 | break; 68 | 69 | case 'post': 70 | params = PostParams.encode(tx.params); 71 | operation = 3; 72 | break; 73 | 74 | case 'update_account': 75 | params = UpdateAccountParams.encode(tx.params); 76 | operation = 4; 77 | break; 78 | 79 | case 'interact': 80 | params = InteractParams.encode({ 81 | ...tx.params, 82 | object: Buffer.from(tx.params.object, 'hex'), 83 | }); 84 | operation = 5; 85 | break; 86 | 87 | default: 88 | throw Error('Unspport operation'); 89 | } 90 | 91 | return Transaction.encode({ 92 | version: 1, 93 | account: Buffer.from(base32.decode(tx.account)), 94 | sequence: tx.sequence, 95 | memo: tx.memo, 96 | operation, 97 | params, 98 | signature: tx.signature, 99 | }); 100 | } 101 | 102 | function decode(data) { 103 | const tx = Transaction.decode(data); 104 | if (tx.version !== 1) { 105 | throw Error('Wrong version'); 106 | } 107 | let operation, params; 108 | switch (tx.operation) { 109 | case 1: 110 | operation = 'create_account'; 111 | params = CreateAccountParams.decode(tx.params); 112 | params.address = base32.encode(params.address); 113 | Keypair.fromPublicKey(params.address); 114 | break; 115 | 116 | case 2: 117 | operation = 'payment'; 118 | params = PaymentParams.decode(tx.params); 119 | params.address = base32.encode(params.address); 120 | Keypair.fromPublicKey(params.address); 121 | break; 122 | 123 | case 3: 124 | operation = 'post'; 125 | params = PostParams.decode(tx.params); 126 | break; 127 | 128 | case 4: 129 | operation = 'update_account'; 130 | params = UpdateAccountParams.decode(tx.params); 131 | break; 132 | 133 | case 5: 134 | operation = 'interact'; 135 | params = InteractParams.decode(tx.params); 136 | params.object = params.object.toString('hex').toUpperCase(); 137 | break; 138 | 139 | default: 140 | throw Error('Unspport operation'); 141 | } 142 | return { 143 | version: 1, 144 | account: base32.encode(tx.account), 145 | sequence: tx.sequence, 146 | memo: tx.memo, 147 | operation, 148 | params, 149 | signature: tx.signature, 150 | }; 151 | } 152 | 153 | module.exports = { 154 | encode, 155 | decode, 156 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forest.network", 3 | "version": "0.0.3", 4 | "description": "forest.network - decentralized social network", 5 | "main": "app.js", 6 | "repository": "git@github.com:nguyenkha/forest.network.git", 7 | "author": "Kha N. Do ", 8 | "license": "MIT", 9 | "scripts": { 10 | "start": "node app.js", 11 | "inspect": "node --inspect=0.0.0.0:9229 app.js" 12 | }, 13 | "dependencies": { 14 | "@grpc/proto-loader": "^0.3.0", 15 | "base32.js": "^0.1.0", 16 | "bluebird": "^3.5.3", 17 | "decimal.js": "^10.0.1", 18 | "ed2curve": "^0.2.1", 19 | "grpc": "^1.16.1", 20 | "lodash": "^4.17.11", 21 | "moment": "^2.22.2", 22 | "pg": "^7.7.1", 23 | "pg-hstore": "^2.3.2", 24 | "request": "^2.88.0", 25 | "sequelize": "^4.41.2", 26 | "stellar-base": "^0.9.0", 27 | "tweetnacl": "^1.0.0", 28 | "varstruct": "^6.1.2" 29 | }, 30 | "devDependencies": { 31 | "chai": "^4.2.0", 32 | "chai-as-promised": "^7.1.1", 33 | "eslint-plugin-mocha": "^5.2.0", 34 | "mocha": "^5.2.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /proto/abci.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package types; 3 | 4 | // For more information on gogo.proto, see: 5 | // https://github.com/gogo/protobuf/blob/master/extensions.md 6 | import "gogo.proto"; 7 | import "timestamp.proto"; 8 | import "types.proto"; 9 | import "merkle.proto"; 10 | 11 | // This file is copied from http://github.com/tendermint/abci 12 | // NOTE: When using custom types, mind the warnings. 13 | // https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues 14 | 15 | option (gogoproto.marshaler_all) = true; 16 | option (gogoproto.unmarshaler_all) = true; 17 | option (gogoproto.sizer_all) = true; 18 | option (gogoproto.goproto_registration) = true; 19 | // Generate tests 20 | option (gogoproto.populate_all) = true; 21 | option (gogoproto.equal_all) = true; 22 | option (gogoproto.testgen_all) = true; 23 | 24 | //---------------------------------------- 25 | // Request types 26 | 27 | message Request { 28 | oneof value { 29 | RequestEcho echo = 2; 30 | RequestFlush flush = 3; 31 | RequestInfo info = 4; 32 | RequestSetOption set_option = 5; 33 | RequestInitChain init_chain = 6; 34 | RequestQuery query = 7; 35 | RequestBeginBlock begin_block = 8; 36 | RequestCheckTx check_tx = 9; 37 | RequestDeliverTx deliver_tx = 19; 38 | RequestEndBlock end_block = 11; 39 | RequestCommit commit = 12; 40 | } 41 | } 42 | 43 | message RequestEcho { 44 | string message = 1; 45 | } 46 | 47 | message RequestFlush { 48 | } 49 | 50 | message RequestInfo { 51 | string version = 1; 52 | uint64 block_version = 2; 53 | uint64 p2p_version = 3; 54 | } 55 | 56 | // nondeterministic 57 | message RequestSetOption { 58 | string key = 1; 59 | string value = 2; 60 | } 61 | 62 | message RequestInitChain { 63 | google.protobuf.Timestamp time = 1 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true]; 64 | string chain_id = 2; 65 | ConsensusParams consensus_params = 3; 66 | repeated ValidatorUpdate validators = 4 [(gogoproto.nullable)=false]; 67 | bytes app_state_bytes = 5; 68 | } 69 | 70 | message RequestQuery { 71 | bytes data = 1; 72 | string path = 2; 73 | int64 height = 3; 74 | bool prove = 4; 75 | } 76 | 77 | message RequestBeginBlock { 78 | bytes hash = 1; 79 | Header header = 2 [(gogoproto.nullable)=false]; 80 | LastCommitInfo last_commit_info = 3 [(gogoproto.nullable)=false]; 81 | repeated Evidence byzantine_validators = 4 [(gogoproto.nullable)=false]; 82 | } 83 | 84 | message RequestCheckTx { 85 | bytes tx = 1; 86 | } 87 | 88 | message RequestDeliverTx { 89 | bytes tx = 1; 90 | } 91 | 92 | message RequestEndBlock { 93 | int64 height = 1; 94 | } 95 | 96 | message RequestCommit { 97 | } 98 | 99 | //---------------------------------------- 100 | // Response types 101 | 102 | message Response { 103 | oneof value { 104 | ResponseException exception = 1; 105 | ResponseEcho echo = 2; 106 | ResponseFlush flush = 3; 107 | ResponseInfo info = 4; 108 | ResponseSetOption set_option = 5; 109 | ResponseInitChain init_chain = 6; 110 | ResponseQuery query = 7; 111 | ResponseBeginBlock begin_block = 8; 112 | ResponseCheckTx check_tx = 9; 113 | ResponseDeliverTx deliver_tx = 10; 114 | ResponseEndBlock end_block = 11; 115 | ResponseCommit commit = 12; 116 | } 117 | } 118 | 119 | // nondeterministic 120 | message ResponseException { 121 | string error = 1; 122 | } 123 | 124 | message ResponseEcho { 125 | string message = 1; 126 | } 127 | 128 | message ResponseFlush { 129 | } 130 | 131 | message ResponseInfo { 132 | string data = 1; 133 | 134 | string version = 2; 135 | uint64 app_version = 3; 136 | 137 | int64 last_block_height = 4; 138 | bytes last_block_app_hash = 5; 139 | } 140 | 141 | // nondeterministic 142 | message ResponseSetOption { 143 | uint32 code = 1; 144 | // bytes data = 2; 145 | string log = 3; 146 | string info = 4; 147 | } 148 | 149 | message ResponseInitChain { 150 | ConsensusParams consensus_params = 1; 151 | repeated ValidatorUpdate validators = 2 [(gogoproto.nullable)=false]; 152 | } 153 | 154 | message ResponseQuery { 155 | uint32 code = 1; 156 | // bytes data = 2; // use "value" instead. 157 | string log = 3; // nondeterministic 158 | string info = 4; // nondeterministic 159 | int64 index = 5; 160 | bytes key = 6; 161 | bytes value = 7; 162 | merkle.Proof proof = 8; 163 | int64 height = 9; 164 | string codespace = 10; 165 | } 166 | 167 | message ResponseBeginBlock { 168 | repeated common.KVPair tags = 1 [(gogoproto.nullable)=false, (gogoproto.jsontag)="tags,omitempty"]; 169 | } 170 | 171 | message ResponseCheckTx { 172 | uint32 code = 1; 173 | bytes data = 2; 174 | string log = 3; // nondeterministic 175 | string info = 4; // nondeterministic 176 | int64 gas_wanted = 5; 177 | int64 gas_used = 6; 178 | repeated common.KVPair tags = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="tags,omitempty"]; 179 | string codespace = 8; 180 | } 181 | 182 | message ResponseDeliverTx { 183 | uint32 code = 1; 184 | bytes data = 2; 185 | string log = 3; // nondeterministic 186 | string info = 4; // nondeterministic 187 | int64 gas_wanted = 5; 188 | int64 gas_used = 6; 189 | repeated common.KVPair tags = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="tags,omitempty"]; 190 | string codespace = 8; 191 | } 192 | 193 | message ResponseEndBlock { 194 | repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable)=false]; 195 | ConsensusParams consensus_param_updates = 2; 196 | repeated common.KVPair tags = 3 [(gogoproto.nullable)=false, (gogoproto.jsontag)="tags,omitempty"]; 197 | } 198 | 199 | message ResponseCommit { 200 | // reserve 1 201 | bytes data = 2; 202 | } 203 | 204 | //---------------------------------------- 205 | // Misc. 206 | 207 | // ConsensusParams contains all consensus-relevant parameters 208 | // that can be adjusted by the abci app 209 | message ConsensusParams { 210 | BlockSizeParams block_size = 1; 211 | EvidenceParams evidence = 2; 212 | ValidatorParams validator = 3; 213 | } 214 | 215 | // BlockSize contains limits on the block size. 216 | message BlockSizeParams { 217 | // Note: must be greater than 0 218 | int64 max_bytes = 1; 219 | // Note: must be greater or equal to -1 220 | int64 max_gas = 2; 221 | } 222 | 223 | // EvidenceParams contains limits on the evidence. 224 | message EvidenceParams { 225 | // Note: must be greater than 0 226 | int64 max_age = 1; 227 | } 228 | 229 | // ValidatorParams contains limits on validators. 230 | message ValidatorParams { 231 | repeated string pub_key_types = 1; 232 | } 233 | 234 | message LastCommitInfo { 235 | int32 round = 1; 236 | repeated VoteInfo votes = 2 [(gogoproto.nullable)=false]; 237 | } 238 | 239 | //---------------------------------------- 240 | // Blockchain Types 241 | 242 | message Header { 243 | // basic block info 244 | Version version = 1 [(gogoproto.nullable)=false]; 245 | string chain_id = 2 [(gogoproto.customname)="ChainID"]; 246 | int64 height = 3; 247 | google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true]; 248 | int64 num_txs = 5; 249 | int64 total_txs = 6; 250 | 251 | // prev block info 252 | BlockID last_block_id = 7 [(gogoproto.nullable)=false]; 253 | 254 | // hashes of block data 255 | bytes last_commit_hash = 8; // commit from validators from the last block 256 | bytes data_hash = 9; // transactions 257 | 258 | // hashes from the app output from the prev block 259 | bytes validators_hash = 10; // validators for the current block 260 | bytes next_validators_hash = 11; // validators for the next block 261 | bytes consensus_hash = 12; // consensus params for current block 262 | bytes app_hash = 13; // state after txs from the previous block 263 | bytes last_results_hash = 14;// root hash of all results from the txs from the previous block 264 | 265 | // consensus info 266 | bytes evidence_hash = 15; // evidence included in the block 267 | bytes proposer_address = 16; // original proposer of the block 268 | } 269 | 270 | message Version { 271 | uint64 Block = 1; 272 | uint64 App = 2; 273 | } 274 | 275 | 276 | message BlockID { 277 | bytes hash = 1; 278 | PartSetHeader parts_header = 2 [(gogoproto.nullable)=false]; 279 | } 280 | 281 | message PartSetHeader { 282 | int32 total = 1; 283 | bytes hash = 2; 284 | } 285 | 286 | // Validator 287 | message Validator { 288 | bytes address = 1; 289 | //PubKey pub_key = 2 [(gogoproto.nullable)=false]; 290 | int64 power = 3; 291 | } 292 | 293 | // ValidatorUpdate 294 | message ValidatorUpdate { 295 | PubKey pub_key = 1 [(gogoproto.nullable)=false]; 296 | int64 power = 2; 297 | } 298 | 299 | // VoteInfo 300 | message VoteInfo { 301 | Validator validator = 1 [(gogoproto.nullable)=false]; 302 | bool signed_last_block = 2; 303 | } 304 | 305 | message PubKey { 306 | string type = 1; 307 | bytes data = 2; 308 | } 309 | 310 | message Evidence { 311 | string type = 1; 312 | Validator validator = 2 [(gogoproto.nullable)=false]; 313 | int64 height = 3; 314 | google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true]; 315 | int64 total_voting_power = 5; 316 | } 317 | 318 | //---------------------------------------- 319 | // Service Definition 320 | 321 | service ABCIApplication { 322 | rpc Echo(RequestEcho) returns (ResponseEcho) ; 323 | rpc Flush(RequestFlush) returns (ResponseFlush); 324 | rpc Info(RequestInfo) returns (ResponseInfo); 325 | rpc SetOption(RequestSetOption) returns (ResponseSetOption); 326 | rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); 327 | rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); 328 | rpc Query(RequestQuery) returns (ResponseQuery); 329 | rpc Commit(RequestCommit) returns (ResponseCommit); 330 | rpc InitChain(RequestInitChain) returns (ResponseInitChain); 331 | rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); 332 | rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); 333 | } 334 | -------------------------------------------------------------------------------- /proto/descriptor.proto: -------------------------------------------------------------------------------- 1 | // Protocol Buffers - Google's data interchange format 2 | // Copyright 2008 Google Inc. All rights reserved. 3 | // https://developers.google.com/protocol-buffers/ 4 | // 5 | // Redistribution and use in source and binary forms, with or without 6 | // modification, are permitted provided that the following conditions are 7 | // met: 8 | // 9 | // * Redistributions of source code must retain the above copyright 10 | // notice, this list of conditions and the following disclaimer. 11 | // * Redistributions in binary form must reproduce the above 12 | // copyright notice, this list of conditions and the following disclaimer 13 | // in the documentation and/or other materials provided with the 14 | // distribution. 15 | // * Neither the name of Google Inc. nor the names of its 16 | // contributors may be used to endorse or promote products derived from 17 | // this software without specific prior written permission. 18 | // 19 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | 31 | // Author: kenton@google.com (Kenton Varda) 32 | // Based on original Protocol Buffers design by 33 | // Sanjay Ghemawat, Jeff Dean, and others. 34 | // 35 | // The messages in this file describe the definitions found in .proto files. 36 | // A valid .proto file can be translated directly to a FileDescriptorProto 37 | // without any other information (e.g. without reading its imports). 38 | 39 | 40 | syntax = "proto2"; 41 | 42 | package google.protobuf; 43 | option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; 44 | option java_package = "com.google.protobuf"; 45 | option java_outer_classname = "DescriptorProtos"; 46 | option csharp_namespace = "Google.Protobuf.Reflection"; 47 | option objc_class_prefix = "GPB"; 48 | option cc_enable_arenas = true; 49 | 50 | // descriptor.proto must be optimized for speed because reflection-based 51 | // algorithms don't work during bootstrapping. 52 | option optimize_for = SPEED; 53 | 54 | // The protocol compiler can output a FileDescriptorSet containing the .proto 55 | // files it parses. 56 | message FileDescriptorSet { 57 | repeated FileDescriptorProto file = 1; 58 | } 59 | 60 | // Describes a complete .proto file. 61 | message FileDescriptorProto { 62 | optional string name = 1; // file name, relative to root of source tree 63 | optional string package = 2; // e.g. "foo", "foo.bar", etc. 64 | 65 | // Names of files imported by this file. 66 | repeated string dependency = 3; 67 | // Indexes of the public imported files in the dependency list above. 68 | repeated int32 public_dependency = 10; 69 | // Indexes of the weak imported files in the dependency list. 70 | // For Google-internal migration only. Do not use. 71 | repeated int32 weak_dependency = 11; 72 | 73 | // All top-level definitions in this file. 74 | repeated DescriptorProto message_type = 4; 75 | repeated EnumDescriptorProto enum_type = 5; 76 | repeated ServiceDescriptorProto service = 6; 77 | repeated FieldDescriptorProto extension = 7; 78 | 79 | optional FileOptions options = 8; 80 | 81 | // This field contains optional information about the original source code. 82 | // You may safely remove this entire field without harming runtime 83 | // functionality of the descriptors -- the information is needed only by 84 | // development tools. 85 | optional SourceCodeInfo source_code_info = 9; 86 | 87 | // The syntax of the proto file. 88 | // The supported values are "proto2" and "proto3". 89 | optional string syntax = 12; 90 | } 91 | 92 | // Describes a message type. 93 | message DescriptorProto { 94 | optional string name = 1; 95 | 96 | repeated FieldDescriptorProto field = 2; 97 | repeated FieldDescriptorProto extension = 6; 98 | 99 | repeated DescriptorProto nested_type = 3; 100 | repeated EnumDescriptorProto enum_type = 4; 101 | 102 | message ExtensionRange { 103 | optional int32 start = 1; 104 | optional int32 end = 2; 105 | 106 | optional ExtensionRangeOptions options = 3; 107 | } 108 | repeated ExtensionRange extension_range = 5; 109 | 110 | repeated OneofDescriptorProto oneof_decl = 8; 111 | 112 | optional MessageOptions options = 7; 113 | 114 | // Range of reserved tag numbers. Reserved tag numbers may not be used by 115 | // fields or extension ranges in the same message. Reserved ranges may 116 | // not overlap. 117 | message ReservedRange { 118 | optional int32 start = 1; // Inclusive. 119 | optional int32 end = 2; // Exclusive. 120 | } 121 | repeated ReservedRange reserved_range = 9; 122 | // Reserved field names, which may not be used by fields in the same message. 123 | // A given name may only be reserved once. 124 | repeated string reserved_name = 10; 125 | } 126 | 127 | message ExtensionRangeOptions { 128 | // The parser stores options it doesn't recognize here. See above. 129 | repeated UninterpretedOption uninterpreted_option = 999; 130 | 131 | // Clients can define custom options in extensions of this message. See above. 132 | extensions 1000 to max; 133 | } 134 | 135 | // Describes a field within a message. 136 | message FieldDescriptorProto { 137 | enum Type { 138 | // 0 is reserved for errors. 139 | // Order is weird for historical reasons. 140 | TYPE_DOUBLE = 1; 141 | TYPE_FLOAT = 2; 142 | // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if 143 | // negative values are likely. 144 | TYPE_INT64 = 3; 145 | TYPE_UINT64 = 4; 146 | // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if 147 | // negative values are likely. 148 | TYPE_INT32 = 5; 149 | TYPE_FIXED64 = 6; 150 | TYPE_FIXED32 = 7; 151 | TYPE_BOOL = 8; 152 | TYPE_STRING = 9; 153 | // Tag-delimited aggregate. 154 | // Group type is deprecated and not supported in proto3. However, Proto3 155 | // implementations should still be able to parse the group wire format and 156 | // treat group fields as unknown fields. 157 | TYPE_GROUP = 10; 158 | TYPE_MESSAGE = 11; // Length-delimited aggregate. 159 | 160 | // New in version 2. 161 | TYPE_BYTES = 12; 162 | TYPE_UINT32 = 13; 163 | TYPE_ENUM = 14; 164 | TYPE_SFIXED32 = 15; 165 | TYPE_SFIXED64 = 16; 166 | TYPE_SINT32 = 17; // Uses ZigZag encoding. 167 | TYPE_SINT64 = 18; // Uses ZigZag encoding. 168 | }; 169 | 170 | enum Label { 171 | // 0 is reserved for errors 172 | LABEL_OPTIONAL = 1; 173 | LABEL_REQUIRED = 2; 174 | LABEL_REPEATED = 3; 175 | }; 176 | 177 | optional string name = 1; 178 | optional int32 number = 3; 179 | optional Label label = 4; 180 | 181 | // If type_name is set, this need not be set. If both this and type_name 182 | // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. 183 | optional Type type = 5; 184 | 185 | // For message and enum types, this is the name of the type. If the name 186 | // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping 187 | // rules are used to find the type (i.e. first the nested types within this 188 | // message are searched, then within the parent, on up to the root 189 | // namespace). 190 | optional string type_name = 6; 191 | 192 | // For extensions, this is the name of the type being extended. It is 193 | // resolved in the same manner as type_name. 194 | optional string extendee = 2; 195 | 196 | // For numeric types, contains the original text representation of the value. 197 | // For booleans, "true" or "false". 198 | // For strings, contains the default text contents (not escaped in any way). 199 | // For bytes, contains the C escaped value. All bytes >= 128 are escaped. 200 | // TODO(kenton): Base-64 encode? 201 | optional string default_value = 7; 202 | 203 | // If set, gives the index of a oneof in the containing type's oneof_decl 204 | // list. This field is a member of that oneof. 205 | optional int32 oneof_index = 9; 206 | 207 | // JSON name of this field. The value is set by protocol compiler. If the 208 | // user has set a "json_name" option on this field, that option's value 209 | // will be used. Otherwise, it's deduced from the field's name by converting 210 | // it to camelCase. 211 | optional string json_name = 10; 212 | 213 | optional FieldOptions options = 8; 214 | } 215 | 216 | // Describes a oneof. 217 | message OneofDescriptorProto { 218 | optional string name = 1; 219 | optional OneofOptions options = 2; 220 | } 221 | 222 | // Describes an enum type. 223 | message EnumDescriptorProto { 224 | optional string name = 1; 225 | 226 | repeated EnumValueDescriptorProto value = 2; 227 | 228 | optional EnumOptions options = 3; 229 | 230 | // Range of reserved numeric values. Reserved values may not be used by 231 | // entries in the same enum. Reserved ranges may not overlap. 232 | // 233 | // Note that this is distinct from DescriptorProto.ReservedRange in that it 234 | // is inclusive such that it can appropriately represent the entire int32 235 | // domain. 236 | message EnumReservedRange { 237 | optional int32 start = 1; // Inclusive. 238 | optional int32 end = 2; // Inclusive. 239 | } 240 | 241 | // Range of reserved numeric values. Reserved numeric values may not be used 242 | // by enum values in the same enum declaration. Reserved ranges may not 243 | // overlap. 244 | repeated EnumReservedRange reserved_range = 4; 245 | 246 | // Reserved enum value names, which may not be reused. A given name may only 247 | // be reserved once. 248 | repeated string reserved_name = 5; 249 | } 250 | 251 | // Describes a value within an enum. 252 | message EnumValueDescriptorProto { 253 | optional string name = 1; 254 | optional int32 number = 2; 255 | 256 | optional EnumValueOptions options = 3; 257 | } 258 | 259 | // Describes a service. 260 | message ServiceDescriptorProto { 261 | optional string name = 1; 262 | repeated MethodDescriptorProto method = 2; 263 | 264 | optional ServiceOptions options = 3; 265 | } 266 | 267 | // Describes a method of a service. 268 | message MethodDescriptorProto { 269 | optional string name = 1; 270 | 271 | // Input and output type names. These are resolved in the same way as 272 | // FieldDescriptorProto.type_name, but must refer to a message type. 273 | optional string input_type = 2; 274 | optional string output_type = 3; 275 | 276 | optional MethodOptions options = 4; 277 | 278 | // Identifies if client streams multiple client messages 279 | optional bool client_streaming = 5 [default=false]; 280 | // Identifies if server streams multiple server messages 281 | optional bool server_streaming = 6 [default=false]; 282 | } 283 | 284 | 285 | // =================================================================== 286 | // Options 287 | 288 | // Each of the definitions above may have "options" attached. These are 289 | // just annotations which may cause code to be generated slightly differently 290 | // or may contain hints for code that manipulates protocol messages. 291 | // 292 | // Clients may define custom options as extensions of the *Options messages. 293 | // These extensions may not yet be known at parsing time, so the parser cannot 294 | // store the values in them. Instead it stores them in a field in the *Options 295 | // message called uninterpreted_option. This field must have the same name 296 | // across all *Options messages. We then use this field to populate the 297 | // extensions when we build a descriptor, at which point all protos have been 298 | // parsed and so all extensions are known. 299 | // 300 | // Extension numbers for custom options may be chosen as follows: 301 | // * For options which will only be used within a single application or 302 | // organization, or for experimental options, use field numbers 50000 303 | // through 99999. It is up to you to ensure that you do not use the 304 | // same number for multiple options. 305 | // * For options which will be published and used publicly by multiple 306 | // independent entities, e-mail protobuf-global-extension-registry@google.com 307 | // to reserve extension numbers. Simply provide your project name (e.g. 308 | // Objective-C plugin) and your project website (if available) -- there's no 309 | // need to explain how you intend to use them. Usually you only need one 310 | // extension number. You can declare multiple options with only one extension 311 | // number by putting them in a sub-message. See the Custom Options section of 312 | // the docs for examples: 313 | // https://developers.google.com/protocol-buffers/docs/proto#options 314 | // If this turns out to be popular, a web service will be set up 315 | // to automatically assign option numbers. 316 | 317 | 318 | message FileOptions { 319 | 320 | // Sets the Java package where classes generated from this .proto will be 321 | // placed. By default, the proto package is used, but this is often 322 | // inappropriate because proto packages do not normally start with backwards 323 | // domain names. 324 | optional string java_package = 1; 325 | 326 | 327 | // If set, all the classes from the .proto file are wrapped in a single 328 | // outer class with the given name. This applies to both Proto1 329 | // (equivalent to the old "--one_java_file" option) and Proto2 (where 330 | // a .proto always translates to a single class, but you may want to 331 | // explicitly choose the class name). 332 | optional string java_outer_classname = 8; 333 | 334 | // If set true, then the Java code generator will generate a separate .java 335 | // file for each top-level message, enum, and service defined in the .proto 336 | // file. Thus, these types will *not* be nested inside the outer class 337 | // named by java_outer_classname. However, the outer class will still be 338 | // generated to contain the file's getDescriptor() method as well as any 339 | // top-level extensions defined in the file. 340 | optional bool java_multiple_files = 10 [default=false]; 341 | 342 | // This option does nothing. 343 | optional bool java_generate_equals_and_hash = 20 [deprecated=true]; 344 | 345 | // If set true, then the Java2 code generator will generate code that 346 | // throws an exception whenever an attempt is made to assign a non-UTF-8 347 | // byte sequence to a string field. 348 | // Message reflection will do the same. 349 | // However, an extension field still accepts non-UTF-8 byte sequences. 350 | // This option has no effect on when used with the lite runtime. 351 | optional bool java_string_check_utf8 = 27 [default=false]; 352 | 353 | 354 | // Generated classes can be optimized for speed or code size. 355 | enum OptimizeMode { 356 | SPEED = 1; // Generate complete code for parsing, serialization, 357 | // etc. 358 | CODE_SIZE = 2; // Use ReflectionOps to implement these methods. 359 | LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. 360 | } 361 | optional OptimizeMode optimize_for = 9 [default=SPEED]; 362 | 363 | // Sets the Go package where structs generated from this .proto will be 364 | // placed. If omitted, the Go package will be derived from the following: 365 | // - The basename of the package import path, if provided. 366 | // - Otherwise, the package statement in the .proto file, if present. 367 | // - Otherwise, the basename of the .proto file, without extension. 368 | optional string go_package = 11; 369 | 370 | 371 | 372 | // Should generic services be generated in each language? "Generic" services 373 | // are not specific to any particular RPC system. They are generated by the 374 | // main code generators in each language (without additional plugins). 375 | // Generic services were the only kind of service generation supported by 376 | // early versions of google.protobuf. 377 | // 378 | // Generic services are now considered deprecated in favor of using plugins 379 | // that generate code specific to your particular RPC system. Therefore, 380 | // these default to false. Old code which depends on generic services should 381 | // explicitly set them to true. 382 | optional bool cc_generic_services = 16 [default=false]; 383 | optional bool java_generic_services = 17 [default=false]; 384 | optional bool py_generic_services = 18 [default=false]; 385 | optional bool php_generic_services = 42 [default=false]; 386 | 387 | // Is this file deprecated? 388 | // Depending on the target platform, this can emit Deprecated annotations 389 | // for everything in the file, or it will be completely ignored; in the very 390 | // least, this is a formalization for deprecating files. 391 | optional bool deprecated = 23 [default=false]; 392 | 393 | // Enables the use of arenas for the proto messages in this file. This applies 394 | // only to generated classes for C++. 395 | optional bool cc_enable_arenas = 31 [default=false]; 396 | 397 | 398 | // Sets the objective c class prefix which is prepended to all objective c 399 | // generated classes from this .proto. There is no default. 400 | optional string objc_class_prefix = 36; 401 | 402 | // Namespace for generated classes; defaults to the package. 403 | optional string csharp_namespace = 37; 404 | 405 | // By default Swift generators will take the proto package and CamelCase it 406 | // replacing '.' with underscore and use that to prefix the types/symbols 407 | // defined. When this options is provided, they will use this value instead 408 | // to prefix the types/symbols defined. 409 | optional string swift_prefix = 39; 410 | 411 | // Sets the php class prefix which is prepended to all php generated classes 412 | // from this .proto. Default is empty. 413 | optional string php_class_prefix = 40; 414 | 415 | // Use this option to change the namespace of php generated classes. Default 416 | // is empty. When this option is empty, the package name will be used for 417 | // determining the namespace. 418 | optional string php_namespace = 41; 419 | 420 | 421 | // Use this option to change the namespace of php generated metadata classes. 422 | // Default is empty. When this option is empty, the proto file name will be used 423 | // for determining the namespace. 424 | optional string php_metadata_namespace = 44; 425 | 426 | // Use this option to change the package of ruby generated classes. Default 427 | // is empty. When this option is not set, the package name will be used for 428 | // determining the ruby package. 429 | optional string ruby_package = 45; 430 | 431 | // The parser stores options it doesn't recognize here. 432 | // See the documentation for the "Options" section above. 433 | repeated UninterpretedOption uninterpreted_option = 999; 434 | 435 | // Clients can define custom options in extensions of this message. 436 | // See the documentation for the "Options" section above. 437 | extensions 1000 to max; 438 | 439 | reserved 38; 440 | } 441 | 442 | message MessageOptions { 443 | // Set true to use the old proto1 MessageSet wire format for extensions. 444 | // This is provided for backwards-compatibility with the MessageSet wire 445 | // format. You should not use this for any other reason: It's less 446 | // efficient, has fewer features, and is more complicated. 447 | // 448 | // The message must be defined exactly as follows: 449 | // message Foo { 450 | // option message_set_wire_format = true; 451 | // extensions 4 to max; 452 | // } 453 | // Note that the message cannot have any defined fields; MessageSets only 454 | // have extensions. 455 | // 456 | // All extensions of your type must be singular messages; e.g. they cannot 457 | // be int32s, enums, or repeated messages. 458 | // 459 | // Because this is an option, the above two restrictions are not enforced by 460 | // the protocol compiler. 461 | optional bool message_set_wire_format = 1 [default=false]; 462 | 463 | // Disables the generation of the standard "descriptor()" accessor, which can 464 | // conflict with a field of the same name. This is meant to make migration 465 | // from proto1 easier; new code should avoid fields named "descriptor". 466 | optional bool no_standard_descriptor_accessor = 2 [default=false]; 467 | 468 | // Is this message deprecated? 469 | // Depending on the target platform, this can emit Deprecated annotations 470 | // for the message, or it will be completely ignored; in the very least, 471 | // this is a formalization for deprecating messages. 472 | optional bool deprecated = 3 [default=false]; 473 | 474 | // Whether the message is an automatically generated map entry type for the 475 | // maps field. 476 | // 477 | // For maps fields: 478 | // map map_field = 1; 479 | // The parsed descriptor looks like: 480 | // message MapFieldEntry { 481 | // option map_entry = true; 482 | // optional KeyType key = 1; 483 | // optional ValueType value = 2; 484 | // } 485 | // repeated MapFieldEntry map_field = 1; 486 | // 487 | // Implementations may choose not to generate the map_entry=true message, but 488 | // use a native map in the target language to hold the keys and values. 489 | // The reflection APIs in such implementions still need to work as 490 | // if the field is a repeated message field. 491 | // 492 | // NOTE: Do not set the option in .proto files. Always use the maps syntax 493 | // instead. The option should only be implicitly set by the proto compiler 494 | // parser. 495 | optional bool map_entry = 7; 496 | 497 | reserved 8; // javalite_serializable 498 | reserved 9; // javanano_as_lite 499 | 500 | // The parser stores options it doesn't recognize here. See above. 501 | repeated UninterpretedOption uninterpreted_option = 999; 502 | 503 | // Clients can define custom options in extensions of this message. See above. 504 | extensions 1000 to max; 505 | } 506 | 507 | message FieldOptions { 508 | // The ctype option instructs the C++ code generator to use a different 509 | // representation of the field than it normally would. See the specific 510 | // options below. This option is not yet implemented in the open source 511 | // release -- sorry, we'll try to include it in a future version! 512 | optional CType ctype = 1 [default = STRING]; 513 | enum CType { 514 | // Default mode. 515 | STRING = 0; 516 | 517 | CORD = 1; 518 | 519 | STRING_PIECE = 2; 520 | } 521 | // The packed option can be enabled for repeated primitive fields to enable 522 | // a more efficient representation on the wire. Rather than repeatedly 523 | // writing the tag and type for each element, the entire array is encoded as 524 | // a single length-delimited blob. In proto3, only explicit setting it to 525 | // false will avoid using packed encoding. 526 | optional bool packed = 2; 527 | 528 | // The jstype option determines the JavaScript type used for values of the 529 | // field. The option is permitted only for 64 bit integral and fixed types 530 | // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING 531 | // is represented as JavaScript string, which avoids loss of precision that 532 | // can happen when a large value is converted to a floating point JavaScript. 533 | // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to 534 | // use the JavaScript "number" type. The behavior of the default option 535 | // JS_NORMAL is implementation dependent. 536 | // 537 | // This option is an enum to permit additional types to be added, e.g. 538 | // goog.math.Integer. 539 | optional JSType jstype = 6 [default = JS_NORMAL]; 540 | enum JSType { 541 | // Use the default type. 542 | JS_NORMAL = 0; 543 | 544 | // Use JavaScript strings. 545 | JS_STRING = 1; 546 | 547 | // Use JavaScript numbers. 548 | JS_NUMBER = 2; 549 | } 550 | 551 | // Should this field be parsed lazily? Lazy applies only to message-type 552 | // fields. It means that when the outer message is initially parsed, the 553 | // inner message's contents will not be parsed but instead stored in encoded 554 | // form. The inner message will actually be parsed when it is first accessed. 555 | // 556 | // This is only a hint. Implementations are free to choose whether to use 557 | // eager or lazy parsing regardless of the value of this option. However, 558 | // setting this option true suggests that the protocol author believes that 559 | // using lazy parsing on this field is worth the additional bookkeeping 560 | // overhead typically needed to implement it. 561 | // 562 | // This option does not affect the public interface of any generated code; 563 | // all method signatures remain the same. Furthermore, thread-safety of the 564 | // interface is not affected by this option; const methods remain safe to 565 | // call from multiple threads concurrently, while non-const methods continue 566 | // to require exclusive access. 567 | // 568 | // 569 | // Note that implementations may choose not to check required fields within 570 | // a lazy sub-message. That is, calling IsInitialized() on the outer message 571 | // may return true even if the inner message has missing required fields. 572 | // This is necessary because otherwise the inner message would have to be 573 | // parsed in order to perform the check, defeating the purpose of lazy 574 | // parsing. An implementation which chooses not to check required fields 575 | // must be consistent about it. That is, for any particular sub-message, the 576 | // implementation must either *always* check its required fields, or *never* 577 | // check its required fields, regardless of whether or not the message has 578 | // been parsed. 579 | optional bool lazy = 5 [default=false]; 580 | 581 | // Is this field deprecated? 582 | // Depending on the target platform, this can emit Deprecated annotations 583 | // for accessors, or it will be completely ignored; in the very least, this 584 | // is a formalization for deprecating fields. 585 | optional bool deprecated = 3 [default=false]; 586 | 587 | // For Google-internal migration only. Do not use. 588 | optional bool weak = 10 [default=false]; 589 | 590 | 591 | // The parser stores options it doesn't recognize here. See above. 592 | repeated UninterpretedOption uninterpreted_option = 999; 593 | 594 | // Clients can define custom options in extensions of this message. See above. 595 | extensions 1000 to max; 596 | 597 | reserved 4; // removed jtype 598 | } 599 | 600 | message OneofOptions { 601 | // The parser stores options it doesn't recognize here. See above. 602 | repeated UninterpretedOption uninterpreted_option = 999; 603 | 604 | // Clients can define custom options in extensions of this message. See above. 605 | extensions 1000 to max; 606 | } 607 | 608 | message EnumOptions { 609 | 610 | // Set this option to true to allow mapping different tag names to the same 611 | // value. 612 | optional bool allow_alias = 2; 613 | 614 | // Is this enum deprecated? 615 | // Depending on the target platform, this can emit Deprecated annotations 616 | // for the enum, or it will be completely ignored; in the very least, this 617 | // is a formalization for deprecating enums. 618 | optional bool deprecated = 3 [default=false]; 619 | 620 | reserved 5; // javanano_as_lite 621 | 622 | // The parser stores options it doesn't recognize here. See above. 623 | repeated UninterpretedOption uninterpreted_option = 999; 624 | 625 | // Clients can define custom options in extensions of this message. See above. 626 | extensions 1000 to max; 627 | } 628 | 629 | message EnumValueOptions { 630 | // Is this enum value deprecated? 631 | // Depending on the target platform, this can emit Deprecated annotations 632 | // for the enum value, or it will be completely ignored; in the very least, 633 | // this is a formalization for deprecating enum values. 634 | optional bool deprecated = 1 [default=false]; 635 | 636 | // The parser stores options it doesn't recognize here. See above. 637 | repeated UninterpretedOption uninterpreted_option = 999; 638 | 639 | // Clients can define custom options in extensions of this message. See above. 640 | extensions 1000 to max; 641 | } 642 | 643 | message ServiceOptions { 644 | 645 | // Note: Field numbers 1 through 32 are reserved for Google's internal RPC 646 | // framework. We apologize for hoarding these numbers to ourselves, but 647 | // we were already using them long before we decided to release Protocol 648 | // Buffers. 649 | 650 | // Is this service deprecated? 651 | // Depending on the target platform, this can emit Deprecated annotations 652 | // for the service, or it will be completely ignored; in the very least, 653 | // this is a formalization for deprecating services. 654 | optional bool deprecated = 33 [default=false]; 655 | 656 | // The parser stores options it doesn't recognize here. See above. 657 | repeated UninterpretedOption uninterpreted_option = 999; 658 | 659 | // Clients can define custom options in extensions of this message. See above. 660 | extensions 1000 to max; 661 | } 662 | 663 | message MethodOptions { 664 | 665 | // Note: Field numbers 1 through 32 are reserved for Google's internal RPC 666 | // framework. We apologize for hoarding these numbers to ourselves, but 667 | // we were already using them long before we decided to release Protocol 668 | // Buffers. 669 | 670 | // Is this method deprecated? 671 | // Depending on the target platform, this can emit Deprecated annotations 672 | // for the method, or it will be completely ignored; in the very least, 673 | // this is a formalization for deprecating methods. 674 | optional bool deprecated = 33 [default=false]; 675 | 676 | // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, 677 | // or neither? HTTP based RPC implementation may choose GET verb for safe 678 | // methods, and PUT verb for idempotent methods instead of the default POST. 679 | enum IdempotencyLevel { 680 | IDEMPOTENCY_UNKNOWN = 0; 681 | NO_SIDE_EFFECTS = 1; // implies idempotent 682 | IDEMPOTENT = 2; // idempotent, but may have side effects 683 | } 684 | optional IdempotencyLevel idempotency_level = 685 | 34 [default=IDEMPOTENCY_UNKNOWN]; 686 | 687 | // The parser stores options it doesn't recognize here. See above. 688 | repeated UninterpretedOption uninterpreted_option = 999; 689 | 690 | // Clients can define custom options in extensions of this message. See above. 691 | extensions 1000 to max; 692 | } 693 | 694 | 695 | // A message representing a option the parser does not recognize. This only 696 | // appears in options protos created by the compiler::Parser class. 697 | // DescriptorPool resolves these when building Descriptor objects. Therefore, 698 | // options protos in descriptor objects (e.g. returned by Descriptor::options(), 699 | // or produced by Descriptor::CopyTo()) will never have UninterpretedOptions 700 | // in them. 701 | message UninterpretedOption { 702 | // The name of the uninterpreted option. Each string represents a segment in 703 | // a dot-separated name. is_extension is true iff a segment represents an 704 | // extension (denoted with parentheses in options specs in .proto files). 705 | // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents 706 | // "foo.(bar.baz).qux". 707 | message NamePart { 708 | required string name_part = 1; 709 | required bool is_extension = 2; 710 | } 711 | repeated NamePart name = 2; 712 | 713 | // The value of the uninterpreted option, in whatever type the tokenizer 714 | // identified it as during parsing. Exactly one of these should be set. 715 | optional string identifier_value = 3; 716 | optional uint64 positive_int_value = 4; 717 | optional int64 negative_int_value = 5; 718 | optional double double_value = 6; 719 | optional bytes string_value = 7; 720 | optional string aggregate_value = 8; 721 | } 722 | 723 | // =================================================================== 724 | // Optional source code info 725 | 726 | // Encapsulates information about the original source file from which a 727 | // FileDescriptorProto was generated. 728 | message SourceCodeInfo { 729 | // A Location identifies a piece of source code in a .proto file which 730 | // corresponds to a particular definition. This information is intended 731 | // to be useful to IDEs, code indexers, documentation generators, and similar 732 | // tools. 733 | // 734 | // For example, say we have a file like: 735 | // message Foo { 736 | // optional string foo = 1; 737 | // } 738 | // Let's look at just the field definition: 739 | // optional string foo = 1; 740 | // ^ ^^ ^^ ^ ^^^ 741 | // a bc de f ghi 742 | // We have the following locations: 743 | // span path represents 744 | // [a,i) [ 4, 0, 2, 0 ] The whole field definition. 745 | // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). 746 | // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). 747 | // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). 748 | // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). 749 | // 750 | // Notes: 751 | // - A location may refer to a repeated field itself (i.e. not to any 752 | // particular index within it). This is used whenever a set of elements are 753 | // logically enclosed in a single code segment. For example, an entire 754 | // extend block (possibly containing multiple extension definitions) will 755 | // have an outer location whose path refers to the "extensions" repeated 756 | // field without an index. 757 | // - Multiple locations may have the same path. This happens when a single 758 | // logical declaration is spread out across multiple places. The most 759 | // obvious example is the "extend" block again -- there may be multiple 760 | // extend blocks in the same scope, each of which will have the same path. 761 | // - A location's span is not always a subset of its parent's span. For 762 | // example, the "extendee" of an extension declaration appears at the 763 | // beginning of the "extend" block and is shared by all extensions within 764 | // the block. 765 | // - Just because a location's span is a subset of some other location's span 766 | // does not mean that it is a descendent. For example, a "group" defines 767 | // both a type and a field in a single declaration. Thus, the locations 768 | // corresponding to the type and field and their components will overlap. 769 | // - Code which tries to interpret locations should probably be designed to 770 | // ignore those that it doesn't understand, as more types of locations could 771 | // be recorded in the future. 772 | repeated Location location = 1; 773 | message Location { 774 | // Identifies which part of the FileDescriptorProto was defined at this 775 | // location. 776 | // 777 | // Each element is a field number or an index. They form a path from 778 | // the root FileDescriptorProto to the place where the definition. For 779 | // example, this path: 780 | // [ 4, 3, 2, 7, 1 ] 781 | // refers to: 782 | // file.message_type(3) // 4, 3 783 | // .field(7) // 2, 7 784 | // .name() // 1 785 | // This is because FileDescriptorProto.message_type has field number 4: 786 | // repeated DescriptorProto message_type = 4; 787 | // and DescriptorProto.field has field number 2: 788 | // repeated FieldDescriptorProto field = 2; 789 | // and FieldDescriptorProto.name has field number 1: 790 | // optional string name = 1; 791 | // 792 | // Thus, the above path gives the location of a field name. If we removed 793 | // the last element: 794 | // [ 4, 3, 2, 7 ] 795 | // this path refers to the whole field declaration (from the beginning 796 | // of the label to the terminating semicolon). 797 | repeated int32 path = 1 [packed=true]; 798 | 799 | // Always has exactly three or four elements: start line, start column, 800 | // end line (optional, otherwise assumed same as start line), end column. 801 | // These are packed into a single field for efficiency. Note that line 802 | // and column numbers are zero-based -- typically you will want to add 803 | // 1 to each before displaying to a user. 804 | repeated int32 span = 2 [packed=true]; 805 | 806 | // If this SourceCodeInfo represents a complete declaration, these are any 807 | // comments appearing before and after the declaration which appear to be 808 | // attached to the declaration. 809 | // 810 | // A series of line comments appearing on consecutive lines, with no other 811 | // tokens appearing on those lines, will be treated as a single comment. 812 | // 813 | // leading_detached_comments will keep paragraphs of comments that appear 814 | // before (but not connected to) the current element. Each paragraph, 815 | // separated by empty lines, will be one comment element in the repeated 816 | // field. 817 | // 818 | // Only the comment content is provided; comment markers (e.g. //) are 819 | // stripped out. For block comments, leading whitespace and an asterisk 820 | // will be stripped from the beginning of each line other than the first. 821 | // Newlines are included in the output. 822 | // 823 | // Examples: 824 | // 825 | // optional int32 foo = 1; // Comment attached to foo. 826 | // // Comment attached to bar. 827 | // optional int32 bar = 2; 828 | // 829 | // optional string baz = 3; 830 | // // Comment attached to baz. 831 | // // Another line attached to baz. 832 | // 833 | // // Comment attached to qux. 834 | // // 835 | // // Another line attached to qux. 836 | // optional double qux = 4; 837 | // 838 | // // Detached comment for corge. This is not leading or trailing comments 839 | // // to qux or corge because there are blank lines separating it from 840 | // // both. 841 | // 842 | // // Detached comment for corge paragraph 2. 843 | // 844 | // optional string corge = 5; 845 | // /* Block comment attached 846 | // * to corge. Leading asterisks 847 | // * will be removed. */ 848 | // /* Block comment attached to 849 | // * grault. */ 850 | // optional int32 grault = 6; 851 | // 852 | // // ignored detached comments. 853 | optional string leading_comments = 3; 854 | optional string trailing_comments = 4; 855 | repeated string leading_detached_comments = 6; 856 | } 857 | } 858 | 859 | // Describes the relationship between generated code and its original source 860 | // file. A GeneratedCodeInfo message is associated with only one generated 861 | // source file, but may contain references to different source .proto files. 862 | message GeneratedCodeInfo { 863 | // An Annotation connects some span of text in generated code to an element 864 | // of its generating .proto file. 865 | repeated Annotation annotation = 1; 866 | message Annotation { 867 | // Identifies the element in the original source .proto file. This field 868 | // is formatted the same as SourceCodeInfo.Location.path. 869 | repeated int32 path = 1 [packed=true]; 870 | 871 | // Identifies the filesystem path to the original source .proto. 872 | optional string source_file = 2; 873 | 874 | // Identifies the starting offset in bytes in the generated code 875 | // that relates to the identified object. 876 | optional int32 begin = 3; 877 | 878 | // Identifies the ending offset in bytes in the generated code that 879 | // relates to the identified offset. The end offset should be one past 880 | // the last relevant byte (so the length of the text = end - begin). 881 | optional int32 end = 4; 882 | } 883 | } 884 | -------------------------------------------------------------------------------- /proto/gogo.proto: -------------------------------------------------------------------------------- 1 | // Protocol Buffers for Go with Gadgets 2 | // 3 | // Copyright (c) 2013, The GoGo Authors. All rights reserved. 4 | // http://github.com/gogo/protobuf 5 | // 6 | // Redistribution and use in source and binary forms, with or without 7 | // modification, are permitted provided that the following conditions are 8 | // met: 9 | // 10 | // * Redistributions of source code must retain the above copyright 11 | // notice, this list of conditions and the following disclaimer. 12 | // * Redistributions in binary form must reproduce the above 13 | // copyright notice, this list of conditions and the following disclaimer 14 | // in the documentation and/or other materials provided with the 15 | // distribution. 16 | // 17 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | 29 | syntax = "proto2"; 30 | package gogoproto; 31 | 32 | import "descriptor.proto"; 33 | 34 | option java_package = "com.google.protobuf"; 35 | option java_outer_classname = "GoGoProtos"; 36 | option go_package = "github.com/gogo/protobuf/gogoproto"; 37 | 38 | extend google.protobuf.EnumOptions { 39 | optional bool goproto_enum_prefix = 62001; 40 | optional bool goproto_enum_stringer = 62021; 41 | optional bool enum_stringer = 62022; 42 | optional string enum_customname = 62023; 43 | optional bool enumdecl = 62024; 44 | } 45 | 46 | extend google.protobuf.EnumValueOptions { 47 | optional string enumvalue_customname = 66001; 48 | } 49 | 50 | extend google.protobuf.FileOptions { 51 | optional bool goproto_getters_all = 63001; 52 | optional bool goproto_enum_prefix_all = 63002; 53 | optional bool goproto_stringer_all = 63003; 54 | optional bool verbose_equal_all = 63004; 55 | optional bool face_all = 63005; 56 | optional bool gostring_all = 63006; 57 | optional bool populate_all = 63007; 58 | optional bool stringer_all = 63008; 59 | optional bool onlyone_all = 63009; 60 | 61 | optional bool equal_all = 63013; 62 | optional bool description_all = 63014; 63 | optional bool testgen_all = 63015; 64 | optional bool benchgen_all = 63016; 65 | optional bool marshaler_all = 63017; 66 | optional bool unmarshaler_all = 63018; 67 | optional bool stable_marshaler_all = 63019; 68 | 69 | optional bool sizer_all = 63020; 70 | 71 | optional bool goproto_enum_stringer_all = 63021; 72 | optional bool enum_stringer_all = 63022; 73 | 74 | optional bool unsafe_marshaler_all = 63023; 75 | optional bool unsafe_unmarshaler_all = 63024; 76 | 77 | optional bool goproto_extensions_map_all = 63025; 78 | optional bool goproto_unrecognized_all = 63026; 79 | optional bool gogoproto_import = 63027; 80 | optional bool protosizer_all = 63028; 81 | optional bool compare_all = 63029; 82 | optional bool typedecl_all = 63030; 83 | optional bool enumdecl_all = 63031; 84 | 85 | optional bool goproto_registration = 63032; 86 | optional bool messagename_all = 63033; 87 | 88 | optional bool goproto_sizecache_all = 63034; 89 | optional bool goproto_unkeyed_all = 63035; 90 | } 91 | 92 | extend google.protobuf.MessageOptions { 93 | optional bool goproto_getters = 64001; 94 | optional bool goproto_stringer = 64003; 95 | optional bool verbose_equal = 64004; 96 | optional bool face = 64005; 97 | optional bool gostring = 64006; 98 | optional bool populate = 64007; 99 | optional bool stringer = 67008; 100 | optional bool onlyone = 64009; 101 | 102 | optional bool equal = 64013; 103 | optional bool description = 64014; 104 | optional bool testgen = 64015; 105 | optional bool benchgen = 64016; 106 | optional bool marshaler = 64017; 107 | optional bool unmarshaler = 64018; 108 | optional bool stable_marshaler = 64019; 109 | 110 | optional bool sizer = 64020; 111 | 112 | optional bool unsafe_marshaler = 64023; 113 | optional bool unsafe_unmarshaler = 64024; 114 | 115 | optional bool goproto_extensions_map = 64025; 116 | optional bool goproto_unrecognized = 64026; 117 | 118 | optional bool protosizer = 64028; 119 | optional bool compare = 64029; 120 | 121 | optional bool typedecl = 64030; 122 | 123 | optional bool messagename = 64033; 124 | 125 | optional bool goproto_sizecache = 64034; 126 | optional bool goproto_unkeyed = 64035; 127 | } 128 | 129 | extend google.protobuf.FieldOptions { 130 | optional bool nullable = 65001; 131 | optional bool embed = 65002; 132 | optional string customtype = 65003; 133 | optional string customname = 65004; 134 | optional string jsontag = 65005; 135 | optional string moretags = 65006; 136 | optional string casttype = 65007; 137 | optional string castkey = 65008; 138 | optional string castvalue = 65009; 139 | 140 | optional bool stdtime = 65010; 141 | optional bool stdduration = 65011; 142 | optional bool wktpointer = 65012; 143 | 144 | } 145 | -------------------------------------------------------------------------------- /proto/merkle.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package merkle; 3 | 4 | // For more information on gogo.proto, see: 5 | // https://github.com/gogo/protobuf/blob/master/extensions.md 6 | import "gogo.proto"; 7 | 8 | option (gogoproto.marshaler_all) = true; 9 | option (gogoproto.unmarshaler_all) = true; 10 | option (gogoproto.sizer_all) = true; 11 | 12 | option (gogoproto.populate_all) = true; 13 | option (gogoproto.equal_all) = true; 14 | 15 | //---------------------------------------- 16 | // Message types 17 | 18 | // ProofOp defines an operation used for calculating Merkle root 19 | // The data could be arbitrary format, providing nessecary data 20 | // for example neighbouring node hash 21 | message ProofOp { 22 | string type = 1; 23 | bytes key = 2; 24 | bytes data = 3; 25 | } 26 | 27 | // Proof is Merkle proof defined by the list of ProofOps 28 | message Proof { 29 | repeated ProofOp ops = 1 [(gogoproto.nullable)=false]; 30 | } 31 | -------------------------------------------------------------------------------- /proto/timestamp.proto: -------------------------------------------------------------------------------- 1 | // Protocol Buffers - Google's data interchange format 2 | // Copyright 2008 Google Inc. All rights reserved. 3 | // https://developers.google.com/protocol-buffers/ 4 | // 5 | // Redistribution and use in source and binary forms, with or without 6 | // modification, are permitted provided that the following conditions are 7 | // met: 8 | // 9 | // * Redistributions of source code must retain the above copyright 10 | // notice, this list of conditions and the following disclaimer. 11 | // * Redistributions in binary form must reproduce the above 12 | // copyright notice, this list of conditions and the following disclaimer 13 | // in the documentation and/or other materials provided with the 14 | // distribution. 15 | // * Neither the name of Google Inc. nor the names of its 16 | // contributors may be used to endorse or promote products derived from 17 | // this software without specific prior written permission. 18 | // 19 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | 31 | syntax = "proto3"; 32 | 33 | package google.protobuf; 34 | 35 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 36 | option cc_enable_arenas = true; 37 | option go_package = "github.com/golang/protobuf/ptypes/timestamp"; 38 | option java_package = "com.google.protobuf"; 39 | option java_outer_classname = "TimestampProto"; 40 | option java_multiple_files = true; 41 | option objc_class_prefix = "GPB"; 42 | 43 | // A Timestamp represents a point in time independent of any time zone or local 44 | // calendar, encoded as a count of seconds and fractions of seconds at 45 | // nanosecond resolution. The count is relative to an epoch at UTC midnight on 46 | // January 1, 1970, in the proleptic Gregorian calendar which extends the 47 | // Gregorian calendar backwards to year one. 48 | // 49 | // All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap 50 | // second table is needed for interpretation, using a [24-hour linear 51 | // smear](https://developers.google.com/time/smear). 52 | // 53 | // The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By 54 | // restricting to that range, we ensure that we can convert to and from [RFC 55 | // 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. 56 | // 57 | // # Examples 58 | // 59 | // Example 1: Compute Timestamp from POSIX `time()`. 60 | // 61 | // Timestamp timestamp; 62 | // timestamp.set_seconds(time(NULL)); 63 | // timestamp.set_nanos(0); 64 | // 65 | // Example 2: Compute Timestamp from POSIX `gettimeofday()`. 66 | // 67 | // struct timeval tv; 68 | // gettimeofday(&tv, NULL); 69 | // 70 | // Timestamp timestamp; 71 | // timestamp.set_seconds(tv.tv_sec); 72 | // timestamp.set_nanos(tv.tv_usec * 1000); 73 | // 74 | // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. 75 | // 76 | // FILETIME ft; 77 | // GetSystemTimeAsFileTime(&ft); 78 | // UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; 79 | // 80 | // // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z 81 | // // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. 82 | // Timestamp timestamp; 83 | // timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); 84 | // timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); 85 | // 86 | // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. 87 | // 88 | // long millis = System.currentTimeMillis(); 89 | // 90 | // Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) 91 | // .setNanos((int) ((millis % 1000) * 1000000)).build(); 92 | // 93 | // 94 | // Example 5: Compute Timestamp from current time in Python. 95 | // 96 | // timestamp = Timestamp() 97 | // timestamp.GetCurrentTime() 98 | // 99 | // # JSON Mapping 100 | // 101 | // In JSON format, the Timestamp type is encoded as a string in the 102 | // [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the 103 | // format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" 104 | // where {year} is always expressed using four digits while {month}, {day}, 105 | // {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional 106 | // seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), 107 | // are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone 108 | // is required. A proto3 JSON serializer should always use UTC (as indicated by 109 | // "Z") when printing the Timestamp type and a proto3 JSON parser should be 110 | // able to accept both UTC and other timezones (as indicated by an offset). 111 | // 112 | // For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past 113 | // 01:30 UTC on January 15, 2017. 114 | // 115 | // In JavaScript, one can convert a Date object to this format using the 116 | // standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) 117 | // method. In Python, a standard `datetime.datetime` object can be converted 118 | // to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) 119 | // with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one 120 | // can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( 121 | // http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D 122 | // ) to obtain a formatter capable of generating timestamps in this format. 123 | // 124 | // 125 | message Timestamp { 126 | 127 | // Represents seconds of UTC time since Unix epoch 128 | // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 129 | // 9999-12-31T23:59:59Z inclusive. 130 | int64 seconds = 1; 131 | 132 | // Non-negative fractions of a second at nanosecond resolution. Negative 133 | // second values with fractions must still have non-negative nanos values 134 | // that count forward in time. Must be from 0 to 999,999,999 135 | // inclusive. 136 | int32 nanos = 2; 137 | } 138 | -------------------------------------------------------------------------------- /proto/types.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package common; 3 | 4 | import "gogo.proto"; 5 | 6 | option (gogoproto.marshaler_all) = true; 7 | option (gogoproto.unmarshaler_all) = true; 8 | option (gogoproto.sizer_all) = true; 9 | option (gogoproto.goproto_registration) = true; 10 | // Generate tests 11 | option (gogoproto.populate_all) = true; 12 | option (gogoproto.equal_all) = true; 13 | option (gogoproto.testgen_all) = true; 14 | 15 | //---------------------------------------- 16 | // Abstract types 17 | 18 | // Define these here for compatibility but use tmlibs/common.KVPair. 19 | message KVPair { 20 | bytes key = 1; 21 | bytes value = 2; 22 | } 23 | 24 | // Define these here for compatibility but use tmlibs/common.KI64Pair. 25 | message KI64Pair { 26 | bytes key = 1; 27 | int64 value = 2; 28 | } 29 | -------------------------------------------------------------------------------- /sample-key: -------------------------------------------------------------------------------- 1 | SAKX6XYIQKWNNYIZUK33PYM7YJAPURMEQVM4LM6YOG42KPPZFB5GV424 2 | GAS3UFFXDUNZ57526OEY7D7642ELZ2DXIKAYHP6IR6PGM2UGEO7RXZDX -------------------------------------------------------------------------------- /tendermint/config/config.toml: -------------------------------------------------------------------------------- 1 | # This is a TOML config file. 2 | # For more information, see https://github.com/toml-lang/toml 3 | 4 | ##### main base config options ##### 5 | 6 | # TCP or UNIX socket address of the ABCI application, 7 | # or the name of an ABCI application compiled in with the Tendermint binary 8 | proxy_app = "tcp://127.0.0.1:26658" 9 | 10 | # A custom human readable name for this node 11 | moniker = "forest-network-private-node" 12 | 13 | # If this node is many blocks behind the tip of the chain, FastSync 14 | # allows them to catchup quickly by downloading blocks in parallel 15 | # and verifying their commits 16 | fast_sync = true 17 | 18 | # Database backend: leveldb | memdb | cleveldb 19 | db_backend = "leveldb" 20 | 21 | # Database directory 22 | db_dir = "data" 23 | 24 | # Output level for logging, including package level options 25 | log_level = "main:info,state:info,*:error" 26 | 27 | # Output format: 'plain' (colored text) or 'json' 28 | log_format = "plain" 29 | 30 | ##### additional base config options ##### 31 | 32 | # Path to the JSON file containing the initial validator set and other meta data 33 | genesis_file = "config/genesis.json" 34 | 35 | # Path to the JSON file containing the private key to use as a validator in the consensus protocol 36 | priv_validator_file = "config/priv_validator.json" 37 | 38 | # TCP or UNIX socket address for Tendermint to listen on for 39 | # connections from an external PrivValidator process 40 | priv_validator_laddr = "" 41 | 42 | # Path to the JSON file containing the private key to use for node authentication in the p2p protocol 43 | node_key_file = "config/node_key.json" 44 | 45 | # Mechanism to connect to the ABCI application: socket | grpc 46 | abci = "grpc" 47 | 48 | # TCP or UNIX socket address for the profiling server to listen on 49 | prof_laddr = "" 50 | 51 | # If true, query the ABCI app on connecting to a new peer 52 | # so the app can decide if we should keep the connection or not 53 | filter_peers = false 54 | 55 | ##### advanced configuration options ##### 56 | 57 | ##### rpc server configuration options ##### 58 | [rpc] 59 | 60 | # TCP or UNIX socket address for the RPC server to listen on 61 | laddr = "tcp://0.0.0.0:26657" 62 | 63 | # A list of origins a cross-domain request can be executed from 64 | # Default value '[]' disables cors support 65 | # Use '["*"]' to allow any origin 66 | cors_allowed_origins = ["*"] 67 | 68 | # A list of methods the client is allowed to use with cross-domain requests 69 | cors_allowed_methods = ["HEAD", "GET", "POST"] 70 | 71 | # A list of non simple headers the client is allowed to use with cross-domain requests 72 | cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"] 73 | 74 | # TCP or UNIX socket address for the gRPC server to listen on 75 | # NOTE: This server only supports /broadcast_tx_commit 76 | grpc_laddr = "" 77 | 78 | # Maximum number of simultaneous connections. 79 | # Does not include RPC (HTTP&WebSocket) connections. See max_open_connections 80 | # If you want to accept more significant number than the default, make sure 81 | # you increase your OS limits. 82 | # 0 - unlimited. 83 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 84 | # 1024 - 40 - 10 - 50 = 924 = ~900 85 | grpc_max_open_connections = 900 86 | 87 | # Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool 88 | unsafe = false 89 | 90 | # Maximum number of simultaneous connections (including WebSocket). 91 | # Does not include gRPC connections. See grpc_max_open_connections 92 | # If you want to accept more significant number than the default, make sure 93 | # you increase your OS limits. 94 | # 0 - unlimited. 95 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 96 | # 1024 - 40 - 10 - 50 = 924 = ~900 97 | max_open_connections = 900 98 | 99 | ##### peer to peer configuration options ##### 100 | [p2p] 101 | 102 | # Address to listen for incoming connections 103 | laddr = "tcp://0.0.0.0:26656" 104 | 105 | # Address to advertise to peers for them to dial 106 | # If empty, will use the same port as the laddr, 107 | # and will introspect on the listener or use UPnP 108 | # to figure out the address. 109 | external_address = "" 110 | 111 | # Comma separated list of seed nodes to connect to 112 | seeds = "tcp://54a610352a6f59c782f99020ed08ef1b73998655@komodo.forest.network:26656,tcp://50e7e2dd0c1bcf34e88162a5e97e6151709451fe@gorilla.forest.network:26656,tcp://d0fb7af79b4969bb0a9646f7ce4478693c04d7e7@zebra.forest.network:26656,tcp://72d8ea30161d33347aea23f2d180388eb3de3c41@dragonfly.forest.network:26656,tcp://ceff623c2b1e361d95106a5a97d1d41ce649f2e6@fox.forest.network:26656" 113 | 114 | # Comma separated list of nodes to keep persistent connections to 115 | persistent_peers = "tcp://54a610352a6f59c782f99020ed08ef1b73998655@komodo.forest.network:26656,tcp://50e7e2dd0c1bcf34e88162a5e97e6151709451fe@gorilla.forest.network:26656,tcp://d0fb7af79b4969bb0a9646f7ce4478693c04d7e7@zebra.forest.network:26656,tcp://72d8ea30161d33347aea23f2d180388eb3de3c41@dragonfly.forest.network:26656,tcp://ceff623c2b1e361d95106a5a97d1d41ce649f2e6@fox.forest.network:26656" 116 | 117 | # UPNP port forwarding 118 | upnp = true 119 | 120 | # Path to address book 121 | addr_book_file = "config/addrbook.json" 122 | 123 | # Set true for strict address routability rules 124 | # Set false for private or local networks 125 | addr_book_strict = true 126 | 127 | # Maximum number of inbound peers 128 | max_num_inbound_peers = 40 129 | 130 | # Maximum number of outbound peers to connect to, excluding persistent peers 131 | max_num_outbound_peers = 10 132 | 133 | # Time to wait before flushing messages out on the connection 134 | flush_throttle_timeout = "100ms" 135 | 136 | # Maximum size of a message packet payload, in bytes 137 | max_packet_msg_payload_size = 1024 138 | 139 | # Rate at which packets can be sent, in bytes/second 140 | send_rate = 5120000 141 | 142 | # Rate at which packets can be received, in bytes/second 143 | recv_rate = 5120000 144 | 145 | # Set true to enable the peer-exchange reactor 146 | pex = true 147 | 148 | # Seed mode, in which node constantly crawls the network and looks for 149 | # peers. If another node asks it for addresses, it responds and disconnects. 150 | # 151 | # Does not work if the peer-exchange reactor is disabled. 152 | seed_mode = false 153 | 154 | # Comma separated list of peer IDs to keep private (will not be gossiped to other peers) 155 | private_peer_ids = "" 156 | 157 | # Toggle to disable guard against peers connecting from the same ip. 158 | allow_duplicate_ip = true 159 | 160 | # Peer connection configuration. 161 | handshake_timeout = "20s" 162 | dial_timeout = "3s" 163 | 164 | ##### mempool configuration options ##### 165 | [mempool] 166 | 167 | recheck = true 168 | broadcast = true 169 | wal_dir = "" 170 | 171 | # size of the mempool 172 | size = 5000 173 | 174 | # size of the cache (used to filter transactions we saw earlier) 175 | cache_size = 10000 176 | 177 | ##### consensus configuration options ##### 178 | [consensus] 179 | 180 | wal_file = "data/cs.wal/wal" 181 | 182 | timeout_propose = "3s" 183 | timeout_propose_delta = "500ms" 184 | timeout_prevote = "1s" 185 | timeout_prevote_delta = "500ms" 186 | timeout_precommit = "1s" 187 | timeout_precommit_delta = "500ms" 188 | timeout_commit = "1s" 189 | 190 | # Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) 191 | skip_timeout_commit = false 192 | 193 | # EmptyBlocks mode and possible interval between empty blocks 194 | create_empty_blocks = false 195 | create_empty_blocks_interval = "60s" 196 | 197 | # Reactor sleep duration parameters 198 | peer_gossip_sleep_duration = "100ms" 199 | peer_query_maj23_sleep_duration = "2s" 200 | 201 | # Block time parameters. Corresponds to the minimum time increment between consecutive blocks. 202 | blocktime_iota = "1s" 203 | 204 | ##### transactions indexer configuration options ##### 205 | [tx_index] 206 | 207 | # What indexer to use for transactions 208 | # 209 | # Options: 210 | # 1) "null" (default) 211 | # 2) "kv" - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). 212 | indexer = "kv" 213 | 214 | # Comma-separated list of tags to index (by default the only tag is "tx.hash") 215 | # 216 | # You can also index transactions by height by adding "tx.height" tag here. 217 | # 218 | # It's recommended to index only a subset of tags due to possible memory 219 | # bloat. This is, of course, depends on the indexer's DB and the volume of 220 | # transactions. 221 | index_tags = "account,object" 222 | 223 | # When set to true, tells indexer to index all tags (predefined tags: 224 | # "tx.hash", "tx.height" and all tags from DeliverTx responses). 225 | # 226 | # Note this may be not desirable (see the comment above). IndexTags has a 227 | # precedence over IndexAllTags (i.e. when given both, IndexTags will be 228 | # indexed). 229 | index_all_tags = false 230 | 231 | ##### instrumentation configuration options ##### 232 | [instrumentation] 233 | 234 | # When true, Prometheus metrics are served under /metrics on 235 | # PrometheusListenAddr. 236 | # Check out the documentation for the list of available metrics. 237 | prometheus = false 238 | 239 | # Address to listen for Prometheus collector(s) connections 240 | prometheus_listen_addr = ":26660" 241 | 242 | # Maximum number of simultaneous connections. 243 | # If you want to accept more significant number than the default, make sure 244 | # you increase your OS limits. 245 | # 0 - unlimited. 246 | max_open_connections = 3 247 | 248 | # Instrumentation namespace 249 | namespace = "tendermint" 250 | -------------------------------------------------------------------------------- /tendermint/config/genesis.json: -------------------------------------------------------------------------------- 1 | { 2 | "genesis_time": "2018-11-28T00:00:00Z", 3 | "chain_id": "forest-network-0", 4 | "consensus_params": { 5 | "block_size": { 6 | "max_bytes": "22020096", 7 | "max_gas": "-1" 8 | }, 9 | "evidence": { 10 | "max_age": "100000" 11 | }, 12 | "validator": { 13 | "pub_key_types": [ 14 | "ed25519" 15 | ] 16 | } 17 | }, 18 | "validators": [ 19 | { 20 | "address": "6EB398EF7290E8E834EBD072B4A274902E7849F1", 21 | "pub_key": { 22 | "type": "tendermint/PubKeyEd25519", 23 | "value": "744hm4ojh0dEEd5JFhbAaJCJ6JJhTRuJgEUyfr1tNNQ=" 24 | }, 25 | "power": "10", 26 | "name": "zebra" 27 | }, 28 | { 29 | "address": "A08B4628DA1F49130E5E2FA14C5CA06E65C6C077", 30 | "pub_key": { 31 | "type": "tendermint/PubKeyEd25519", 32 | "value": "wMHkYe/DucKbYfHU2o+MZ1S0QSLtCBqws8CrqC8H/Ok=" 33 | }, 34 | "power": "10", 35 | "name": "gorilla" 36 | }, 37 | { 38 | "address": "64541E5A70DAB586EE8C4EE93092FCE0A2A0891C", 39 | "pub_key": { 40 | "type": "tendermint/PubKeyEd25519", 41 | "value": "/qVSIAZgDEe/MNBzaN9uORNK8nWXdpuFLgOfmPfLff0=" 42 | }, 43 | "power": "10", 44 | "name": "komodo" 45 | }, 46 | { 47 | "address": "BDC85B7B30290CD0616DFB3D174B482551DA5131", 48 | "pub_key": { 49 | "type": "tendermint/PubKeyEd25519", 50 | "value": "jMWIMQaNswPpACITtLH9EV6bRLA5XPMwkPRK6zeBYSw=" 51 | }, 52 | "power": "10", 53 | "name": "dragonfly" 54 | } 55 | ], 56 | "app_hash": "666F726573742E6E6574776F726B206279204B686120446F" 57 | } -------------------------------------------------------------------------------- /testnet/config/config.toml: -------------------------------------------------------------------------------- 1 | # This is a TOML config file. 2 | # For more information, see https://github.com/toml-lang/toml 3 | 4 | ##### main base config options ##### 5 | 6 | # TCP or UNIX socket address of the ABCI application, 7 | # or the name of an ABCI application compiled in with the Tendermint binary 8 | proxy_app = "tcp://127.0.0.1:26658" 9 | 10 | # A custom human readable name for this node 11 | moniker = "forest-network-testnet-node" 12 | 13 | # If this node is many blocks behind the tip of the chain, FastSync 14 | # allows them to catchup quickly by downloading blocks in parallel 15 | # and verifying their commits 16 | fast_sync = true 17 | 18 | # Database backend: leveldb | memdb | cleveldb 19 | db_backend = "leveldb" 20 | 21 | # Database directory 22 | db_dir = "data" 23 | 24 | # Output level for logging, including package level options 25 | log_level = "main:info,state:info,*:error" 26 | 27 | # Output format: 'plain' (colored text) or 'json' 28 | log_format = "plain" 29 | 30 | ##### additional base config options ##### 31 | 32 | # Path to the JSON file containing the initial validator set and other meta data 33 | genesis_file = "config/genesis.json" 34 | 35 | # Path to the JSON file containing the private key to use as a validator in the consensus protocol 36 | priv_validator_file = "config/priv_validator.json" 37 | 38 | # TCP or UNIX socket address for Tendermint to listen on for 39 | # connections from an external PrivValidator process 40 | priv_validator_laddr = "" 41 | 42 | # Path to the JSON file containing the private key to use for node authentication in the p2p protocol 43 | node_key_file = "config/node_key.json" 44 | 45 | # Mechanism to connect to the ABCI application: socket | grpc 46 | abci = "grpc" 47 | 48 | # TCP or UNIX socket address for the profiling server to listen on 49 | prof_laddr = "" 50 | 51 | # If true, query the ABCI app on connecting to a new peer 52 | # so the app can decide if we should keep the connection or not 53 | filter_peers = false 54 | 55 | ##### advanced configuration options ##### 56 | 57 | ##### rpc server configuration options ##### 58 | [rpc] 59 | 60 | # TCP or UNIX socket address for the RPC server to listen on 61 | laddr = "tcp://0.0.0.0:26657" 62 | 63 | # A list of origins a cross-domain request can be executed from 64 | # Default value '[]' disables cors support 65 | # Use '["*"]' to allow any origin 66 | cors_allowed_origins = ["*"] 67 | 68 | # A list of methods the client is allowed to use with cross-domain requests 69 | cors_allowed_methods = ["HEAD", "GET", "POST"] 70 | 71 | # A list of non simple headers the client is allowed to use with cross-domain requests 72 | cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"] 73 | 74 | # TCP or UNIX socket address for the gRPC server to listen on 75 | # NOTE: This server only supports /broadcast_tx_commit 76 | grpc_laddr = "" 77 | 78 | # Maximum number of simultaneous connections. 79 | # Does not include RPC (HTTP&WebSocket) connections. See max_open_connections 80 | # If you want to accept more significant number than the default, make sure 81 | # you increase your OS limits. 82 | # 0 - unlimited. 83 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 84 | # 1024 - 40 - 10 - 50 = 924 = ~900 85 | grpc_max_open_connections = 900 86 | 87 | # Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool 88 | unsafe = false 89 | 90 | # Maximum number of simultaneous connections (including WebSocket). 91 | # Does not include gRPC connections. See grpc_max_open_connections 92 | # If you want to accept more significant number than the default, make sure 93 | # you increase your OS limits. 94 | # 0 - unlimited. 95 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 96 | # 1024 - 40 - 10 - 50 = 924 = ~900 97 | max_open_connections = 900 98 | 99 | ##### peer to peer configuration options ##### 100 | [p2p] 101 | 102 | # Address to listen for incoming connections 103 | laddr = "tcp://0.0.0.0:26656" 104 | 105 | # Address to advertise to peers for them to dial 106 | # If empty, will use the same port as the laddr, 107 | # and will introspect on the listener or use UPnP 108 | # to figure out the address. 109 | external_address = "" 110 | 111 | # Comma separated list of seed nodes to connect to 112 | seeds = "" 113 | 114 | # Comma separated list of nodes to keep persistent connections to 115 | persistent_peers = "" 116 | 117 | # UPNP port forwarding 118 | upnp = false 119 | 120 | # Path to address book 121 | addr_book_file = "config/addrbook.json" 122 | 123 | # Set true for strict address routability rules 124 | # Set false for private or local networks 125 | addr_book_strict = true 126 | 127 | # Maximum number of inbound peers 128 | max_num_inbound_peers = 40 129 | 130 | # Maximum number of outbound peers to connect to, excluding persistent peers 131 | max_num_outbound_peers = 10 132 | 133 | # Time to wait before flushing messages out on the connection 134 | flush_throttle_timeout = "100ms" 135 | 136 | # Maximum size of a message packet payload, in bytes 137 | max_packet_msg_payload_size = 1024 138 | 139 | # Rate at which packets can be sent, in bytes/second 140 | send_rate = 5120000 141 | 142 | # Rate at which packets can be received, in bytes/second 143 | recv_rate = 5120000 144 | 145 | # Set true to enable the peer-exchange reactor 146 | pex = true 147 | 148 | # Seed mode, in which node constantly crawls the network and looks for 149 | # peers. If another node asks it for addresses, it responds and disconnects. 150 | # 151 | # Does not work if the peer-exchange reactor is disabled. 152 | seed_mode = false 153 | 154 | # Comma separated list of peer IDs to keep private (will not be gossiped to other peers) 155 | private_peer_ids = "" 156 | 157 | # Toggle to disable guard against peers connecting from the same ip. 158 | allow_duplicate_ip = true 159 | 160 | # Peer connection configuration. 161 | handshake_timeout = "20s" 162 | dial_timeout = "3s" 163 | 164 | ##### mempool configuration options ##### 165 | [mempool] 166 | 167 | recheck = true 168 | broadcast = true 169 | wal_dir = "" 170 | 171 | # size of the mempool 172 | size = 5000 173 | 174 | # size of the cache (used to filter transactions we saw earlier) 175 | cache_size = 10000 176 | 177 | ##### consensus configuration options ##### 178 | [consensus] 179 | 180 | wal_file = "data/cs.wal/wal" 181 | 182 | timeout_propose = "3s" 183 | timeout_propose_delta = "500ms" 184 | timeout_prevote = "1s" 185 | timeout_prevote_delta = "500ms" 186 | timeout_precommit = "1s" 187 | timeout_precommit_delta = "500ms" 188 | timeout_commit = "1s" 189 | 190 | # Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) 191 | skip_timeout_commit = false 192 | 193 | # EmptyBlocks mode and possible interval between empty blocks 194 | create_empty_blocks = false 195 | create_empty_blocks_interval = "0s" 196 | 197 | # Reactor sleep duration parameters 198 | peer_gossip_sleep_duration = "100ms" 199 | peer_query_maj23_sleep_duration = "2s" 200 | 201 | # Block time parameters. Corresponds to the minimum time increment between consecutive blocks. 202 | blocktime_iota = "1s" 203 | 204 | ##### transactions indexer configuration options ##### 205 | [tx_index] 206 | 207 | # What indexer to use for transactions 208 | # 209 | # Options: 210 | # 1) "null" (default) 211 | # 2) "kv" - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). 212 | indexer = "kv" 213 | 214 | # Comma-separated list of tags to index (by default the only tag is "tx.hash") 215 | # 216 | # You can also index transactions by height by adding "tx.height" tag here. 217 | # 218 | # It's recommended to index only a subset of tags due to possible memory 219 | # bloat. This is, of course, depends on the indexer's DB and the volume of 220 | # transactions. 221 | index_tags = "account,object" 222 | 223 | # When set to true, tells indexer to index all tags (predefined tags: 224 | # "tx.hash", "tx.height" and all tags from DeliverTx responses). 225 | # 226 | # Note this may be not desirable (see the comment above). IndexTags has a 227 | # precedence over IndexAllTags (i.e. when given both, IndexTags will be 228 | # indexed). 229 | index_all_tags = false 230 | 231 | ##### instrumentation configuration options ##### 232 | [instrumentation] 233 | 234 | # When true, Prometheus metrics are served under /metrics on 235 | # PrometheusListenAddr. 236 | # Check out the documentation for the list of available metrics. 237 | prometheus = false 238 | 239 | # Address to listen for Prometheus collector(s) connections 240 | prometheus_listen_addr = ":26660" 241 | 242 | # Maximum number of simultaneous connections. 243 | # If you want to accept more significant number than the default, make sure 244 | # you increase your OS limits. 245 | # 0 - unlimited. 246 | max_open_connections = 3 247 | 248 | # Instrumentation namespace 249 | namespace = "tendermint" 250 | -------------------------------------------------------------------------------- /testnet/config/genesis.json: -------------------------------------------------------------------------------- 1 | { 2 | "genesis_time": "2018-12-05T00:33:35.459693818Z", 3 | "chain_id": "test-chain-grMWOz", 4 | "consensus_params": { 5 | "block_size": { 6 | "max_bytes": "22020096", 7 | "max_gas": "-1" 8 | }, 9 | "evidence": { 10 | "max_age": "100000" 11 | }, 12 | "validator": { 13 | "pub_key_types": [ 14 | "ed25519" 15 | ] 16 | } 17 | }, 18 | "validators": [ 19 | { 20 | "address": "C8438455439695421A8D2C1B78B33AB5082BDFA2", 21 | "pub_key": { 22 | "type": "tendermint/PubKeyEd25519", 23 | "value": "WTf24oYz01RpjL4JQof7yFOV5nXbKBkga0/AqVK2Iz4=" 24 | }, 25 | "power": "10", 26 | "name": "" 27 | } 28 | ], 29 | "app_hash": "666F726573742E6E6574776F726B206279204B686120446F" 30 | } -------------------------------------------------------------------------------- /testnet/config/node_key.json: -------------------------------------------------------------------------------- 1 | {"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"dXHen+o6+PjKZIS6qAL/95+0LrzhVW1nt9adXNUPeUuBxVa1j0dUHNrXAe+sGht5C8f1WWRhsBhssSglcyfEAw=="}} -------------------------------------------------------------------------------- /testnet/config/priv_validator.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "C8438455439695421A8D2C1B78B33AB5082BDFA2", 3 | "pub_key": { 4 | "type": "tendermint/PubKeyEd25519", 5 | "value": "WTf24oYz01RpjL4JQof7yFOV5nXbKBkga0/AqVK2Iz4=" 6 | }, 7 | "priv_key": { 8 | "type": "tendermint/PrivKeyEd25519", 9 | "value": "mGxJ2hPhU8PxCBEudlUigfwQs17vuxSaxrPj5aUNS6lZN/bihjPTVGmMvglCh/vIU5XmddsoGSBrT8CpUrYjPg==" 10 | } 11 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@grpc/proto-loader@^0.3.0": 6 | version "0.3.0" 7 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.3.0.tgz#c127d3859bff895f220453612ba04b923af0c584" 8 | integrity sha512-9b8S/V+3W4Gv7G/JKSZ48zApgyYbfIR7mAC9XNnaSWme3zj57MIESu0ELzm9j5oxNIpFG8DgO00iJMIUZ5luqw== 9 | dependencies: 10 | "@types/lodash" "^4.14.104" 11 | "@types/node" "^9.4.6" 12 | lodash "^4.17.5" 13 | protobufjs "^6.8.6" 14 | 15 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 16 | version "1.1.2" 17 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 18 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 19 | 20 | "@protobufjs/base64@^1.1.2": 21 | version "1.1.2" 22 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 23 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 24 | 25 | "@protobufjs/codegen@^2.0.4": 26 | version "2.0.4" 27 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 28 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 29 | 30 | "@protobufjs/eventemitter@^1.1.0": 31 | version "1.1.0" 32 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 33 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 34 | 35 | "@protobufjs/fetch@^1.1.0": 36 | version "1.1.0" 37 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 38 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 39 | dependencies: 40 | "@protobufjs/aspromise" "^1.1.1" 41 | "@protobufjs/inquire" "^1.1.0" 42 | 43 | "@protobufjs/float@^1.0.2": 44 | version "1.0.2" 45 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 46 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 47 | 48 | "@protobufjs/inquire@^1.1.0": 49 | version "1.1.0" 50 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 51 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 52 | 53 | "@protobufjs/path@^1.1.2": 54 | version "1.1.2" 55 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 56 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 57 | 58 | "@protobufjs/pool@^1.1.0": 59 | version "1.1.0" 60 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 61 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 62 | 63 | "@protobufjs/utf8@^1.1.0": 64 | version "1.1.0" 65 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 66 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 67 | 68 | "@types/geojson@^1.0.0": 69 | version "1.0.6" 70 | resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" 71 | integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w== 72 | 73 | "@types/lodash@^4.14.104": 74 | version "4.14.118" 75 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27" 76 | integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw== 77 | 78 | "@types/long@^4.0.0": 79 | version "4.0.0" 80 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" 81 | integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== 82 | 83 | "@types/node@*", "@types/node@^10.1.0": 84 | version "10.12.12" 85 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" 86 | integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== 87 | 88 | "@types/node@^9.4.6": 89 | version "9.6.40" 90 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.40.tgz#2d69cefbc090cb0bb824542a4c575b14dde7d3aa" 91 | integrity sha512-M3HHoXXndsho/sTbQML2BJr7/uwNhMg8P0D4lb+UsM65JQZx268faiz9hKpY4FpocWqpwlLwa8vevw8hLtKjOw== 92 | 93 | abbrev@1: 94 | version "1.1.1" 95 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 96 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 97 | 98 | ajv@^6.5.5: 99 | version "6.6.1" 100 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" 101 | integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== 102 | dependencies: 103 | fast-deep-equal "^2.0.1" 104 | fast-json-stable-stringify "^2.0.0" 105 | json-schema-traverse "^0.4.1" 106 | uri-js "^4.2.2" 107 | 108 | ansi-regex@^2.0.0: 109 | version "2.1.1" 110 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 111 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 112 | 113 | ansi-regex@^3.0.0: 114 | version "3.0.0" 115 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 116 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 117 | 118 | aproba@^1.0.3: 119 | version "1.2.0" 120 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 121 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 122 | 123 | are-we-there-yet@~1.1.2: 124 | version "1.1.5" 125 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 126 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 127 | dependencies: 128 | delegates "^1.0.0" 129 | readable-stream "^2.0.6" 130 | 131 | ascli@~1: 132 | version "1.0.1" 133 | resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" 134 | integrity sha1-vPpZdKYvGOgcq660lzKrSoj5Brw= 135 | dependencies: 136 | colour "~0.7.1" 137 | optjs "~3.2.2" 138 | 139 | asn1@~0.2.3: 140 | version "0.2.4" 141 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 142 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 143 | dependencies: 144 | safer-buffer "~2.1.0" 145 | 146 | assert-plus@1.0.0, assert-plus@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 149 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 150 | 151 | assertion-error@^1.1.0: 152 | version "1.1.0" 153 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 154 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 155 | 156 | asynckit@^0.4.0: 157 | version "0.4.0" 158 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 159 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 160 | 161 | aws-sign2@~0.7.0: 162 | version "0.7.0" 163 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 164 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 165 | 166 | aws4@^1.8.0: 167 | version "1.8.0" 168 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 169 | integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 170 | 171 | balanced-match@^1.0.0: 172 | version "1.0.0" 173 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 174 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 175 | 176 | base32.js@^0.1.0, base32.js@~0.1.0: 177 | version "0.1.0" 178 | resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.1.0.tgz#b582dec693c2f11e893cf064ee6ac5b6131a2202" 179 | integrity sha1-tYLexpPC8R6JPPBk7mrFthMaIgI= 180 | 181 | bcrypt-pbkdf@^1.0.0: 182 | version "1.0.2" 183 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 184 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 185 | dependencies: 186 | tweetnacl "^0.14.3" 187 | 188 | bignumber.js@^4.0.0: 189 | version "4.1.0" 190 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" 191 | integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== 192 | 193 | bindings@^1.2.1: 194 | version "1.3.1" 195 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" 196 | integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== 197 | 198 | bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.3: 199 | version "3.5.3" 200 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" 201 | integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== 202 | 203 | brace-expansion@^1.1.7: 204 | version "1.1.11" 205 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 206 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 207 | dependencies: 208 | balanced-match "^1.0.0" 209 | concat-map "0.0.1" 210 | 211 | browser-stdout@1.3.1: 212 | version "1.3.1" 213 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 214 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 215 | 216 | buffer-writer@2.0.0: 217 | version "2.0.0" 218 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 219 | integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== 220 | 221 | bytebuffer@~5: 222 | version "5.0.1" 223 | resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" 224 | integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= 225 | dependencies: 226 | long "~3" 227 | 228 | camelcase@^2.0.1: 229 | version "2.1.1" 230 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 231 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 232 | 233 | caseless@~0.12.0: 234 | version "0.12.0" 235 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 236 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 237 | 238 | chai-as-promised@^7.1.1: 239 | version "7.1.1" 240 | resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" 241 | integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== 242 | dependencies: 243 | check-error "^1.0.2" 244 | 245 | chai@^4.2.0: 246 | version "4.2.0" 247 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 248 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 249 | dependencies: 250 | assertion-error "^1.1.0" 251 | check-error "^1.0.2" 252 | deep-eql "^3.0.1" 253 | get-func-name "^2.0.0" 254 | pathval "^1.1.0" 255 | type-detect "^4.0.5" 256 | 257 | check-error@^1.0.2: 258 | version "1.0.2" 259 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 260 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 261 | 262 | chownr@^1.1.1: 263 | version "1.1.1" 264 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 265 | integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 266 | 267 | cliui@^3.0.3: 268 | version "3.2.0" 269 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 270 | integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= 271 | dependencies: 272 | string-width "^1.0.1" 273 | strip-ansi "^3.0.1" 274 | wrap-ansi "^2.0.0" 275 | 276 | cls-bluebird@^2.1.0: 277 | version "2.1.0" 278 | resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" 279 | integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4= 280 | dependencies: 281 | is-bluebird "^1.0.2" 282 | shimmer "^1.1.0" 283 | 284 | code-point-at@^1.0.0: 285 | version "1.1.0" 286 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 287 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 288 | 289 | colour@~0.7.1: 290 | version "0.7.1" 291 | resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" 292 | integrity sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g= 293 | 294 | combined-stream@^1.0.6, combined-stream@~1.0.6: 295 | version "1.0.7" 296 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 297 | integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== 298 | dependencies: 299 | delayed-stream "~1.0.0" 300 | 301 | commander@2.15.1: 302 | version "2.15.1" 303 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 304 | integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== 305 | 306 | concat-map@0.0.1: 307 | version "0.0.1" 308 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 309 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 310 | 311 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 312 | version "1.1.0" 313 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 314 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 315 | 316 | core-util-is@1.0.2, core-util-is@~1.0.0: 317 | version "1.0.2" 318 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 319 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 320 | 321 | crc@3.5.0: 322 | version "3.5.0" 323 | resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" 324 | integrity sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ= 325 | 326 | cursor@^0.1.5: 327 | version "0.1.5" 328 | resolved "https://registry.yarnpkg.com/cursor/-/cursor-0.1.5.tgz#ea778c2b09d33c2e564fd92147076750483ebb2c" 329 | integrity sha1-6neMKwnTPC5WT9khRwdnUEg+uyw= 330 | 331 | dashdash@^1.12.0: 332 | version "1.14.1" 333 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 334 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 335 | dependencies: 336 | assert-plus "^1.0.0" 337 | 338 | debug@3.1.0: 339 | version "3.1.0" 340 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 341 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 342 | dependencies: 343 | ms "2.0.0" 344 | 345 | debug@^2.1.2, debug@^2.6.9: 346 | version "2.6.9" 347 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 348 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 349 | dependencies: 350 | ms "2.0.0" 351 | 352 | debug@^3.1.0: 353 | version "3.2.6" 354 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 355 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 356 | dependencies: 357 | ms "^2.1.1" 358 | 359 | decamelize@^1.1.1: 360 | version "1.2.0" 361 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 362 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 363 | 364 | decimal.js@^10.0.1: 365 | version "10.0.1" 366 | resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.0.1.tgz#d04b16b277f0f9af09671cee225c4882e8857c58" 367 | integrity sha512-vklWB5C4Cj423xnaOtsUmAv0/7GqlXIgDv2ZKDyR64OV3OSzGHNx2mk4p/1EKnB5s70k73cIOOEcG9YzF0q4Lw== 368 | 369 | deep-eql@^3.0.1: 370 | version "3.0.1" 371 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 372 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 373 | dependencies: 374 | type-detect "^4.0.0" 375 | 376 | deep-extend@^0.6.0: 377 | version "0.6.0" 378 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 379 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 380 | 381 | delayed-stream@~1.0.0: 382 | version "1.0.0" 383 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 384 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 385 | 386 | delegates@^1.0.0: 387 | version "1.0.0" 388 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 389 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 390 | 391 | depd@^1.1.0: 392 | version "1.1.2" 393 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 394 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 395 | 396 | detect-libc@^1.0.2: 397 | version "1.0.3" 398 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 399 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 400 | 401 | diff@3.5.0: 402 | version "3.5.0" 403 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 404 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 405 | 406 | dottie@^2.0.0: 407 | version "2.0.1" 408 | resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.1.tgz#697ad9d72004db7574d21f892466a3c285893659" 409 | integrity sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw== 410 | 411 | ecc-jsbn@~0.1.1: 412 | version "0.1.2" 413 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 414 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 415 | dependencies: 416 | jsbn "~0.1.0" 417 | safer-buffer "^2.1.0" 418 | 419 | ed25519@0.0.4: 420 | version "0.0.4" 421 | resolved "https://registry.yarnpkg.com/ed25519/-/ed25519-0.0.4.tgz#e56218ace2fc903d259593aef0b2a9639f475beb" 422 | integrity sha1-5WIYrOL8kD0llZOu8LKpY59HW+s= 423 | dependencies: 424 | bindings "^1.2.1" 425 | nan "^2.0.9" 426 | 427 | ed2curve@^0.2.1: 428 | version "0.2.1" 429 | resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.2.1.tgz#22e6aaa3569e3c4dbf4eefa29612ec329e58190c" 430 | integrity sha1-Iuaqo1aePE2/Tu+ilhLsMp5YGQw= 431 | dependencies: 432 | tweetnacl "0.x.x" 433 | 434 | escape-string-regexp@1.0.5: 435 | version "1.0.5" 436 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 437 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 438 | 439 | eslint-plugin-mocha@^5.2.0: 440 | version "5.2.0" 441 | resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.0.tgz#d8786d9fff8cb8b5f6e4b61e40395d6568a5c4e2" 442 | integrity sha512-4VTX/qIoxUFRnXLNm6bEhEJyfGnGagmQzV4TWXKzkZgIYyP2FSubEdCjEFTyS/dGwSVRWCWGX7jO7BK8R0kppg== 443 | dependencies: 444 | ramda "^0.25.0" 445 | 446 | extend@~3.0.2: 447 | version "3.0.2" 448 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 449 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 450 | 451 | extsprintf@1.3.0: 452 | version "1.3.0" 453 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 454 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 455 | 456 | extsprintf@^1.2.0: 457 | version "1.4.0" 458 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 459 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 460 | 461 | fast-deep-equal@^2.0.1: 462 | version "2.0.1" 463 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 464 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 465 | 466 | fast-json-stable-stringify@^2.0.0: 467 | version "2.0.0" 468 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 469 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 470 | 471 | forever-agent@~0.6.1: 472 | version "0.6.1" 473 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 474 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 475 | 476 | form-data@~2.3.2: 477 | version "2.3.3" 478 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 479 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 480 | dependencies: 481 | asynckit "^0.4.0" 482 | combined-stream "^1.0.6" 483 | mime-types "^2.1.12" 484 | 485 | fs-minipass@^1.2.5: 486 | version "1.2.5" 487 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 488 | integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== 489 | dependencies: 490 | minipass "^2.2.1" 491 | 492 | fs.realpath@^1.0.0: 493 | version "1.0.0" 494 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 495 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 496 | 497 | gauge@~2.7.3: 498 | version "2.7.4" 499 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 500 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 501 | dependencies: 502 | aproba "^1.0.3" 503 | console-control-strings "^1.0.0" 504 | has-unicode "^2.0.0" 505 | object-assign "^4.1.0" 506 | signal-exit "^3.0.0" 507 | string-width "^1.0.1" 508 | strip-ansi "^3.0.1" 509 | wide-align "^1.1.0" 510 | 511 | generic-pool@^3.4.0: 512 | version "3.4.2" 513 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" 514 | integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag== 515 | 516 | get-func-name@^2.0.0: 517 | version "2.0.0" 518 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 519 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 520 | 521 | getpass@^0.1.1: 522 | version "0.1.7" 523 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 524 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 525 | dependencies: 526 | assert-plus "^1.0.0" 527 | 528 | glob@7.1.2: 529 | version "7.1.2" 530 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 531 | integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== 532 | dependencies: 533 | fs.realpath "^1.0.0" 534 | inflight "^1.0.4" 535 | inherits "2" 536 | minimatch "^3.0.4" 537 | once "^1.3.0" 538 | path-is-absolute "^1.0.0" 539 | 540 | glob@^7.0.5: 541 | version "7.1.3" 542 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 543 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 544 | dependencies: 545 | fs.realpath "^1.0.0" 546 | inflight "^1.0.4" 547 | inherits "2" 548 | minimatch "^3.0.4" 549 | once "^1.3.0" 550 | path-is-absolute "^1.0.0" 551 | 552 | growl@1.10.5: 553 | version "1.10.5" 554 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 555 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 556 | 557 | grpc@^1.16.1: 558 | version "1.16.1" 559 | resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.16.1.tgz#533316f38cea68111ef577728c3f4e8e9e554543" 560 | integrity sha512-7uHN1Nd3UqfvwgQ6f5U3+EZb/0iuHJ9mbPH+ydaTkszJsUi3nwdz6DuSh0eJwYVXXn6Gojv2khiQAadMongGKg== 561 | dependencies: 562 | lodash "^4.17.5" 563 | nan "^2.0.0" 564 | node-pre-gyp "^0.12.0" 565 | protobufjs "^5.0.3" 566 | 567 | har-schema@^2.0.0: 568 | version "2.0.0" 569 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 570 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 571 | 572 | har-validator@~5.1.0: 573 | version "5.1.3" 574 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 575 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 576 | dependencies: 577 | ajv "^6.5.5" 578 | har-schema "^2.0.0" 579 | 580 | has-flag@^3.0.0: 581 | version "3.0.0" 582 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 583 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 584 | 585 | has-unicode@^2.0.0: 586 | version "2.0.1" 587 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 588 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 589 | 590 | he@1.1.1: 591 | version "1.1.1" 592 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 593 | integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= 594 | 595 | http-signature@~1.2.0: 596 | version "1.2.0" 597 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 598 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 599 | dependencies: 600 | assert-plus "^1.0.0" 601 | jsprim "^1.2.2" 602 | sshpk "^1.7.0" 603 | 604 | iconv-lite@^0.4.4: 605 | version "0.4.24" 606 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 607 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 608 | dependencies: 609 | safer-buffer ">= 2.1.2 < 3" 610 | 611 | ignore-walk@^3.0.1: 612 | version "3.0.1" 613 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 614 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 615 | dependencies: 616 | minimatch "^3.0.4" 617 | 618 | inflection@1.12.0: 619 | version "1.12.0" 620 | resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 621 | integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= 622 | 623 | inflight@^1.0.4: 624 | version "1.0.6" 625 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 626 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 627 | dependencies: 628 | once "^1.3.0" 629 | wrappy "1" 630 | 631 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 632 | version "2.0.3" 633 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 634 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 635 | 636 | ini@~1.3.0: 637 | version "1.3.5" 638 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 639 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 640 | 641 | int53@^0.2.4: 642 | version "0.2.4" 643 | resolved "https://registry.yarnpkg.com/int53/-/int53-0.2.4.tgz#5ed8d7aad6c5c6567cae69aa7ffc4a109ee80f86" 644 | integrity sha1-XtjXqtbFxlZ8rmmqf/xKEJ7oD4Y= 645 | 646 | invert-kv@^1.0.0: 647 | version "1.0.0" 648 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 649 | integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 650 | 651 | is-bluebird@^1.0.2: 652 | version "1.0.2" 653 | resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" 654 | integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI= 655 | 656 | is-fullwidth-code-point@^1.0.0: 657 | version "1.0.0" 658 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 659 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 660 | dependencies: 661 | number-is-nan "^1.0.0" 662 | 663 | is-fullwidth-code-point@^2.0.0: 664 | version "2.0.0" 665 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 666 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 667 | 668 | is-typedarray@~1.0.0: 669 | version "1.0.0" 670 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 671 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 672 | 673 | isarray@~1.0.0: 674 | version "1.0.0" 675 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 676 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 677 | 678 | isstream@~0.1.2: 679 | version "0.1.2" 680 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 681 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 682 | 683 | js-xdr@^1.0.5: 684 | version "1.0.5" 685 | resolved "https://registry.yarnpkg.com/js-xdr/-/js-xdr-1.0.5.tgz#c639f62e5988675e20dfe5fc51ede875e8989072" 686 | integrity sha512-v0jffMa8bko3uFcGYt1lHrtpd1adhH6qk41RfLPsNPj77/K8fi7LOi4+lUUY3MBEIFnJgaGHrbc6sxdTwHImxQ== 687 | dependencies: 688 | cursor "^0.1.5" 689 | lodash "^4.17.5" 690 | long "^2.2.3" 691 | 692 | jsbn@~0.1.0: 693 | version "0.1.1" 694 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 695 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 696 | 697 | json-schema-traverse@^0.4.1: 698 | version "0.4.1" 699 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 700 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 701 | 702 | json-schema@0.2.3: 703 | version "0.2.3" 704 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 705 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 706 | 707 | json-stringify-safe@~5.0.1: 708 | version "5.0.1" 709 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 710 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 711 | 712 | jsprim@^1.2.2: 713 | version "1.4.1" 714 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 715 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 716 | dependencies: 717 | assert-plus "1.0.0" 718 | extsprintf "1.3.0" 719 | json-schema "0.2.3" 720 | verror "1.10.0" 721 | 722 | lcid@^1.0.0: 723 | version "1.0.0" 724 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 725 | integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 726 | dependencies: 727 | invert-kv "^1.0.0" 728 | 729 | lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: 730 | version "4.17.11" 731 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 732 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 733 | 734 | long@^2.2.3: 735 | version "2.4.0" 736 | resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" 737 | integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= 738 | 739 | long@^4.0.0: 740 | version "4.0.0" 741 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 742 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 743 | 744 | long@~3: 745 | version "3.2.0" 746 | resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" 747 | integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= 748 | 749 | mime-db@~1.37.0: 750 | version "1.37.0" 751 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 752 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 753 | 754 | mime-types@^2.1.12, mime-types@~2.1.19: 755 | version "2.1.21" 756 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 757 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 758 | dependencies: 759 | mime-db "~1.37.0" 760 | 761 | minimatch@3.0.4, minimatch@^3.0.4: 762 | version "3.0.4" 763 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 764 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 765 | dependencies: 766 | brace-expansion "^1.1.7" 767 | 768 | minimist@0.0.8: 769 | version "0.0.8" 770 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 771 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 772 | 773 | minimist@^1.2.0: 774 | version "1.2.0" 775 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 776 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 777 | 778 | minipass@^2.2.1, minipass@^2.3.4: 779 | version "2.3.5" 780 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 781 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 782 | dependencies: 783 | safe-buffer "^5.1.2" 784 | yallist "^3.0.0" 785 | 786 | minizlib@^1.1.1: 787 | version "1.2.1" 788 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 789 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 790 | dependencies: 791 | minipass "^2.2.1" 792 | 793 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 794 | version "0.5.1" 795 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 796 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 797 | dependencies: 798 | minimist "0.0.8" 799 | 800 | mocha@^5.2.0: 801 | version "5.2.0" 802 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 803 | integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== 804 | dependencies: 805 | browser-stdout "1.3.1" 806 | commander "2.15.1" 807 | debug "3.1.0" 808 | diff "3.5.0" 809 | escape-string-regexp "1.0.5" 810 | glob "7.1.2" 811 | growl "1.10.5" 812 | he "1.1.1" 813 | minimatch "3.0.4" 814 | mkdirp "0.5.1" 815 | supports-color "5.4.0" 816 | 817 | moment-timezone@^0.5.14: 818 | version "0.5.23" 819 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" 820 | integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== 821 | dependencies: 822 | moment ">= 2.9.0" 823 | 824 | "moment@>= 2.9.0", moment@^2.20.0, moment@^2.22.2: 825 | version "2.22.2" 826 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 827 | integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= 828 | 829 | ms@2.0.0: 830 | version "2.0.0" 831 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 832 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 833 | 834 | ms@^2.1.1: 835 | version "2.1.1" 836 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 837 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 838 | 839 | nan@^2.0.0, nan@^2.0.9: 840 | version "2.11.1" 841 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" 842 | integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== 843 | 844 | needle@^2.2.1: 845 | version "2.2.4" 846 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" 847 | integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== 848 | dependencies: 849 | debug "^2.1.2" 850 | iconv-lite "^0.4.4" 851 | sax "^1.2.4" 852 | 853 | node-pre-gyp@^0.12.0: 854 | version "0.12.0" 855 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 856 | integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 857 | dependencies: 858 | detect-libc "^1.0.2" 859 | mkdirp "^0.5.1" 860 | needle "^2.2.1" 861 | nopt "^4.0.1" 862 | npm-packlist "^1.1.6" 863 | npmlog "^4.0.2" 864 | rc "^1.2.7" 865 | rimraf "^2.6.1" 866 | semver "^5.3.0" 867 | tar "^4" 868 | 869 | nopt@^4.0.1: 870 | version "4.0.1" 871 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 872 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 873 | dependencies: 874 | abbrev "1" 875 | osenv "^0.1.4" 876 | 877 | npm-bundled@^1.0.1: 878 | version "1.0.5" 879 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 880 | integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== 881 | 882 | npm-packlist@^1.1.6: 883 | version "1.1.12" 884 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" 885 | integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== 886 | dependencies: 887 | ignore-walk "^3.0.1" 888 | npm-bundled "^1.0.1" 889 | 890 | npmlog@^4.0.2: 891 | version "4.1.2" 892 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 893 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 894 | dependencies: 895 | are-we-there-yet "~1.1.2" 896 | console-control-strings "~1.1.0" 897 | gauge "~2.7.3" 898 | set-blocking "~2.0.0" 899 | 900 | number-is-nan@^1.0.0: 901 | version "1.0.1" 902 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 903 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 904 | 905 | oauth-sign@~0.9.0: 906 | version "0.9.0" 907 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 908 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 909 | 910 | object-assign@^4.1.0: 911 | version "4.1.1" 912 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 913 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 914 | 915 | once@^1.3.0: 916 | version "1.4.0" 917 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 918 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 919 | dependencies: 920 | wrappy "1" 921 | 922 | optjs@~3.2.2: 923 | version "3.2.2" 924 | resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" 925 | integrity sha1-aabOicRCpEQDFBrS+bNwvVu29O4= 926 | 927 | os-homedir@^1.0.0: 928 | version "1.0.2" 929 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 930 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 931 | 932 | os-locale@^1.4.0: 933 | version "1.4.0" 934 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 935 | integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= 936 | dependencies: 937 | lcid "^1.0.0" 938 | 939 | os-tmpdir@^1.0.0: 940 | version "1.0.2" 941 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 942 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 943 | 944 | osenv@^0.1.4: 945 | version "0.1.5" 946 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 947 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 948 | dependencies: 949 | os-homedir "^1.0.0" 950 | os-tmpdir "^1.0.0" 951 | 952 | packet-reader@0.3.1: 953 | version "0.3.1" 954 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" 955 | integrity sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc= 956 | 957 | path-is-absolute@^1.0.0: 958 | version "1.0.1" 959 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 960 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 961 | 962 | pathval@^1.1.0: 963 | version "1.1.0" 964 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 965 | integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= 966 | 967 | performance-now@^2.1.0: 968 | version "2.1.0" 969 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 970 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 971 | 972 | pg-connection-string@0.1.3: 973 | version "0.1.3" 974 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" 975 | integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= 976 | 977 | pg-hstore@^2.3.2: 978 | version "2.3.2" 979 | resolved "https://registry.yarnpkg.com/pg-hstore/-/pg-hstore-2.3.2.tgz#f7ef053e7b9b892ae986af2f7cbe86432dfcf24f" 980 | integrity sha1-9+8FPnubiSrphq8vfL6GQy388k8= 981 | dependencies: 982 | underscore "^1.7.0" 983 | 984 | pg-pool@^2.0.4: 985 | version "2.0.4" 986 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.4.tgz#05ad0f2d9437d89c94ccc4f4d0a44ac65ade865b" 987 | integrity sha512-Mi2AsmlFkVMpI28NreaDkz5DkfxLOG16C/HNwi091LDlOiDiQACtAroLxSd1vIS2imBqxdjjO9cQZg2CwsOPbw== 988 | 989 | pg-types@~1.12.1: 990 | version "1.12.1" 991 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2" 992 | integrity sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I= 993 | dependencies: 994 | postgres-array "~1.0.0" 995 | postgres-bytea "~1.0.0" 996 | postgres-date "~1.0.0" 997 | postgres-interval "^1.1.0" 998 | 999 | pg@^7.7.1: 1000 | version "7.7.1" 1001 | resolved "https://registry.yarnpkg.com/pg/-/pg-7.7.1.tgz#546b192ff484322b69689391f885de3ba91a30d4" 1002 | integrity sha512-p3I0mXOmUvCoVlCMFW6iYSrnguPol6q8He15NGgSIdM3sPGjFc+8JGCeKclw8ZR4ETd+Jxy2KNiaPUcocHZeMw== 1003 | dependencies: 1004 | buffer-writer "2.0.0" 1005 | packet-reader "0.3.1" 1006 | pg-connection-string "0.1.3" 1007 | pg-pool "^2.0.4" 1008 | pg-types "~1.12.1" 1009 | pgpass "1.x" 1010 | semver "4.3.2" 1011 | 1012 | pgpass@1.x: 1013 | version "1.0.2" 1014 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" 1015 | integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= 1016 | dependencies: 1017 | split "^1.0.0" 1018 | 1019 | postgres-array@~1.0.0: 1020 | version "1.0.3" 1021 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5" 1022 | integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ== 1023 | 1024 | postgres-bytea@~1.0.0: 1025 | version "1.0.0" 1026 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1027 | integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= 1028 | 1029 | postgres-date@~1.0.0: 1030 | version "1.0.3" 1031 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" 1032 | integrity sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g= 1033 | 1034 | postgres-interval@^1.1.0: 1035 | version "1.1.2" 1036 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz#bf71ff902635f21cb241a013fc421d81d1db15a9" 1037 | integrity sha512-fC3xNHeTskCxL1dC8KOtxXt7YeFmlbTYtn7ul8MkVERuTmf7pI4DrkAxcw3kh1fQ9uz4wQmd03a1mRiXUZChfQ== 1038 | dependencies: 1039 | xtend "^4.0.0" 1040 | 1041 | process-nextick-args@~2.0.0: 1042 | version "2.0.0" 1043 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1044 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1045 | 1046 | protobufjs@^5.0.3: 1047 | version "5.0.3" 1048 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17" 1049 | integrity sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA== 1050 | dependencies: 1051 | ascli "~1" 1052 | bytebuffer "~5" 1053 | glob "^7.0.5" 1054 | yargs "^3.10.0" 1055 | 1056 | protobufjs@^6.8.6: 1057 | version "6.8.8" 1058 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" 1059 | integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== 1060 | dependencies: 1061 | "@protobufjs/aspromise" "^1.1.2" 1062 | "@protobufjs/base64" "^1.1.2" 1063 | "@protobufjs/codegen" "^2.0.4" 1064 | "@protobufjs/eventemitter" "^1.1.0" 1065 | "@protobufjs/fetch" "^1.1.0" 1066 | "@protobufjs/float" "^1.0.2" 1067 | "@protobufjs/inquire" "^1.1.0" 1068 | "@protobufjs/path" "^1.1.2" 1069 | "@protobufjs/pool" "^1.1.0" 1070 | "@protobufjs/utf8" "^1.1.0" 1071 | "@types/long" "^4.0.0" 1072 | "@types/node" "^10.1.0" 1073 | long "^4.0.0" 1074 | 1075 | psl@^1.1.24: 1076 | version "1.1.29" 1077 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 1078 | integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== 1079 | 1080 | punycode@^1.4.1: 1081 | version "1.4.1" 1082 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1083 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1084 | 1085 | punycode@^2.1.0: 1086 | version "2.1.1" 1087 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1088 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1089 | 1090 | qs@~6.5.2: 1091 | version "6.5.2" 1092 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1093 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1094 | 1095 | ramda@^0.25.0: 1096 | version "0.25.0" 1097 | resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" 1098 | integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== 1099 | 1100 | rc@^1.2.7: 1101 | version "1.2.8" 1102 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1103 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1104 | dependencies: 1105 | deep-extend "^0.6.0" 1106 | ini "~1.3.0" 1107 | minimist "^1.2.0" 1108 | strip-json-comments "~2.0.1" 1109 | 1110 | readable-stream@^2.0.6: 1111 | version "2.3.6" 1112 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1113 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1114 | dependencies: 1115 | core-util-is "~1.0.0" 1116 | inherits "~2.0.3" 1117 | isarray "~1.0.0" 1118 | process-nextick-args "~2.0.0" 1119 | safe-buffer "~5.1.1" 1120 | string_decoder "~1.1.1" 1121 | util-deprecate "~1.0.1" 1122 | 1123 | request@^2.88.0: 1124 | version "2.88.0" 1125 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1126 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 1127 | dependencies: 1128 | aws-sign2 "~0.7.0" 1129 | aws4 "^1.8.0" 1130 | caseless "~0.12.0" 1131 | combined-stream "~1.0.6" 1132 | extend "~3.0.2" 1133 | forever-agent "~0.6.1" 1134 | form-data "~2.3.2" 1135 | har-validator "~5.1.0" 1136 | http-signature "~1.2.0" 1137 | is-typedarray "~1.0.0" 1138 | isstream "~0.1.2" 1139 | json-stringify-safe "~5.0.1" 1140 | mime-types "~2.1.19" 1141 | oauth-sign "~0.9.0" 1142 | performance-now "^2.1.0" 1143 | qs "~6.5.2" 1144 | safe-buffer "^5.1.2" 1145 | tough-cookie "~2.4.3" 1146 | tunnel-agent "^0.6.0" 1147 | uuid "^3.3.2" 1148 | 1149 | retry-as-promised@^2.3.2: 1150 | version "2.3.2" 1151 | resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" 1152 | integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c= 1153 | dependencies: 1154 | bluebird "^3.4.6" 1155 | debug "^2.6.9" 1156 | 1157 | rimraf@^2.6.1: 1158 | version "2.6.2" 1159 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1160 | integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== 1161 | dependencies: 1162 | glob "^7.0.5" 1163 | 1164 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1165 | version "5.1.2" 1166 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1167 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1168 | 1169 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1170 | version "2.1.2" 1171 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1172 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1173 | 1174 | sax@^1.2.4: 1175 | version "1.2.4" 1176 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1177 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1178 | 1179 | semver@4.3.2: 1180 | version "4.3.2" 1181 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" 1182 | integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= 1183 | 1184 | semver@^5.3.0, semver@^5.5.0: 1185 | version "5.6.0" 1186 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1187 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 1188 | 1189 | sequelize@^4.41.2: 1190 | version "4.41.2" 1191 | resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.41.2.tgz#bb9ba30d72e9eeb883c9861cd0e2cac672010883" 1192 | integrity sha512-8vPf2R0o9iEmtzkqNzwFdblO+0Mu+RNxOdLeYGGqWGlp3cushLpQucAeSGPQgf2hQVZP5yOCM1ouZKTQ5FTlvA== 1193 | dependencies: 1194 | bluebird "^3.5.0" 1195 | cls-bluebird "^2.1.0" 1196 | debug "^3.1.0" 1197 | depd "^1.1.0" 1198 | dottie "^2.0.0" 1199 | generic-pool "^3.4.0" 1200 | inflection "1.12.0" 1201 | lodash "^4.17.1" 1202 | moment "^2.20.0" 1203 | moment-timezone "^0.5.14" 1204 | retry-as-promised "^2.3.2" 1205 | semver "^5.5.0" 1206 | terraformer-wkt-parser "^1.1.2" 1207 | toposort-class "^1.0.1" 1208 | uuid "^3.2.1" 1209 | validator "^10.4.0" 1210 | wkx "^0.4.1" 1211 | 1212 | set-blocking@~2.0.0: 1213 | version "2.0.0" 1214 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1215 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1216 | 1217 | sha.js@^2.3.6: 1218 | version "2.4.11" 1219 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1220 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1221 | dependencies: 1222 | inherits "^2.0.1" 1223 | safe-buffer "^5.0.1" 1224 | 1225 | shimmer@^1.1.0: 1226 | version "1.2.0" 1227 | resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" 1228 | integrity sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag== 1229 | 1230 | signal-exit@^3.0.0: 1231 | version "3.0.2" 1232 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1233 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1234 | 1235 | split@^1.0.0: 1236 | version "1.0.1" 1237 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 1238 | integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== 1239 | dependencies: 1240 | through "2" 1241 | 1242 | sshpk@^1.7.0: 1243 | version "1.15.2" 1244 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" 1245 | integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== 1246 | dependencies: 1247 | asn1 "~0.2.3" 1248 | assert-plus "^1.0.0" 1249 | bcrypt-pbkdf "^1.0.0" 1250 | dashdash "^1.12.0" 1251 | ecc-jsbn "~0.1.1" 1252 | getpass "^0.1.1" 1253 | jsbn "~0.1.0" 1254 | safer-buffer "^2.0.2" 1255 | tweetnacl "~0.14.0" 1256 | 1257 | stellar-base@^0.9.0: 1258 | version "0.9.0" 1259 | resolved "https://registry.yarnpkg.com/stellar-base/-/stellar-base-0.9.0.tgz#03a4d71c9bfe49f0c54afd4a8f34517ed49c0924" 1260 | integrity sha512-4tyztbyNeLW3bGUMepMqdcywfLUmfAI1A/RSiMgNHRC7vK8Jueh5Dn8RmQPhmAlKsgXhDSmbvpCLwEr2i00Emg== 1261 | dependencies: 1262 | base32.js "~0.1.0" 1263 | bignumber.js "^4.0.0" 1264 | crc "3.5.0" 1265 | js-xdr "^1.0.5" 1266 | lodash "^4.17.10" 1267 | sha.js "^2.3.6" 1268 | tweetnacl "^1.0.0" 1269 | optionalDependencies: 1270 | ed25519 "0.0.4" 1271 | 1272 | string-width@^1.0.1: 1273 | version "1.0.2" 1274 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1275 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1276 | dependencies: 1277 | code-point-at "^1.0.0" 1278 | is-fullwidth-code-point "^1.0.0" 1279 | strip-ansi "^3.0.0" 1280 | 1281 | "string-width@^1.0.2 || 2": 1282 | version "2.1.1" 1283 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1284 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1285 | dependencies: 1286 | is-fullwidth-code-point "^2.0.0" 1287 | strip-ansi "^4.0.0" 1288 | 1289 | string_decoder@~1.1.1: 1290 | version "1.1.1" 1291 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1292 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1293 | dependencies: 1294 | safe-buffer "~5.1.0" 1295 | 1296 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1297 | version "3.0.1" 1298 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1299 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1300 | dependencies: 1301 | ansi-regex "^2.0.0" 1302 | 1303 | strip-ansi@^4.0.0: 1304 | version "4.0.0" 1305 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1306 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1307 | dependencies: 1308 | ansi-regex "^3.0.0" 1309 | 1310 | strip-json-comments@~2.0.1: 1311 | version "2.0.1" 1312 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1313 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1314 | 1315 | supports-color@5.4.0: 1316 | version "5.4.0" 1317 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1318 | integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== 1319 | dependencies: 1320 | has-flag "^3.0.0" 1321 | 1322 | tar@^4: 1323 | version "4.4.8" 1324 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 1325 | integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 1326 | dependencies: 1327 | chownr "^1.1.1" 1328 | fs-minipass "^1.2.5" 1329 | minipass "^2.3.4" 1330 | minizlib "^1.1.1" 1331 | mkdirp "^0.5.0" 1332 | safe-buffer "^5.1.2" 1333 | yallist "^3.0.2" 1334 | 1335 | terraformer-wkt-parser@^1.1.2: 1336 | version "1.2.0" 1337 | resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" 1338 | integrity sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w== 1339 | dependencies: 1340 | "@types/geojson" "^1.0.0" 1341 | terraformer "~1.0.5" 1342 | 1343 | terraformer@~1.0.5: 1344 | version "1.0.9" 1345 | resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6" 1346 | integrity sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag== 1347 | optionalDependencies: 1348 | "@types/geojson" "^1.0.0" 1349 | 1350 | through@2: 1351 | version "2.3.8" 1352 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1353 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1354 | 1355 | toposort-class@^1.0.1: 1356 | version "1.0.1" 1357 | resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 1358 | integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= 1359 | 1360 | tough-cookie@~2.4.3: 1361 | version "2.4.3" 1362 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1363 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 1364 | dependencies: 1365 | psl "^1.1.24" 1366 | punycode "^1.4.1" 1367 | 1368 | tunnel-agent@^0.6.0: 1369 | version "0.6.0" 1370 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1371 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1372 | dependencies: 1373 | safe-buffer "^5.0.1" 1374 | 1375 | tweetnacl@0.x.x, tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1376 | version "0.14.5" 1377 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1378 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1379 | 1380 | tweetnacl@^1.0.0: 1381 | version "1.0.0" 1382 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.0.tgz#713d8b818da42068740bf68386d0479e66fc8a7b" 1383 | integrity sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins= 1384 | 1385 | type-detect@^4.0.0, type-detect@^4.0.5: 1386 | version "4.0.8" 1387 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1388 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1389 | 1390 | underscore@^1.7.0: 1391 | version "1.9.1" 1392 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" 1393 | integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== 1394 | 1395 | uri-js@^4.2.2: 1396 | version "4.2.2" 1397 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1398 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1399 | dependencies: 1400 | punycode "^2.1.0" 1401 | 1402 | util-deprecate@~1.0.1: 1403 | version "1.0.2" 1404 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1405 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1406 | 1407 | uuid@^3.2.1, uuid@^3.3.2: 1408 | version "3.3.2" 1409 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1410 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 1411 | 1412 | validator@^10.4.0: 1413 | version "10.9.0" 1414 | resolved "https://registry.yarnpkg.com/validator/-/validator-10.9.0.tgz#d10c11673b5061fb7ccf4c1114412411b2bac2a8" 1415 | integrity sha512-hZJcZSWz9poXBlAkjjcsNAdrZ6JbjD3kWlNjq/+vE7RLLS/+8PAj3qVVwrwsOz/WL8jPmZ1hYkRvtlUeZAm4ug== 1416 | 1417 | varstruct@^6.1.2: 1418 | version "6.1.2" 1419 | resolved "https://registry.yarnpkg.com/varstruct/-/varstruct-6.1.2.tgz#9eba2115d9d86f6fd00daa72c3af2798e8506b24" 1420 | integrity sha512-tfdokSJxltuS0SD4FBRQl0JPJfZr5lVwL/5bDdwP/AYMh5ZaZxAKbgB4KOmIYDIzagCPDsq9pC8/2urFKnygbA== 1421 | dependencies: 1422 | int53 "^0.2.4" 1423 | safe-buffer "^5.1.1" 1424 | 1425 | verror@1.10.0: 1426 | version "1.10.0" 1427 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1428 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1429 | dependencies: 1430 | assert-plus "^1.0.0" 1431 | core-util-is "1.0.2" 1432 | extsprintf "^1.2.0" 1433 | 1434 | wide-align@^1.1.0: 1435 | version "1.1.3" 1436 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1437 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1438 | dependencies: 1439 | string-width "^1.0.2 || 2" 1440 | 1441 | window-size@^0.1.4: 1442 | version "0.1.4" 1443 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" 1444 | integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= 1445 | 1446 | wkx@^0.4.1: 1447 | version "0.4.5" 1448 | resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.5.tgz#a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0" 1449 | integrity sha512-01dloEcJZAJabLO5XdcRgqdKpmnxS0zIT02LhkdWOZX2Zs2tPM6hlZ4XG9tWaWur1Qd1OO4kJxUbe2+5BofvnA== 1450 | dependencies: 1451 | "@types/node" "*" 1452 | 1453 | wrap-ansi@^2.0.0: 1454 | version "2.1.0" 1455 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1456 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 1457 | dependencies: 1458 | string-width "^1.0.1" 1459 | strip-ansi "^3.0.1" 1460 | 1461 | wrappy@1: 1462 | version "1.0.2" 1463 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1464 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1465 | 1466 | xtend@^4.0.0: 1467 | version "4.0.1" 1468 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1469 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 1470 | 1471 | y18n@^3.2.0: 1472 | version "3.2.1" 1473 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1474 | integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= 1475 | 1476 | yallist@^3.0.0, yallist@^3.0.2: 1477 | version "3.0.3" 1478 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 1479 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 1480 | 1481 | yargs@^3.10.0: 1482 | version "3.32.0" 1483 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" 1484 | integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= 1485 | dependencies: 1486 | camelcase "^2.0.1" 1487 | cliui "^3.0.3" 1488 | decamelize "^1.1.1" 1489 | os-locale "^1.4.0" 1490 | string-width "^1.0.1" 1491 | window-size "^0.1.4" 1492 | y18n "^3.2.0" 1493 | --------------------------------------------------------------------------------