From e14a2657ef4fe72e5cacf1f7f1980c2dfd0a3b02 Mon Sep 17 00:00:00 2001 From: Nguyen Hoang Vu Date: Fri, 29 Mar 2019 11:25:17 +0800 Subject: [PATCH 01/16] Changes in Staging (#26) * Develop (#21) * [fix] Add `fetchDao` query with some fields turned to timestamp * [fix] Fix address subscription for claim rewards and redeem badge * Merge latest changes from develop * update dao-contracts package * use DaoUpgradeStorage.sol * [hard code] daoInfo till infura time sync issue * catch exception in reading latest block * lower case forum/kyc admin addresses while inserting * update dao-contracts package * use DaoUpgradeStorage.sol * [hard code] daoInfo till infura time sync issue * catch exception in reading latest block * lower case forum/kyc admin addresses while inserting --- app.js | 2 +- helpers/contracts.js | 2 +- package.json | 2 +- scripts/blocks.js | 44 +++++++++++++++------------ scripts/dao.js | 17 +++++++++++ scripts/index.js | 2 ++ scripts/manage/add/add-forum-admin.js | 7 ++++- scripts/manage/add/add-kyc-admin.js | 7 ++++- scripts/manage/helpers.js | 5 +++ staging.config.js | 4 +-- 10 files changed, 65 insertions(+), 27 deletions(-) diff --git a/app.js b/app.js index c8ef82d..6cd8175 100644 --- a/app.js +++ b/app.js @@ -58,7 +58,7 @@ const addProcessKycCron = async () => { waitingCron.stop(); // refresh DAO, now that the DigixDAO has started - scripts.refreshDao(); + scripts.refreshDaoTemp(); scripts.refreshDaoConfigs(); const cronFrequency = process.env.CRON_PROCESS_KYC_FREQUENCY; diff --git a/helpers/contracts.js b/helpers/contracts.js index e38994c..3098356 100644 --- a/helpers/contracts.js +++ b/helpers/contracts.js @@ -17,7 +17,7 @@ const DaoStakeStorage = require('@digix/dao-contracts/build/contracts/DaoStakeSt const DaoStorage = require('@digix/dao-contracts/build/contracts/DaoStorage.json'); // Replace with DaoUpgradeStorage in mainnet deployment -const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/MockDaoUpgradeStorage.json'); +const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/DaoUpgradeStorage.json'); const DaoVoting = require('@digix/dao-contracts/build/contracts/DaoVoting.json'); const DaoVotingClaims = require('@digix/dao-contracts/build/contracts/DaoVotingClaims.json'); diff --git a/package.json b/package.json index c97c430..4828357 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "author": "", "license": "ISC", "dependencies": { - "@digix/dao-contracts": "^0.0.6", + "@digix/dao-contracts": "^0.0.7", "@digix/dijix": "0.0.16", "@digix/helpers": "^1.0.1", "@digix/lite-dgx-contract": "1.0.1", diff --git a/scripts/blocks.js b/scripts/blocks.js index 84e063b..06ce774 100644 --- a/scripts/blocks.js +++ b/scripts/blocks.js @@ -42,30 +42,34 @@ const syncAndProcessToLatestBlock = async (lastProcessedBlock = null) => { const _updateLatestTxns = async (lastSeenBlock, latestBlockNumber) => { await setIsUpdatingLatestTxns(true); - for (const blockNumber of indexRange(lastSeenBlock + 1, latestBlockNumber + 1)) { - const block = await getWeb3().eth.getBlock(blockNumber); - const watchedTxns = []; - for (const txn of block.transactions) { - if (await isExistPendingTransaction(txn)) { - watchedTxns.push({ - txhash: txn, - }); + try { + for (const blockNumber of indexRange(lastSeenBlock + 1, latestBlockNumber + 1)) { + const block = await getWeb3().eth.getBlock(blockNumber); + const watchedTxns = []; + for (const txn of block.transactions) { + if (await isExistPendingTransaction(txn)) { + watchedTxns.push({ + txhash: txn, + }); + } } - } - if (watchedTxns.length > 0) { - notifyDaoServer({ - method: 'PUT', - path: daoServerEndpoints.TRANSACTION_SEEN, - body: { - payload: { - blockNumber: block.number, - transactions: watchedTxns, + if (watchedTxns.length > 0) { + notifyDaoServer({ + method: 'PUT', + path: daoServerEndpoints.TRANSACTION_SEEN, + body: { + payload: { + blockNumber: block.number, + transactions: watchedTxns, + }, }, - }, - }); + }); + } + await setLastSeenBlock(blockNumber); } + } catch (e) { + console.log('[ERROR] = ', e); } - await setLastSeenBlock(latestBlockNumber); await setIsUpdatingLatestTxns(false); }; diff --git a/scripts/dao.js b/scripts/dao.js index c4a2f34..0a6260a 100644 --- a/scripts/dao.js +++ b/scripts/dao.js @@ -5,6 +5,7 @@ const { const { updateDao, updateDaoConfigs, + getDaoInfo, } = require('../dbWrapper/dao'); const { @@ -73,6 +74,21 @@ const refreshDao = async () => { }); }; +const refreshDaoTemp = async () => { + const dao = await getDaoInfo(); + await updateDao({ + $set: { + currentQuarter: 1, + startOfQuarter: dao.startOfNextQuarter, + startOfMainphase: dao.startOfNextQuarter + 864000, + startOfNextQuarter: dao.startOfNextQuarter + 7776000, + isGlobalRewardsSet: true, + nModerators: 0, + nParticipants: 0, + }, + }); +}; + const isDaoStarted = async () => { const startOfFirstQuarter = await getContracts().daoUpgradeStorage.startOfFirstQuarter.call(); if ( @@ -97,6 +113,7 @@ const initDaoBeforeStart = async () => { module.exports = { initDao, refreshDao, + refreshDaoTemp, refreshDaoConfigs, isDaoStarted, initDaoBeforeStart, diff --git a/scripts/index.js b/scripts/index.js index 7e27201..575e5da 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -12,6 +12,7 @@ const { refreshDao, initDaoBeforeStart, refreshDaoConfigs, + refreshDaoTemp, } = require('./dao'); const { @@ -27,4 +28,5 @@ module.exports = { processPendingKycs, isDaoStarted, initDaoBeforeStart, + refreshDaoTemp, }; diff --git a/scripts/manage/add/add-forum-admin.js b/scripts/manage/add/add-forum-admin.js index 172f1cd..d26bc02 100644 --- a/scripts/manage/add/add-forum-admin.js +++ b/scripts/manage/add/add-forum-admin.js @@ -1,5 +1,8 @@ +const assert = require('assert'); + const { initMongoClient, + isInvalid, } = require('../helpers'); const { @@ -10,9 +13,11 @@ const addForumAdmin = async () => { // connect to and get mongo db const mongoClient = await initMongoClient('mongodb://localhost:27017/digixdao', 'digixdao'); + assert.ok(!isInvalid(process.env.FORUM_ADMIN_ADDRESS), 'Please provide the FORUM_ADMIN_ADDRESS'); + // add kyc admin await mongoClient.collection(collections.ADDRESSES).insertOne({ - address: process.env.FORUM_ADMIN_ADDRESS, + address: process.env.FORUM_ADMIN_ADDRESS.toLowerCase(), isForumAdmin: true, }); diff --git a/scripts/manage/add/add-kyc-admin.js b/scripts/manage/add/add-kyc-admin.js index 6059440..5ca5092 100644 --- a/scripts/manage/add/add-kyc-admin.js +++ b/scripts/manage/add/add-kyc-admin.js @@ -1,5 +1,8 @@ +const assert = require('assert'); + const { initMongoClient, + isInvalid, } = require('../helpers'); const { @@ -10,9 +13,11 @@ const addKycAdmin = async () => { // connect to and get mongo db const mongoClient = await initMongoClient('mongodb://localhost:27017/digixdao', 'digixdao'); + assert.ok(!isInvalid(process.env.KYC_ADMIN_ADDRESS), 'Please provide the KYC_ADMIN_ADDRESS'); + // add kyc admin await mongoClient.collection(collections.ADDRESSES).insertOne({ - address: process.env.KYC_ADMIN_ADDRESS, + address: process.env.KYC_ADMIN_ADDRESS.toLowerCase(), isKycOfficer: true, }); diff --git a/scripts/manage/helpers.js b/scripts/manage/helpers.js index 4e40502..86b680c 100644 --- a/scripts/manage/helpers.js +++ b/scripts/manage/helpers.js @@ -5,6 +5,11 @@ const initMongoClient = async (DB_URL, DIGIXDAO_DB_NAME) => { return mongoUtil.getDB(); }; +const isInvalid = (param) => { + return (param === '' || param === undefined); +}; + module.exports = { initMongoClient, + isInvalid, }; diff --git a/staging.config.js b/staging.config.js index b0eee3d..7723302 100644 --- a/staging.config.js +++ b/staging.config.js @@ -14,7 +14,7 @@ module.exports = { RATE_LIMIT_WINDOW_MS: 60 * 1000, RATE_LIMIT_PER_WINDOW: 10, BLOCK_CONFIRMATIONS: 3, - START_BLOCK: 10483600, + START_BLOCK: 10610000, N_BLOCKS_BUCKET: 200, N_BLOCKS_CONCURRENT: 100, FORCE_REFRESH_DB: process.env.FORCE_REFRESH_DB, @@ -24,7 +24,7 @@ module.exports = { WEB3_HTTP_PROVIDER: 'https://kovan.digixdev.com', IPFS_ENDPOINT: 'https://ipfs-api.digix.global', HTTP_ENDPOINT: 'https://ipfs.digix.global/ipfs', - IPFS_TIMEOUT: 30000, + IPFS_TIMEOUT: 60000, CRON_PROCESS_KYC_FREQUENCY: 5, CRON_WATCH_BLOCKS_FREQUENCY: 5, KYC_ADMIN_PASSWORD: 'digixdao-kovan', From 0e43b2df7dd933cca01d3686f780dc6980fb35fe Mon Sep 17 00:00:00 2001 From: Francis Murillo <44824731+FrancisMurilloDigix@users.noreply.github.com> Date: Thu, 4 Apr 2019 08:29:08 +0800 Subject: [PATCH 02/16] [fix] Fix reputation point null values for KYC Admin (#27) --- types/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/user.js b/types/user.js index a789781..f9a1700 100644 --- a/types/user.js +++ b/types/user.js @@ -21,7 +21,7 @@ const typeDef = gql` lockedDgd: BigNumber # User's current reputation points - reputationPoint: BigNumber! + reputationPoint: BigNumber # User's current quarterly points quarterPoint: BigNumber From cb90a5d80eb06bac4c9156dd963a0fd799e4734b Mon Sep 17 00:00:00 2001 From: Nguyen Hoang Vu Date: Wed, 10 Apr 2019 16:32:36 +0800 Subject: [PATCH 03/16] make use of denominator for rp and qp in /points endpoint (#30) (#31) --- routes/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/routes/index.js b/routes/index.js index 2f3b89d..90eca6c 100644 --- a/routes/index.js +++ b/routes/index.js @@ -23,10 +23,12 @@ const { deserializeDaoConfigs, deserializeAddress, readConfig, + ofOne, } = require('../helpers/utils'); const { counters, + denominators, } = require('../helpers/constants'); const router = express.Router(); @@ -66,8 +68,8 @@ router.get('/points', async (req, res) => { const filteredDetails = {}; details.forEach(function (d) { filteredDetails[d.address] = { - reputation: d.reputationPoint, - quarterPoints: d.quarterPoint, + reputation: ofOne(d.reputationPoint, denominators.REPUTATION_POINT), + quarterPoints: ofOne(d.quarterPoint, denominators.QUARTER_POINT), }; }); return res.json({ result: filteredDetails }); From c1773f2199da7feea72ae9bebd812949a0c4acb3 Mon Sep 17 00:00:00 2001 From: Francis Murillo <44824731+FrancisMurilloDigix@users.noreply.github.com> Date: Thu, 4 Apr 2019 08:29:08 +0800 Subject: [PATCH 04/16] [fix] Fix reputation point null values for KYC Admin (#27) --- types/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/user.js b/types/user.js index a789781..f9a1700 100644 --- a/types/user.js +++ b/types/user.js @@ -21,7 +21,7 @@ const typeDef = gql` lockedDgd: BigNumber # User's current reputation points - reputationPoint: BigNumber! + reputationPoint: BigNumber # User's current quarterly points quarterPoint: BigNumber From 6ac6b5326fdc9e8defd05020fe5f7a38156bb3cf Mon Sep 17 00:00:00 2001 From: Nguyen Hoang Vu Date: Wed, 10 Apr 2019 16:32:36 +0800 Subject: [PATCH 05/16] make use of denominator for rp and qp in /points endpoint (#30) (#31) --- routes/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/routes/index.js b/routes/index.js index 2f3b89d..90eca6c 100644 --- a/routes/index.js +++ b/routes/index.js @@ -23,10 +23,12 @@ const { deserializeDaoConfigs, deserializeAddress, readConfig, + ofOne, } = require('../helpers/utils'); const { counters, + denominators, } = require('../helpers/constants'); const router = express.Router(); @@ -66,8 +68,8 @@ router.get('/points', async (req, res) => { const filteredDetails = {}; details.forEach(function (d) { filteredDetails[d.address] = { - reputation: d.reputationPoint, - quarterPoints: d.quarterPoint, + reputation: ofOne(d.reputationPoint, denominators.REPUTATION_POINT), + quarterPoints: ofOne(d.quarterPoint, denominators.QUARTER_POINT), }; }); return res.json({ result: filteredDetails }); From 922d9a8b9ef4c3eb9244dddad8e62c6bfff79fca Mon Sep 17 00:00:00 2001 From: Nguyen Hoang Vu Date: Tue, 23 Apr 2019 14:33:35 +0800 Subject: [PATCH 06/16] Feature/sprint 7e (#35) * add more docs (Needed for DGDG-496) (#29) * add more docs (Needed for DGDG-496) * fix moreDocs json structure * [feature] Add proposal doc type to support moredocs (#32) * [feature] Loosen GraphQL authorization for proposal (#33) * make prl fields boolean (#34) --- dijixWrapper/proposals.js | 10 ++++++++++ graphql.js | 30 ++++++++++++++++++++++++++---- helpers/constants.js | 8 +++++--- helpers/contracts.js | 5 ++++- helpers/utils.js | 18 ++++++++++++++++++ package.json | 2 +- scripts/proposals.js | 30 +++++++++++++++++++++++++----- scripts/watchedFunctions.js | 2 ++ types/proposal.js | 12 ++++++++++-- 9 files changed, 101 insertions(+), 16 deletions(-) diff --git a/dijixWrapper/proposals.js b/dijixWrapper/proposals.js index b45f90a..8494bfe 100644 --- a/dijixWrapper/proposals.js +++ b/dijixWrapper/proposals.js @@ -5,6 +5,16 @@ const fetchProposalVersion = async (ipfsHash) => { return dijixObject; }; +const fetchMultiple = async (hashes) => { + const docs = []; + for (const hash of hashes) { + const doc = await dijixUtil.getDijix().failSafeFetch(hash); + docs.push(doc); + } + return docs; +}; + module.exports = { fetchProposalVersion, + fetchMultiple, }; diff --git a/graphql.js b/graphql.js index c9e85f0..f9db6f3 100644 --- a/graphql.js +++ b/graphql.js @@ -68,6 +68,10 @@ const resolvers = { return proposal ? proposalToType(proposal) : null; }, fetchCurrentUser: (_obj, _args, context, _info) => { + if (!context.currentUser) { + throw new Error('Not Authenticated'); + } + return context.currentUser; }, fetchDao: (_obj, _args, _context, _info) => { @@ -78,15 +82,33 @@ const resolvers = { Subscription: { userUpdated: { subscribe: withFilter( - () => pubsub.asyncIterator('userUpdated'), + (_obj, _args, context, _info) => { + if (!context.currentUser) { + throw new Error('Not Authenticated'); + } + + return pubsub.asyncIterator('userUpdated'); + }, filterByCurrentAddress(payload => payload.userUpdated.address), ), }, proposalSubmitted: { - subscribe: () => pubsub.asyncIterator('proposalSubmitted'), + subscribe: (_obj, _args, context, _info) => { + if (!context.currentUser) { + throw new Error('Not Authenticated'); + } + + return pubsub.asyncIterator('proposalSubmitted'); + }, }, proposalUpdated: { - subscribe: () => pubsub.asyncIterator('proposalUpdated'), + subscribe: (_obj, _args, context, _info) => { + if (!context.currentUser) { + throw new Error('Not Authenticated'); + } + + return pubsub.asyncIterator('proposalUpdated'); + }, }, daoUpdated: { subscribe: () => pubsub.asyncIterator('daoUpdated'), @@ -124,7 +146,7 @@ const signatureAuthorization = (params) => { throw new AuthenticationError('Invalid address or signature'); } else { - throw new AuthenticationError('Missing address or signature'); + return {}; } }; diff --git a/helpers/constants.js b/helpers/constants.js index 7573d7f..3d57a16 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -115,9 +115,9 @@ const readProposalVersionIndices = { }; const readProposalPRLActions = { - 1: 'stopped', - 2: 'paused', - 3: 'ok', + 1: true, + 2: true, + 3: false, }; const proposalStages = { @@ -174,6 +174,7 @@ const watchedFunctionNames = { ENDORSE_PROPOSAL: 'endorseProposal', MODIFY_PROPOSAL: 'modifyProposal', FINALIZE_PROPOSAL: 'finalizeProposal', + ADD_PROPOSAL_DOC: 'addProposalDoc', DRAFT_VOTE: 'voteOnDraft', CLAIM_DRAFT_VOTING: 'claimDraftVotingResult', COMMIT_VOTE: 'commitVoteOnProposal', @@ -208,6 +209,7 @@ const watchedFunctionsList = [ watchedFunctionNames.ENDORSE_PROPOSAL, watchedFunctionNames.MODIFY_PROPOSAL, watchedFunctionNames.FINALIZE_PROPOSAL, + watchedFunctionNames.ADD_PROPOSAL_DOC, watchedFunctionNames.DRAFT_VOTE, watchedFunctionNames.CLAIM_DRAFT_VOTING, watchedFunctionNames.COMMIT_VOTE, diff --git a/helpers/contracts.js b/helpers/contracts.js index 5a0b4d2..dc76b00 100644 --- a/helpers/contracts.js +++ b/helpers/contracts.js @@ -15,7 +15,10 @@ const DaoSpecialVotingClaims = require('@digix/dao-contracts/build/contracts/Dao const DaoStakeLocking = require('@digix/dao-contracts/build/contracts/DaoStakeLocking.json'); const DaoStakeStorage = require('@digix/dao-contracts/build/contracts/DaoStakeStorage.json'); const DaoStorage = require('@digix/dao-contracts/build/contracts/DaoStorage.json'); -const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/DaoUpgradeStorage.json'); + +// Replace with DaoUpgradeStorage in mainnet deployment +const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/MockDaoUpgradeStorage.json'); + const DaoVoting = require('@digix/dao-contracts/build/contracts/DaoVoting.json'); const DaoVotingClaims = require('@digix/dao-contracts/build/contracts/DaoVotingClaims.json'); const DaoWhitelisting = require('@digix/dao-contracts/build/contracts/DaoWhitelisting.json'); diff --git a/helpers/utils.js b/helpers/utils.js index 56794eb..ec8f48b 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -307,6 +307,23 @@ const getDefaultDijixFields = function () { }; }; +const _getAdditionalDocObj = function (doc) { + if (doc === null || doc === undefined) return doc; + const doc2 = { + ...doc.data.attestation.moreDocs, + created: Math.floor(doc.created / 1000), + }; + return doc2; +}; + +const getAdditionalDocs = function (docs) { + const additionalDocs = []; + for (const doc of docs) { + additionalDocs.push(_getAdditionalDocObj(doc)); + } + return additionalDocs; +}; + module.exports = { sumArray, sumArrayBN, @@ -332,4 +349,5 @@ module.exports = { getUpdatedFundings, getServerSignatures, getDefaultDijixFields, + getAdditionalDocs, }; diff --git a/package.json b/package.json index 4828357..7324985 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "author": "", "license": "ISC", "dependencies": { - "@digix/dao-contracts": "^0.0.7", + "@digix/dao-contracts": "file:../dao-contracts", "@digix/dijix": "0.0.16", "@digix/helpers": "^1.0.1", "@digix/lite-dgx-contract": "1.0.1", diff --git a/scripts/proposals.js b/scripts/proposals.js index 8bd10ff..dda1c4e 100644 --- a/scripts/proposals.js +++ b/scripts/proposals.js @@ -16,6 +16,7 @@ const { getUpdatedFundings, getDefaultDijixFields, bNArrayToString, + getAdditionalDocs, } = require('../helpers/utils'); const { @@ -51,6 +52,7 @@ const { const { fetchProposalVersion, + fetchMultiple, } = require('../dijixWrapper/proposals'); const { @@ -168,16 +170,12 @@ const refreshProposalDetails = async (res) => { console.log('version id : ', v); const proposalVersion = await getContracts().daoStorage.readProposalVersion.call(res._proposalId, currentVersion); const ipfsDoc = await fetchProposalVersion('Qm'.concat(decodeHash(proposalVersion[readProposalVersionIndices.docIpfsHash]).slice(2))); - let proposalDocs = []; - if (proposalVersion === proposal.finalVersionIpfsDoc) { - proposalDocs = await getContracts().daoStorage.readProposalDocs.call(res._proposalId); - } proposal.proposalVersions.push({ docIpfsHash: proposalVersion[readProposalVersionIndices.docIpfsHash], created: proposalVersion[readProposalVersionIndices.created].toNumber(), milestoneFundings: (currentVersion === latestVersion) ? res._milestonesFundings : bNArrayToString(proposalVersion[readProposalVersionIndices.milestoneFundings]), finalReward: (currentVersion === latestVersion) ? res._finalReward.toString() : proposalVersion[readProposalVersionIndices.finalReward].toString(), - moreDocs: proposalDocs, + moreDocs: [], totalFunding: (new BigNumber(res._finalReward)).plus(sumArrayString(res._milestonesFundings)).toString(), dijixObject: ipfsDoc.data ? { ...ipfsDoc.data.attestation, @@ -196,6 +194,27 @@ const refreshProposalDetails = async (res) => { return Promise.resolve(proposal); }; +// TO BE TESTED +const refreshProposalAddMoreDocs = async (res) => { + const proposal = await getProposal(res._proposalId); + + const v = proposal.proposalVersions.length - 1; + let proposalMoreDocs = await getContracts().daoStorage.readProposalDocs.call(res._proposalId); + proposalMoreDocs = proposalMoreDocs.map((item) => { + return 'Qm'.concat(decodeHash(item).slice(2)); + }); + + proposal.proposalVersions[v].moreDocs = getAdditionalDocs(await fetchMultiple(proposalMoreDocs)); + + await updateProposal(res._proposalId, { + $set: { + proposalVersions: proposal.proposalVersions, + }, + }); + + return Promise.resolve(proposal); +}; + // DONE const refreshProposalEndorseProposal = async (res) => { const proposal = await getProposal(res._proposalId); @@ -908,6 +927,7 @@ module.exports = { refreshProposalDetails, refreshProposalEndorseProposal, refreshProposalFinalizeProposal, + refreshProposalAddMoreDocs, refreshProposalDraftVote, refreshProposalDraftVotingClaim, refreshProposalCommitVote, diff --git a/scripts/watchedFunctions.js b/scripts/watchedFunctions.js index 1678718..5776179 100644 --- a/scripts/watchedFunctions.js +++ b/scripts/watchedFunctions.js @@ -5,6 +5,7 @@ const { refreshProposalDetails, refreshProposalEndorseProposal, refreshProposalFinalizeProposal, + refreshProposalAddMoreDocs, refreshProposalDraftVote, refreshProposalDraftVotingClaim, refreshProposalCommitVote, @@ -108,6 +109,7 @@ const watchedFunctionsMap = { modifyProposal: broadcastUpdatedProposal(refreshProposalDetails), endorseProposal: broadcastUpdatedProposal(refreshProposalEndorseProposal), finalizeProposal: broadcastUpdatedProposal(refreshProposalFinalizeProposal), + addProposalDoc: broadcastUpdatedProposal(refreshProposalAddMoreDocs), voteOnDraft: multiBroadcast( ([proposal, user]) => [proposal, user], [broadcastUpdatedProposal, broadcastUpdatedUser], diff --git a/types/proposal.js b/types/proposal.js index f0febf0..de4dd8f 100644 --- a/types/proposal.js +++ b/types/proposal.js @@ -28,6 +28,14 @@ const typeDef = gql` updated: BigNumber } + type ProposalDoc { + # IPFS hashes for doc + docs: [String] + + # Date the document is created + created: Timestamp + } + # Milestone fundings type MilestoneFunding { # Index ID @@ -126,8 +134,8 @@ const typeDef = gql` # Expected reward on the completion of the proposal finalReward: BigNumber - # More docs(?) - moreDocs: [String] + # More docs associated with the proposal + moreDocs: [ProposalDoc] # Version total funding totalFunding: BigNumber From d4715d31bc59b8b7eb2688e032be185d58f8d443 Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Mon, 29 Apr 2019 07:51:57 +0800 Subject: [PATCH 07/16] add route for transaction configs (gas limits) (Needed for DGDG-478) (#28) * add route for transaction configs (gas limits) (Needed for DGDG-478) --- helpers/constants.js | 31 +++++++++++++++++++++++++++++++ helpers/utils.js | 36 ++++++++++++++++++++++++++++++++++++ routes/index.js | 7 +++++++ 3 files changed, 74 insertions(+) diff --git a/helpers/constants.js b/helpers/constants.js index 3d57a16..0d6c66c 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -294,6 +294,36 @@ const daoConfigsKeys = { CONFIG_PREPROPOSAL_COLLATERAL: 'config_preproposal_collateral', }; +const gasLimits = { + // participation + LOCK_DGD: 1000000, + UNLOCK_DGD: 1000000, + CONFIRM_CONTINUE_PARTICIPATION: 1000000, + CLAIM_REWARDS: 400000, + // voting + MODERATOR_VOTE: 300000, + COMMIT_VOTE: 150000, + REVEAL_VOTE: 300000, + COMMIT_VOTE_SPECIAL: 200000, + REVEAL_VOTE_SPECIAL: 250000, + // claim voting + CLAIM_DRAFT_VOTING: 8000000, + CLAIM_VOTING: 8000000, + CLAIM_SPECIAL_VOTING: 8000000, + // proposal + CREATE_PROPOSAL: 1000000, + ENDORSE_PROPOSAL: 400000, + EDIT_PROPOSAL: 1000000, + FINALIZE_PROPOSAL: 400000, + CLAIM_FUNDING: 400000, + FINISH_MILESTONE: 400000, + ADD_PROPOSAL_DOC: 300000, + CHANGE_FUNDINGS: 500000, + ABORT_PROPOSAL: 400000, + // default value + DEFAULT_GAS: 2000000, +}; + module.exports = { readProposalIndices, readSpecialProposalIndices, @@ -311,4 +341,5 @@ module.exports = { dijixDefaultFields, daoServerEndpoints, daoServerEventTypes, + gasLimits, }; diff --git a/helpers/utils.js b/helpers/utils.js index ec8f48b..92a715e 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -4,6 +4,7 @@ const crypto = require('crypto'); const { denominators, dijixDefaultFields, + gasLimits, } = require('./constants'); const getServerSignatures = function (req) { @@ -324,6 +325,40 @@ const getAdditionalDocs = function (docs) { return additionalDocs; }; +const getTxConfigs = function () { + return { + gas: { + // participation + LOCK_DGD: gasLimits.LOCK_DGD, + UNLOCK_DGD: gasLimits.UNLOCK_DGD, + CONFIRM_CONTINUE_PARTICIPATION: gasLimits.CONFIRM_CONTINUE_PARTICIPATION, + CLAIM_REWARDS: gasLimits.CLAIM_REWARDS, + // voting + MODERATOR_VOTE: gasLimits.MODERATOR_VOTE, + COMMIT_VOTE: gasLimits.COMMIT_VOTE, + REVEAL_VOTE: gasLimits.REVEAL_VOTE, + COMMIT_VOTE_SPECIAL: gasLimits.COMMIT_VOTE_SPECIAL, + REVEAL_VOTE_SPECIAL: gasLimits.REVEAL_VOTE_SPECIAL, + // claim voting + CLAIM_DRAFT_VOTING: gasLimits.CLAIM_DRAFT_VOTING, + CLAIM_VOTING: gasLimits.CLAIM_VOTING, + CLAIM_SPECIAL_VOTING: gasLimits.CLAIM_SPECIAL_VOTING, + // proposal + CREATE_PROPOSAL: gasLimits.CREATE_PROPOSAL, + ENDORSE_PROPOSAL: gasLimits.ENDORSE_PROPOSAL, + EDIT_PROPOSAL: gasLimits.EDIT_PROPOSAL, + FINALIZE_PROPOSAL: gasLimits.FINALIZE_PROPOSAL, + CLAIM_FUNDING: gasLimits.CLAIM_FUNDING, + FINISH_MILESTONE: gasLimits.FINISH_MILESTONE, + ADD_PROPOSAL_DOC: gasLimits.ADD_PROPOSAL_DOC, + CHANGE_FUNDINGS: gasLimits.CHANGE_FUNDINGS, + ABORT_PROPOSAL: gasLimits.ABORT_PROPOSAL, + // default value + DEFAULT: gasLimits.DEFAULT_GAS, + }, + }; +}; + module.exports = { sumArray, sumArrayBN, @@ -350,4 +385,5 @@ module.exports = { getServerSignatures, getDefaultDijixFields, getAdditionalDocs, + getTxConfigs, }; diff --git a/routes/index.js b/routes/index.js index 90eca6c..23c469d 100644 --- a/routes/index.js +++ b/routes/index.js @@ -24,6 +24,7 @@ const { deserializeAddress, readConfig, ofOne, + getTxConfigs, } = require('../helpers/utils'); const { @@ -51,6 +52,12 @@ router.get('/daoConfigs', async (req, res) => { }); }); +router.get('/txConfigs', (req, res) => { + return res.json({ + result: getTxConfigs(), + }); +}); + router.get('/address/:address', async (req, res) => { const details = deserializeAddress(await getAddressDetails(req.params.address.toLowerCase())); return res.json({ result: details || 'notFound' }); From 436b23cbb8101d6eceff1ea0ed9ef6bb4296216d Mon Sep 17 00:00:00 2001 From: Francis Murillo <44824731+FrancisMurilloDigix@users.noreply.github.com> Date: Mon, 29 Apr 2019 08:44:10 +0800 Subject: [PATCH 08/16] [fix] Add user broadcast for reveal special proposal (#36) --- scripts/proposals.js | 5 ++++- scripts/watchedFunctions.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/proposals.js b/scripts/proposals.js index dda1c4e..41f8614 100644 --- a/scripts/proposals.js +++ b/scripts/proposals.js @@ -880,7 +880,10 @@ const refreshProposalRevealVoteOnSpecial = async (res) => { console.log('reveal vote for special proposal'); - return getSpecialProposal(res._proposalId); + return Promise.all([ + getSpecialProposal(res._proposalId), + getAddressDetails(res._from), + ]); }; // TO BE TESTED diff --git a/scripts/watchedFunctions.js b/scripts/watchedFunctions.js index 5776179..f3bad96 100644 --- a/scripts/watchedFunctions.js +++ b/scripts/watchedFunctions.js @@ -131,7 +131,10 @@ const watchedFunctionsMap = { createSpecialProposal: broadcastUpdatedProposal(refreshProposalSpecialNew), startSpecialProposalVoting: broadcastUpdatedProposal(refreshProposalSpecial), commitVoteOnSpecialProposal: broadcastUpdatedProposal(refreshProposalCommitVoteOnSpecial), - revealVoteOnSpecialProposal: broadcastUpdatedProposal(refreshProposalRevealVoteOnSpecial), + revealVoteOnSpecialProposal: multiBroadcast( + ([proposal, user]) => [proposal, user], + [broadcastUpdatedProposal, broadcastUpdatedUser], + )(refreshProposalRevealVoteOnSpecial), claimSpecialProposalVotingResult: broadcastUpdatedProposal(refreshProposalSpecialVotingClaim), }; From 4303e2bb5b851707cc8c8c7e752d7bcb4afa40b6 Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Tue, 14 May 2019 10:14:36 +0800 Subject: [PATCH 09/16] modify some graphql types to Enum (#39) * modify some graphql types to Enum * remove console log * utility function to get actionableStatus * query for fetching actionable statuses * fetchProposals query with actionableStatus field * add default prl for special proposal * add arg for filtering out non-actionable proposals * refactor * minor fix * case fix * graphql case fix * fix for 0 proposal count * refactoring --- graphql.js | 27 +++++++++- helpers/constants.js | 39 ++++++++++----- helpers/contracts.js | 3 +- helpers/utils.js | 84 +++++++++++++++++++++++++++++++ routes/proposals.js | 6 +-- scripts/proposals.js | 5 +- types/proposal.js | 116 ++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 253 insertions(+), 27 deletions(-) diff --git a/graphql.js b/graphql.js index f9db6f3..5078578 100644 --- a/graphql.js +++ b/graphql.js @@ -2,14 +2,22 @@ const ethJsUtil = require('ethereumjs-util'); const { withFilter, AuthenticationError } = require('apollo-server'); const { ApolloServer, gql } = require('apollo-server-express'); -const { proposalToType } = require('./helpers/utils'); +const { actionableStatus } = require('./helpers/constants'); +const { proposalToType, getCurrentActionableStatus } = require('./helpers/utils'); const { getAddressDetails } = require('./dbWrapper/addresses'); const { getDaoInfo } = require('./dbWrapper/dao'); const { pubsub } = require('./pubsub'); -const { getProposal, getSpecialProposal } = require('./dbWrapper/proposals'); +const { + getProposal, + getSpecialProposal, + getSpecialProposals, + getProposals, +} = require('./dbWrapper/proposals'); + +const { proposalStages } = require('./helpers/constants'); const { typeDef: scalarType, resolvers: scalarResolvers } = require('./types/scalar.js'); const { typeDef: userType, resolvers: userResolvers } = require('./types/user.js'); @@ -26,6 +34,9 @@ const queryType = gql` # Get the current user's information. fetchDao: Dao! + + # Find proposals in specific stage + fetchProposals(stage: String!, onlyActionable: Boolean): [Proposal] } `; @@ -77,6 +88,18 @@ const resolvers = { fetchDao: (_obj, _args, _context, _info) => { return getDaoInfo(); }, + fetchProposals: async (_obj, args, context, _info) => { + const { stage, onlyActionable } = args; + const filter = (stage === 'all') ? {} : { stage: stage.toUpperCase() }; + const proposals = await getProposals(filter); + const specialProposals = (stage.toUpperCase() === proposalStages.PROPOSAL || stage === 'all') ? await getSpecialProposals() : []; + + const allProposals = specialProposals.concat(proposals).map(proposal => ({ + ...proposal, + actionableStatus: getCurrentActionableStatus(proposal, context.currentUser), + })); + return onlyActionable ? allProposals.filter(proposal => proposal.actionableStatus !== actionableStatus.NONE) : allProposals; + }, }, Mutation: {}, Subscription: { diff --git a/helpers/constants.js b/helpers/constants.js index 0d6c66c..ff4ea01 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -115,25 +115,37 @@ const readProposalVersionIndices = { }; const readProposalPRLActions = { - 1: true, - 2: true, - 3: false, + 1: 'STOPPED', + 2: 'PAUSED', + 3: 'ACTIVE', + NEW: 'ACTIVE', + PAUSED: 'PAUSED', }; const proposalStages = { - IDEA: 'idea', - DRAFT: 'draft', - PROPOSAL: 'proposal', - ONGOING: 'ongoing', - REVIEW: 'review', - ARCHIVED: 'archived', + IDEA: 'IDEA', + DRAFT: 'DRAFT', + PROPOSAL: 'PROPOSAL', + ONGOING: 'ONGOING', + REVIEW: 'REVIEW', + ARCHIVED: 'ARCHIVED', }; const proposalVotingStages = { - DRAFT: 'draftVoting', - COMMIT: 'commit', - REVEAL: 'reveal', - NONE: 'none', + DRAFT: 'DRAFT', + COMMIT: 'COMMIT', + REVEAL: 'REVEAL', + NONE: 'NONE', +}; + +const actionableStatus = { + NONE: 'NONE', + AWAITING_ENDORSEMENT: 'AWAITING_ENDORSEMENT', + MODERATOR_VOTING: 'MODERATOR_VOTING_ACTIVE', + COMMIT_PHASE: 'COMMIT_PHASE_ACTIVE', + REVEAL_PHASE: 'REVEAL_PHASE_ACTIVE', + CLAIM_FUNDING: 'CLAIM_FUNDING', + CLAIM_VOTING: 'CLAIM_VOTING', }; const collections = { @@ -342,4 +354,5 @@ module.exports = { daoServerEndpoints, daoServerEventTypes, gasLimits, + actionableStatus, }; diff --git a/helpers/contracts.js b/helpers/contracts.js index dc76b00..1c0d05a 100644 --- a/helpers/contracts.js +++ b/helpers/contracts.js @@ -1,7 +1,6 @@ const ContractResolver = require('@digix/dao-contracts/build/contracts/ContractResolver.json'); const Dao = require('@digix/dao-contracts/build/contracts/Dao.json'); const DaoCalculatorService = require('@digix/dao-contracts/build/contracts/DaoCalculatorService.json'); -const DaoConfigsStorage = require('@digix/dao-contracts/build/contracts/DaoConfigsStorage.json'); const DaoFundingManager = require('@digix/dao-contracts/build/contracts/DaoFundingManager.json'); const DaoIdentity = require('@digix/dao-contracts/build/contracts/DaoIdentity.json'); const DaoIdentityStorage = require('@digix/dao-contracts/build/contracts/DaoIdentityStorage.json'); @@ -17,7 +16,9 @@ const DaoStakeStorage = require('@digix/dao-contracts/build/contracts/DaoStakeSt const DaoStorage = require('@digix/dao-contracts/build/contracts/DaoStorage.json'); // Replace with DaoUpgradeStorage in mainnet deployment +// Replace with DaoConfigsStorage in mainnet deployment const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/MockDaoUpgradeStorage.json'); +const DaoConfigsStorage = require('@digix/dao-contracts/build/contracts/MockDaoConfigsStorage.json'); const DaoVoting = require('@digix/dao-contracts/build/contracts/DaoVoting.json'); const DaoVotingClaims = require('@digix/dao-contracts/build/contracts/DaoVotingClaims.json'); diff --git a/helpers/utils.js b/helpers/utils.js index 92a715e..3256cb4 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -1,10 +1,17 @@ const BigNumber = require('bignumber.js'); const crypto = require('crypto'); +const { + getCurrentTimestamp, +} = require('@digix/helpers/lib/helpers'); + const { denominators, dijixDefaultFields, gasLimits, + actionableStatus, + proposalStages, + proposalVotingStages, } = require('./constants'); const getServerSignatures = function (req) { @@ -359,6 +366,82 @@ const getTxConfigs = function () { }; }; +const getCurrentActionableStatus = function (proposal, user) { + if (!proposal || !user) return actionableStatus.NONE; + + const currentTime = getCurrentTimestamp(); + if ( + proposal.stage === proposalStages.IDEA + && user.isModerator + ) { + return actionableStatus.AWAITING_ENDORSEMENT; + } + if ( + proposal.votingStage === proposalVotingStages.DRAFT + && currentTime > proposal.draftVoting.startTime + && currentTime < proposal.draftVoting.votingDeadline + && user.isModerator + ) { + return actionableStatus.MODERATOR_VOTING; + } + if ( + proposal.votingStage === proposalVotingStages.DRAFT + && currentTime > proposal.draftVoting.votingDeadline + && user.address === proposal.proposer + ) { + return actionableStatus.CLAIM_VOTING; + } + if ( + proposal.votingStage === proposalVotingStages.COMMIT + && currentTime > proposal.votingRounds[proposal.currentVotingRound].startTime + && currentTime < proposal.votingRounds[proposal.currentVotingRound].commitDeadline + && (user.isModerator || user.isParticipant) + ) { + return actionableStatus.COMMIT_PHASE; + } + if ( + proposal.votingStage === proposalVotingStages.COMMIT + && currentTime > proposal.votingRounds[proposal.currentVotingRound].commitDeadline + && currentTime < proposal.votingRounds[proposal.currentVotingRound].revealDeadline + && (user.isModerator || user.isParticipant) + ) { + return actionableStatus.REVEAL_PHASE; + } + if ( + proposal.votingStage === proposalVotingStages.COMMIT + && currentTime > proposal.votingRounds[proposal.currentVotingRound].revealDeadline + && user.address === proposal.proposer + ) { + return actionableStatus.CLAIM_VOTING; + } + if ( + proposal.stage === proposalStages.ONGOING + && proposal.claimableFunding !== null + && proposal.claimableFunding !== undefined + && proposal.claimableFunding !== '0' + && user.address === proposal.proposer + ) { + return actionableStatus.CLAIM_FUNDING; + } + if ( + proposal.isActive + && currentTime > proposal.votingRounds[0].startTime + && currentTime < proposal.votingRounds[0].commitDeadline + && (user.isModerator || user.isParticipant) + ) { + return actionableStatus.COMMIT_PHASE; + } + if ( + proposal.isActive + && currentTime > proposal.votingRounds[0].commitDeadline + && currentTime < proposal.votingRounds[0].revealDeadline + && (user.isModerator || user.isParticipant) + ) { + return actionableStatus.REVEAL_PHASE; + } + return actionableStatus.NONE; +}; + module.exports = { sumArray, sumArrayBN, @@ -386,4 +469,5 @@ module.exports = { getDefaultDijixFields, getAdditionalDocs, getTxConfigs, + getCurrentActionableStatus, }; diff --git a/routes/proposals.js b/routes/proposals.js index 8ea77ef..debbfd0 100644 --- a/routes/proposals.js +++ b/routes/proposals.js @@ -34,7 +34,7 @@ router.get('/count', async (req, res) => { if (!result[proposal.stage]) result[proposal.stage] = 0; result[proposal.stage] += 1; } - result[proposalStages.PROPOSAL] += specialProposalsCount; + result[proposalStages.PROPOSAL] = result[proposalStages.PROPOSAL] ? result[proposalStages.PROPOSAL] + specialProposalsCount : specialProposalsCount; return res.json({ result }); }); @@ -45,11 +45,11 @@ router.get('/details/:id', async (req, res) => { }); router.get('/:stage', async (req, res) => { - const filter = (req.params.stage === 'all') ? {} : { stage: req.params.stage }; + const filter = (req.params.stage === 'all') ? {} : { stage: req.params.stage.toUpperCase() }; const proposals = await getProposals(filter); let specialProposals = []; if ( - req.params.stage === proposalStages.PROPOSAL + req.params.stage.toUpperCase() === proposalStages.PROPOSAL || req.params.stage === 'all' ) { specialProposals = await getSpecialProposals(); diff --git a/scripts/proposals.js b/scripts/proposals.js index 41f8614..11ab3c7 100644 --- a/scripts/proposals.js +++ b/scripts/proposals.js @@ -89,7 +89,7 @@ const refreshProposalNew = async (res) => { proposal.stage = proposalStages.IDEA; proposal.timeCreated = proposalDetails[readProposalIndices.timeCreated].toNumber(); proposal.finalVersionIpfsDoc = proposalDetails[readProposalIndices.finalVersionIpfsDoc]; - proposal.prl = proposalDetails[readProposalIndices.prl]; + proposal.prl = readProposalPRLActions.NEW; proposal.isDigix = proposalDetails[readProposalIndices.isDigix]; proposal.claimableFunding = 0; proposal.currentMilestone = -1; @@ -159,7 +159,7 @@ const refreshProposalDetails = async (res) => { proposal.endorser = proposalDetails[readProposalIndices.endorser]; proposal.timeCreated = proposalDetails[readProposalIndices.timeCreated].toNumber(); proposal.finalVersionIpfsDoc = proposalDetails[readProposalIndices.finalVersionIpfsDoc]; - proposal.prl = proposalDetails[readProposalIndices.prl]; + proposal.prl = proposalDetails[readProposalIndices.prl] ? readProposalPRLActions.PAUSED : readProposalPRLActions.NEW; proposal.isDigix = proposalDetails[readProposalIndices.isDigix]; const nVersions = proposalDetails[readProposalIndices.nVersions]; @@ -733,6 +733,7 @@ const refreshProposalSpecialNew = async (res) => { proposal.timeCreated = readProposal[readSpecialProposalIndices.timeCreated].toNumber(); proposal.isActive = false; proposal.isSpecial = true; + proposal.prl = readProposalPRLActions.NEW; proposal.stage = proposalStages.PROPOSAL; proposal.uintConfigs = {}; proposal.addressConfigs = {}; diff --git a/types/proposal.js b/types/proposal.js index de4dd8f..cd810f3 100644 --- a/types/proposal.js +++ b/types/proposal.js @@ -1,9 +1,105 @@ const { gql } = require('apollo-server-express'); -const { ofOne } = require('../helpers/utils'); -const { denominators } = require('../helpers/constants'); +const { + ofOne, + getCurrentActionableStatus, +} = require('../helpers/utils'); + +const { + denominators, + actionableStatus, +} = require('../helpers/constants'); const typeDef = gql` + enum ProposalPrlEnum { + # If PRL stops proposal + STOPPED + + # If PRL pauses proposal + PAUSED + + # If no action has been taken + # the proposal is active + ACTIVE + } + + enum ProposalStageEnum { + # Idea phase + IDEA + + # Draft phase + DRAFT + + # Proposal phase + PROPOSAL + + # Ongoing phase + ONGOING + + # Review phase + REVIEW + + # Archived phase + # After a proposal is completed all rounds + # Or if it failed voting in any round + # Or the proposer closed the proposal + # Or the founder closed the proposal after deadline + ARCHIVED + } + + enum ProposalVotingStageEnum { + # Draft Voting stage + DRAFT + + # Commit voting stage + COMMIT + + # Reveal voting stage + REVEAL + + # No voting stage going on + NONE + } + + enum ActionableStatusEnum { + # No actionable status + # Or there is no user context + NONE + + # Proposal awaits endorsement + # is displayed to the moderators + AWAITING_ENDORSEMENT + + # Proposal is in moderator voting phase + # is displayed to the moderators + MODERATOR_VOTING + + # Proposal is in commit voting phase + # is displayed to every participant + COMMIT_PHASE + + # Proposal is in reveal vote phase + # is displayed to every participant + REVEAL_PHASE + + # Funds can be claimed for this proposal + # is displayed only to the proposer of this proposal + CLAIM_FUNDING + + # Voting result can be claimed for this proposal + # is displayed only to the proposer of this proposal + CLAIM_VOTING + } + + # Proposal actionable status for a proposal + type ProposalActionableObject { + # Proposal ID + proposalId: String + + # Action that can be done by the current user + actionableStatus: String + } + # Voting rounds for proposal voting type Milestone { # Index ID @@ -233,7 +329,7 @@ const typeDef = gql` endorser: EthAddress # The current stage of the proposal - stage: String + stage: ProposalStageEnum # A flag to indicate the proposal is by the Digix isDigix: Boolean @@ -281,13 +377,13 @@ const typeDef = gql` finalVersionIpfsDoc: String # See 'Proposal.isPrl' - prl: Boolean + prl: ProposalPrlEnum # Proposal's claimable funding claimableFunding: BigNumber # Current voting stage - votingStage: String + votingStage: ProposalVotingStageEnum # For special proposals, the title of the proposal title: String @@ -300,6 +396,9 @@ const typeDef = gql` # Special proposal config changes uintConfigs: UintConfig + + # Any actionable status + actionableStatus: ActionableStatusEnum } `; @@ -354,6 +453,12 @@ const resolvers = { claimableFunding(proposal) { return eth(proposal.claimableFunding); }, + actionableStatus(proposal, _args, context, _info) { + if (!context.currentUser) { + return actionableStatus.NONE; + } + return (proposal.actionableStatus || getCurrentActionableStatus(proposal, context.currentUser)); + }, proposalVersions(proposal) { return (proposal.proposalVersions || []).map((version, index) => ({ id: `${proposal.proposalId}/VERSION-${index}`, @@ -361,7 +466,6 @@ const resolvers = { })); }, }, - }; module.exports = { resolvers, typeDef }; From 659e4d73984dd5af921abcf56df60c59f8054c61 Mon Sep 17 00:00:00 2001 From: Francis Murillo <44824731+FrancisMurilloDigix@users.noreply.github.com> Date: Tue, 14 May 2019 14:31:00 +0800 Subject: [PATCH 10/16] [fix] Fix actionableStatus enum suffixes (#41) --- helpers/constants.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helpers/constants.js b/helpers/constants.js index ff4ea01..df7df46 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -141,9 +141,9 @@ const proposalVotingStages = { const actionableStatus = { NONE: 'NONE', AWAITING_ENDORSEMENT: 'AWAITING_ENDORSEMENT', - MODERATOR_VOTING: 'MODERATOR_VOTING_ACTIVE', - COMMIT_PHASE: 'COMMIT_PHASE_ACTIVE', - REVEAL_PHASE: 'REVEAL_PHASE_ACTIVE', + MODERATOR_VOTING: 'MODERATOR_VOTING', + COMMIT_PHASE: 'COMMIT_PHASE', + REVEAL_PHASE: 'REVEAL_PHASE', CLAIM_FUNDING: 'CLAIM_FUNDING', CLAIM_VOTING: 'CLAIM_VOTING', }; From 825c3fbfcc67dd808652fd455367c115e933aaf5 Mon Sep 17 00:00:00 2001 From: mrenoon Date: Thu, 16 May 2019 17:20:55 +0800 Subject: [PATCH 11/16] add changes from staging --- .eslintrc | 1 + dbWrapper/mongoUtil.js | 2 +- development.config.js | 1 + helpers/constants.js | 3 +++ helpers/utils.js | 6 ++++++ package.json | 4 ++-- scripts/kyc.js | 2 +- staging.config.js | 3 ++- web3Wrapper/web3Util.js | 3 ++- 9 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.eslintrc b/.eslintrc index 570f3de..51ee0fa 100644 --- a/.eslintrc +++ b/.eslintrc @@ -20,6 +20,7 @@ rules: no-restricted-syntax: 0 guard-for-in: 0 import/no-extraneous-dependencies: 0 + import/no-dynamic-require: 0 no-use-before-define: 0 no-param-reassign: 0 no-plusplus: 0 diff --git a/dbWrapper/mongoUtil.js b/dbWrapper/mongoUtil.js index a790d2f..06b7813 100644 --- a/dbWrapper/mongoUtil.js +++ b/dbWrapper/mongoUtil.js @@ -6,7 +6,7 @@ const { collections, } = require('../helpers/constants'); -const keystore = require('../keystore/kyc-admin.json'); +const keystore = require(process.env.KYC_ADMIN_KEYSTORE_PATH); let _db; diff --git a/development.config.js b/development.config.js index 0d6417d..ed56a7c 100644 --- a/development.config.js +++ b/development.config.js @@ -28,6 +28,7 @@ module.exports = { RESYNC: process.env.RESYNC, REPROCESS_ONLY: process.env.REPROCESS_ONLY, SYNC_REPORT_FREQUENCY: 10, + KYC_ADMIN_KEYSTORE_PATH: '../keystore/kyc-admin.json', KYC_ADMIN_PASSWORD: 'digixdao', FORUM_ADMIN_ADDRESS: '0x52a9d38687a0c2d5e1645f91733ffab3bbd29b06', DGD_CONTRACT: '0x36376d6e66f20a2f5377a91a5e6ce37b53dda0d8', diff --git a/helpers/constants.js b/helpers/constants.js index df7df46..5036f49 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -354,5 +354,8 @@ module.exports = { daoServerEndpoints, daoServerEventTypes, gasLimits, +<<<<<<< HEAD actionableStatus, +======= +>>>>>>> staging }; diff --git a/helpers/utils.js b/helpers/utils.js index 3256cb4..9b9ffe3 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -9,9 +9,12 @@ const { denominators, dijixDefaultFields, gasLimits, +<<<<<<< HEAD actionableStatus, proposalStages, proposalVotingStages, +======= +>>>>>>> staging } = require('./constants'); const getServerSignatures = function (req) { @@ -469,5 +472,8 @@ module.exports = { getDefaultDijixFields, getAdditionalDocs, getTxConfigs, +<<<<<<< HEAD getCurrentActionableStatus, +======= +>>>>>>> staging }; diff --git a/package.json b/package.json index 7324985..0940d65 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "dev:force": "rm -f out.log && FORCE_REFRESH_DB=true pm2 start development.config.js && tail -f out.log", "dev:resync": "rm -f out.log && RESYNC=true pm2 start development.config.js && tail -f out.log", "dev:reprocess": "rm -f out.log && REPROCESS_ONLY=true pm2 start development.config.js && tail -f out.log", - "staging": "pm2 start staging.config.js", + "staging": "FORCE_REFRESH_DB=false RESYNC=false pm2 start staging.config.js", "staging:force": "FORCE_REFRESH_DB=true pm2 start staging.config.js", - "staging:resync": "RESYNC=true pm2 start staging.config.js", + "staging:resync": "FORCE_REFRESH_DB=false RESYNC=true pm2 start staging.config.js", "staging:reprocess": "REPROCESS_ONLY=true pm2 start staging.config.js", "test": "echo \"Error: no test specified\" && exit 1", "db": "mongod --dbpath db --port 12702", diff --git a/scripts/kyc.js b/scripts/kyc.js index 118bcbd..ce428dd 100644 --- a/scripts/kyc.js +++ b/scripts/kyc.js @@ -28,7 +28,7 @@ const { notifyDaoServer, } = require('./notifier'); -const keystore = require('../keystore/kyc-admin.json'); +const keystore = require(process.env.KYC_ADMIN_KEYSTORE_PATH); const _getCallData = (entry) => { return getContracts() diff --git a/staging.config.js b/staging.config.js index 7723302..d473f2f 100644 --- a/staging.config.js +++ b/staging.config.js @@ -21,12 +21,13 @@ module.exports = { RESYNC: process.env.RESYNC, REPROCESS_ONLY: process.env.REPROCESS_ONLY, SYNC_REPORT_FREQUENCY: 10, - WEB3_HTTP_PROVIDER: 'https://kovan.digixdev.com', + WEB3_HTTP_PROVIDER: 'https://kovan.infura.io/v3/0bc82d401f644369afdbed5b5590fe28', IPFS_ENDPOINT: 'https://ipfs-api.digix.global', HTTP_ENDPOINT: 'https://ipfs.digix.global/ipfs', IPFS_TIMEOUT: 60000, CRON_PROCESS_KYC_FREQUENCY: 5, CRON_WATCH_BLOCKS_FREQUENCY: 5, + KYC_ADMIN_KEYSTORE_PATH: process.env.KYC_ADMIN_KEYSTORE_PATH, KYC_ADMIN_PASSWORD: 'digixdao-kovan', FORUM_ADMIN_ADDRESS: '0x369d674039d64519af688f4c6f9608552207bdab', DGD_CONTRACT: '0x3bbba4b50468ead87cfc90a31c2768b7bf4d26e1', diff --git a/web3Wrapper/web3Util.js b/web3Wrapper/web3Util.js index e926c56..1f1249e 100644 --- a/web3Wrapper/web3Util.js +++ b/web3Wrapper/web3Util.js @@ -1,6 +1,7 @@ const Web3 = require('web3'); const Wallet = require('ethereumjs-wallet'); -const keystore = require('../keystore/kyc-admin.json'); + +const keystore = require(process.env.KYC_ADMIN_KEYSTORE_PATH); let _web3; let _bufferPK; From a4314997783bd08d11767c9667103f73eef65e73 Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Fri, 24 May 2019 16:12:04 +0800 Subject: [PATCH 12/16] price info and remaining funds (Needed for DGDG-561) --- app.js | 2 + cacheWrapper/cacheUtil.js | 32 + development.config.js | 1 + helpers/constants.js | 3 - helpers/utils.js | 7 +- package-lock.json | 1474 ++++++++++++++++++------------------- package.json | 1 + routes/index.js | 9 + scripts/blocks.js | 6 + scripts/dao.js | 9 + scripts/prices.js | 29 + 11 files changed, 805 insertions(+), 768 deletions(-) create mode 100644 cacheWrapper/cacheUtil.js create mode 100644 scripts/prices.js diff --git a/app.js b/app.js index a9c4f44..8c6a059 100644 --- a/app.js +++ b/app.js @@ -13,6 +13,7 @@ const { const mongoUtil = require('./dbWrapper/mongoUtil'); const dijixUtil = require('./dijixWrapper/dijixUtil'); const web3Util = require('./web3Wrapper/web3Util'); +const cacheUtil = require('./cacheWrapper/cacheUtil'); const { initContracts, @@ -105,6 +106,7 @@ const init = async () => { console.log('INFOLOG: init'); await initDB(); await initIpfs(); + cacheUtil.init(); app.use('/', routes); diff --git a/cacheWrapper/cacheUtil.js b/cacheWrapper/cacheUtil.js new file mode 100644 index 0000000..67fb970 --- /dev/null +++ b/cacheWrapper/cacheUtil.js @@ -0,0 +1,32 @@ +const NodeCache = require('node-cache'); + +const _cache = {}; + +const init = (options = {}) => { + _cache.cache = new NodeCache(options); +}; + +const store = (key, value) => { + _cache.cache.set(key, value); +}; + +const fetchMany = (keys) => { + const values = _cache.cache.mget(keys); + return values; +}; + +const fetch = (key) => { + try { + const value = _cache.cache.get(key, true); + return value; + } catch (err) { + console.log(err); + } +}; + +module.exports = { + init, + store, + fetch, + fetchMany, +}; diff --git a/development.config.js b/development.config.js index ed56a7c..49c5bba 100644 --- a/development.config.js +++ b/development.config.js @@ -17,6 +17,7 @@ module.exports = { CRON_WATCH_BLOCKS_FREQUENCY: 5, WEB3_HTTP_PROVIDER: 'http://localhost:8545', DAO_SERVER_URL: 'http://localhost:3005', + PRICEFEED_SERVER: 'https://datafeed.digix.global', SERVER_SECRET: 'this-is-a-secret-between-dao-and-info-server', RATE_LIMIT_WINDOW_MS: 60 * 1000, RATE_LIMIT_PER_WINDOW: 10, diff --git a/helpers/constants.js b/helpers/constants.js index 5036f49..df7df46 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -354,8 +354,5 @@ module.exports = { daoServerEndpoints, daoServerEventTypes, gasLimits, -<<<<<<< HEAD actionableStatus, -======= ->>>>>>> staging }; diff --git a/helpers/utils.js b/helpers/utils.js index 9b9ffe3..ba6fdec 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -9,12 +9,9 @@ const { denominators, dijixDefaultFields, gasLimits, -<<<<<<< HEAD actionableStatus, proposalStages, proposalVotingStages, -======= ->>>>>>> staging } = require('./constants'); const getServerSignatures = function (req) { @@ -265,6 +262,7 @@ const deserializeDaoInfo = function (daoInfo) { if (daoInfo === null) return daoInfo; daoInfo.totalLockedDgds = ofOne(daoInfo.totalLockedDgds, denominators.DGD); daoInfo.totalModeratorLockedDgds = ofOne(daoInfo.totalModeratorLockedDgds, denominators.DGD); + daoInfo.remainingFunds = ofOne(daoInfo.remainingFunds, denominators.ETH); return daoInfo; }; @@ -472,8 +470,5 @@ module.exports = { getDefaultDijixFields, getAdditionalDocs, getTxConfigs, -<<<<<<< HEAD getCurrentActionableStatus, -======= ->>>>>>> staging }; diff --git a/package-lock.json b/package-lock.json index bce9672..e9628ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,17 +5,17 @@ "requires": true, "dependencies": { "@apollographql/apollo-tools": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.3.5.tgz", - "integrity": "sha512-5ySiiNT2EIwxGKWyoAOnibCPUXvbxKOVxiPMK4uIXmvF+qbGNleQWP+vekciiAmCCESPmGd5szscRwDm4G/NNg==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.3.7.tgz", + "integrity": "sha512-+ertvzAwzkYmuUtT8zH3Zi6jPdyxZwOgnYaZHY7iLnMVJDhQKWlkyjLMF8wyzlPiEdDImVUMm5lOIBZo7LkGlg==", "requires": { - "apollo-env": "0.4.0" + "apollo-env": "0.5.1" } }, "@apollographql/graphql-playground-html": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz", - "integrity": "sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ==" + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.18.tgz", + "integrity": "sha512-7HGC1hQ0Aj93z2kv8h4RBtYClkiccj+F2Juh1m74Pky7D9tJDsQ4eBlaNNn0jMxGAL6EuaGwBN46EA9JtBMRog==" }, "@babel/code-frame": { "version": "7.0.0", @@ -107,21 +107,12 @@ "ganache-cli": "6.4.1", "openzeppelin-solidity": "1.12.0", "truffle": "4.1.15", - "web3-utils": "1.0.0-beta.48" + "web3-utils": "1.0.0-beta.55" }, "dependencies": { "@babel/runtime": { - "version": "7.3.4", - "bundled": true, - "requires": { - "regenerator-runtime": "0.12.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.12.1", - "bundled": true - } - } + "version": "", + "bundled": true }, "@digix/bitcore-mnemonic": { "version": "1.5.2", @@ -156,7 +147,7 @@ "tar.gz": "1.0.7", "toml": "2.3.6", "tomlify-j0.4": "1.0.4", - "truffle-config": "1.1.6", + "truffle-config": "1.1.12", "truffle-resolver": "3.0.1" } }, @@ -171,7 +162,7 @@ "elliptic": "3.1.0", "ethereumjs-tx": "1.3.7", "ethereumjs-util": "5.2.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "scrypt-async": "1.3.1", "tweetnacl": "0.13.2", "web3": "0.20.2" @@ -186,7 +177,7 @@ "bundled": true, "requires": { "base64-js": "1.3.0", - "ieee754": "1.1.12", + "ieee754": "1.1.13", "isarray": "1.0.0" } }, @@ -307,7 +298,7 @@ "debug": "3.2.6", "graphlib": "2.1.7", "solc": "0.4.25", - "truffle-config": "1.1.6", + "truffle-config": "1.1.12", "truffle-contract-sources": "0.0.2", "truffle-error": "0.0.3", "truffle-expect": "0.0.4" @@ -341,11 +332,11 @@ "version": "4.11.4", "bundled": true, "requires": { - "@types/node": "10.14.1" + "@types/node": "10.14.7" } }, "@types/node": { - "version": "10.14.1", + "version": "10.14.7", "bundled": true }, "abstract-leveldown": { @@ -981,7 +972,7 @@ "babel-plugin-transform-regenerator": "6.26.0", "browserslist": "3.2.8", "invariant": "2.2.4", - "semver": "5.6.0" + "semver": "5.7.0" } }, "babel-register": { @@ -1292,8 +1283,8 @@ "version": "3.2.8", "bundled": true, "requires": { - "caniuse-lite": "1.0.30000950", - "electron-to-chromium": "1.3.116" + "caniuse-lite": "1.0.30000971", + "electron-to-chromium": "1.3.137" } }, "bs58": { @@ -1308,7 +1299,7 @@ "bundled": true, "requires": { "base64-js": "1.3.0", - "ieee754": "1.1.12" + "ieee754": "1.1.13" } }, "buffer-alloc": { @@ -1375,7 +1366,7 @@ "bundled": true }, "caniuse-lite": { - "version": "1.0.30000950", + "version": "1.0.30000971", "bundled": true }, "canvas": { @@ -1907,7 +1898,7 @@ "bundled": true }, "electron-to-chromium": { - "version": "1.3.116", + "version": "1.3.137", "bundled": true }, "elliptic": { @@ -2016,7 +2007,6 @@ "imurmurhash": "0.1.4", "inquirer": "3.3.0", "is-resolvable": "1.1.0", - "js-yaml": "3.12.2", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.11", @@ -2029,7 +2019,7 @@ "progress": "2.0.3", "regexpp": "1.1.0", "require-uncached": "1.0.3", - "semver": "5.6.0", + "semver": "5.7.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.2", @@ -2370,7 +2360,7 @@ "version": "1.4.2", "bundled": true, "requires": { - "ethereumjs-abi": "0.6.6", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", "ethereumjs-util": "5.2.0" } }, @@ -2379,7 +2369,7 @@ "bundled": true }, "ethereumjs-abi": { - "version": "0.6.6", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", "bundled": true, "requires": { "bn.js": "4.11.8", @@ -2388,13 +2378,14 @@ "dependencies": { "ethereumjs-util": { "version": "6.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "requires": { "bn.js": "4.11.8", "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", "secp256k1": "3.6.2" } @@ -2406,7 +2397,7 @@ "bundled": true, "requires": { "ethereumjs-util": "5.2.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2" } }, @@ -2451,7 +2442,7 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", "secp256k1": "3.6.2" } @@ -2492,7 +2483,7 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", "secp256k1": "3.6.2" } @@ -2507,7 +2498,7 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", "secp256k1": "3.6.2" } @@ -2518,7 +2509,7 @@ "version": "4.0.0-beta.1", "bundled": true, "requires": { - "@types/node": "10.14.1", + "@types/node": "10.14.7", "aes-js": "3.0.0", "bn.js": "4.11.8", "elliptic": "6.3.3", @@ -3459,7 +3450,7 @@ } }, "ieee754": { - "version": "1.1.12", + "version": "1.1.13", "bundled": true }, "ignore": { @@ -3836,14 +3827,6 @@ "version": "3.0.2", "bundled": true }, - "js-yaml": { - "version": "3.12.2", - "bundled": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" - } - }, "jsbn": { "version": "0.1.1", "bundled": true @@ -4300,7 +4283,7 @@ "levelup": "1.3.9", "memdown": "1.4.1", "readable-stream": "2.3.6", - "rlp": "2.2.2", + "rlp": "2.2.3", "semaphore": "1.1.0" }, "dependencies": { @@ -4637,7 +4620,7 @@ "requires": { "hosted-git-info": "2.7.1", "resolve": "1.10.0", - "semver": "5.6.0", + "semver": "5.7.0", "validate-npm-package-license": "3.0.4" } }, @@ -5013,8 +4996,7 @@ "bundled": true, "requires": { "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "react-is": "16.8.4" + "object-assign": "4.1.1" } }, "protocol-buffers-schema": { @@ -5129,10 +5111,6 @@ "unpipe": "1.0.0" } }, - "react-is": { - "version": "16.8.4", - "bundled": true - }, "read-pkg": { "version": "1.1.0", "bundled": true, @@ -5307,7 +5285,7 @@ } }, "rlp": { - "version": "2.2.2", + "version": "2.2.3", "bundled": true, "requires": { "bn.js": "4.11.8", @@ -5446,7 +5424,7 @@ "bundled": true }, "semver": { - "version": "5.6.0", + "version": "5.7.0", "bundled": true }, "send": { @@ -5596,7 +5574,7 @@ "fs-extra": "0.30.0", "memorystream": "0.3.1", "require-from-string": "1.2.1", - "semver": "5.6.0", + "semver": "5.7.0", "yargs": "4.8.1" } }, @@ -6031,7 +6009,7 @@ } }, "truffle-config": { - "version": "1.1.6", + "version": "1.1.12", "bundled": true, "requires": { "configstore": "4.0.0", @@ -6039,19 +6017,21 @@ "lodash": "4.17.11", "original-require": "1.0.1", "truffle-error": "0.0.4", - "truffle-provider": "0.1.5" + "truffle-provider": "0.1.9" }, "dependencies": { "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { "locate-path": "2.0.0" } }, "truffle-error": { "version": "0.0.4", - "bundled": true + "resolved": "https://registry.npmjs.org/truffle-error/-/truffle-error-0.0.4.tgz", + "integrity": "sha512-hER0TNR4alBIhUp7SNrZRRiZtM/MBx+xBdM9qXP0tC3YASFmhNAxPuOyB8JDHFRNbDx12K7nvaqmyYGsI5c8BQ==" } } }, @@ -6106,22 +6086,41 @@ "version": "0.0.4", "bundled": true }, + "truffle-interface-adapter": { + "version": "0.1.2", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "web3": "1.0.0-beta.37" + } + }, "truffle-provider": { - "version": "0.1.5", + "version": "0.1.9", "bundled": true, "requires": { "truffle-error": "0.0.4", + "truffle-interface-adapter": "0.1.5", "web3": "1.0.0-beta.37" }, "dependencies": { "truffle-error": { "version": "0.0.4", - "bundled": true + "resolved": "https://registry.npmjs.org/truffle-error/-/truffle-error-0.0.4.tgz", + "integrity": "sha512-hER0TNR4alBIhUp7SNrZRRiZtM/MBx+xBdM9qXP0tC3YASFmhNAxPuOyB8JDHFRNbDx12K7nvaqmyYGsI5c8BQ==" + }, + "truffle-interface-adapter": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/truffle-interface-adapter/-/truffle-interface-adapter-0.1.5.tgz", + "integrity": "sha512-TbKD7oUdz/0GqeR4PStNoad4uwKkHtZMUQQH+Xyy5acVZxBCJ7uTGwYVaOvtxeAITaX5zxeyhjlU8IKyrnd4QA==", + "requires": { + "bn.js": "4.11.8", + "web3": "1.0.0-beta.37" + } } } }, "truffle-provisioner": { - "version": "0.1.2", + "version": "0.1.4", "bundled": true }, "truffle-resolver": { @@ -6131,7 +6130,7 @@ "async": "2.6.1", "truffle-contract": "2.0.5", "truffle-expect": "0.0.3", - "truffle-provisioner": "0.1.2" + "truffle-provisioner": "0.1.4" }, "dependencies": { "truffle-expect": { @@ -6769,29 +6768,43 @@ } }, "web3-utils": { - "version": "1.0.0-beta.48", + "version": "1.0.0-beta.55", "bundled": true, "requires": { - "@babel/runtime": "7.3.4", + "@babel/runtime": "7.4.5", "@types/bn.js": "4.11.4", - "@types/node": "10.14.1", + "@types/node": "10.14.7", "bn.js": "4.11.8", "eth-lib": "0.2.8", "ethjs-unit": "0.1.6", "lodash": "4.17.11", "number-to-bn": "1.7.0", - "randomhex": "0.1.5", + "randombytes": "2.1.0", "utf8": "2.1.1" }, "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "0.13.2" + } + }, "eth-lib": { "version": "0.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "requires": { "bn.js": "4.11.8", "elliptic": "6.4.1", "xhr-request-promise": "0.1.2" } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" } } }, @@ -7001,7 +7014,7 @@ "awaiting": "3.0.0", "babel-plugin-transform-runtime": "6.23.0", "babel-runtime": "6.26.0", - "commander": "2.19.0", + "commander": "2.20.0", "get-installed-path": "3.0.3", "ipfs-api": "14.3.7", "isomorphic-fetch": "2.2.1" @@ -7019,7 +7032,7 @@ "elliptic": "3.1.0", "ethereumjs-tx": "1.3.7", "ethereumjs-util": "5.2.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "scrypt-async": "1.3.1", "tweetnacl": "0.13.2", "web3": "0.20.2" @@ -7079,7 +7092,7 @@ "awaiting": "3.0.0", "ethereumjs-testrpc": "3.9.2", "openzeppelin-solidity": "1.8.0", - "solc": "0.4.25" + "solc": "0.4.26" } }, "@digix/multi-hash": { @@ -7140,7 +7153,7 @@ "requires": { "continuation-local-storage": "3.2.1", "log-driver": "1.2.7", - "semver": "5.6.0", + "semver": "5.7.0", "shimmer": "1.2.1", "uuid": "3.3.2" } @@ -7161,7 +7174,7 @@ "requires": { "continuation-local-storage": "3.2.1", "log-driver": "1.2.7", - "semver": "5.6.0", + "semver": "5.7.0", "shimmer": "1.2.1", "uuid": "3.3.2" } @@ -7169,9 +7182,9 @@ } }, "@pm2/agent": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-0.5.23.tgz", - "integrity": "sha512-mviwkRt51y3wY161uxiqXc0wyHTjgo+sIkJ/Mh6m400dYAnAGQ12LFlK56EbnQRwPfPog0q6txqncbFpn4L5zA==", + "version": "0.5.25", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-0.5.25.tgz", + "integrity": "sha512-MeIPvxcWq2VTCDedF0jnLrvt4OIWWMTnXPsCLmPWp2oWG2OR3d6gLsrXCN1NO7Oo39LBjZbS5ckOaiBpJuqM9w==", "requires": { "async": "2.6.2", "chalk": "2.4.2", @@ -7181,7 +7194,8 @@ "nssocket": "0.6.0", "pm2-axon": "3.3.0", "pm2-axon-rpc": "0.5.1", - "semver": "5.6.0", + "proxy-agent": "3.1.0", + "semver": "5.7.0", "ws": "5.2.2" }, "dependencies": { @@ -7222,14 +7236,14 @@ } }, "@pm2/agent-node": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@pm2/agent-node/-/agent-node-1.1.8.tgz", - "integrity": "sha512-R5X6P+eZM9wVxix5HzJnoAo0F0JCnu9kJcPfscCKx+gVFw69VjmvXxTHGejYNMokrkIGQ+BIJQ2+/uGnLFvi3w==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@pm2/agent-node/-/agent-node-1.1.9.tgz", + "integrity": "sha512-DEtMFWr7B6uYl/8pxH3+q6hk+D1eavfeojDmkdk68w0s7CHb7pPDffkaRgRVPnl85Yw4i66IHYzLVb8NGy09lw==", "requires": { "debug": "3.2.6", "eventemitter2": "5.0.1", - "proxy-agent": "3.0.3", - "ws": "6.2.0" + "proxy-agent": "3.1.0", + "ws": "6.2.1" }, "dependencies": { "debug": { @@ -7248,18 +7262,18 @@ } }, "@pm2/io": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-4.1.2.tgz", - "integrity": "sha512-AS4eIjcBGac+hxq2c1Rb9jaXIn3VBv998vhACi6yD9RLb9+jUZ4Ezs6FsIg2i4rfMoiBn3b9DewjCfLGqhYB4g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-4.2.1.tgz", + "integrity": "sha512-WoOqkWzXyH7ftpFFVVUT3YPosmvvVLfPMWTHY53HxVWEM8cALX63aAZLXneB4r76nK5bAaV5VEDE6fHpbDuQCw==", "requires": { "@opencensus/core": "0.0.9", "@opencensus/propagation-b3": "0.0.8", - "@pm2/agent-node": "1.1.8", + "@pm2/agent-node": "1.1.9", "async": "2.6.2", "debug": "3.1.0", "event-loop-inspector": "1.2.2", "eventemitter2": "5.0.1", - "require-in-the-middle": "3.0.0", + "require-in-the-middle": "4.0.0", "semver": "5.5.0", "shimmer": "1.2.1", "signal-exit": "3.0.2", @@ -7282,9 +7296,9 @@ } }, "@pm2/js-api": { - "version": "0.5.53", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.5.53.tgz", - "integrity": "sha512-ddlBUhB2tP6wQRygICdz/W/2XRA4fL0ituw8jBheS0QdVM4tVD2hmELl3ABVx63+AMOOydvGSIflNku1IxKFvw==", + "version": "0.5.57", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.5.57.tgz", + "integrity": "sha512-sfD7+yWo2YHvnNWz+cYSHEI7p8O/bqsAtRylDxJSfhTljcUTH+nOvBAqrZoKEhkimcXoDPvFVEPgj2j2l7Jr6Q==", "requires": { "async": "2.6.2", "axios": "0.16.2", @@ -7369,7 +7383,7 @@ "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", "requires": { - "@types/node": "11.11.3" + "@types/node": "12.0.2" } }, "@types/body-parser": { @@ -7378,7 +7392,7 @@ "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "requires": { "@types/connect": "3.4.32", - "@types/node": "11.11.3" + "@types/node": "12.0.2" } }, "@types/connect": { @@ -7386,13 +7400,13 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", "requires": { - "@types/node": "11.11.3" + "@types/node": "12.0.2" } }, "@types/cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.4.tgz", - "integrity": "sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-GmK8AKu8i+s+EChK/uZ5IbrXPcPaQKWaNSGevDT/7o3gFObwSUQwqb1jMqxuo+YPvj0ckGzINI+EO7EHcmJjKg==", "requires": { "@types/express": "4.16.1" } @@ -7408,16 +7422,16 @@ "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", "requires": { "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.16.2", + "@types/express-serve-static-core": "4.16.5", "@types/serve-static": "1.13.2" } }, "@types/express-serve-static-core": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.2.tgz", - "integrity": "sha512-qgc8tjnDrc789rAQed8NoiFLV5VGcItA4yWNFphqGU0RcuuQngD00g3LHhWIK3HQ2XeDgVCmlNPDlqi3fWBHnQ==", + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.5.tgz", + "integrity": "sha512-T8oej2B9TVALoCK4epWXRNWaFaqDyOaEQ3ntph+tSw5QoKnZfxgCXefIm3+nGp2XCRrkX4X7U5CSTMnwKJcOjQ==", "requires": { - "@types/node": "11.11.3", + "@types/node": "12.0.2", "@types/range-parser": "1.2.3" } }, @@ -7432,9 +7446,9 @@ "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" }, "@types/node": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", - "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==" + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", + "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==" }, "@types/range-parser": { "version": "1.2.3", @@ -7446,7 +7460,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", "requires": { - "@types/express-serve-static-core": "4.16.2", + "@types/express-serve-static-core": "4.16.5", "@types/mime": "2.0.1" } }, @@ -7456,7 +7470,7 @@ "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", "requires": { "@types/events": "3.0.0", - "@types/node": "11.11.3" + "@types/node": "12.0.2" } }, "abbrev": { @@ -7498,12 +7512,12 @@ } }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "2.1.22", - "negotiator": "0.6.1" + "mime-types": "2.1.24", + "negotiator": "0.6.2" } }, "acorn": { @@ -7633,83 +7647,95 @@ } }, "apollo-cache-control": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.5.2.tgz", - "integrity": "sha512-uehXDUrd3Qim+nzxqqN7XT1YTbNSyumW3/FY5BxbKZTI8d4oPG4eyVQKqaggooSjswKQnOoIQVes3+qg9tGAkw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.6.0.tgz", + "integrity": "sha512-66aCF6MHe0/FdD3knphwTv6CCIdb1ZxrMsiRpxP474qqyYVe2jAwBu6aJBn4emffZHZ7i6gp9dY6cPHThjnbKA==", "requires": { - "apollo-server-env": "2.2.0", - "graphql-extensions": "0.5.4" - }, - "dependencies": { - "graphql-extensions": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.5.4.tgz", - "integrity": "sha512-qLThJGVMqcItE7GDf/xX/E40m/aeqFheEKiR5bfra4q5eHxQKGjnIc20P9CVqjOn9I0FkEiU9ypOobfmIf7t6g==", - "requires": { - "@apollographql/apollo-tools": "0.3.5" - } - } + "apollo-server-env": "2.3.0", + "graphql-extensions": "0.6.0" } }, "apollo-datasource": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.3.1.tgz", - "integrity": "sha512-qdEUeonc9pPZvYwXK36h2NZoT7Pddmy0HYOzdV0ON5pcG1YtNmUyyYi83Q60V5wTWjuaCjyJ9hOY6wr0BMvQuA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.4.0.tgz", + "integrity": "sha512-6QkgnLYwQrW0qv+yXIf617DojJbGmza2XJXUlgnzrGGhxzfAynzEjaLyYkc8rYS1m82vjrl9EOmLHTcnVkvZAQ==", "requires": { - "apollo-server-caching": "0.3.1", - "apollo-server-env": "2.2.0" + "apollo-server-caching": "0.4.0", + "apollo-server-env": "2.3.0" } }, "apollo-engine-reporting": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.0.7.tgz", - "integrity": "sha512-mFsXvd+1/o5jSa9tI2RoXYGcvCLcwwcfLwchjSTxqUd4ViB8RbqYKynzEZ+Omji7PBRM0azioBm43f7PSsQPqA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.1.0.tgz", + "integrity": "sha512-Dj0BwgcluHL0QVUaquhAoYoLX9Z4DRP/n2REcIwO8d2iy52r+1wN5QqZLx97dEFh7CjhNjTWeysJzc8XMWKa1Q==", "requires": { - "apollo-engine-reporting-protobuf": "0.2.1", - "apollo-graphql": "0.1.3", - "apollo-server-core": "2.4.8", - "apollo-server-env": "2.2.0", + "apollo-engine-reporting-protobuf": "0.3.0", + "apollo-graphql": "0.2.1-register.1", + "apollo-server-core": "2.5.0", + "apollo-server-env": "2.3.0", "async-retry": "1.2.3", - "graphql-extensions": "0.5.7" + "graphql-extensions": "0.6.0" } }, "apollo-engine-reporting-protobuf": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.2.1.tgz", - "integrity": "sha512-5pYR84uWeylRS2OJowtkTczT3bWTwOErWtfnkRKccUi/wZ/AZJBP+D5HKNzM7xoFcz9XvrJyS+wBTz1oBi0Jiw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.3.0.tgz", + "integrity": "sha512-PYowpx/E+TJT/8nKpp3JmJuKh3x1SZcxDF6Cquj0soV205TUpFFCZQMi91i5ACiEp2AkYvM/GDBIrw+rfIwzTg==", "requires": { "protobufjs": "6.8.8" } }, "apollo-env": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.4.0.tgz", - "integrity": "sha512-TZpk59RTbXd8cEqwmI0KHFoRrgBRplvPAP4bbRrX4uDSxXvoiY0Y6tQYUlJ35zi398Hob45mXfrZxeRDzoFMkQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.5.1.tgz", + "integrity": "sha512-fndST2xojgSdH02k5hxk1cbqA9Ti8RX4YzzBoAB4oIe1Puhq7+YlhXGXfXB5Y4XN0al8dLg+5nAkyjNAR2qZTw==", "requires": { - "core-js": "3.0.0-beta.13", - "node-fetch": "2.3.0", + "core-js": "3.1.2", + "node-fetch": "2.6.0", "sha.js": "2.4.11" }, "dependencies": { "core-js": { - "version": "3.0.0-beta.13", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.13.tgz", - "integrity": "sha512-16Q43c/3LT9NyePUJKL8nRIQgYWjcBhjJSMWg96PVSxoS0PeE0NHitPI3opBrs9MGGHjte1KoEVr9W63YKlTXQ==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.2.tgz", + "integrity": "sha512-3poRGjbu56leCtZCZCzCgQ7GcKOflDFnjWIepaPFUsM0IXUBrne10sl3aa2Bkcz3+FjRdIxBe9dAMhIJmEnQNA==" }, "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" } } }, "apollo-graphql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.1.3.tgz", - "integrity": "sha512-bYgDh71jFfHKO9ioGlxnnoSYgpNp6LRl+/QHTx6tktQEN0Z+AdpkOKFNCHO/pRU/4vSqV5wuIhxhnCecxJQrMA==", + "version": "0.2.1-register.1", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.2.1-register.1.tgz", + "integrity": "sha512-Z2LOuvYomC9CN9K+mpFVcVQu6Ml5PIJlV+YOkGzFq73xeqWg1InxHqI3eEdCEhxTJq6H8rlWT8ATrMS+4sIhqw==", "requires": { - "apollo-env": "0.4.0", + "apollo-env": "0.4.1-register.1", "lodash.sortby": "4.7.0" + }, + "dependencies": { + "apollo-env": { + "version": "0.4.1-register.1", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.4.1-register.1.tgz", + "integrity": "sha512-fg1US7YZ6yW1N0tFq8g4HpCR3eJZmI+rIiHDiknYN9D1MTjvwYdmXYhi7VaPvQ21hV5nMRvfBUMqYXjP+6FsGQ==", + "requires": { + "core-js": "3.0.0-beta.13", + "node-fetch": "2.6.0", + "sha.js": "2.4.11" + } + }, + "core-js": { + "version": "3.0.0-beta.13", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.13.tgz", + "integrity": "sha512-16Q43c/3LT9NyePUJKL8nRIQgYWjcBhjJSMWg96PVSxoS0PeE0NHitPI3opBrs9MGGHjte1KoEVr9W63YKlTXQ==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } } }, "apollo-link": { @@ -7717,28 +7743,28 @@ "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.11.tgz", "integrity": "sha512-PQvRCg13VduLy3X/0L79M6uOpTh5iHdxnxYuo8yL7sJlWybKRJwsv4IcRBJpMFbChOOaHY7Og9wgPo6DLKDKDA==", "requires": { - "apollo-utilities": "1.2.1", - "ts-invariant": "0.3.2", + "apollo-utilities": "1.3.0", + "ts-invariant": "0.3.3", "tslib": "1.9.3", "zen-observable-ts": "0.8.18" } }, "apollo-server": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.4.8.tgz", - "integrity": "sha512-IU6RekO2dqrDdC+5hU6aeVvGg/2t/f01inBMjDhAn1a7hoITUXEh8Sa57TgmYEZ5uAtDuWW7cdiZN2j0cMI3/w==", - "requires": { - "apollo-server-core": "2.4.8", - "apollo-server-express": "2.4.8", - "express": "4.16.4", - "graphql-subscriptions": "1.0.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.5.0.tgz", + "integrity": "sha512-85A3iAnXVP5QiXc0xvAJRyGsoxov06+8AzttKqehR4Q50UC1Is62xY5WZk58oW7fm+awpqh+sXB2F2E6tObSmg==", + "requires": { + "apollo-server-core": "2.5.0", + "apollo-server-express": "2.5.0", + "express": "4.17.0", + "graphql-subscriptions": "1.1.0", "graphql-tools": "4.0.4" } }, "apollo-server-caching": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.3.1.tgz", - "integrity": "sha512-mfxzikYXbB/OoEms77AGYwRh7FF3Oim5v5XWAL+VL49FrkbZt5lopVa4bABi7Mz8Nt3Htl9EBJN8765s/yh8IA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.4.0.tgz", + "integrity": "sha512-GTOZdbLhrSOKYNWMYgaqX5cVNSMT0bGUTZKV8/tYlyYmsB6ey7l6iId3Q7UpHS6F6OR2lstz5XaKZ+T3fDfPzQ==", "requires": { "lru-cache": "5.1.1" }, @@ -7759,110 +7785,100 @@ } }, "apollo-server-core": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.4.8.tgz", - "integrity": "sha512-N+5UOzHhMOnHizEiArJtNvEe/cGhSHQyTn5tlU4RJ36FDBJ/WlYZfPbGDMLISSUCJ6t+aP8GLL4Mnudt9d2PDQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.5.0.tgz", + "integrity": "sha512-7hyQ/Rt0hC38bUfxMQmLNHDBIGEBykFWo9EO0W+3o/cno/SqBKd1KKichrABVv+v+SCvZAUutX6gYS5l3G+ULQ==", "requires": { - "@apollographql/apollo-tools": "0.3.5", - "@apollographql/graphql-playground-html": "1.6.6", + "@apollographql/apollo-tools": "0.3.7", + "@apollographql/graphql-playground-html": "1.6.18", "@types/ws": "6.0.1", - "apollo-cache-control": "0.5.2", - "apollo-datasource": "0.3.1", - "apollo-engine-reporting": "1.0.7", - "apollo-server-caching": "0.3.1", - "apollo-server-env": "2.2.0", - "apollo-server-errors": "2.2.1", - "apollo-server-plugin-base": "0.3.7", - "apollo-tracing": "0.5.2", + "apollo-cache-control": "0.6.0", + "apollo-datasource": "0.4.0", + "apollo-engine-reporting": "1.1.0", + "apollo-server-caching": "0.4.0", + "apollo-server-env": "2.3.0", + "apollo-server-errors": "2.3.0", + "apollo-server-plugin-base": "0.4.0", + "apollo-tracing": "0.6.0", "fast-json-stable-stringify": "2.0.0", - "graphql-extensions": "0.5.7", - "graphql-subscriptions": "1.0.0", + "graphql-extensions": "0.6.0", + "graphql-subscriptions": "1.1.0", "graphql-tag": "2.10.1", "graphql-tools": "4.0.4", - "graphql-upload": "8.0.4", + "graphql-upload": "8.0.6", "sha.js": "2.4.11", "subscriptions-transport-ws": "0.9.16", - "ws": "6.2.0" + "ws": "6.2.1" } }, "apollo-server-env": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.2.0.tgz", - "integrity": "sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.3.0.tgz", + "integrity": "sha512-WIwlkCM/gir0CkoYWPMTCH8uGCCKB/aM074U1bKayvkFOBVO2VgG5x2kgsfkyF05IMQq2/GOTsKhNY7RnUEhTA==", "requires": { - "node-fetch": "2.3.0", + "node-fetch": "2.6.0", "util.promisify": "1.0.0" }, "dependencies": { "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" } } }, "apollo-server-errors": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.2.1.tgz", - "integrity": "sha512-wY/YE3iJVMYC+WYIf8QODBjIP4jhI+oc7kiYo9mrz7LdYPKAgxr/he+NteGcqn/0Ea9K5/ZFTGJDbEstSMeP8g==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.3.0.tgz", + "integrity": "sha512-rUvzwMo2ZQgzzPh2kcJyfbRSfVKRMhfIlhY7BzUfM4x6ZT0aijlgsf714Ll3Mbf5Fxii32kD0A/DmKsTecpccw==" }, "apollo-server-express": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.4.8.tgz", - "integrity": "sha512-i60l32mfVe33jnKDPNYgUKUKu4Al0xEm2HLOSMgtJ9Wbpe/MbOx5X8M5F27fnHYdM+G5XfAErsakAyRGnQJ48Q==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.5.0.tgz", + "integrity": "sha512-2gd3VWIqji2jyDYMTTqKzVU4/znjEjugtLUmPgVl5SoBvJSMTsO7VgJv+roBubZGDK8jXXUEXr2a33RtIeHe4g==", "requires": { - "@apollographql/graphql-playground-html": "1.6.6", + "@apollographql/graphql-playground-html": "1.6.18", "@types/accepts": "1.3.5", "@types/body-parser": "1.17.0", - "@types/cors": "2.8.4", + "@types/cors": "2.8.5", "@types/express": "4.16.1", - "accepts": "1.3.5", - "apollo-server-core": "2.4.8", - "body-parser": "1.18.3", + "accepts": "1.3.7", + "apollo-server-core": "2.5.0", + "body-parser": "1.19.0", "cors": "2.8.5", - "graphql-subscriptions": "1.0.0", + "graphql-subscriptions": "1.1.0", "graphql-tools": "4.0.4", - "type-is": "1.6.16" + "type-is": "1.6.18" } }, "apollo-server-plugin-base": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.3.7.tgz", - "integrity": "sha512-hW1jaLKf9qNOxMTwRq2CSqz3eqXsZuEiCc8/mmEtOciiVBq1GMtxFf19oIYM9HQuPvQU2RWpns1VrYN59L3vbg==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.4.0.tgz", + "integrity": "sha512-iD7ARNtwnvHGd1EMPK0CuodM8d8hgDvFwTfIDzJY04QIQ6/KrBFaWhnCXJsy+HMb47GovwBbq67IK6eb2WJgBg==" }, "apollo-tracing": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.5.2.tgz", - "integrity": "sha512-2FdwRvPIq9uuF6OzONroXep6VBGqzHOkP6LlcFQe7SdwxfRP+SD/ycHNSC1acVg2b8d+am9Kzqg2vV54UpOIKA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.6.0.tgz", + "integrity": "sha512-OpYPHVBgcQ/HT2WLXJQWwhilzR1rrl01tZeMU2N7yinsp/oyKngF5aUSMtuvX1k/T3abilQo+w10oAQlBCGdPA==", "requires": { - "apollo-server-env": "2.2.0", - "graphql-extensions": "0.5.4" - }, - "dependencies": { - "graphql-extensions": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.5.4.tgz", - "integrity": "sha512-qLThJGVMqcItE7GDf/xX/E40m/aeqFheEKiR5bfra4q5eHxQKGjnIc20P9CVqjOn9I0FkEiU9ypOobfmIf7t6g==", - "requires": { - "@apollographql/apollo-tools": "0.3.5" - } - } + "apollo-server-env": "2.3.0", + "graphql-extensions": "0.6.0" } }, "apollo-utilities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.2.1.tgz", - "integrity": "sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.0.tgz", + "integrity": "sha512-wQjV+FdWcTWmWUFlChG5rS0vHKy5OsXC6XlV9STRstQq6VbXANwHy6DHnTEQAfLXWAbNcPgBu+nBUpR3dFhwrA==", "requires": { "fast-json-stable-stringify": "2.0.0", - "ts-invariant": "0.2.1", + "ts-invariant": "0.4.2", "tslib": "1.9.3" }, "dependencies": { "ts-invariant": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz", - "integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.2.tgz", + "integrity": "sha512-PTAAn8lJPEdRBJJEs4ig6MVZWfO12yrFzV7YaPslmyhG7+4MA279y4BXT3f72gXeVl0mC1aAWq2rMX4eKTWU/Q==", "requires": { "tslib": "1.9.3" } @@ -7891,7 +7907,7 @@ "dev": true, "requires": { "ast-types-flow": "0.0.7", - "commander": "2.19.0" + "commander": "2.20.0" } }, "arr-diff": { @@ -7958,9 +7974,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz", - "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.1.tgz", + "integrity": "sha512-b+EeK0WlzrSmpMw5jktWvQGxblpWnvMrV+vOp69RLjzGiHwWV0vgq75DPKtUjppKni3yWwSW8WLGV3Ch/XIWcQ==" }, "ast-types-flow": { "version": "0.0.7", @@ -7983,9 +7999,9 @@ } }, "async-each": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", - "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, "async-eventemitter": { "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", @@ -8003,7 +8019,7 @@ "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", "requires": { - "semver": "5.6.0", + "semver": "5.7.0", "shimmer": "1.2.1" } }, @@ -8563,7 +8579,7 @@ "babel-plugin-transform-regenerator": "6.26.0", "browserslist": "3.2.8", "invariant": "2.2.4", - "semver": "5.6.0" + "semver": "5.7.0" } }, "babel-register": { @@ -8573,7 +8589,7 @@ "requires": { "babel-core": "6.26.3", "babel-runtime": "6.26.0", - "core-js": "2.6.5", + "core-js": "2.6.8", "home-or-tmp": "2.0.0", "lodash": "4.17.11", "mkdirp": "0.5.1", @@ -8585,7 +8601,7 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.6.5", + "core-js": "2.6.8", "regenerator-runtime": "0.11.1" } }, @@ -8666,7 +8682,7 @@ "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", - "component-emitter": "1.2.1", + "component-emitter": "1.3.0", "define-property": "1.0.0", "isobject": "3.0.1", "mixin-deep": "1.3.1", @@ -8754,9 +8770,9 @@ "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "bindings": { "version": "1.5.0", @@ -8843,51 +8859,20 @@ "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=" }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "1.0.4", "debug": "2.6.9", "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "1.6.16" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.5.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "1.6.18" } }, "boxen": { @@ -9023,8 +9008,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "requires": { - "caniuse-lite": "1.0.30000950", - "electron-to-chromium": "1.3.116" + "caniuse-lite": "1.0.30000971", + "electron-to-chromium": "1.3.137" } }, "bs58": { @@ -9056,7 +9041,7 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "1.3.0", - "ieee754": "1.1.12", + "ieee754": "1.1.13", "isarray": "1.0.0" } }, @@ -9105,17 +9090,17 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "busboy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.0.tgz", - "integrity": "sha512-e+kzZRAbbvJPLjQz2z+zAyr78BSi9IFeBTyLwF76g78Q2zRt/RZ1NtS3MS17v2yLqYfLz69zHdC+1L4ja8PwqQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", "requires": { "dicer": "0.3.0" } }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cache-base": { "version": "1.0.1", @@ -9123,7 +9108,7 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { "collection-visit": "1.0.0", - "component-emitter": "1.2.1", + "component-emitter": "1.3.0", "get-value": "2.0.6", "has-value": "1.0.0", "isobject": "3.0.1", @@ -9134,9 +9119,9 @@ } }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -9145,16 +9130,16 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "caniuse-lite": { - "version": "1.0.30000950", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000950.tgz", - "integrity": "sha512-Cs+4U9T0okW2ftBsCIHuEYXXkki7mjXmjCh4c6PzYShk04qDEr76/iC7KwhLoWoY65wcra1XOsRD+S7BptEb5A==" + "version": "1.0.30000971", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz", + "integrity": "sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==" }, "canvas": { "version": "1.6.13", "resolved": "https://registry.npmjs.org/canvas/-/canvas-1.6.13.tgz", "integrity": "sha512-XAfzfEOHZ3JIPjEV+WSI6PpISgUta3dgmndWbsajotz+0TQOX/jDpp2kawjRERatOGv9sMMzk5auB3GKEKA6hg==", "requires": { - "nan": "2.13.1" + "nan": "2.14.0" } }, "capture-stack-trace": { @@ -9199,18 +9184,18 @@ } }, "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "requires": { "anymatch": "2.0.0", - "async-each": "1.0.2", + "async-each": "1.0.3", "braces": "2.3.2", - "fsevents": "1.2.7", + "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", - "is-glob": "4.0.0", + "is-glob": "4.0.1", "normalize-path": "3.0.0", "path-is-absolute": "1.0.1", "readdirp": "2.2.1", @@ -9229,7 +9214,7 @@ "requires": { "class-is": "1.1.0", "multibase": "0.6.0", - "multicodec": "0.5.0", + "multicodec": "0.5.1", "multihashes": "0.4.14" } }, @@ -9360,22 +9345,22 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "1.0.0" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", @@ -9413,9 +9398,12 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -9440,9 +9428,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -9460,9 +9448,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.8.tgz", + "integrity": "sha512-RWlREFU74TEkdXzyl1bka66O3kYp8jeTXrvJZDzVVMH8AiHUSOFpL1yfhQJ+wHocAm1m+4971W1PPzfLuCv1vg==" }, "core-util-is": { "version": "1.0.2", @@ -9519,11 +9507,11 @@ } }, "cron": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.0.tgz", - "integrity": "sha512-I7S7ES2KZtKPfBTGJ5Brc6X23apE71fgYU/PC5ayh8R6VhECpqvTLe/LTkwAEN3ERFzNKXlWzh/PkwsGg3vkDQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.1.tgz", + "integrity": "sha512-gmMB/pJcqUVs/NklR1sCGlNYM7TizEw+1gebz20BMc/8bTm/r7QUp3ZPSPlG8Z5XRlvb7qhjEjq/+bdIfUCL2A==", "requires": { - "moment-timezone": "0.5.23" + "moment-timezone": "0.5.25" } }, "cross-spawn": { @@ -9557,9 +9545,9 @@ "integrity": "sha1-lQL18BVKLVoioCPnn3HMk2+m728=" }, "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", "dev": true }, "dashdash": { @@ -9571,17 +9559,17 @@ } }, "data-uri-to-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz", - "integrity": "sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz", + "integrity": "sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==", "requires": { - "@types/node": "8.10.44" + "@types/node": "8.10.48" }, "dependencies": { "@types/node": { - "version": "8.10.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.44.tgz", - "integrity": "sha512-HY3SK7egERHGUfY8p6ztXIEQWcIPHouYhCGcLAPQin7gE2G/fALFz+epnMwcxKUS6aKqTVoAFdi+t1llQd3xcw==" + "version": "8.10.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz", + "integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==" } } }, @@ -9651,7 +9639,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "1.1.0" + "object-keys": "1.1.1" } }, "define-property": { @@ -9701,7 +9689,7 @@ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", "requires": { - "ast-types": "0.12.2", + "ast-types": "0.13.1", "escodegen": "1.11.1", "esprima": "3.1.3" } @@ -9835,9 +9823,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==" + "version": "1.3.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.137.tgz", + "integrity": "sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw==" }, "elliptic": { "version": "6.4.1", @@ -9919,7 +9907,7 @@ "has": "1.0.3", "is-callable": "1.1.4", "is-regex": "1.0.4", - "object-keys": "1.1.0" + "object-keys": "1.1.1" } }, "es-to-primitive": { @@ -9981,9 +9969,9 @@ } }, "eslint": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.3.tgz", - "integrity": "sha512-vMGi0PjCHSokZxE0NLp2VneGw5sio7SSiDNgIUn2tC0XkWJRNOIoHIg3CliLVfXnJsiHxGAYrkw0PieAu8+KYQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "7.0.0", @@ -10000,13 +9988,13 @@ "esutils": "2.0.2", "file-entry-cache": "5.0.1", "functional-red-black-tree": "1.0.1", - "glob": "7.1.3", - "globals": "11.11.0", + "glob": "7.1.4", + "globals": "11.12.0", "ignore": "4.0.6", "import-fresh": "3.0.0", "imurmurhash": "0.1.4", - "inquirer": "6.2.2", - "js-yaml": "3.12.2", + "inquirer": "6.3.1", + "js-yaml": "3.13.1", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.11", @@ -10017,10 +10005,10 @@ "path-is-inside": "1.0.2", "progress": "2.0.3", "regexpp": "2.0.1", - "semver": "5.6.0", + "semver": "5.7.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "5.2.3", + "table": "5.4.0", "text-table": "0.2.0" }, "dependencies": { @@ -10058,7 +10046,7 @@ "requires": { "nice-try": "1.0.5", "path-key": "2.0.1", - "semver": "5.6.0", + "semver": "5.7.0", "shebang-command": "1.2.0", "which": "1.3.1" } @@ -10073,9 +10061,9 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "ms": { @@ -10133,13 +10121,13 @@ "dev": true, "requires": { "debug": "2.6.9", - "resolve": "1.10.0" + "resolve": "1.10.1" } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "2.6.9", @@ -10147,21 +10135,22 @@ } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", "dev": true, "requires": { + "array-includes": "3.0.3", "contains-path": "0.1.0", "debug": "2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.3.0", + "eslint-module-utils": "2.4.0", "has": "1.0.3", "lodash": "4.17.11", "minimatch": "3.0.4", "read-pkg-up": "2.0.0", - "resolve": "1.10.0" + "resolve": "1.10.1" }, "dependencies": { "doctrine": { @@ -10243,25 +10232,25 @@ "array-includes": "3.0.3", "ast-types-flow": "0.0.7", "axobject-query": "2.0.2", - "damerau-levenshtein": "1.0.4", + "damerau-levenshtein": "1.0.5", "emoji-regex": "7.0.3", "has": "1.0.3", - "jsx-ast-utils": "2.0.1" + "jsx-ast-utils": "2.1.0" } }, "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz", + "integrity": "sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ==", "dev": true, "requires": { "array-includes": "3.0.3", "doctrine": "2.1.0", "has": "1.0.3", - "jsx-ast-utils": "2.0.1", + "jsx-ast-utils": "2.1.0", "object.fromentries": "2.0.0", "prop-types": "15.7.2", - "resolve": "1.10.0" + "resolve": "1.10.1" }, "dependencies": { "doctrine": { @@ -10381,7 +10370,7 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d8d7fc9cc1fd781186c25676af100d1ec727013e", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", "ethereumjs-util": "5.2.0" } }, @@ -10391,7 +10380,7 @@ "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" }, "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d8d7fc9cc1fd781186c25676af100d1ec727013e", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", "requires": { "bn.js": "4.11.8", "ethereumjs-util": "6.1.0" @@ -10406,9 +10395,9 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } } } @@ -10419,7 +10408,7 @@ "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", "requires": { "ethereumjs-util": "5.2.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2" } }, @@ -10470,9 +10459,9 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } }, "ethereumjs-vm": { @@ -10514,9 +10503,9 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } } } @@ -10530,9 +10519,9 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } } } @@ -10562,9 +10551,9 @@ "create-hash": "1.2.0", "ethjs-util": "0.1.6", "keccak": "1.4.0", - "rlp": "2.2.2", + "rlp": "2.2.3", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } }, "utf8": { @@ -10616,9 +10605,9 @@ "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, "events": { "version": "3.0.0", @@ -10689,63 +10678,46 @@ } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.0.tgz", + "integrity": "sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ==", "requires": { - "accepts": "1.3.5", + "accepts": "1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "1.1.2", "encodeurl": "1.0.2", "escape-html": "1.0.3", "etag": "1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", - "parseurl": "1.3.2", + "parseurl": "1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", - "qs": "6.5.2", - "range-parser": "1.2.0", + "proxy-addr": "2.0.5", + "qs": "6.7.0", + "range-parser": "1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "1.5.0", + "type-is": "1.6.18", "utils-merge": "1.0.1", "vary": "1.1.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } } }, "express-rate-limit": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-3.4.0.tgz", - "integrity": "sha512-SktWQGHhTQfIOZykiVIaoqmHCptqq177fEbumVytWsMpEqe+g78IFrfzivJTimoCdMZ5+vYJ5/a/w1darXMv+A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-3.5.3.tgz", + "integrity": "sha512-V6YEfLt5oNYKIJPBJQeE1xTM6JeeP/e4YXZGPgheo1nF4vtWHUFHmcNsOPxDa9VtIB1zOZ1j1DKScewVetw8Ow==", "requires": { "defaults": "1.0.3" } @@ -10935,24 +10907,17 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "1.0.2", "escape-html": "1.0.3", "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", "unpipe": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } } }, "find-up": { @@ -11033,8 +10998,8 @@ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.22" + "combined-stream": "1.0.8", + "mime-types": "2.1.24" } }, "forwarded": { @@ -11056,9 +11021,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-capacitor": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.1.tgz", - "integrity": "sha512-kyV2oaG1/pu9NPosfGACmBym6okgzyg6hEtA5LSUq0dGpGLe278MVfMwVnSHDA/OBcTCHkPNqWL9eIwbPN6dDg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", + "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" }, "fs-constants": { "version": "1.0.0", @@ -11083,13 +11048,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "optional": true, "requires": { - "nan": "2.13.1", - "node-pre-gyp": "0.10.3" + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" }, "dependencies": { "abbrev": { @@ -11150,11 +11115,11 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.1" } }, "deep-extend": { @@ -11299,34 +11264,34 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "optional": true }, "needle": { - "version": "2.2.4", + "version": "2.3.0", "bundled": true, "optional": true, "requires": { - "debug": "2.6.9", + "debug": "4.1.1", "iconv-lite": "0.4.24", "sax": "1.2.4" } }, "node-pre-gyp": { - "version": "0.10.3", + "version": "0.12.0", "bundled": true, "optional": true, "requires": { "detect-libc": "1.0.3", "mkdirp": "0.5.1", - "needle": "2.2.4", + "needle": "2.3.0", "nopt": "4.0.1", - "npm-packlist": "1.2.0", + "npm-packlist": "1.4.1", "npmlog": "4.1.2", "rc": "1.2.8", "rimraf": "2.6.3", - "semver": "5.6.0", + "semver": "5.7.0", "tar": "4.4.8" } }, @@ -11340,17 +11305,17 @@ } }, "npm-bundled": { - "version": "1.0.5", + "version": "1.0.6", "bundled": true, "optional": true }, "npm-packlist": { - "version": "1.2.0", + "version": "1.4.1", "bundled": true, "optional": true, "requires": { "ignore-walk": "3.0.1", - "npm-bundled": "1.0.5" + "npm-bundled": "1.0.6" } }, "npmlog": { @@ -11464,7 +11429,7 @@ "optional": true }, "semver": { - "version": "5.6.0", + "version": "5.7.0", "bundled": true, "optional": true }, @@ -11609,12 +11574,12 @@ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz", "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==", "requires": { - "data-uri-to-buffer": "2.0.0", + "data-uri-to-buffer": "2.0.1", "debug": "4.1.1", "extend": "3.0.2", "file-uri-to-path": "1.0.0", "ftp": "0.3.10", - "readable-stream": "3.2.0" + "readable-stream": "3.3.0" }, "dependencies": { "debug": { @@ -11631,9 +11596,9 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", "requires": { "inherits": "2.0.3", "string_decoder": "1.1.1", @@ -11665,15 +11630,10 @@ "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", "integrity": "sha1-WZrBkrcYdYJeE6RF86bgURjC90U=" }, - "gkt": { - "version": "https://tgz.pm2.io/gkt-1.0.0.tgz", - "integrity": "sha512-zr6QQnzLt3Ja0t0XI8gws2kn7zV2p0l/D3kreNvS6hFZhVU5g+uY/30l42jbgt0XGcNBEmBDGJR71J692V92tA==", - "optional": true - }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -11775,25 +11735,25 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "graphql": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.1.1.tgz", - "integrity": "sha512-C5zDzLqvfPAgTtP8AUPIt9keDabrdRAqSWjj2OPRKrKxI9Fb65I36s1uCs1UUBFnSWTdO7hyHi7z1ZbwKMKF6Q==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.3.1.tgz", + "integrity": "sha512-FZm7kAa3FqKdXy8YSSpAoTtyDFMIYSpCDOr+3EqlI1bxmtHu+Vv/I2vrSeT1sBOEnEniX3uo4wFhFdS/8XN6gA==", "requires": { "iterall": "1.2.2" } }, "graphql-extensions": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.5.7.tgz", - "integrity": "sha512-HrU6APE1PiehZ46scMB3S5DezSeCATd8v+e4mmg2bqszMyCFkmAnmK6hR1b5VjHxhzt5/FX21x1WsXfqF4FwdQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.6.0.tgz", + "integrity": "sha512-SshzmbD68fHXRv2q3St29olMOxHDLQ5e9TOh+Tz2BYxinrfhjFaPNcEefiK/vF295wW827Y58bdO11Xmhf8J+Q==", "requires": { - "@apollographql/apollo-tools": "0.3.5" + "@apollographql/apollo-tools": "0.3.7" } }, "graphql-subscriptions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz", - "integrity": "sha512-+ytmryoHF1LVf58NKEaNPRUzYyXplm120ntxfPcgOBC7TnK7Tv/4VRHeh4FAR9iL+O1bqhZs4nkibxQ+OA5cDQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", + "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", "requires": { "iterall": "1.2.2" } @@ -11809,19 +11769,19 @@ "integrity": "sha512-chF12etTIGVVGy3fCTJ1ivJX2KB7OSG4c6UOJQuqOHCmBQwTyNgCDuejZKvpYxNZiEx7bwIjrodDgDe9RIkjlw==", "requires": { "apollo-link": "1.2.11", - "apollo-utilities": "1.2.1", + "apollo-utilities": "1.3.0", "deprecated-decorator": "0.1.6", "iterall": "1.2.2", "uuid": "3.3.2" } }, "graphql-upload": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.0.4.tgz", - "integrity": "sha512-jsTfVYXJ5mU6BXiiJ20CUCAcf41ICCQJ2ltwQFUuaFKiY4JhlG99uZZp5S3hbpQ/oA1kS7hz4pRtsnxPCa7Yfg==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.0.6.tgz", + "integrity": "sha512-cBRALMOvGBm2AD6M61b1QbSmKfCLXvgV+Z3wXT2JS1EQwGWQ1g5/sby4J/cpwAaGnq5P2eGp+N3HQI9cSn9Jfg==", "requires": { - "busboy": "0.3.0", - "fs-capacitor": "2.0.1", + "busboy": "0.3.1", + "fs-capacitor": "2.0.4", "http-errors": "1.7.2", "object-path": "0.11.4" } @@ -11920,7 +11880,7 @@ "requires": { "coinstring": "2.3.0", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" } }, "hmac-drbg": { @@ -12029,9 +11989,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { "version": "4.0.6", @@ -12055,7 +12015,7 @@ "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", "dev": true, "requires": { - "parent-module": "1.0.0", + "parent-module": "1.0.1", "resolve-from": "4.0.0" }, "dependencies": { @@ -12097,9 +12057,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { "ansi-escapes": "3.2.0", @@ -12111,7 +12071,7 @@ "lodash": "4.17.11", "mute-stream": "0.0.7", "run-async": "2.3.0", - "rxjs": "6.4.0", + "rxjs": "6.5.2", "string-width": "2.1.1", "strip-ansi": "5.2.0", "through": "2.3.8" @@ -12228,9 +12188,9 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "ipfs-api": { "version": "14.3.7", @@ -12243,7 +12203,7 @@ "concat-stream": "1.6.2", "detect-node": "2.0.4", "flatmap": "0.0.3", - "glob": "7.1.3", + "glob": "7.1.4", "glob-escape": "0.0.2", "ipfs-block": "0.6.1", "ipfs-unixfs": "0.1.16", @@ -12260,7 +12220,7 @@ "peer-info": "0.11.6", "promisify-es6": "1.0.3", "pump": "1.0.3", - "qs": "6.6.0", + "qs": "6.7.0", "readable-stream": "2.3.6", "stream-http": "2.8.3", "streamifier": "0.1.1", @@ -12297,7 +12257,7 @@ "multihashes": "0.4.14", "multihashing-async": "0.4.8", "protons": "1.0.1", - "pull-stream": "3.6.9", + "pull-stream": "3.6.11", "pull-traverse": "1.0.3", "stable": "0.1.8" } @@ -12330,7 +12290,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "1.13.0" + "binary-extensions": "1.13.1" } }, "is-buffer": { @@ -12428,9 +12388,9 @@ "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "2.1.1" } @@ -12610,9 +12570,9 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "1.0.10", @@ -12722,9 +12682,9 @@ } }, "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", + "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", "dev": true, "requires": { "array-includes": "3.0.3" @@ -12737,7 +12697,7 @@ "requires": { "bindings": "1.5.0", "inherits": "2.0.3", - "nan": "2.13.1", + "nan": "2.14.0", "safe-buffer": "5.1.2" } }, @@ -12931,7 +12891,7 @@ "multihashing-async": "0.5.2", "nodeify": "1.0.1", "safe-buffer": "5.1.2", - "secp256k1": "3.6.2" + "secp256k1": "3.7.0" }, "dependencies": { "js-sha3": { @@ -13188,7 +13148,7 @@ "levelup": "1.3.9", "memdown": "1.4.1", "readable-stream": "2.3.6", - "rlp": "2.2.2", + "rlp": "2.2.3", "semaphore": "1.1.0" }, "dependencies": { @@ -13225,21 +13185,21 @@ } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "1.38.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -13324,31 +13284,31 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", - "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", + "version": "0.5.25", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.25.tgz", + "integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==", "requires": { "moment": "2.24.0" } }, "mongodb": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.13.tgz", - "integrity": "sha512-sz2dhvBZQWf3LRNDhbd30KHVzdjZx9IKC0L+kSZ/gzYquCF5zPOgGqRz6sSCqYZtKP2ekB4nfLxhGtzGHnIKxA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.6.tgz", + "integrity": "sha512-qnHc4tjEkHKemuzBq9R7ycYnhFE0Dlpt6+n6suoZp2DcDdqviQ+teloJU24fsOw/PLmr75yGk4mRx/YabjDQEQ==", "requires": { - "mongodb-core": "3.1.11", + "mongodb-core": "3.2.6", "safe-buffer": "5.1.2" } }, "mongodb-core": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.11.tgz", - "integrity": "sha512-rD2US2s5qk/ckbiiGFHeu+yKYDXdJ1G87F6CG3YdaZpzdOm5zpoAZd/EKbPmFO6cQZ+XVXBXBJ660sSI0gc6qg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.6.tgz", + "integrity": "sha512-i+XRVjur9D0ywGF7cFebOUnALnbvMHajdNhhl3TQuopW6QDE655G8CpPeERbqSqfa3rOKEUo08lENDIiBIuAvQ==", "requires": { "bson": "1.1.1", "require_optional": "1.0.1", "safe-buffer": "5.1.2", - "saslprep": "1.0.2" + "saslprep": "1.0.3" } }, "morgan": { @@ -13400,9 +13360,9 @@ } }, "multicodec": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.0.tgz", - "integrity": "sha512-lKsJeT4cKeSq0rVEWhO3oSBgDN4sMY1sNZKlvl68g/ZAahjPS1KIVyF4IqhuYmCdtOyKs4Q4hQ6M0C3iqRnuqQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.1.tgz", + "integrity": "sha512-Q5glyZLdXVbbBxvRYHLQHpu8ydVf1422Z+v9fU47v2JCkiue7n+JcFS7uRv0cQW8hbVtgdtIDgYWPWaIKEXuXA==", "requires": { "varint": "5.0.0" } @@ -13450,9 +13410,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", - "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -13490,19 +13450,34 @@ } }, "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "requires": { - "debug": "2.6.9", + "debug": "3.2.6", "iconv-lite": "0.4.24", "sax": "1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "netmask": { "version": "1.0.6", @@ -13515,6 +13490,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-cache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz", + "integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==", + "requires": { + "clone": "2.1.2", + "lodash": "4.17.11" + } + }, "node-cron": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", @@ -13553,16 +13537,16 @@ } }, "nodemon": { - "version": "1.18.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.10.tgz", - "integrity": "sha512-we51yBb1TfEvZamFchRgcfLbVYgg0xlGbyXmOtbBzDwxwgewYS/YbZ5tnlnsH51+AoSTTsT3A2E/FloUbtH8cQ==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.0.tgz", + "integrity": "sha512-NHKpb/Je0Urmwi3QPDHlYuFY9m1vaVfTsRZG5X73rY46xPj0JpNe8WhUGQdkDXQDOxrBNIU3JrcflE9Y44EcuA==", "requires": { - "chokidar": "2.1.2", + "chokidar": "2.1.6", "debug": "3.2.6", "ignore-by-default": "1.0.1", "minimatch": "3.0.4", "pstree.remy": "1.1.6", - "semver": "5.6.0", + "semver": "5.7.0", "supports-color": "5.5.0", "touch": "3.1.0", "undefsafe": "2.0.2", @@ -13606,8 +13590,8 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "2.7.1", - "resolve": "1.10.0", - "semver": "5.6.0", + "resolve": "1.10.1", + "semver": "5.7.0", "validate-npm-package-license": "3.0.4" } }, @@ -13705,9 +13689,9 @@ "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" }, "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-path": { "version": "0.11.4", @@ -13731,7 +13715,7 @@ "define-properties": "1.1.3", "function-bind": "1.1.1", "has-symbols": "1.0.0", - "object-keys": "1.1.0" + "object-keys": "1.1.1" } }, "object.entries": { @@ -13912,7 +13896,7 @@ "http-proxy-agent": "2.1.0", "https-proxy-agent": "2.2.1", "pac-resolver": "3.0.0", - "raw-body": "2.3.3", + "raw-body": "2.4.0", "socks-proxy-agent": "4.0.2" }, "dependencies": { @@ -13949,9 +13933,9 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { "got": "6.7.1", - "registry-auth-token": "3.3.2", + "registry-auth-token": "3.4.0", "registry-url": "3.1.0", - "semver": "5.6.0" + "semver": "5.7.0" } }, "pako": { @@ -13960,12 +13944,12 @@ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" }, "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "callsites": "3.0.0" + "callsites": "3.1.0" } }, "parse-headers": { @@ -13991,9 +13975,9 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", @@ -14168,40 +14152,38 @@ } }, "pm2": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-3.4.0.tgz", - "integrity": "sha512-BLK3zwrCmfE9I9XEvrGweK+/IEkhVlGENc1fgOH0fJHZc1vneC3v6dUmxz32pmsi9aB4DnrYIeZi46RHd6rO3Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-3.5.1.tgz", + "integrity": "sha512-pDPBetbI48JDynxmtSPNSKRDk/LRbhsHrJ/WSCKVD1TUNnb6XNMe6GzO7DCNijJBvdaQ+u1WxNudxqExlXdhEw==", "requires": { - "@pm2/agent": "0.5.23", - "@pm2/io": "4.1.2", - "@pm2/js-api": "0.5.53", + "@pm2/agent": "0.5.25", + "@pm2/io": "4.2.1", + "@pm2/js-api": "0.5.57", "async": "2.6.2", "blessed": "0.1.81", "chalk": "2.4.2", - "chokidar": "2.1.2", + "chokidar": "2.1.6", "cli-table-redemption": "1.0.1", "commander": "2.15.1", - "cron": "1.7.0", + "cron": "1.7.1", "date-fns": "1.30.1", "debug": "3.2.6", "eventemitter2": "5.0.1", "fclone": "1.0.11", - "gkt": "https://tgz.pm2.io/gkt-1.0.0.tgz", "mkdirp": "0.5.1", "moment": "2.24.0", - "needle": "2.2.4", - "nssocket": "0.6.0", + "needle": "2.4.0", "pidusage": "2.0.17", "pm2-axon": "3.3.0", "pm2-axon-rpc": "0.5.1", "pm2-deploy": "0.4.0", "pm2-multimeter": "0.1.2", "promptly": "2.2.0", - "semver": "5.6.0", + "semver": "5.7.0", "shelljs": "0.8.3", - "source-map-support": "0.5.11", + "source-map-support": "0.5.12", "sprintf-js": "1.1.1", - "v8-compile-cache": "2.0.2", + "v8-compile-cache": "2.0.3", "vizion": "2.0.2", "yamljs": "0.3.0" }, @@ -14248,9 +14230,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", - "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "requires": { "buffer-from": "1.1.1", "source-map": "0.6.1" @@ -14414,7 +14396,7 @@ "requires": { "loose-envify": "1.4.0", "object-assign": "4.1.1", - "react-is": "16.8.4" + "react-is": "16.8.6" }, "dependencies": { "object-assign": { @@ -14441,14 +14423,14 @@ "@protobufjs/pool": "1.1.0", "@protobufjs/utf8": "1.1.0", "@types/long": "4.0.0", - "@types/node": "10.14.1", + "@types/node": "10.14.7", "long": "4.0.0" }, "dependencies": { "@types/node": { - "version": "10.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.1.tgz", - "integrity": "sha512-Rymt08vh1GaW4vYB6QP61/5m/CFLGnFZP++bJpWbiNxceNa6RBipDmb413jvtSf/R1gg5a/jQVl2jY4XVRscEA==" + "version": "10.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", + "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" } } }, @@ -14469,18 +14451,18 @@ } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "requires": { "forwarded": "0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "proxy-agent": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.3.tgz", - "integrity": "sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.0.tgz", + "integrity": "sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA==", "requires": { "agent-base": "4.2.1", "debug": "3.2.6", @@ -14533,9 +14515,9 @@ "integrity": "sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w==" }, "pull-stream": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.9.tgz", - "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==" + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.11.tgz", + "integrity": "sha512-43brwtqO0OSltctKbW1mgzzKH4TNE8egkW+Y4BFzlDWiG2Ayl7VKr4SeuoKacfgPfUWcSwcPlHsf40BEqNR32A==" }, "pull-traverse": { "version": "1.0.3", @@ -14557,9 +14539,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", - "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "randombytes": { "version": "2.1.0", @@ -14570,45 +14552,19 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.5.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } } }, "rc": { @@ -14623,9 +14579,9 @@ } }, "react-is": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", - "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", "dev": true }, "read": { @@ -14684,7 +14640,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "1.10.0" + "resolve": "1.10.1" } }, "regenerate": { @@ -14733,9 +14689,9 @@ } }, "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "requires": { "rc": "1.2.8", "safe-buffer": "5.1.2" @@ -14793,7 +14749,7 @@ "aws-sign2": "0.7.0", "aws4": "1.8.0", "caseless": "0.12.0", - "combined-stream": "1.0.7", + "combined-stream": "1.0.8", "extend": "3.0.2", "forever-agent": "0.6.1", "form-data": "2.3.3", @@ -14802,7 +14758,7 @@ "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.22", + "mime-types": "2.1.24", "oauth-sign": "0.9.0", "performance-now": "2.1.0", "qs": "6.5.2", @@ -14830,12 +14786,28 @@ "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "require-in-the-middle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-3.0.0.tgz", - "integrity": "sha512-rBQkxxboJbUNRMMf5Yi00TeljqBJf6GKJZZAA1M8sElWOZR60sM7UFDAMl7NbHQT2RLzg5mSoUiKU1ZR9+TeTQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-4.0.0.tgz", + "integrity": "sha512-GX12iFhCUzzNuIqvei0dTLUbBEjZ420KTY/MmDxe2GQKPDGyH/wgfGMWFABpnM/M6sLwC3IaSg8A95U6gIb+HQ==", "requires": { + "debug": "4.1.1", "module-details-from-path": "1.0.3", - "resolve": "1.10.0" + "resolve": "1.10.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "require-main-filename": { @@ -14849,13 +14821,13 @@ "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "requires": { "resolve-from": "2.0.0", - "semver": "5.6.0" + "semver": "5.7.0" } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "requires": { "path-parse": "1.0.6" } @@ -14912,7 +14884,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "7.1.3" + "glob": "7.1.4" } }, "ripemd160": { @@ -14925,9 +14897,9 @@ } }, "rlp": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.2.tgz", - "integrity": "sha512-Ng2kJEN731Sfv4ZAY2i0ytPMc0BbJKBsVNl0QZY8LxOWSwd+1xpg+fpSRfaMn0heHU447s6Kgy8qfHZR0XTyVw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.3.tgz", + "integrity": "sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ==", "requires": { "bn.js": "4.11.8", "safe-buffer": "5.1.2" @@ -14973,9 +14945,9 @@ "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "1.9.3" @@ -15013,9 +14985,9 @@ "integrity": "sha1-eDDkV5e1kzKH8fmyj4cZB0ViYvI=" }, "saslprep": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", - "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", "optional": true, "requires": { "sparse-bitfield": "3.0.3" @@ -15041,7 +15013,7 @@ "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", "optional": true, "requires": { - "nan": "2.13.1" + "nan": "2.14.0" } }, "scrypt-async": { @@ -15067,9 +15039,9 @@ } }, "secp256k1": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.6.2.tgz", - "integrity": "sha512-90nYt7yb0LmI4A2jJs1grglkTAXrBwxYAjP9bpeKjvJKOjG2fOeH/YI/lchDMIvjrOasd5QXwvV2jwN168xNng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.0.tgz", + "integrity": "sha512-YlUIghD6ilkMkzmFJpIdVjiamv2S8lNZ9YMwm1XII9JC0NcR5qQiv2DOp/G37sExBtaMStzba4VDJtvBXEbmMQ==", "requires": { "bindings": "1.5.0", "bip66": "1.1.5", @@ -15077,7 +15049,7 @@ "create-hash": "1.2.0", "drbg.js": "1.0.1", "elliptic": "6.4.1", - "nan": "2.13.1", + "nan": "2.14.0", "safe-buffer": "5.1.2" } }, @@ -15087,22 +15059,22 @@ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.6.0" + "semver": "5.7.0" } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "1.1.2", @@ -15111,46 +15083,30 @@ "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "range-parser": "1.2.1", + "statuses": "1.5.0" }, "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.4.0" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "1.0.2", "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" + "parseurl": "1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -15216,7 +15172,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", "requires": { - "glob": "7.1.3", + "glob": "7.1.4", "interpret": "1.2.0", "rechoir": "0.6.2" } @@ -15393,14 +15349,14 @@ } }, "solc": { - "version": "0.4.25", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.25.tgz", - "integrity": "sha512-jU1YygRVy6zatgXrLY2rRm7HW1d7a8CkkEgNJwvH2VLpWhMFsMdWcJn6kUqZwcSz/Vm+w89dy7Z/aB5p6AFTrg==", + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "requires": { "fs-extra": "0.30.0", "memorystream": "0.3.1", "require-from-string": "1.2.1", - "semver": "5.6.0", + "semver": "5.7.0", "yargs": "4.8.1" } }, @@ -15449,7 +15405,7 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "requires": { "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.3" + "spdx-license-ids": "3.0.4" } }, "spdx-exceptions": { @@ -15463,13 +15419,13 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.3" + "spdx-license-ids": "3.0.4" } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" }, "split-string": { "version": "3.1.0", @@ -15634,7 +15590,7 @@ "integrity": "sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==", "requires": { "backo2": "1.0.2", - "eventemitter3": "3.1.0", + "eventemitter3": "3.1.2", "iterall": "1.2.2", "symbol-observable": "1.2.0", "ws": "5.2.2" @@ -15661,9 +15617,9 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", + "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", "dev": true, "requires": { "ajv": "6.10.0", @@ -15715,12 +15671,12 @@ "defined": "1.0.0", "for-each": "0.3.3", "function-bind": "1.1.1", - "glob": "7.1.3", + "glob": "7.1.4", "has": "1.0.3", "inherits": "2.0.3", "minimist": "1.2.0", "object-inspect": "1.6.0", - "resolve": "1.10.0", + "resolve": "1.10.1", "resumer": "0.0.0", "string.prototype.trim": "1.1.2", "through": "2.3.8" @@ -15875,9 +15831,9 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "ts-invariant": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.2.tgz", - "integrity": "sha512-QsY8BCaRnHiB5T6iE4DPlJMAKEG3gzMiUco9FEt1jUXQf0XP6zi0idT0i0rMTu8A326JqNSDsmlkA9dRSh1TRg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.3.tgz", + "integrity": "sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ==", "requires": { "tslib": "1.9.3" } @@ -15914,12 +15870,12 @@ } }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.22" + "mime-types": "2.1.24" } }, "typedarray": { @@ -16142,9 +16098,9 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -16232,7 +16188,7 @@ "readable-stream": "2.3.6", "request": "2.88.0", "semaphore": "1.1.0", - "solc": "0.4.25", + "solc": "0.4.26", "tape": "4.10.1", "xhr": "2.5.0", "xtend": "4.0.1" @@ -16349,9 +16305,9 @@ } }, "ws": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz", - "integrity": "sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { "async-limiter": "1.0.0" } @@ -16416,7 +16372,7 @@ "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", "requires": { "argparse": "1.0.10", - "glob": "7.1.3" + "glob": "7.1.4" } }, "yargs": { @@ -16450,9 +16406,9 @@ } }, "zen-observable": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.13.tgz", - "integrity": "sha512-fa+6aDUVvavYsefZw0zaZ/v3ckEtMgCFi30sn91SEZea4y/6jQp05E3omjkX91zV6RVdn15fqnFZ6RKjRGbp2g==" + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz", + "integrity": "sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g==" }, "zen-observable-ts": { "version": "0.8.18", @@ -16460,7 +16416,7 @@ "integrity": "sha512-q7d05s75Rn1j39U5Oapg3HI2wzriVwERVo4N7uFGpIYuHB9ff02P/E92P9B8T7QVC93jCMHpbXH7X0eVR5LA7A==", "requires": { "tslib": "1.9.3", - "zen-observable": "0.8.13" + "zen-observable": "0.8.14" } } } diff --git a/package.json b/package.json index 0940d65..fc5b216 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "mongodb": "^3.1.8", "morgan": "^1.9.0", "node-cron": "^2.0.1", + "node-cache": "^4.2.0", "nodemon": "^1.18.4", "pm2": "^3.2.2", "postmark": "^1.6.1", diff --git a/routes/index.js b/routes/index.js index 23c469d..da08509 100644 --- a/routes/index.js +++ b/routes/index.js @@ -27,6 +27,10 @@ const { getTxConfigs, } = require('../helpers/utils'); +const { + fetchMany, +} = require('../cacheWrapper/cacheUtil'); + const { counters, denominators, @@ -45,6 +49,11 @@ router.get('/daoInfo', async (req, res) => { return res.json({ result: info }); }); +router.get('/priceInfo', async (req, res) => { + const priceInfo = fetchMany(['ethusd']); + return res.json({ result: priceInfo }); +}); + router.get('/daoConfigs', async (req, res) => { const daoConfigs = deserializeDaoConfigs(await getDaoConfigs()); return res.json({ diff --git a/scripts/blocks.js b/scripts/blocks.js index 06ce774..cc58986 100644 --- a/scripts/blocks.js +++ b/scripts/blocks.js @@ -26,11 +26,16 @@ const { notifyDaoServer, } = require('./notifier'); +const { + updatePrices, +} = require('./prices'); + const { counters, daoServerEndpoints, } = require('../helpers/constants'); + const syncAndProcessToLatestBlock = async (lastProcessedBlock = null) => { console.log('INFOLOG: syncAndProcessToLatestBlock'); await setIsSyncing(true); @@ -84,6 +89,7 @@ const watchNewBlocks = async () => { if (latestBlock > lastSeenBlock) { console.log('INFOLOG: [seen] new blocks = [', lastSeenBlock + 1, ', ', latestBlock, ']'); if (!isUpdatingLatestTxns) _updateLatestTxns(lastSeenBlock, latestBlock); + updatePrices(); } }; diff --git a/scripts/dao.js b/scripts/dao.js index d4c69c1..818aa03 100644 --- a/scripts/dao.js +++ b/scripts/dao.js @@ -16,6 +16,10 @@ const { daoConfigsIndices, } = require('../helpers/constants'); +const { + getWeb3, +} = require('../web3Wrapper/web3Util'); + const initDao = async () => { const daoInfo = await getContracts().daoInformation.readDaoInfo.call(); const totalLockedDgds = await getContracts() @@ -26,6 +30,7 @@ const initDao = async () => { .daoStakeStorage .totalModeratorLockedDGDStake .call(); + const fundsInDao = await getWeb3().eth.getBalance(getContracts().daoFundingManager.address); // don't need to wait for this to be completed await updateDao({ @@ -39,6 +44,7 @@ const initDao = async () => { isGlobalRewardsSet: daoInfo[5], nModerators: daoInfo[6].toNumber(), nParticipants: daoInfo[7].toNumber(), + remainingFunds: fundsInDao.toNumber(), }, }, { upsert: true }); }; @@ -60,6 +66,7 @@ const refreshDaoConfigs = async () => { // which is already handled in the `addresses.js` const refreshDao = async () => { const daoInfo = await getContracts().daoInformation.readDaoInfo.call(); + const fundsInDao = await getWeb3().eth.getBalance(getContracts().daoFundingManager.address); // don't need to wait for this to be completed await updateDao({ $set: { @@ -70,6 +77,7 @@ const refreshDao = async () => { isGlobalRewardsSet: daoInfo[5], nModerators: daoInfo[6].toNumber(), nParticipants: daoInfo[7].toNumber(), + remainingFunds: fundsInDao.toNumber(), }, }); }; @@ -87,6 +95,7 @@ const refreshDaoTemp = async () => { nParticipants: 0, totalLockedDgds: 0, totalModeratorLockedDgds: 0, + remainingFunds: 0, }, }); }; diff --git a/scripts/prices.js b/scripts/prices.js new file mode 100644 index 0000000..733f4e6 --- /dev/null +++ b/scripts/prices.js @@ -0,0 +1,29 @@ +const request = require('request'); + +const { + store, +} = require('../cacheWrapper/cacheUtil'); + +const updatePrices = async () => { + const options = { + baseUrl: process.env.PRICEFEED_SERVER, + url: '/tick/ethusd', + method: 'GET', + strictSSL: true, + headers: { + 'content-type': 'application/json', + }, + }; + + request(options, async function (err, response, body) { + if (err) { + console.log(err); + } + body = JSON.parse(body); + if (body && body.data && body.data.price) store('ethusd', body.data.price); + }); +}; + +module.exports = { + updatePrices, +}; From 5c43cf110a48e36db68d5f62c391f9d1d626e3d4 Mon Sep 17 00:00:00 2001 From: Michael Jimenez Date: Sun, 2 Jun 2019 09:09:18 +0800 Subject: [PATCH 13/16] remove merge conflicts accidentally added --- helpers/constants.js | 3 --- helpers/utils.js | 6 ------ 2 files changed, 9 deletions(-) diff --git a/helpers/constants.js b/helpers/constants.js index 5036f49..df7df46 100644 --- a/helpers/constants.js +++ b/helpers/constants.js @@ -354,8 +354,5 @@ module.exports = { daoServerEndpoints, daoServerEventTypes, gasLimits, -<<<<<<< HEAD actionableStatus, -======= ->>>>>>> staging }; diff --git a/helpers/utils.js b/helpers/utils.js index 9b9ffe3..3256cb4 100644 --- a/helpers/utils.js +++ b/helpers/utils.js @@ -9,12 +9,9 @@ const { denominators, dijixDefaultFields, gasLimits, -<<<<<<< HEAD actionableStatus, proposalStages, proposalVotingStages, -======= ->>>>>>> staging } = require('./constants'); const getServerSignatures = function (req) { @@ -472,8 +469,5 @@ module.exports = { getDefaultDijixFields, getAdditionalDocs, getTxConfigs, -<<<<<<< HEAD getCurrentActionableStatus, -======= ->>>>>>> staging }; From 31155a88e076a172c724a94c9e29914ef024b495 Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Tue, 2 Jul 2019 09:50:28 +0800 Subject: [PATCH 14/16] Open source documentation (#45) * [wip] documentation for info-server * repository structure * instructions to start infoserver * contribution guidelines * architecture image --- CODE_OF_CONDUCT.md | 76 ++++++++++++ CONTRIBUTING.md | 81 +++++++++++++ LICENSE.md | 31 +++++ README.md | 211 ++++++--------------------------- docs/digixdao-architecture.png | Bin 0 -> 48015 bytes package.json | 18 +-- 6 files changed, 233 insertions(+), 184 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 docs/digixdao-architecture.png diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..09827eb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1fba325 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,81 @@ +# Contributing to Info Server + +We only accept pull request that is assigned an accepted issue. By +participating in this project, you agree to abide by the [code of +conduct](./CODE_OF_CONDUCT.md "code of conduct"). + +## Submitting a Pull Request +1. Fork this repository +2. Create a feature branch based of `develop` branch +3. Implement your feature or bug fix +4. Add, commit, and push your changes +5. Submit a pull request + +### Considerations + +- If needed, update documentation or behaviors +- If possible, avoid installing dependencies and if so use an exact + version `x.y.z` instead of using semantic version +- As much as possible, squash commits before filing a PR + +# Development +## Dependency + +Before setting up Info server, remember to start a ganache RPC client and deploy the [DigixDAO smart contracts](https://github.com/dao-contracts). + +Aside from setting up this server, remember to start this server before +[dao-server](https://github.com/DigixGlobal/dao-server "dao-server") +and all its dependencies since Info server sends requests to `dao-server`. + +## Code Structure +* `dbWrapper/` + + Wrapper functions to read/write to MongoDB + +* `dijixWrapper/` + + Wrapper functions to fetch documents from IPFS + +* `cacheWrapper/` + + Wrapper functions to read/write to cache + +* `routes/` + + API endpoints for DigixDAO. These are sub-divided into `proposals`, `transactions` and `kyc`, and the rest are placed in `index.js` + +* `scripts/` + + This is where most of the business logic has been implemented + + * `watchedFunctions.js` + + Includes the list of the functions from DigixDAO smart contracts that are being watched by Info-server. This also includes broadcasting of GraphQL subscriptions. + + * `blocks.js` + + Info-server queries to check if any new blocks have been mined. If yes, it fetches all transactions from those blocks, filters them to only the transactions that are of interest (`watchedFunctionsList` in `helpers/constants.js`) and add these transactions to the database. `blocks.js` includes the logic to watch for new blocks. + + * `transactions.js` + + This includes the logic for filtering from transactions in new blocks. This also calls the respective functions from `proposals.js`, `addresses.js` and `dao.js`, depending on the state transition brought about by that specific transaction. + + * `proposals.js` + + Includes the logic to implement transition of a DigixDAO project between states. + + * `addresses.js` + + Includes the logic to update any information related to a DigixDAO participant/moderator, or their stakes/votes. + + * `dao.js` + + Includes the logic to update the generic state of DigixDAO, which covers configuration values, DigixDAO timeline, total DGDs staked in the contracts and so on. + + * `notifier.js` + + This script contains the logic to communicate with DigixDAO's [DAO Server](https://github.com/dao-server), which also includes the HMAC logic. + +* `types/` + + The code in this directory contains the GraphQL schemas, types and resolvers. These are then used in the `graphql.js` file, that includes the queries, mutations and subscriptions. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..2a860fe --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,31 @@ +# LICENSE + +The code in this repository is licensed under the [BSD-3 Clause](https://opensource.org/licenses/BSD-3-Clause). + +Copyright (c) 2019, DIGIXGLOBAL PRIVATE LIMITED +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 81cf691..fe7537d 100644 --- a/README.md +++ b/README.md @@ -1,189 +1,50 @@ -### Outline of server structure: [link](OUTLINE.md) +# Info Server +Info-server is a NodeJS server responsible for maintaining an off-chain replica of the DigixDAO storage contracts. Essentially, it watches for newly mined Ethereum blocks and updates its own database. -### SETUP INSTRUCTIONS -Please refer [HERE](https://gist.github.com/roynalnaruto/52f2be795f256ed7b0f156666108f8fc). The Info-server runs together with [DigixDAO contracts](https://github.com/DigixGlobal/dao-contracts/tree/dev-info-server) and [Dao-server](https://github.com/DigixGlobal/dao-server/tree/dev) +### Setup +##### Prerequisites +* [MongoDB](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition-using-deb-packages) +* [Ganache](https://github.com/trufflesuite/ganache-cli) (Ethereum RPC client for development/testing) +* [DigixDAO Contracts](https://github.com/DigixGlobal/dao-contracts) -### Setup: -* Install MongoDB: https://docs.mongodb.com/manual/administration/install-on-linux/ -* Make sure `mongod` is running: +##### Run info-server +* Get the source ``` -sudo service mongod start +$ git clone https://github.com/DigixGlobal/info-server.git +$ git checkout develop ``` -* Install pm2: +* Install dependencies ``` -npm install pm2@latest -g +$ npm install ``` -* Install node dependencies: +* Run MongoDB ``` -npm i -``` -* [Development] start the server in development: -``` -npm run dev -``` - * The local server is at `localhost:3001`. Test going to http://localhost:3001/daoInfo -* [Staging] start the staging server (on port 3002) -``` -npm run staging +$ sudo service mongod start ``` +* Run info-server -##### Details -Note that the `dev` can be replaced by `staging` for the staging environment -* Forcefully drop database and restart Info-server -``` -$ npm run dev:force -``` -* Re-sync all transactions from the blockchain, and then process them -``` -$ npm run dev:resync -``` -* Don't re-sync transactions, only process transactions all over again -``` -$ npm run dev:reprocess -``` + Info-server can be started with multiple configurations, that are included in the `development.config.js` file. A few `npm` scripts have been added in the `package.json` file, also listed below: + * Forcefully drop database and restart info-server with a fresh instance. This also starts watching blocks from the `START_BLOCK` config value. + ``` + $ npm run dev:force + ``` + * Re-sync all transactions from the blockchain, and then process them. This does not drop the database. + ``` + $ npm run dev:resync + ``` + * Only re-process the transactions that already exist in the database. You may want to choose this option if you have modified certain logic in the `scripts/` directory, but do not want to re-sync all transactions from the blockchain + ``` + $ npm run dev:reprocess + ``` -### Endpoints -##### Dao details -* `/daoInfo` -``` -{ - result: { - "currentQuarter": 1, - "startOfQuarter": , // in seconds - "startOfMainphase": , - "startOfNextQuarter": , - "totalLockedDgds": 1234e9, // = 1234 DGD - "totalModeratorLockedDgds": 234e9 // 234 DGD - } -} -``` -##### Address details -* `/address/:address` -``` -{ - result: { - "address": "0x6ed6e4bc5341d8d53bca4ee5df6f0e1970f49918", - "isUser": true, // whether this address is a user. In ther words, whether this address has locked DGDs at least once - "lockedDgdStake": 123e9, // 123 DGDStake - "lockedDgd": 200e9, // locked 200 DGD - "reputationPoint": 12e9, // 12 Reputation Points - "quarterPoint": 8e9, // 8 Quarter Points - "isParticipant": true, - "isModerator": true, - "lastParticipatedQuarter": 1 - } -} -``` +### DigixDAO Architecture +![DigixDAO Architecture](docs/digixdao-architecture.png) -##### Proposals -* Get count of proposals in different stages: `/proposals/count` -``` -{ - "result": { - "idea": 2, - "draft": 1, - "proposal": 2, - "ongoing": 1, - "review": 1, - "archived": 1 - } -} -``` -* Get proposal details: `/proposals/details/:id` -``` -{ - result: { - "proposalId": "0xwef23fwef", - "stage": "idea", - "proposer": "0x1234we..", - "endorser": "0x231423..", - "isDigix": false, - "timeCreated": , - "finalVersionIpfsDoc": "Qm23f..", - "proposalVersions": [ - { - "docIpfsHash": "Qm..", - "created": , - "milestoneFundings": [1e18, 2e18], - finalReward: [1e18], - moreDocs: ["Qm..", "Qm..",..], - totalFunding: 4e18 - }, - ... - ] - "draftVoting": { - "startTime": , - "votingDeadline": , - "totalVoterStake": 123e9, // 123 DGD, - "totalVoterCount": 12 - "currentResult": 0.61, // 61% - "quorum": 140e9, // 140 DGD - "quota": 0.60, // 60% - "claimed": false, - "passed": false, - "funded": false, - }, - "votingRounds": [ - { // voting round 0 - "startTime": , - "commitDeadline": , - "revealDeadline": , - "totalVoterStake": 123e9, // 123 DGD, - "totalVoterCount": 12 - "currentResult": 0.61, // 61% - "quorum": 140e9, // 140 DGD - "quota": 0.60, // 60% - "claimed": false, - "passed": false, - "funded": false, - }, - .... - ] - "currentMilestone": 1, - "currentMilestoneStart": , - "currentVotingRound": -1, // -1 = draftVoting, 0 = first Voting - "votingStage": "draftVoting", // draftVoting/commit/reveal/none - "claimableFunding": 1e18, // 1 ETH - "prl": "ok", // ok/paused/stopped - } -} -``` +### Contributing +Refer [CONTRIBUTING.md](./CONTRIBUTING.md) for the process for submitting pull requests to us. -* List proposals in a certain stage: `/proposals/:stage` :stage = idea/draft/... -``` -{ - result: [ - { - "proposalId": "0xwef23fwef", - "proposer": "0x1234we..", - .... - }, - { - "proposalId": "0xwef23fwef", - "proposer": "0x1234we..", - .... - }, - ... - ] -} -``` +### [License](./LICENSE.md) +Copyright DIGIXGLOBAL PRIVATE LIMITED. -* List all proposals: `/proposals/all` -``` -{ - result: [ - { - "proposalId": "0xwef23fwef", - "proposer": "0x1234we..", - .... - }, - { - "proposalId": "0xwef23fwef", - "proposer": "0x1234we..", - .... - }, - ... - ] -} -``` +The code in this repository is licensed under the [BSD-3 Clause](https://opensource.org/licenses/BSD-3-Clause) BSD-3-clause, 2017. diff --git a/docs/digixdao-architecture.png b/docs/digixdao-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..fb743c2fc0391985fcedf5b42331fd5057591abe GIT binary patch literal 48015 zcmdqJcQl;e*Ef6(LPUmyB!VCfQ6@z1B+~SReDxYc7^C-|5Ym){jOY?Q7!z%DgCwGN zgHgk1gAr|X&o%tM@AJI({oL#Q|DCmFEpuJx>~qdOd++nv=X{PgkF*{@PqCi@0064` z@U9L3P-6jrs_P^z_{7|ctposq0oA*=pLh>1jzXPH^pj`zV=@pJgv{foJbKE?EHvFT zAI`JcJh})KR6{>K%fzL}c3O~&CXaCTmHk(qgfz(aYh2auE!y5A|60fLKfV$2g$Isu;Ro}Nh5d~?ql6-om^Ts;>@>2T8i`|hRVo*ToSpIBt#H*(D^5|n=4OOmg_2ob85Dc6EbzW+CR( z9z$U0I_vf$Ef%LzpjV(~(cgEknbfEH(pQa=@^{== zC-V2a80g16QT&@UzCS83rg+pD&h*2k~c(*e@8v zL@9N*>DA$8g;8j` zI>ORXZ_b{=rUtHXaGXkeoC3aXOx=0vJ5(J&5q$X$WDA^9gbGBwrMD1MJp)ysv7o$o zZ3K)x6mFr&BU2-7n1dmd(oZ1&*Y zwM_S@7Ge8%h<67#(7F&?}W?eF=Te1yn^?^k{69vElRF@)|AAc zrIBJJ@~9lXH1#AbQ@@FgLEX#Xqs&0=izrIy1gJzH<)0zmdb7RpR)g;u;rteg z%+F>UMDr)fcMXsYJ#+7SFCkx{lNi;53}`*riWoh{WIg_NQ>rQhya1~lpng(eUcsCg zI@M3*oEeFmRtRc~chaF=J?oSd8Y!j;P@16>jgtk`H5c#2jGi`1kz1shU@SIqBYrd* zISa+cxnI&RWqF$!=F@F5He%T4eLL}JWWj(2a8ngn?r|nchA7%13mZ%8OYW$+7E2+j z6uG)wG9|ZPE0V%S(=FqTEER6f$)ChhI(8CEGx3quV&1z&QXe_tH&(02t1ITG5t83M zJJasU@+@ym$ox<))6x({M)X?t%=f=JKVW5)%>z&@n4(N|_F%Y17F&sU09V`DU}Nz< zwYg7Pg(F0tyqfJ6|BMH7_c+Hry+1|0$Nj&C_fEBVJqply7dT2de&cp?CsiI-HOKQ1m}OVYufPQD&B0J#r=DZ&0{L zNnOgL%}ta-6!S7+gczXuKcyr!`QWLJo=JB=3=+gsMFnxoM-NV7zdxsfQeORUE3}|G z3ZG|!>9NO#PkBX;r4*vHd=w|ZIkKQU_`eyk>q)G+;^9NIV8t%|zwyQ`b+19cu4?SE z_r$MkT1tqyO$kfeE7`Rd<(JqxlV*?OPxq~Z2G*MC7aO$o`Uj6~SF)dMq%Uo;lcs?Z%Sz!qXK8t>w9&iPEbNsC8~LJVP0R*R#=GU@NX1pyT2p3D)8)b zUP!emMZo1@W=pp6)o*!$M*4?^Gm-BDw_N6z%DbYsO2b)0s>TkM-D9RH0nGa_fSdlS zcmQe@t6zJ5FV$&h%AD5=l!r2{QnEuPzCY6T)2nPql`2o3y4Z({-itHFj;3=9+uC(V z-d{SsI~B#_%^Vjp->hIK$#j^*gStQma!QSMXz$_XkjF+;ZEZH`Z;pnN^xliK^tFh( zVRMhh&c=z|DR5=ugpwb?oERuQejRktk-l|80%u0XN_@hZ<>U;Ki&qY@!smBU2hF9p zrNf!pJi$Z7y*go`ja#3&D0Tja&u`HmM+OeWra$>G%ZgS%GDkv|tdNp;D~9Llu?0OP zIyJ0@8rIg`gj}QuI-{<$yDJ9GKg6FayzrmMcth}-<+eGyK^@|)K7+rhPj=q(s7j~e?w?D&7K6?`0?f&W(J zznK2(Ab>Hc=p6Etr!Ym>2x31m(dG34ke#@E0xL z;CTF72EY*a4j8J=9~GYkOl**a)LCoCxM+w?V0DjnD3kIoc3GzUE8 zK(N@~_^R63mVp!7_66lYXqyMJplh||rMic)3*1-RFEcvhUsYG5KPYR92spDy(1fqXi_@5{F zzs%UbvF`sI+MVMOfQtEyIY-gazhenrJ%uH6$+3x#{iQP`bl^PbxOb*!-69XWJN@|; zA~oXRTYb1X?&{j?V|dChp{*UY3!+u0pCa27cUMx_i>qIAtWr>DZ||&;n5&uX?CJc^ zl7EjL%d90>h)+Ebw3!oLhJrvAHSz84)r*%7ur^b5t5LGOS2kY3glilIXFCG2a5QND#e@R)mW9aX-%eTz=9;j}P3*aybgZu%MgUTo zs3a^=B13_GsfxDfchgTLX1qVHJpX~ux-CvlO`Gt|p z`$k-?mH3&VT~zH%Ga^=5SYoi}obikYS#DhAXikHfbC}d^4GwsP4z&%qx@XI-1L_~( zF5`OxUh>;@p`Da)yl!QeC1lw<@KG%ySE#Y@eA&H*3~_jegvLt}3^RsIF>5HGF~XD? z*gIv?4u!$#XLax+L!-Oa0MbYOWZYGWK4$Bsb!KNmg0+uO@57Z+9IN^b+D;mevtZ+}r-Es|B?PhIF62UxGYy-v zCLGajum@CmG{%QMx!*s{v>&W7qj_l5oqBbMLRbEInP=?4;^4D5@I?KCWsyeikVm0S z8K?L5+D9WRj^KHkqb1~R;Z33J##I7(?_JmgDKztG9yNNM77>zO@OZLR3 z06nq-wf57gVW=YR>DT00(#ukG#5@9mWt7 zgec696E8jv7s`Km8hW@vOuN3|runRb%{|}^(y$8=o$(M+7;26eEAESIISlMWbt%A4zxr3%LqK{?1$zw4~1X^hg;ihV>(zD`Y~F`o5}VKXSAK zGY-QqkC%Iio8J~M*j~jt?2W6Dq?B=!RJ1y72$8Zj%|@>VlLr{R=4o< zdxf+Rl4xVrvndZXm($KAY{0V-?WmeaY5j1MqQIVQB%%y<#h@(pKXZ7kv=&6A0~k01 z();j^}lPCBjLexZQ6{?l<`o|x0EAJA>#nO5&`uO`@|03lo?=5IF$ z`d)`2(NE&)eSgcYe$j@cp;3y1%544^N~w_{rK3-!kru7>f-SlnFS z>7jAz{aS;wZFCh9`o{*XNQ3jHnV3Phy|Ve-DFC8EpBQQk50ut8S4@bt-IedI>lq)N zL+;IAF>nb!@ykq~2}ae|d>UL8`4t{%AucPQZ;a(%tn6(;CruSpUMXUVvVUkNoW60j z{8u)8Nzx-38>G{he;OY!0zg{zL)g7k+Lm|5mx2@BIb~htg(s`|w4FI|D^+?N^w^(I zo&#EJD8$HXPiSpAduS_ty+j}mz_YlCzX2Dd8`og$*o^s=#S3&3ES54Uwu6&s6OmTU zsLnaaGMg#c$CNxJ80sH?P~9>0TG5s|v+t_5Ut_3v1XuUG^+618?~lrQL$kz4skA9I z7=kRYyI0b&_FAzFQf@?@V4BtEiZ?=3jc#sy>zePJFW2=g0*1b=UvJi{tE0!_3t5B` z?t<_wmW`a|kVpOU(v8g-wt*bFQVHKjY;)tWw6kYp>MAC4!kTEIF}>`s5dhM{xNyzb zxqs~T%Cf%Le^Vv(Y-CNk8_lFSE%MoQ*y0n*tuC;eWcCSPPQ~=rB;zZTJy2wdGT=)&D%`{2P_?ijTT z^j>GD>AhxrtM?w6l-(52x0$`9x-pn07JM`)>?s~oLLi($(W^^OK{ z0nR<~7*0pB=ENdPRiHY4y#}Ah$F!p<4j(v)!t(*f#}-%&I8f`i@}ffAJw41C+hS2M zm#%wG8x-E5c8=+A(g`6Yg|&U6LQA7s<7P9;WgZNgRgXgsj%?SDsx$J$Yl&5)HV(87b& zCEp?H`*u3z!vUr|=hQUStHhLo6f0)>GbZH-p`;8XyX}}n-lBS{xQpU*B>ZJwa#upv zg#V-2$wI5rX7MFYT;YImU3tuYcOf60uhkhYaA;xxo^%O+UG`_^8465_GZ}}IAe?bn zW#`da$Y2qlJLBqEI`GBi(rOiU=E|pK2pWAVbTm@f)v)pP7gcfa6&j(cOLBWw5jQKn znWXN_0~ou~hq(vxC6hC^<|r8tKHQ|!K@LiM{nwM(gdVF{!6$oU!@-EJKdqNNOwO+% zc*>cB-HyazB`?<~={LFKPc3~hWb`B`egU)LnlXv-si$@#iGHnl{?_r6B@0Lj%HMn@9p`t($p!(hq8-0gyi-tc5*xd8 zCKz^P<3FNDhO=O(E4EOG_d_P{wG*Q{G!}l*3PmS&?>8)$8#*oz6+y?z;Eodh6RWc+QdX*U8E~(6^a?7P8#u#=Lyn|7~YKup@t9kpHY-C@8`+}8Eha@*@z-82O zl)WLddGds5q{}bvUYnM!nhrE%|L`-T5&{W#jku}8*kbEG*5BbRn%X!9DHxe8>tLwt zuVivPF=1wU|J6azL!9|cP=mEp@}k#fqJ}Qv{j{|CVMpEBo~h0zOXeVJ2JQRqNDImcmzBL(IqlWxHQo*bFy-qi#%VO zh=Az%{VVvr!>qngv}8j9Ft#evtc*owO1u>Bb=HB#LID^ee?elz$}mM8lzW zA|4)a=a1A%q!lb-wnB8JLjP@e+QN|T2x!e* zoC#~Xkn9zmZsH1J$tG7f5aZVN?u_Kqb_m!i(lMOIy0N$HZ?u=DQ2Ry;P40Yc?t3fc zx7$4)`Se@&gm7saw3EuB->2Tc?f{ms&Ql1td?< zSmeehn_KSVn1dt2y4j%vJ*T(I6@|Z)eZ>MM1+7Uf-?>*+pHIXYO<1vq3DzuKgw+!T zHGgIfcy&E8zDL=>TUhgW9mN7FSN!)zjw90#N#|h^gLF&H1VL?I%i?<~E}Hbz&Ji~o zmoj~S(5J%bu{zYlQ>SAdd8=U%0-f@!3aCEnakJSU^%*RpOMx*&hfKTm`AchsW|Mb+ z-0xqIM>LtaoMiu5OD6_`5R=nTUn++_XFG7^Q63`pMNfY;dYpS!A@m_R__{qXkq#b-10$=U&D%{oJAmrp?Z9v5!FY@+$f@ACn1e%gfdJ2f&^M^^r5 zz~OGeA4TpXox`^2ej{YG?&LqH>9B3Nd#DF< zj3&YEMHdcwwWsrvJ@By}v7>(EgRejM?gV}zk(6!`{9t}j$DwB^X1MdLXCpFRWJt3b z$8sTDBP&a8Vd3ey>BsViFrlb$!W;CSfRK_T!B9-&D7K5nbzvVjq6Xc2IM&}lHH1rB z#Mr;WpROog5*fnjQ6u}P4u4qNCoAdwBC1g;0BNr?o~fd4A&Fn6x<-nw+`rA0c@4L# zt~#Z&XSI$>T7($2t-_KrX37Qr;QvUDFaOE>DUcz#VGF{J>h-URxtW#k zaXx|xcUuY66{!B3(`HjTex`Fgw1P`7{pu6Jg;5U%wj^S z(oEMMJPo`7lX*VZ$4m$b!tXt@x5%j% zGmCE9W&b934~cslVbn+32@DvSrJ$uE*_sfTpYnjKmyfQNJh={1&(qGF3LVI&Q+6w=o|Tn_kf z<}`p^n8r31Y%lb4kLS2B6`jQX#C;(#*ln7e{fqdHJKw=(AMjZAF`PL7b$60~Tmt*c zdU=02#U0UmCW%ug%;o-WJ&`6GK<^6M1= z&97DB-WPUPKltN-su!!}EQ?ywUpk@K^E=Y!SY!Shs0+a?J0m=#>%mGnUH6M|t-Sl$I_fZAG3e2X>hjIy(!gHJm1XCR3@7ZD>g^6Yv8fT&Z8a}`ld@mxbhkn1Et>qSXeACOwYwcP1b&P!`U{ci} z+bm*tGeC`6nhc`@ET9g>T?MkraEYO0XAikAUYWomch_JDFBw=a`C^rSr+= zhlStpMvdsRoQy9G~7oO0W4R^9H9$=c2P$&lnWM&7!zpECR$;OZsG z`$f34%Tl4uiTK(4M7dPRtPgST6lCioCWtrLhjYy={Th2H1W<<1$(PMG7c8Er)C(HS zZeL|vW#BlCJ%BJlyghXMM4VdcDxO{WGhoO1$FfS|jadOp{%zApnqOS|V@eArwCFwi zJ7kAkMmLPr0mZC3G1p|2iB$FUt1Vr3x$vzIXW5-M`&~+> z$ET4c^@z%Oa#{jO>{>)T{Axxt&LkzSg&CR09@=W(`H+-jcXMh($nzMVTlr12dA)lZ z%POkA6x+PsC0B6!nJTrn4inaT%Z^iVDnGG??vFI2+(M_<>mfEItPRKR7vgaIF3 zv!q=?eq#R3jFQVqYQC!28#u?$cN*adMGF-ghG;~vG_Z86=)sD#`o}6&#fp3bI+)!1 z!?MuJfk<9Y9U`73Wa$mQAOXGqo1C09h-W+o)SA~y4|LoVEz8Opi=Tey{PmClun#zE zbCkRQZ|^pI5r-mq-zVQ1Oer7zMvp#PPXUKuaR%f}eUC;t*h4FLz?5?y?`75_d2jC2uvx~I+QvIookY;ndC z5ct_oyxrj%{;~t0IVj(KVn3JMf98@$DX%WkxT*CWLI8{jgf#&ip%u1x)QjMcAD?yf zn5;fO&8V1()VKG`yq}AEL}Z{itb6%`qm?c8y&w0;%teQ&zIC;T!oIyMZ=V-JWvcE$ z@r8Ux?oRxN&^{n4fnYT5X=Y}j4(iPP$x(@WXE1Opo)xu- zj?Z5PSO@L-St5A59~)|emGff?cs`*ohQqB0X&xq+>{oHDH#i()=E7d*A1m`|#?K$b zVT0U_GvM%T`)^(7;R`}h*iMv7Wq52Zd?D; z(nZPkFZcY>Qx_;z?Xkn1EgpHp8vH!Ella`==EWn^O8cFGd?H)^RvngGrJ#8)A-iuS zL&K+k{RvU_?DARt@YBaLI!)as-T%>Z{>9wnRYX+Z0(ka)26=B^jtyDKj5_QSm@0Wi zNGjH1Z6}m&s+?$}drfsD-J;RHLG%k9Qu7u*<*7t`?24aiV@b_^%pPZd3~i?LZ&Mh6 zfln-XPz8o?dAGXLQ;9r%%}Y5*H^4Z8N5ZnxG+8%@0^OSr+ezLjAtv<0u${WT-)a%g zsmsRcljZ8T+;Jh?Q$tsTt6CH1I%6yXaO|?I;oTi;Wpz(cWV7WLN~W>+aq)Nz=-9BY zVwSnKetOqm=p;LQG8xn7jq%2+D-RqRIC^d}+-BjAVK$a+@@iAs6ZMR4?f3jBT zX9D~9O}rln&dg9YC>}e41{Z&o6$9sNd{M&?s;+rH|{)vFvrKl+U|ok7!B;7NyitJr;uP zpEDmUyyMkv73{^xPU%To%HbriFT%_@g4aBjJ$}R^f%i+7DPEotpES)r!2`yD8xf&g z4$bwJP8wy|<3lMrxTky)C7v^EinVtD$G%|sFOb18^C2h}Mm&kt;Sfr8CFH4o93Fp6 zB~r$QzrORCpTyfOvBQ>mlv93?n1f7)a=G72Hhz~p{DZ*NjW$ZY_CD3<3ZT9=%VPG~ zY@G^?m(fb3-Tff|F}Q>auw+`#Y#LHkkhwfro&vl_+{jIBa?7gTl{#`!Jsco3evgK2(# zAaR8{(Lwu8h>?l?cei-hWLf{p2cT#C z-BI9s9e)9;>zby|7P9ogXi?gRg=~W1)uhV*E)yVER!`)+ zU6+8lh2}qsaAzzxk+Kh3_beP?mLgiXo76Xyj^$pY5AT`(u&zA997Ej$$~~R7ckjEZ z`^z|R!^A;~(^uqrduYt9K`#0gmr74IWp^-wt!G@g84p?;{^cb=bFSV9M2im?B{Sze z`%tDxv)pXS`3&VN?Cq-xVN321?oS3E$oQY=KA+C)tD8o2yt|vG+rL%O%doARZ`ESv zuIzU>5YoYg^p8fu9Bi&$`%(h76prN(>(1L4eGdpp$iI?2k=o-?)Z3lzzDI=)Z4w)^ zRYF0^;Vg>gf-t#LnqQ42XqpIQutS%Lm%Y@O0y&vu}#Z(G-SIgeQu zC9+A*l{*5CJx$@&A&=rw+To>sjURoT6*5{MN)sPv_j>q1%Jst4+xsjGd^NIiv-0EI z**$xNygp9RO@wyXK1|j2#T%p(opAmA`K?4Lf~jB`Cl$I+mbSc zh!nD&d88%9ySXI@0dL+cf>|Cl5Nt5-!RR}sLp0V>0CTPv%h6nmH)U^kGR-*_6v~^O zYAsPr83=jg_eeH-Eyj{{{X6uqsG6Ry?^3U&u55DBoHRIYWxP@D8hfDj!qh3-YJR8; zOzXzS5OS}qw&56mGOA_hz9HSb2I4Lzcib>5zthszfPuRi#(>pjmmbaP3Iw=%$j#{5 z+3BkE$4zx}{xh`hm9%`nwPp=ayIkTOep#(P4&%g-o$Yz|0fgE3c;im38#TH*+}1sr zusiWFP^oX;PcMrT=i=vX9JWzYK9Tf(p|^7|dQB1b>rKO{eUr9x{7>S*X#}CLP@moN zc+og>GV8svriC?|3tzL=uZOrWmT-U@IBQyIIb9*EdI}<`ZdwL?GGAODF)c^1AUmIn zr1U(B7W8+w3(j?6^tDa$0Jof~Am#dGp9cKQwGK%xmoTU-UV0fS_XDztq_arpd+=;s z!UNo5344giIzXqai?A~zpobZ?!aGSgU*}{n;*z=Idz;cbnmN-`890LT+-pYExg+J) zToaY`=lsS4NFKyD9J_&@@Sjz0_c*N@$zMc+qK@48uFf5%nG4kx7iVf;|Q zW9-F&8f2?nO4vBhIG66L8@mvrEIy!x{#!-E78cA2-b)>zoBN^(3|LYBABm{WAx5dT zt@^3xH078YhkBUyM*}Qa6aFv5q1I zeH*#m(aT=e9?jPF!7=P_3H#E|is1gEWXs}?-ceNgj>)T=jr*tLzUBsoG?z>tN6)iN zMbE?^W`b_xns&4FAD!O5Co{XIjNi10w>|VFbG=MJ&`OLuMWxD*dNNZl-CCwyU(P;s~i~K`;x>)^k3qF zkJk2kAN#10Cs9DwwIXTf#u<8l&t|L6VV%rzQ$|qFwfo zWel#AN4Ju9V&a~Yd5R~}O+Xtc`-1ftp=Ss4w%ew*d0wy5LffI(&FNoBYerJ`H&B~n zDj^+y?zhbkA+sB);zOFF`#|+vjd@%(uvqrQuHWW&QO5RKj+hW3)QY}(jkhXy**XO< zN$;&l?Y(cCygxvnx%?&hsJk4OCDLal&i(w-oKU0v_x+puF@`b|is|*GD(3G3`EFxA6l`9*ns2JDMvyk2rP&1(U^ zq}1*ZS1CY0QKPp<4+>T1tx7NShisvjqZmh(ii9IqKfn?Jllc=C=_IDzK*fy08b8sQ z&tcYn$-6mjuDo#q0m4yp^4fNnJ*m+OF1Rm;c!I=djcj`audZBT55ctOvV+n!bzZl2 z=kS}hT|Pm0^4I;OVe+5H0ZwIbnQYRi&e4uAmi?dS7vrT~jT1{p?)_E#sj6U++7)vq z*$jJeAmre-g5jhj-%^*I_PqC}u{RO7VscH@Wf~XO(*ksu`UI2qXH&$Z?RJtZiz@?J z*e}{w`$R76WN3Km64*_{Rg*gkREcZIp$Uid>ab1O$NV*62^j^hT?|EfdCiV*Nwr`M zCfTOfyS2$Riz ze|n}n2X+Sjt|F66>To|mX?CI}#`cu*(Y#Zx+nR}Fe;(m$05Et%X6hymyNzLZBXFqr zvu}q=ISj!ZfNsO-qAEPWZRq*KzSH0e;1Q$saayR#T{-rB{pN4T$G$DKcBi*-tbpss zj=JfL+1LD}n9wrSb){E?FKBsYWFfnj0~HV~@lkB9ha-37+cm~^J%n&x*#IkmE>hd) zj5Zd}Z1Fc$N*^b=CVu0N*KisE*Ur4Re+q*2t|nLgmO!wCWw`)oy@0Ih#JjB(CSEsI`1D>iU+$9%tfSA+sF*h;@Oc5as13Qdt3BN#$1XBO+I9jeRq2<|;{4iVb zbD-sc=UN<7mfN=tUZUl>kabd^9UT?CpCEhKLtnSLl|8dcd~sCSM!*Isw-G%CW0jcr z?{#5XkF~Ib2hpoe7j# z3&~6yX$47ELGz{$miOyH7S)EFJ}>iOZ|ni`9DlZ;W(E zeCKkqPKR>qzpWngPPLL} zhCg2o(x>8@M_!l$;V)-f4)qDgM;+LI2Yk3DUMvcLX- zbtc6Uvfa;%AOZ}087^wiNc=OgQxa-ZhINr^a8+$`8fpj_Jcm@#x;(oJIU@4~bCc$1 zCi(|Ha6kSb1Y{4$EIl$fHGeh$1}WE}wz*tSW7 z(c<${vzR6vIeSMqO zR$-HJRbQq>g4 zQt4lXC^m|eyR!9CYrL>G#pM7Kh1g2QMGt2N2`^L|CvD7$4r!*v$Z}U{S;?jvaVloE zmh!RAc#Hx^RL>*AE6*ux;P>_fCc?>YO>M5wT<1h(5P;;n|N3-hB-bpHec9xzXOgf{yE^e16~m! z#LKt-_JBHDxS9(R=`8A0@`vOh(zp$*LS?OI}K8lN<4jquFQZP5_A2Sj80*v#@+<7S5L>Fr3&iXU} zQtZu6E!-@W@h=sprM>+P6^(`Fu1Z z^LrkvPKSM;tde)U)n6Vfo@V00{-07z-3nZ3Br9~)`_Ak&2^yU#(S=JH%_Ti0&PGk~ zV(}^JqwHtnJ$0HsurpwKk)dK5zpBzQUr{6+`Mgbm@9gquVc;(@I4NL9v-EJiFFU)| z+-LN_+@z|`-tKTiYHy+P8!?DKD%Ef|sUp$IXH2EDYH8C7SAX(qV%eyg!m9mqqrN}9#1kVXk^JA-D4dXp#Ij~ojv zyKQ=OFYA+VbuEZp! znDUW*3uoacZ`1)onm{H}4|N{C7SyLlkL3ehb3H4mX_-x=j_-*Sz$87@yy~!2(kHS@ zF3q3?9pkQQkM($M?&r*UYckUl3|sBO_v-whRSo8})Vf}{+K$MG7=+q=nCA6XAq`U?;H!<9CEPQaOjFI0~*1+InHQ`VEk zs-1)h3Oo97;+QbE+y=q@@)&s4U~0Fp?slZ9@wN<2nIZuC5JGo~EhZpf$sXeE{|Rt7 zbsB5xLxtv!{Aow!>_F}8K_7A__s$(Sy~-UYdXwHo_z95Q%UFxTJ@}X#r`Eu4w)#0{UiFL2_rdRu+QoCj>KD)1 zgWq83%8YSc1dj=Ay@wy&L}ap@mx4fhFs`_UnK5%f;#)7PQHPnqNweKwQc5W!HM6^6 z@X!}U^w`a9aHo)Ay@d9WjC5>@2CJkDfP*i+=?iU!X=<^fAX)U{kJy_fXf5pmO)4S@ zzeQIi6bg)H3+h10`>8xBMYdmNFtUbV8o zwA|%S@W9NbE-r+4XCvXe+tlg_C1-Bx-`94p(6dNut5_1ACtV!hN_iqon&}n!= z?czF|?rJ--L0^h$SBzEk((9g=t!;BNco!r{ACI$4Hm{P(H^lIai^OZ)B+a=EbTeT! zJLDOC*5B{H>)nq43q|!vqg(A+H zO4I!@wD0IldZqd3Mqba~2OeVwl}s{?AIHdRs-(lSriCG90BXSI{k*UE^cD(3s^e9R z1Ov&+ruS01;=XUIQs72a{ds+pZ8&A1R!n!?IFk@WU=O_dNaMG;%mY}ZU;o^0r_9zD zqctkqHb(N(32#-+S@W5(aw_z^&&@41ME=XTerP3Ic%L)qiONLDO}Lu;%ku5WxhGL*5pw)*fCNm(biJ5SX$Ow>9kav+KUyq;&~fa zXH1@dJWKPV+EFDA)fsy;Z+NI_v@(USnjBGs^UFq6DcnMXxX<47SI$k912fmn`slTU z(+mE-TL#SF1)gs2r8@AIfn-U+(bZH^q_*>W+BEr~>QrPU|JHiQ_zgU_>Nb_80#Sy> z!r^X2*jdc|5VlPvj0$krBomnY=A6*sSob=iuRc5c!bM_&V&WGzP`ZQ&ndD*fS4;+!}=?`+(1 z;xJC$$1N@i8xF__1KK`?@1Ui>;tyXJ2aOKv4h;xEvuBg%7uIE}mK}36=R_T}#~3>3 z-?IyU){-NIFz{B1HA46RsrbbzhCy7RE@uBDW{i_PEyiD-LJC_ATA~YALVrO-tb%Ui znra!@4a5?nyeKy%oWaWtx@Afq3w>0ycTzmS@dnc*`;aQs_%fjJt#T#C{J`#%nly)7 z7ThJQJ+alP-Bl;fj@r4w7-tB5S}|a$r}DIhHpd70fpg5?NFpr)KGAkQm?*vnd;VK~ znntvar9R{46gsTg$5v^pzH2my`O!Y{b(Al}dr%HyfoVpv*&150^J>F`F}vAn$;G&gcT_=Qh> z!5?VOMDcF*mEqQXx6FIPz8DGcYH{}OC8TxyrF6)RR&J;Hi(ghN_v@Rq0xA{*FOw8J zbsWE?ki(W%ZECHWv{1tJzEsZtoTXmr20`8(2xQO$jRhRUt3B+~VkW%QQn~y8hIx!^ z%0mV_rlL`G9QIMNUnFyHue@(I+4ar90wbx{0Pb5APOP@tyc&tEq^d>oSEUT%wJXI# zhMk_KWW$);vx?cRe`oC)K?3o`_jB%Rylw%TU~A4HEWtKA?<%=7X)9F2hk)wOd;o6k z?{#oIt%s#?F@J@h2fD0)_kVDu6oW0e=ZLwEF=gMLXgZ0-@=BxVtjm7aPgp8Af7h#& z_~_JdfDoQ2^@6L5)W)vhGr=fV(Cg*BJB0WZDAYtgC|_p4 z-%8-tNc3R$QZifF^oe2#ZmO|)vf$}8U%923h8Gvs&~|GOT_g^8*5xx~Wr5 zTG_fb;>F^;+<7LwjMT%qrn!3lYCEkf+Z{sbYOhLs+paCi;5DedN12eI;&JJ+mbG4R)v6r|_EA$A2-aeq^Loz_j8EFe zcYM*B_to^XbZxd?wsn-tl1*(a*?hCsd$vm4IMQKgV3csYM!}}bJ|n6R1Z@b<{b!mp>~k4jS1nb?l>#cw5kMI! zS8IPvajK>%%)`X5r{44R2@sr0UoET&{e5(k9%;wCJ}}JS_9R<4qPmb_M2H z>5c0Ebs|e}m1}5=8@M6+*iy9SjZuVebV8TqW-wo7RGzCwOixHQQl8s!w>l{A-CAX& z>&n!4+4O4^{1w?hvw7LY!*p|Th|Ha8N*;Na*u7^{>>FNNwy@LGMrc=m;qRb3o^JLK z(foJxmUR&vHVVjRrjEO~Z6l(?T*1U;-#-d|*|pA!DjAm(shc=e^+WRerjxF<(@*PJ zqURqEgH#f3gQJU(S&bc9Y`>N}Zk#Mr%eUm~zTovIt+-7#X1=+$8y`du4fJFy=r~ZC ztGTf0SE=2^eQT&abg68bU9YgS0>2b!%k4>p!Hec-Q7@D`#_V@=dKCV7He32lES}xn zkC^4csaIH-hi4nQoxGXTyu5Xqg5yKY{Oke-z|E12#<4E*k*bB}ogD4D9+yEsQjHR) zKhG2O%+R3sssL>nFTfE~aqqQ)cd`d#QPz4;?uYnpvCU13wt?y2^&>p9K6sjwnFf@-`bjO}hZ$7K zm>DyI*F-7lZsO)}tLk=L?IBBj;>0((nfZC==Sk{SUlnWigfZ>@E_lJ7spjtn zS8CK)f?t3*x&Va!eO)^eC#!YJUks|C+^&X~ZTXIu#&Ud1UCo=7C;QAgl~0B-jx7&fJcPaQY(5Y%l9U%E#$z9Dxpr1BVnqh>_@)e1g`ZBE{>s;qtxYIv9Ay zB4xO(WKQZTg0gzQfdG_6ih@spZ7Rf_khzDEfRI8~rGkXI*t9y>@tQ#WmpSV_M#XAC z8HVM1O@-RhU$m4~X4q5wcg@w&l?zNI8ct5X!S%cXr_DDq6Cy!5ALp^@a)ebx6 zq)kZRKh>dJ^_N$oZ%suphf?~P=D>-wuzxr5U=`h5J9;lM(zdy@G~0bdW#=|xz*01d z7W&&&p|D1)u*Z7&`_KeTw?#E(RHITiyEF5D5%tz_O@8nH_-K(*45U%Ik(5?YKvGaT zReE$cQxH)Eq?K+&T3|FIRASOGa)88u(E|pI!S9~0_vicDA3T7^&bhC1&ULQ7p0{a9 zsh>)9IYyRdCSuvT$Bj+t~C~p5eJTpd2b$0R(Ss!=6v4tG^In2fzuwgzfD3xAV@g zm`2S9Z`n4JV-2geHI-9Qg^ac1SK*BZGS;<@P6tA0%mxK4;pjYAX|HqfNHJ9JLUat3 zvCwk4*?xFP|Ahb?GkV!F@NKn5!J#C)+!-PsMCaa9|#s3p^NzuCPk(hP?gm-!b)}{i_cXjQf~rsIq&gs;6W7fu;MP#cvz6u@z-2!S zFep4eZNnljSH!*=O{zmJE1&ZGV|O4_-62ig;T2ldCW57+3l(L(Qb>-76C^VD*LquW z>7OC11xhiS2+6XpZ#x(yz^ZHn&UkMBSg9d(!@sQ_k`JtgxA=v~)-v`>B?a7=sG_;)aSN9D+JU*+D z^iTD)Q``z!shOuW4KFo~3lzHttc;M9AojRVQa#?-ysQa4a8lT7z@sw#Wz%irHBp`X zqK#TttL@v2yZ{~dq&j}k8Zf&=G(>_Kjh*B0fz#+nyeq-TqwIL-q~SiG^U`Vj@;Ofn zg+o(`yOzmj7E0hSa9PoK`P{m6Oe$#EaHEmtWhs@GK}juo#8zbYk=bwe$y3ANA>$2& zbZ;Se+*qQ6iRSx>RIf{`rq?~@Rb|Z=vn`1&>=GFsbnS$Y3)VV(v5XrDBsuy;Kycwt z=QCENrYYC9L|+3v+FFRovn-pZVySDrqb{a$-3MTM?y3H|Q{rk1gy5Klx3kllOBHvj z9e#fQ18+|fTM1ABl&T7Jg8=e(;4YDev=FMxi%01B8Ijh8M^oNeqLS!x*62h2mk0Su z(74FeMx`BU_$w2hE-$N+hUGYPh;2I+(?e9Zml@)vE}|zce3&^*A0^uCgJd||%^#fI z^vK2_mcI@9t6Z}2KOrC?WnRn|ujTZA{i_n}Gv}B9E|6;pjzGJAv-;k+(~LTh26AR; zAR#PK>Ye~Bg5H+frr#HOF#828OP{(rGlyu+<85O(6&#zjA0Pc>TAX&;d(L$Y?hy=I zvH*}wo@+@se;sVgsop-(oHVQ?gSHvZg8zwXVzFmIyqUw!BvmvW15DCrpD(068`ae4 zOH?KY(Bd{zJZ3d&1AhOsm&KEKFEGp6peM-=Di2Q>4$`>H@noCz&GaFzZi%axs|s>Z zavconZ4L5m<3603S<%E_+9Y6ipLK8h|8bj0D>_tRy!dtr^gASyfUbSL#`R{HT)<8%Q4WK}0;-D;FmC7OsK>G#9=-p@)0@lmaFhfG$_&5_ywKOOm z?D=$Hqg*L<=6Pvo#mGY^)ztCfLHV)x;5>he9)3yCto_s&Q(=4{QGmdZw684M+3Qa@ zPmi3R`)`IepUAtcwi-!-wVmkDq7NyVPX_({%-wI@A2MeJ5t0*x3)SK0kF-V9Ny`GU z`T)J)WxAlDr!@Nz@)xs92Jgv58aM@=66c_CAeRhDnFrnEKE}bZ_!!S!eY5RIWxjm?sGmofYb$5q|Kxu|cS>E3mf;yltwtaWVSNZ;NCltOWfC+^Fl*_jQO@V*j#YR;x7n-sx-qHXG_w5UQ$ z%aaoYNJLagsw$gz9dSusW0IDa6#6 z1*xtObbK?v7cd&c$%cZ%mfZ!b+IEbG0@i9TBCD=KKrBFk z(8t<$2fu(#wgOI!02dRN7?lp#@n7451=)h_w+HkH5qVZpG%=VlF}Wh{;R zrD@LY?W?F*(U6e_bL)$KJ^XA$I2SfX5AdqmnIHkqqjceb*Xz|nx`} zUjq__(F1p@{q2hLm)aAPp@J6iN=Uzdym<#yeF{{IU8iY_IrIN%D-+{J1>b+*f=>DH z^AdMp+;;ZtVJ8JWW+YFyUowh+<0}i<7{Jc!^}|>T`xvS<5QUW-H7~*@C?B zbW1xW=80FD;a@d0>B^szeF_#6Dsb!I_mH~=`42rPvUtF20Td=k9!&Ymo?@{uYM}s$ zxy1z0`y~XbdN&>!k4YsX$abL0q8>~G=T5RLbAIZ+AF3;sIy_VGrrMeWXm4IIr75Y9 ztNf#P#&Aaxp0%HaeY=^gD_=U+zaYoTGmy<7c?Gw5#8DR(OJp+XtK9?3jdvYey6(TL^X|7#7+3=(R_l?}%>1~Lgh&vZ%Sg#M z9h7@hKMYdHzdK|#X5l0*)j=qfOqy3XZyc=BY^Xul?o_yeb#Xp{m9(sS&;i%q+Y~lf ztL{^f*$!j;d(H5b0^ zu1w#WTZhs9jV~(loYhqSeqw;&!455%&(^I;wxR|TSn}q$;c|7qf#&JE2Z_3(10i6b z+_$7HkY?jh+IDcm4-WN3V+sT#1C$qWL;)f_VHuX(AiBW3nabcrA#c8+>Z>$I27+yc z@yw_H|7JLiM>L1LaVP?XsHql>lky%_F+&*I0*_?xx)y=vzP~L0%_ve|lEO47D%(9d zN|{{mD(b+37p&cvzyuH zvtDNax}C&y=G^L=i2ylI-hprjuzOylrJI>!gc0L$t5fW5&*}y`%6wV5xMZA6>IbrK z$XUMMseR&LQh%{v@eo9-y@u?jq=5n%6QyiUAT@bX>0g}T0|gg>6u#p+0(d#DdA9iN zo_^*38@k&NJl!O5`W$Hp_*)|m!9?xfmfVck;l6qAy&{FRicN<*0@N9afuunN`OMJ2FdjTpuij>}wmi9hjl5H`L3Zw%KGJr z61*;&aTWK64wx{lJW|cAzgcFDH@0_^v9QqXCNg^9@u2cIG+s6^A_67lPlf;9Y$#tZt9?!oC`D0L@@&xp(AIm*Yo@nJ zx*)cL-$`-!+l1g0@R0`GON4Il5c?Qve(&ojid#&J?revZWaV~{C6Bk3?8Zp@AS1FE z{@JPMd3V8C=4V=p)zlzVoyKRK@@tT7NdwjSCKXWXsdumpFdK(jI?aGWO%2GR>e0wH zW%#37ujk=UJ<5dD=f$fr0MJkBJt4dE^sBEKfSE=m)X-#aX|LC zCq5PL(*}OL0bM7LzQ(OGURUhummyNGVD6`7K51`0SM*WX2>PVx_ARg(f03puo2{^) zXN>UnTdfwCqL1-DT2%M!N{d9y>P%|#-!a{{fq;lmUt^jE*Te?7ZitII@W6Ia-dq?z zs~uU1!OJ=KAbA_A9C`t)TB}j|on0u|;w@-TdDG;(@srA!fNdp9huA;|c3aBMd8X!I zs*Vhuq4Uj=Gm!s3bUnxxC5$!Fnu`ylwO*h8Nb4kv4L~eC3Tv^a`ECSqiw*b_w9SJV zTLq~Kc}jGD*++Xo1!%pqF&5K0~kr9Jz+y?yQ?JCD~k9&=YqB-s`*gKl6HRT zq>E&0KrKhfY!}#_$mEPnG@jn7fr{KR=I*guGj?U^7m(W#{Zqs_ZDf>BnY!mGd5*oD# zN{VtE(*kAZ-whOSmjI^u9JuE6ndAH(BT+yzGMkAT6!V11$QXPw=So%IMrLz2!qC^b z16fp6uTnLUX-#}Y?(H@f23ExR)U5F!ZD*mkAoBOJdEbOmx)Yj3KYv{^UbCwx=KK7R zUaX?YXFh25mglT)I``10fb4JeWKK)9ZANduTc-tu&RfyU-G-6BY#L&=Q=BxY8j5|v zzTes$eMDGX?=>o^b0htmy$>g^j82{k5;aSxeI`_XibdC74@+1o{B2C$naI;W8e*ER zJSNHjqVG_@4g&oUI(Pe5pc?Z@laJ(XFJHKqp}yMhOmMKpS&|9o&B0o{;&85FQa%NU z>x1EIo~5*~Pax1@x%~~cCA~8>!woue%GS{;+jb@Ovn&^=Vz?18bk^CN7X~WI`=$7lybJ$ntJmSko5-rg?O>y{`Lk4CxP|Yity#K>mQF2o zsdX8!k1s90FZst`n3xuZSN+{40v#rqckjx1?;MH)8*wRrKgim+_cg%6OlHEPk!I<- zGBd;;G25Pj^Id%Cgby?FF3Lt+Uqn%akrC%G7r`Y!9{n6Gyjx$DaQ`)#P1z)L0;(ar z7h(>gotmuG%(>CTb~ZCTN={QD6Md;T8bduT1d=x*>^tJzfLHZ*gun(UQmmChow!RY4`HbCMs3G1{ zyRm}s@LV$tXP3wOmtsPohr5MjV{U{kicTYa!T3qDG8^97IwtkaZ<^S# z93&L4<+{y6(Xz#@%}smhQLQ=|H(@dxDmpsn2c#5>(k% z(t$BFFez#_g-5}x_Q}~*(P3E0?8WT?9)-o|R=0XenJnmJljddppGkyyJRBpV23TWb z*xqpvsB2e&Ks~_86}AFxp^?^v-ycHXFOdAdU#%JCUy(ogCxv^BbpHEyhs_m&Z1~@o ztv4{U+WLe)KtCp4(7<$V{wrGMFn{Weq9v>o;G@~@D(V13z5n}`HVv%)|GqUKv7`he zOa|fl>fS|C0RoLOhheXU0gp`7A~#7`^V3p^iTMkHBxh7DHGIqmrqfUgcbvXs28~K} z{zw8cD2^p$13t4+X*XU@`v40vpbzt>CrmI}a=&hCjNKmS?Srhmvv%@bF5&~mkHQ(u zCNn$+9z%d>BNM1%{xLgfkh35W$_$jrKfKqy%R`_XA|ds~BWe9s-Y*?bPzR)IS56g6 z(2wd#=^v%??2H{t^B#b57Z&m|2)70F)h>=w=7U=vABbaTPY@r9__qpiy->$#W-}wE zvudJ;3QG;KgeCNDvHO;(z;}iX)Pb4hd*|BaDG5_dzczA|&AlWB1$FJR5lDD=oWKP5 zV^;r4>y1vb{_UYH;8Tk0Bp%XKmOKDa8`Lv}q4WV>08Q(uy-(H8M*)mM{_;fe;R$dO zcPwnPZN7?{6rTg#O^{BY80~%PS5GBaUnB+nC+Nv?K%0CW>E8h4*0A_|o*j=}b#7YE zvTzJiXaZ}WOMG@&H;`8}A(jO+14JJzy97E;Gng^)(Sl6Nt-5zVg|(`Y({2rm-D*1d z8-ORjv9K6X=98r>sYPNZ)cHU)%zfqZ(E#O?F<5d}%@XCJ8w`}^$Brv#Bsr#&68Ea< zFxfgBVti{QHI9Cj+#P21yjLI6x6l|N@f}l{=GNUPW zZZYgFNZB&=G(hh6i?+c?a4K-r`HAcdUPmFJZ^I;sAkVvYiOj_`eL!ww9>NPb+t3cd zr80PCuxE{7j^MnWoQ@t%5$R%Vb4BP`vx!vC4_c?S7WEv#Jomh9PxRY0-T6sPnj-PF zZogT~?G2?ym!4)RHO8&UQ0SzrvKlD6*sjeurvZ8UOIuKjC4v`c#m)^H8k-&Enn^DR zj28)|S!|p+q;{KpNk3N31OnOKPrLXsTcXTF#E~Qg=8#|5tu@ift+*zw4ihaq^lOXK z6bzUKLrONAiJ_rMduBk2Kj*@g?oADGb$N-JdxN75)Y)ovmmfOZ^c-Pa@p7WMqsbCm zukT)Uf21Tby{M{|*tx>3;Ql?3@y40`47BZO{6OK z;EEmU`5avWW3AJn1ulp`0$n!gd5=6f7%=uuUp}&c;ASP`GnJEj_QEZ$k4D)bc2}EI zuA>{e_P$5kAj%(!7=f%9YG?%`H6e4%HOk_H5r(xb&q-<{7yagQ$e6O_UGwCAQ2VLP z@#gvHKL%x&E=e6+a%Vw5gW1>Nu2jvq!!OOQ3`9R&Lg^T0i2a2yhnMEwE)2ro58G^V z)j^=)5@-Afm-62EO$rD#6%04fVgBQAf;1>6s(s)(yqu4yvEfbSJ$AGpsOsZ&NX5)j zFW$6Z$nslNR^DCc6WDUaB3l`?^yBFT!|Ox=d4VV!(|YJ~HR4{6K#!$rvtpc^)*R)BxepFTfAY6U0 zWZj>8(wy_*Y6m8t)U;{A`G;$4WSdGv(fDV-jdtP9B4E+7J7j=i!mVj)TEF+o{c%8w zt7ts{yj2z3tUP%!`8C_jsp{hLn?%2o^m^C{XFtE=;5It}h%K%3tl&f7t%MKhhdubs zyQ)#=_e4c6?a~AVbOXrk|}?Dj3lNWA6;$%nqhgHX}o;Vd6ykL zppG8vk#kuZbY|PqvjIWRmdql+ea-$~y)%q=B~Y~2>dmoDd1((!#_eq~?`d9nq73!RSc9uB|h2krN*#p3<-SK4X(+ApnBPH4LE#$;0uEz%=`k-cQSf_b=v<8~ShNX__TTxF)XPmuvKxXt@*mY?xP^BbFcZiE20;*2BnH8Gc zDIiP%hLr$+IM0Ud0{wfgvtX)H!Nah!uh65*#0qE(`SF{Um0jPnbU(#PlYtrVk?$j6 zOiJ^GWBnl@K0Q4*=qOK#B;Wmo+=y_mgdasWG_LfX%crpfhV)=MEvtNfx4F!ESL3J} z!j51u3P_Z8qrHp3ll1#b2&Et~o6Ac8%%B6JagtJYp>^U(^xgxtvKH23xgzVeyd4v_ zH8qQ@T4Z)TJ&@VK1-iLqOXeiM@%h3$+m!lGTYYvJg=wXyJ{^-fGrpTeT-n-cx$And z*y$QfOZ(ttCe0duaU}Cwr}2cBsoI&(xhLVGsO6v1(73g+%oDocDDct8(W~hIdD7+T z&#Gy=7i*z(jICvp{=jT{=K~eYizx0599ZV(nQQq=57Y0Baxs+}WMrV7tuNZx+4byC z>QnX3mmRoBwRFTVuS(KFddlw+`ky$mxNerqEa^WWxk-^&F2E~;O_ASix;%OjX$@{V zwA>B+6RBSGXJzL^4a2tG7& z6kF2IFN)93`1|nf0E?W5sY;qLpHL$CKt40jZDW`DNxoUWx+^W?+JPjb>QCM(U zRG4&XlV-!5F{W-yqes8P=@s3#2Tm$NooW?_()}Am$X2fadmk2U>C1U1Dlhuq z(i_-Z>f4Px_duf5!mLc%@`v?dZ5{U-Qi! za?BM451OBJ3w7aU2M*!0^U>L|{X3usklcQkP8#ShYbM!?YuoP3oSR$b@uRszUa1*j zZO(+vQzn|SQf*UXC|C&2aEY(@LADq~<1`sGcV;PzxP4(X-IYZ;I2|-wgmy(cfGQid zgFB$RM(m68L7u#mWE7N*15gi`Il^gsL1^}3XJWS2NB;R?ja-{$)ocPsONXCDnQPDd zcXYiOeZ{zVZMviAh>fcc>#QrzjaATl0%#OX#%$7cS@P_Yl-qo^(BS9ufFD;O|efhd41RBm~3)fv&JMPp@0=K=9@JDEt>eb zW6mrHLI9xX$4VV#KJvA%%Kb|!gHvT2ntp5r2Pb1kSPNLN8}}t=x@vqaFs`e-xH{x< z^E9-Bd0X*dQ+oA*`JYql1Ry;%rs(=f+Rht^Uzr|uIS6YmVG2WZ0JtZShf6di$YQG@0V?KXHO8 zEl27!-hub5n0MPRgNGh)gBGyE@o(MyM{cwVQyNx0^2k;_R(IxZDG1RU_;@8cL8@bv zVe&go%JNsI;PT1a5R`L3Euzp(rUnd=|I?(CR3`Ze@O0dVe;v|89M(P6y*6r^TozX8 zCDYVcYVC@5{H>)rj5r$DjmH8>ZDcDapuT~W9e}vxZ!Io?nJWHz^I*%W)^irDOWA>z z-oA1>P(gGb%Jqq~n}qf%Of4dL+@}&z%`p5-XdpQa2q4g$h2%s{6+uC~cSqcV&Kk^! z0^U>t7Dm%Np!k!l?(A*0*KG!sch(zW=^@5nv+aM;KP!rA8avJclP%t!#n?MKS~Co`jJwih2XSn+E*anGn&Qy9fd`lD+5RO;Dc2DI?G4m z(DkWX}sy9u&52jzL}{m=Yon)6~*wZ;u6#P5vqH~mE;oIL!j3Q zXtz&bvvCK zz85Zm^7R?5J2JenbHSlwSo>0d-)WP1u>v5V~b-gXE-KJ@s5!2QAK^|6GGr1{D_vBv(MxX5t>7B!yEtjhOi2 z9tG11P3#Hgc{#z$hm_F3O&dVDZ4P=iwa>sWD10twrLO6%3M*)88;gBXH>n$E@p;#==aqd zrKBx+`f_S+2+_+SR5tod8dY0`QWcTw^^w3yJ?6mm{)(mHnY)xX5_7@z8cJAe`h(hc za@wc1g+)SbKs{y^DDM_FjLnylI!&1TDlurF6CjvHyQ^wkiTn_HXgXV|ypl;TfF8R^ z{rnb0_@LWVEzZ*B+lL{b{5#Zgya#8t>b1(6$~5KkZXrhz|7!TTMaVc;@v)Iv%AfIJ z(dUr9b=33>%LAKl+rWADUcvp52Rjx!@uqZO)xtyVxvTduW7xe4v@Np?$CMbv=C6nhH7!61L=teM z89VHoKg@3h7F|TAF$tA2B41NEWE??Bq0;y_EsxnT(`-q&!rR{@)V?K)IUlhmqu7RX z1-5i@nSGec4&T>p1wT{udWg7-tr)(x;6&A_b7mI!hpE%g=x4iI^)^_YiMZNhiRZ(2Jz$8meMP%eBacj}ax=a)r zOm#JeHr!z#Dp@-8IK`L+@i6_Wh%ozU*i?z#Z^u3YEsPCOie-NG4Hp`g-;|%3yTZw7 zQjIuV>nlo3bKDODW9~s~7k*X}?Tl}W+($_>)>AC*L?dwd0N%7o-EoyByE&Vu&?A}_ zX3n^RhESa%fi^LYrPlPZ@saPYyM{Ipw6nlLkbIGm^z;%IA?iyi+P*Sckhd+Y`@E?S zrALmeHFFsE6ad(ggOQlYqu^a-Zq)E3ACXCFpeN~~j=qYWJKou@1tayz&j}Jo-H}lL z0||r;9#eKqzIN4*O%(3_ zqJR75b#D`A=n8fd#XZ8*`iuL0Wz$lzgu(L+!259M&SA}bxr*8c!OnyiA z=-k{XQO5mv8rz!hH5DGu96r+bc%0ll@OWY|li7WHP}BoXmi?7hbU8?PffnD8Jx1VF z5^j=(^2utxPCfFEUQZ$`xr-e-1aU9ass1#PpvIlQLB}_mWt;-6oL}j^5m!aH)A+15 zYy;jUrqFMSNw|6Xb`Tz#%L2Z%-?(o!P|I231B5)h?b&hZZuA$kI-BIeDs*M;=S1Fa zF>ebGQd6xB^<@tyW}5rvv5JQUi-56-ciTDtHR+zof0V*1%rA`dPcjYd$Df&|#(=%{ zOMVSs1-uqeM8`q&@W`tm=S+$Wa>Zlmu7~}k+KsCn#Xe-cOA`}0-D***P5yQc>x!mxh*p39#h9(1@b^sA zSp9j065;=_kn5eZ32 z-aJ0xV#=_^7wdkw>hITKg8M0<3y~S;Ewx+t)JbkZmj#O04+`;KUfwX2h|nCH++*#_BgcLqj)RP7PNoV%zl8z#yA5(e%< zt$kuPP!gBZesUK1A<3%Gw@L0jHRC}*CJIPi z5H1 zS10>+g^2zaYe=M+hB68L8FM@idQ6l2(3vQBV4ShG3q?FWgB%wubw;z<^k>RWF{plFRR|5Ol z05fS?IaQ)GRf{~Qw3ax5QZFOYKT$j}tV~?$#c#SvPN}-r&cE5ur^iHjBg+G$}n-eYn+kqpJG;MPRYoIbTWOWYizUCb6`hh!K!yp443Defb0N> zyncX*OXA%h+-!L`g86Lz=yw_5MsDXn;xY4i={lcN;S`qGR40P>OM|Ciqx#}De5Gxt z9OO&;;ds|1W+uJDzY5JxONg+Xq$Ex}91oPcgCO3(9dyc#a-Ozcf{3!VfJsTfT zY9o}$d#AVcN1JJLj?VR2=gA(_dd+kOU$f8U?ad2&b9N>EBoZD8+&gIRP2~^kC5*e` z4#c}P(gIWwPx2wtK zr-RHVn+z^15!>WPr#fqMJi|sX^=Tyie0&Ntmwg;>o>#Riu2`S%MPyS}=^oK8J-c>N zK7qB-A!jxB4Qt2gd=29<%=={~0{a{K-piu$m+1lH0+<||SwDgNJGxw|6kk}}1l+U^ z>Yb*3f(_S$ByBd0$ZtFLN!f7na*@17NcoDGdmL?U^U#!ALfMfMOg2SEt{*EAx?y~} z6Fu^hA?7Q-REO@tHyndOsn1&GE(#D(Q6mr(VYU0C;(0d0CfMae-=J*Nd=QaMRUbsw z)f;or9zH-L<6j80!rha4M@F`zn>4M{BP@6n%ATxdacwF9uhT#==E=vD&3=$c+lXF*Sm06J1p1c(w%WNWclS|Y!FMP?24HY zU2iwx0O{`|F^uR~5}ZQI{5!gZkRC*QiC~?Hj)|6L=(eesh~y?J;2BN-%{%@}qHd@C z^PN7~>RRk3p)<=z7m1e>!2NpA{o9JzqaF#BA+fv$#6ToaaSzcG*A!H{>q0&5G(-)W zGW~Amgv$0D9-?AzLHyIRc?OKWrLdn1hmzV%BfY%cw(FAnMj!1VwHWI+f+rUX&ok1} z!i7>uZvQfKvpA_o=p0kq*7Zi>8tHEDbmiwi-%yIT4O<*O4FNzG7J~p17@dludQ0_* ztBoTz=xGXTrC#jBa{_q;u=&xkLL2Ka`(J~xnL;?ZIq0^a9%@)bxRQCKsTBK*d?b7#%h^yiHTQmOpm%1tn`6UOcYd2)v8!y|pQHTlUVM zz5zwIAFr?Rr-fCnQAZ^Ot@I{@OPn4E4n9~?2pY21-4Lga0*v*=EA>p|3^Nyi(;(LL zGy)u})KeD!WHMP~;wYLtbjKbKWM9e|Ht=A{>cPosF#cJZ7*xNzM)4DL9bAllRdtlo z(W;9OL^n8Foa@Jdq1zOtkw?;@^Fb01aGK zr4`a%LNF4B`H4=_n`AEIW&I=fwRye4?lPuI;`{6Om#zHz1AP`$m9NIJ+&ZDLz7I?Q z!D#3-kJF22^!%oZ`FL@@{(MN52UK;kq<4|~=6;5TPB>UP=cnDR3*C}Tb#V&M)#2}m zQ)hx2%X~`yFv+Q~kTJ+mKqfOOBUqE1)=LwFtX>UYdDYP_6dYc5cu)N`G`k}(@YEsG zi|y&Pw1JNahtG*YwS3vXNY2r*?jv00lZ7Y_^an{stB5u!&`$UW1JYCSv;C4 z!H*$lNIT0u-HFff&<0(Uh|cpDU@QCoVhw?wk&04f60D_~U|Rd8cpCNvj--Hi*$SAh zE?_#MGoA8A!~QLTjcA*C$zb-jxh{iioEW&p$`&U_m%+b*gFN^R`wUW$fiD2rkG8uJ z$Hr^-Q)OFm;cY1*JGm(o?#}&iM{-H2PM1e#-+2938d;kqgwgOhhR#?r zv;zoVJqF%_QlL{y*fv{QN)BNrmBQV1W}f}}4kTbZEYBXZXa{?oqIU5nYi{#$8pv6* zwnqKsj?h{)ztqLq+h!sAt-$_n=wbu8NNiG)&%O{-5@<_&xTSTd38XE0c3W{dV@T?t zSE1chJWoTjST)mw+-3CBZ`?6GUMAkx+E&Fb2*dV>k`%{1|H*I((6MEfmuM& zMSaFr`;&kb?nEWBU|PErpzG!~s@CEswm~(w3Bd>S^bX<;&F*hiMbWTNXH{a>9rR#) zn9FR*!E!^OwgR+xbLZX=;a+*&vkVQ#tG>sZs!rK()}I+H&wQzjVdweXJBWJyB6n@W zyxq&+jCil4vTf;4w0=Q&M+qY^{-L!q;4C$;E$oN%N5CCW!Vko`WUw%D&uR1eD&$SK z+M$H3A*_Ocu%L3vCdQHAa>qBUeChkMQAD7>u(Op)EnYUW|IH_}w6K=4+zw%#oHFvj z=_<*k&cQ_C9bhyfdQ-nb>V}9?%6E)Lx>A}kwc=Memk$Ueule-xqZg*8rqf;Og!i>R zoI9A`VLxA`xI7zpL7IkxU9y(|cBuFdUt#WW=&`ZdS$68rBdotI3Zpm8Sr#6&S{LtI zl7AXv8QT5f!0XaL_b!1ZykS;G1~xHr(ROlC`26frF)0I`NEBmx?OX99vq_rnGIilH zHmSA!m)+_+`>CmZfbS5WmV74H-!EvzY$kPX{NxD|r``DB@KidUZMb)kWKlp!K#t?? z15?z<+Cn=^=J@cG;i8{%PY(fY8;G&ZblMr*P!JG1ewL5((!6uFr>^WdXKvAI9I>l% zgAMZZEFW;}Wr;n>OB0-e0FPB&WeK|?B{Rp;iZ-YF=Ms6~*GeLQ_~+cT-Fz`?CzJv~ zjzW4l?EUbEVKu_uw3H1mpT66$2D)U_{n$7d=eCr4tY7%w8$l%`4^=O5#;2WxVADM+ z{BE)T1F*v{#ay{T1-MA+?(NIy9tyeoSV_Z_Tp1vmNw;)arP`ezBy~aNlBM*5R4jU(Ul(?tE2&Us|1j~aiR-ttqUZ~ zeHfVMrE2FAr|5$vLBX_#lPo=98jxCY=R^(}gzesXJEvNF`{43X_7~aUooV|Pk_vpQ z`$Y5DYKrPYZ(pA&cyJq@Q4VmHam#jS*-?t&xrGR%4(T0U4Ffi0mcbn6Sq#YA7oxc@ zW}&qTb$^zZfsz&whm{+RP|aDiG~A*Skmfy`JTffJp`Nq+PEbKW5t}KV8oR;q4I<4l z0UIqy@A3}Ifc#hM)g^za+Y`7to+epuw9H&Lla5OL%2Pi^Mx$Xf7kR5YDt;@~DTscW z)TIB+-63RisHrJ%^yjG}Pamgz4lm=l;I%-u6vGo4t)!hk8spY_kG>x^D}h`~CeFR9 z7a6xjlq6pMUEu_*=pHStQ2Lz$snu+-fy7&BfL@5uT`5QOazJ+E5aX!2iL+0PLN>zN z%Ukc=4%OP)nqP1$^7w}r(2^wZzEXmOxs`v$kNdno*EEaiV@bv#!t1xsBb%+%XT9>m zV~1Q|v6_F5i)z#g3yteeFo8Z^K2VM~+dGwQIobG?R=}fdUR3}xp1J`sF?3NwRj-^9 z#OmXpi82^NG1m#f+-r1cQ7LbzlezGU4M3TmX6=k@vtsE{vaAoQRN~=Dj7Z@6!SCXR zqFwJFCB)64`wg_H)m4~dCPF&|{1M3@yF;t=8<+<4_b&d444nrnfc^8~Ao1pI%ORQX zxW;HbgWg5S_v;fSH%1m@kaoZSfG;!AUikOjgMzXp>Cfwg)!zQ2f`QRDP?H#V_lfFy zog}OJjCx|_RZ`+2yVVlg^z0Y!tij3Kd4`-wu_gN@-5P!(lwo+6H0L9NLRn8CEw-dI z(R+63D!DY%_%JGJ=LywIegqenvg|H`HG+UY0&vE23SjL{=ug|h8aM&xE3FTop!tb)1x~OMoOSo z1@y2gT@{WbC7ZDM>B^|zJn*t7V?3ddSGWCKrXgf?r|zA#Y5Qph-CMiWTe^(b1K*L4 zy~u)pA_amVAPyeNx3xFwDtkd&V;=K=hhOU*YK*$YBQi$cRJ|IY%gnL%=zs89v(U)W z;3!O-UJ@7r`DWYkjieZRYDhs3sc_Y3EcXmBr4HcQ(5ed9U9di@#1=}Oo56z@E<11h zW{h}QBo1Qk)))pxf?j=IgMDC;Rt%q=xxWB zUD;fr)pJcdiGcr3V~^H=Q?TCdg9{Jy)@qFuj{=85@rPip4T6VY4kRn$u5|p1Gxh4f zS$L3pZeMf~>cHhlc%*(rS3YS~Z39RsLT_8Tl==FDku#R3%>*yKKu-}B4HELchI>zo z!*Eb{{I?~GEQU;f>F15br+SusdFD`!BHeJ&O^s24X=V!&-~|%Nf7=f}Hn2Q1dVcik z(RWGa|7f(~l!EoGr!jt7mNnpPoaK5+izvb1eLw zR;uhhkhORBz@zYqy{;}Yl6J9x_i z?m|NMN{1om_m)rI&WH$pWOnBAfBQ`RNKp`iIjD65uf_g#xGmHpnTX)&#R{Ez^v;wJvT%<$k{dtCET&|xo!>DY-T;ZZ-v zZqju0Nq-*TWeVi7{`DQs%E>RkRDcCpEY z{7m|HnMoH@^@e2iU##Gv-5*S!rKy3Xt{D~K(- zVQHcu_31z}%jNV{B@ks9$=9*i!t9T+Pu_Sk3^GcG*!tf) z!~Jft@IBh{GY-250#MU{56Ub4tJu=_zBKFou|Aqu(We~WS)|V&C-emK9J*uIYovHp zuF=j= zVtgtLJ3R9Hd#L1fw-^>tZJ2h}uiJmW_y>Faxa514hU5*Ob|V4-6n&yX=O?{X#Fx(( zMHE5HLA@#TAZ(Byg#~mO5q(p?(U!Rq#2&*X$|YCgHr9fem)gXKc;SX1|AMM z+;5IiVCJsVjCH#gw*Id;0yxEXOPSMy`DIa9NN&U>X_C(zl?vQ1iBZaneyZqrcoy!R z?rmAAUPzAZqP&5HU-@ZN(Pk(wv~&Vw5;7|WU;w(96=2C9rvTM54cd*$uA!pn5weeg*k1Z%I!!I{vJAwNYH(}{F z%|$_ObC={sz3jPSBBZ_N=R)`kl^^5cl}w2lI5?qp@c*mryW*PazHLMKXo3i+NLNu1 zY0{-*qbLCdr9(h^4ZV|~G!+pM>0K!z9qC;Zks5k{0HOEZNg&)6zW+J*+=u(SPd5*= zgtgb6dzHDy9Ai!pY>w9Ykb#Vx1AdJ|Gxx105ryJpkzV5PCCWNfrqk|*w~(p8+nwt5 z>yf-!WUv;TI#`&JMZ4`ah>;!(1w)XFx#2v}n$A}w!#Nq< zZ9z)MiCZo>*{J9f68Qq~*#wZd6-ySzF zM2jbH@=(E$WB}Y*rSII}wTrqc^eVaNILSpUxjcrKmIdF4jo4U_M(dpRyWg1Yfq*5Fm>el$t{HZwxc@?h*YBgViqZlNoJ5+2&@tRUy+3p*fR^sd!N+>tU7eZ4<_qk-P_gFugK zRB=7*wBcr1vZTwvXWd9ve7hI&IGDQ|-_pTJ`+*I)746SKTu#(J>ptDg)Xsh#HMfj9 z?%z=NKQRijyHcoZngKp%pQ z=BfW`P4xdqgaMd#SRqfz!4#OKnN3ZvH#-XvuyC4`P@4#iUO0}36URqv&**Ih0C3PPp* zzTL2cBg1Z5F8z~$hIeNsU=y|YYn!9~5BHg~lM&#nKt@_DBL9_xmpjv{Ik~YuYJLi6 zQaJih4>}Thwyl{szuCP~h|TAjt;I8BC*2OCQ!F96I^73nv=T!j-?3o4FVP69JYHtK z_s*IQ$RikM-y8jWjYRM7z(cK>#V3<8Vz%9|@ZEzL1Cs<#RXYz$)-P+U(^;t9$_E`a z7uPzh=!RW#^I04AVvEL7Vs}oW(TGBf?mDbZ>TI-;KH}Wy*GQmIjuoEpIpF7MsP+sx ze_NT_hmEnUP(6M}x4B^#OQg^28=aq2L^2u~1Ie5r3;r z(MH>Cx)R3G%vi)*ial>Kqp#Fx2mGfx)C!)hEId5CQQT_m@G~71FElN{a;}vfkwLV{ zUzvWuUs(U8LDksDEZx{7ICVSK*6sCqew7hxma^};Tt!idpe#yk5{TIB&(F?s(g`Bl zU8*eu~)}jds@A+h%83 z{U#`d_DBceYeI=8!WYYd)$_C=(!$Yj1a4LQY3W~6Q|xg!{Rfki1f;L+YDl>sKnbv- zQ}ciN8LJwd=vMn2d{Wl^YAN8kZ&Lv-Cb)vhS@C=hIq!1mvJc{fKo6Dul#lvF#J1|Z z`?5HQEDrxY&^gGGYSYb|nwfsLujo(Ur&>gPbd#SxTf)zMM-U zxa|#-+F+OC>nAOKLgt*e)^HYk-pwl{L=QmDm*vMQ6#F90qEv8?JJPjFaQ!%Oo5#?? zfyH*E7h1n+HH1aQ_rK;xo5fIUSr`Y~aQvmYe{HXV)N86YY2y$VsK{)X8X$4Fv;vp8 zC`0*SIfMu}K$d3t^A3-Quo4fzScR$H$5cPXi(P%%^Rq=i%S@Zp#$GMA=z;Pv)FMIc z7CyW&5oeeprf=tz1z%@pTF>JT@XXpMd>`ttcdgKMlrP6}VDUF3-)?8;9AcTDUvYP? zHZE-${==qv*oElhdDl&R01nMY!Xd8WY`(rSfV(VhJ=X+l!I=@JeQX%jSt|}Uw;d8XK%GpdgeikVs33Z7xf2k#U$GoEnGtQk zSn#EEd%uKvC{=YXP!F&eUzzHMz!DesD?|Hwf$G$!-Bd-ZHf2?`ju@lnqA_3$7IRV1 zxBXQAdx~Uuda$SAc2W9d8$jIAp|mW0f(tJ-oYuGM>W<@#h0w7*YnOP&R4`qYXMq*d zxl1vpE&$w3Rey9?kKFU6ZZw|Q-hR7KlBaRLNibt(S^Xgr>m3(qB(ZaoE;>Q^eyuuJ z%wL1P%S`KBDGrRGbJI{JEIa76l9lUGJJ`V%;R*0e*ecuw{M39bQv1CE`t@7gMIP&9jym^CjogXkv_Eq?;PPO`Zu{v)LHiumgq1k z?dNh_`sU;7y|<_h&evS4V0ifuq}GwD+0rx`Ro+_oFvSU1D8R2#K-Lh zXHe8lOG}LCu2B-3K}FIlv?=BNjt26Lq}6Czr}9CIc~f(u5vJ$%y|dqQ!0?KXI5iJ0 zLAmZ?!lYbpU-@qU^%iR9a$H?No8<SGUDVLw1OQEIy!e~i?$P?tbxY<$HeVC6M!zxgMXJjq_8D-7lR>k z2eGn2Ut3KMgJ==(g`@_`l27SlvC+{xiD*OrP59}$wqL{Upr6U{{&E_-UgOcy4?zZt zqqy?O210_cfOm%H^enSQ;Y804I@APxWdWfoSR?LZqDB-GLN2H&w?bc>s;c}mN%Z>e zB_d?6{mUGGZLgm>BiCR?d{02&cvN|Zo||iUF0qs9Oj;x-;AB| zWR_gCoGC_HF6-#Jt7+vYRhHxg*d@ zYo?(oIA_jP_SlGM@$T^8kQYHB5Mmf4^G`1|iQfEGPD%gS3|hsw8^PuF@ug)|Mm}LV zl|}*1R|5(xA8sGPOkCTI_1py%vGuneQ+*%YlvQkL6#8Kn32D>#!Cl$W=UT2QF3yX+=e0?s%9AweJjB!zh&)Zat z5Z!7DYm>eBu9xki1nav4`&+36k(7HdF4zb#{uQd+fOkU|MeWIoi}H`(XyYIqrbgz% z$(!FD4~$qpUbeL|6!*Sr-E{sEH6eqfKmRfyJPt%xy?ymFaH72H}tz0K&w> z(a@mO>hcU}NN~s?tKAJ%!NCjDpBen}>RYl}EtQI%$BuiXHO}b)iexm8eEBSpqXzek zKO=Q6TWFTy_to~Dy?&Zpp^DoXXDQhfz!eg`Nr}% zhyxwrVo&;A@RLzihF`6q941NDaE!IN;8l^;at(K+S=0nqL3O>HSL9Nzi`SBm)YmkU z;hI2mMT(L6`)8KZvVBE3>|TbjPYZ%rZ@DAtXBmCq3!SNr$CECDD}Gh_WFd8NS{-p^ zQEsg;|F$9`1<6*hwXxpLs&;AVG_f7xkVaXh4cCmMs?Kw`2Ct-0rOvB;2_h2T@K8-? zfd>Zu1x3a_aDZ91ukG2TZN6k%y=0r}7%)-b6O3NO&0c?;?-OX8ZQY(Vhda=qL!VHC ztcS+Ae6a6$iy{xe%U1q{cbch_eg|gv$Dc;H8BZ%vY*ftGs0(heQLR|;bB)L>C~nBu zdTSBl&s3OTXnXESAEkTZ63aK6^fAuJ1NZL~4e!eHvB&PkKs8vS<_Mddf0L!qzE4&W zPX7W|C9WMis-HJf+Hv`6gn|i^rQu-Bhreq&D%DhsE3d=$eEn7+jj6nhcXNI}3l)+N zvs!8#+6l(r15+_|19et)td*6=Zea z7pquiH=E1hhv{b=wMZQ+r8!-C*@(RV?!5l}r~!(OZ_QeUeB};WWO`l={0_LL0c0Ie zM7lhLEradRMyeM-E7KxVe`Tugk+L*^hKShtN5uAw{|iY;>9#h{9+_0jb*NKT(ULNqbzh}6?vv#1 z{&kjD`tu^5pkB3~vty6(>_|LGnxHM|>NG#GP3Kr!*4IoTiN)Gv#VpU{zn23Sj*soa zlSBo4m`+MVmD6_l`SUieQx7O^eERu0Q@XB`S5{24n7)A3WgF;z-5x?>!)a2drvv;Q zh(1bkkpzhHDTygS!p*pqovK_%TWhpM;A^v?{2GysHq-62GL)n|a;V}?e*W@beef5F ztWxs}%ylV+3IkE$5)ux~R&Rvt=F|7`nC9UJvY81N)> zo^-UsL=!ONI{UTKWdb5oe75Wi2+Js|)kmDDB!7!&jR_97tX`ftB`A-9qx*_8W;X39|b6*Xih2c zzwZ1Be~vRM(rEUz{GRzR;x31}k~dxa0PJFPK=xZ=PNeDU+6$c#P`&U5`6RPCmZ&Omx1C@&he`c0{8L-_;i-dl0@Xo*W*oG14X zI*;axi+n(U$kKiBmE^|w_G;cwV$fJmZ&upl=VFP}BF}un=9>-{`0!@bxW*Ehz=DB( z^=YNPbBV3nr)Jm}QeKd25dzWIL=;zGg1&4=UXj320vJg)}5XS_y=X-Ioy+ zt%iF>ANis(Jp$dO_3ZrCY5T>jf5baBfAvtoIKB9-(1tkNJGy6_HWvG=QCCGyIF=8G zgR=Ilk?1MNp7W4Ta>okvL%k=<=5U90m;)6H$oa)b8Glc5`)5j!I*IBicU=SqXUUbL zY&2<*9$A1sr+MaO{dR01{FTf5Pn7KD&dB3QHk-iejSQ}Tgs+Gd`u+aO8IR`>2~3rR4O78#jlR3X zr=lfz4eLi@iw6Od5Ad1lzy~TK3Pr#yy2&TwUKyHuiPgyRW3dpOD`T^agn$8wQ{!6l zc{{z&3vG2B95^E%qkUxD(o!Dl0H#kJnMlzYz^Y_9?uhe^6RMR^9a?s)-DOXw^?!M~x?#W}UJ792hL>_{Zwl-M3q-F^W zU&&506f5wFGPn5?@1bz3b(a59g>7H0AI!qCZ+JKs zQA;r7$Vy%z3Tz>Zaoes)!+-}fZO`8y^9KaUx3s80tJ=1ey85^lpyzLQ=i5+>Z>BbS z8{^b+#2`;jcedZPBcW4fDD(kJLug1UAOPHX|&vuUr{bUe! z$yP@^sKIlc8P54k-mZz;DsAJsAOjdaSv^&O$QU;ZQ|J0mc*+H9Pc=M#U2d*$v80@)O z*Gs13b(uhNk*mg+80vH%>cexESjxI(CS))>qYjqU{hqz|1a1NuHK1n=a>Cn068_v8 zBv}aHI(+KYQashsZJst4cEEZvWi0T@$@!S*h2i|Q1NI% zMzPL8$LPTxE>Y>T`R=le=dw(J6}qbeB9!4?E(FxTM_ze_UU5!2&=8-#LH|q&Pq3j!AGQXU}!n_paydtd@`u z*jk}K@W|dE$?f9V?aOB#H(Iw{s#LLGhI+kE)QX8J=vM|X#d60H;KQ!5`f3GC; z4O(0!Il6p)Y={~xLZM5xU)ZIu<1QL+Tr}+Y5!MoV1%D$g4dmmHSlY3QpHMLdrFX2B zJz2R^xq9|G-w#LX(B}DK~V1vChD3q?$B%VP&vJ=|P6rs91I`&cbD(~aBVwe0b@cS6qy|c1b-Lis; z*|5iBYfsIp(; z0}+0l$$t5xU$X68Gkv-f8yFcoqGrx za&F*bhPf{F5=rwnp3c=6iB3jJwIkYX%C&Y3<6c=N({-hT)D~C!J+VC*(ZXDRsH6HfID z1ccOoJb>dEUZPgS#&^Doh$;pCz70@v*@1dvzb-tWTIzl!O|KG)0ZUJ zp?Z51+T2z9e-!7ZOwiWAKyhyH`uNP%)wTO?avn$*0F-06Pt>S$i4n=8z(^E2D@2kf zq#LOAWEL|On!K>5_15a%lX(uazpZ-ytz3PDU2ftN*8iYY^DYkrRlQZg`=GY`c6j(0 z9~cCo24_jwg46(La^O_Il9U3j0_YL$;ne8IR{Xr;LD`_pIdGcO#RHBX#nsIRZ{kN&}j|ItW18l>{M?N*j83&GZIV=X4I1wrYZ{k^n_|6b*S{ln*BjT z!a9WgiY%cKTJ_es;)x}&U&h&0AOzj$))hx=Nu|8wl-JP%#Zk7=$bgI%d8&5V7hUPO zduNaO))4m2=?C5ZfdeVM*{#3Fjs29*e0YDbxHmoh*Bl~)HAX&gxrUh|rrh&QVpb+Q zWo;AHNOLtEF&j`R9Nf;;)TcVj{Fu0Ql9GmDTm&VmZfE5r%Uy^#FT;ahEKkt>9>D-gwTIMBz5FcH6l-XHQhs- zH+p*{6%(^8^%YBfcg=xt#vFh-pqQ7iKVKD5KM+H&c-h~gLyV{uU0*FFN_a6r_CaVA z%zGQK{r7xzzbU&>QELKn%`8zl zuE3z)n|a1OV*bU~A z-TO6i+J6VxoyiMz->WirLn1IpuUk<+b(_b*{P<{vYNT`g`lq7HYQ)NBiB@n0TD33M zZzncBN60t@7L@hr&|N>z^YZyx1@fp;s=lSAD0HZvr|i%H^X1L!&!G(->dP zi`>IY)lkax?G$*8<6EysE@-m4oA0^B;H{H3Z?yr`y{|_rj>PiP$8!|A8u-PwhX)z4 zS5FB1igkW}KVCzHRqP-h6bKUs{Ed*{{5?Q{6ow)D*Dz^gZj&}hdw(EGAOrxe-p{9j z_z-IJ?w==iZ4X<m-tREjDU%Fp{3hNtEG?&HXWgq%tRr{KdT(S2^dw*`S z)KR-FS2Ur2{2tjm>aw&xnfsVhu=9!nhDd5t?#?uwb$`UsHtNVm~V%5}{ zmWCSRw~;35)`u~3>v%4iW!LJ|NyoFuqF!b~@xbSHn*mS}o?_8X1{*^MM5!$jk@7wQ z<0N{@x z6e8r4P)P)1Aa^c^K8>Y~zX{E>gb1>zu589y!{}sgLKJZWZuf|&gCTL%f~b<)UYG9= z&e3vJ2Q~pylJZ=*T$pz_@jb}fAtL6O+c3CqFD<{t2{ILN1Ad#?%Ic+Zt}KjkL-@j?0E)P$frybML&>C zEp4KvH8%$OALb>1Hz;X${%yL?LK!TXQE);BeeI`92&vQkxyj*kymg7u(LZ9R&&FM* z_5%=qvrntpcY{BMI)V(HHM|IqQA4Bcg&xVv&pOZUjCYe6sOs&3eoCsL+_ft(>ET%> z1Ky%)1PpAEh8Z5HOz*S4YKX~S3`R=Xbyi7j_${jZ1OOj?eC#On$g6HyNWho7tnfuf zR^s)uXMb0Q3TVSL0fUaKwr(qcveExwTl@c>D*(p^_j88m$NSFc~70zW9_r_(SHU$68STu8w;Z{n9XN)MBjl9e7_y}-bG;msTH zLE?KZ)6@^iUsoC*)$D)8b~o2QDHJ+DG=3NI^vd?D@l!gkv_3QR|8d#>=P!pMavU)o zsin;L&JXR;&llXE4Q;zZar4v!zP9vH_eTdv6-?A+<@4X9^}iQqCN(3=;6CqNMW z^{o1B&p_;48A|QD+fh((zO9h?*suAW@n_Oi)@-~?%Se0V>=m)E+tqknNDFpctrIxe zO)$ezf2x9SUwozm=WafFf2i`1yYs- zeCi9E;WIDXDZSiktbv)=PLrHrpH~=k+ZBlT>U-s+z|l*7r&8e>r091=1oa+8t|BlL zRvr@f@wpH)A^Ei#btLoG?FPJW+nNXYSJwFM>qZR`0kGDJmb*i(-%g9D+|s@joZRj9 zq;Zd9dcATdnHkbmDYMAas zbFQq-appkgugG82B!`w|`ax);;JwzRL+RuOXvU^?aK%fpW)o%-(F0rg*SMGO53=za zF@00=&2VOzfWV&rTbJ<&U4QHAI(fII97asQLTa6|JF%jJ24_ms2Mk>O=(p~P$=YGD)l065C?dE=80g3?al`Bl< zzIT))CFD`LS{|=ujW9FdB)@2&-!ENXrUOOoLoQx5#4vpLq1!bk@UR&Bfq)e!sY<%g zp4W00Cd_?2EEp$*1&BXdp`Y`0Ol6#-3eU%*ORG zIzLimeP^u+&6pRdRha*?$6l#7)1KQK;S*%+1R5VCl}$crw(2Ev^J%QP;_^rZOY2|yB^iyG zx_1y``D$wj;tFOvsM{o4WL4!(_riuaf;s!2N!{_o?X6|~1v5P`r=@6`YK>3d8B%kl z_2X?xszM7GFUHku-RwFiPjZ-JQ!BS=D@{6U8C>p4y&p&Qkd0xuuu&T#wA^l8@Pn}x z$zne8VWudv82OoW>&Lf7GgVMv^;~96P#PHzeIuAcZjH)ju1*?~Jk>x`BOw z@ctgnJI7pl<;3s<-Ywsv+7n@Sit)9uTQL_r*v%GTr=(jf78xL(HoQxdD_&v=gr<`YDgPk!xXJl~i( zsmlcm@nqVS*Ok{HaF0r^H)p#Y_{{(R*Kyh*{Zvk{J70{MJn?F3k2D?@-Zy>yzW`{X BP$mEX literal 0 HcmV?d00001 diff --git a/package.json b/package.json index fc5b216..848fe8f 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,15 @@ "description": "", "main": "index.js", "scripts": { - "dev": "rm -f out.log && pm2 start development.config.js", - "dev:watch": "rm -f out.log && pm2 start development.config.js && tail -f out.log", - "dev:force": "rm -f out.log && FORCE_REFRESH_DB=true pm2 start development.config.js && tail -f out.log", - "dev:resync": "rm -f out.log && RESYNC=true pm2 start development.config.js && tail -f out.log", - "dev:reprocess": "rm -f out.log && REPROCESS_ONLY=true pm2 start development.config.js && tail -f out.log", - "staging": "FORCE_REFRESH_DB=false RESYNC=false pm2 start staging.config.js", - "staging:force": "FORCE_REFRESH_DB=true pm2 start staging.config.js", - "staging:resync": "FORCE_REFRESH_DB=false RESYNC=true pm2 start staging.config.js", - "staging:reprocess": "REPROCESS_ONLY=true pm2 start staging.config.js", + "dev": "rm -f out.log && ./node_modules/.bin/pm2 start development.config.js", + "dev:watch": "rm -f out.log && ./node_modules/.bin/pm2 start development.config.js && tail -f out.log", + "dev:force": "rm -f out.log && FORCE_REFRESH_DB=true ./node_modules/.bin/pm2 start development.config.js && tail -f out.log", + "dev:resync": "rm -f out.log && RESYNC=true ./node_modules/.bin/pm2 start development.config.js && tail -f out.log", + "dev:reprocess": "rm -f out.log && REPROCESS_ONLY=true ./node_modules/.bin/pm2 start development.config.js && tail -f out.log", + "staging": "FORCE_REFRESH_DB=false RESYNC=false ./node_modules/.bin/pm2 start staging.config.js", + "staging:force": "FORCE_REFRESH_DB=true ./node_modules/.bin/pm2 start staging.config.js", + "staging:resync": "FORCE_REFRESH_DB=false RESYNC=true ./node_modules/.bin/pm2 start staging.config.js", + "staging:reprocess": "REPROCESS_ONLY=true ./node_modules/.bin/pm2 start staging.config.js", "test": "echo \"Error: no test specified\" && exit 1", "db": "mongod --dbpath db --port 12702", "eslint": "eslint", From d180e813d48b5c36b1465178b8198aad9228757a Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Tue, 6 Aug 2019 14:46:50 +0800 Subject: [PATCH 15/16] script to update the address details to latest --- scripts/manage/update/update-address.js | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 scripts/manage/update/update-address.js diff --git a/scripts/manage/update/update-address.js b/scripts/manage/update/update-address.js new file mode 100644 index 0000000..e4ca850 --- /dev/null +++ b/scripts/manage/update/update-address.js @@ -0,0 +1,61 @@ +const Web3 = require('web3'); + +const { + initMongoClient, +} = require('../helpers'); + +const { + collections, +} = require('../../../helpers/constants'); + +const { + initContracts, + getContracts, +} = require('../../../helpers/contracts'); + +const getAddressObject = (userInfo) => { + return { + isParticipant: userInfo[0], + isModerator: userInfo[1], + isDigix: userInfo[2], + redeemedBadge: userInfo[3], + lastParticipatedQuarter: userInfo[4].toNumber(), + lastQuarterThatReputationWasUpdated: userInfo[5].toNumber(), + lockedDgdStake: userInfo[6].toString(), + lockedDgd: userInfo[7].toString(), + reputationPoint: userInfo[8].toString(), + quarterPoint: userInfo[9].toString(), + claimableDgx: userInfo[10].toString(), + moderatorQuarterPoint: userInfo[11].toString(), + }; +}; + +const updateAddress = async () => { + const mongoClient = await initMongoClient('mongodb://localhost:27017/digixdao', 'digixdao'); + + const provider = process.env.WEB3_HTTP_PROVIDER; + const web3 = new Web3(new Web3.providers.HttpProvider(provider)); + const networkId = await web3.version.network; + await initContracts(web3, networkId); + + const address = process.env.USER_ADDRESS; + + const addressDetails = await mongoClient + .collection(collections.ADDRESSES) + .findOne({ address }); + + if (addressDetails) { + const userInfo = await getContracts().daoInformation.readUserInfo.call(address); + + await mongoClient.collection(collections.ADDRESSES) + .updateOne({ address }, { + $set: { + ...getAddressObject(userInfo), + }, + }, { upsert: true }); + } + + console.log('done'); +}; + +updateAddress(); From 6d9a4e3d3cd52cacc0e55a773f1175ee114f6e62 Mon Sep 17 00:00:00 2001 From: Rohit Narurkar Date: Mon, 23 Sep 2019 10:31:25 +0800 Subject: [PATCH 16/16] (Needed for DGDG-584) Update participant and moderator status at the start of quarter --- dbWrapper/addresses.js | 7 +++++++ scripts/dao.js | 42 +++++++++++++++++++++++++++++++++++++ scripts/watchedFunctions.js | 4 ++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/dbWrapper/addresses.js b/dbWrapper/addresses.js index 0201ce6..d75f3c9 100644 --- a/dbWrapper/addresses.js +++ b/dbWrapper/addresses.js @@ -16,6 +16,12 @@ const updateAddress = async (address, update, moreOptions = {}) => { .updateOne({ address }, update, moreOptions); }; +const updateAddresses = async (filter, update, moreOptions = {}) => { + await mongoUtil.getDB() + .collection(collections.ADDRESSES) + .updateMany(filter, update, moreOptions); +}; + const getAddressDetails = async (address) => { const addressDetails = await mongoUtil.getDB() .collection(collections.ADDRESSES) @@ -46,6 +52,7 @@ const getAllAddresses = async (filter) => { module.exports = { updateAddress, + updateAddresses, insertAddress, getAddressDetails, getAllAddresses, diff --git a/scripts/dao.js b/scripts/dao.js index 818aa03..a5a95d1 100644 --- a/scripts/dao.js +++ b/scripts/dao.js @@ -8,6 +8,10 @@ const { getDaoInfo, } = require('../dbWrapper/dao'); +const { + updateAddresses, +} = require('../dbWrapper/addresses'); + const { getContracts, } = require('../helpers/contracts'); @@ -49,6 +53,43 @@ const initDao = async () => { }, { upsert: true }); }; +const initDaoAtNewQuarter = async () => { + const daoInfo = await getContracts().daoInformation.readDaoInfo.call(); + const totalLockedDgds = await getContracts() + .daoStakeStorage + .totalLockedDGDStake + .call(); + const totalModeratorLockedDgds = await getContracts() + .daoStakeStorage + .totalModeratorLockedDGDStake + .call(); + const fundsInDao = await getWeb3().eth.getBalance(getContracts().daoFundingManager.address); + // don't need to wait for this to be completed + + // set everybody to be not participants and not moderators + await updateAddresses({ isParticipant: true }, { + $set: { + isParticipant: false, + isModerator: false, + }, + }); + + await updateDao({ + $set: { + currentQuarter: daoInfo[0].toNumber(), + startOfQuarter: daoInfo[1].toNumber(), + startOfMainphase: daoInfo[2].toNumber(), + startOfNextQuarter: daoInfo[3].toNumber(), + totalLockedDgds: totalLockedDgds.toNumber(), + totalModeratorLockedDgds: totalModeratorLockedDgds.toNumber(), + isGlobalRewardsSet: daoInfo[5], + nModerators: daoInfo[6].toNumber(), + nParticipants: daoInfo[7].toNumber(), + remainingFunds: fundsInDao.toNumber(), + }, + }, { upsert: true }); +}; + const refreshDaoConfigs = async () => { const readDaoConfigs = await getContracts().daoConfigsStorage.readUintConfigs.call(); const daoConfigs = {}; @@ -133,5 +174,6 @@ module.exports = { refreshDaoConfigs, isDaoStarted, initDaoBeforeStart, + initDaoAtNewQuarter, getStartOfFirstQuarter, }; diff --git a/scripts/watchedFunctions.js b/scripts/watchedFunctions.js index f3bad96..4301857 100644 --- a/scripts/watchedFunctions.js +++ b/scripts/watchedFunctions.js @@ -30,8 +30,8 @@ const { } = require('./addresses'); const { - initDao, initDaoBeforeStart, + initDaoAtNewQuarter, } = require('./dao'); const tapPromise = t => f => (...args) => f(...args).then((result) => { @@ -83,7 +83,7 @@ const multiBroadcast = (splitter, broadcasts) => tapPromise((result) => { const watchedFunctionsMap = { setStartOfFirstQuarter: initDaoBeforeStart, - calculateGlobalRewardsBeforeNewQuarter: initDao, + calculateGlobalRewardsBeforeNewQuarter: initDaoAtNewQuarter, lockDGD: multiBroadcast( ([daoInfo, user]) => [daoInfo, user],