Commit Graph

466 Commits

Author SHA1 Message Date
Łukasz Magiera
fabd074165 on chain deals: Deals make it to the chain 2019-10-23 19:39:14 +02:00
Łukasz Magiera
61e14d0f4c on chain deals: Fix some serialization bugs 2019-10-23 14:59:57 +02:00
Łukasz Magiera
5175d8541e peer manager: Handle bootstrap in peermgr 2019-10-23 13:11:18 +02:00
Łukasz Magiera
1d1f468c98 peer manager: Disable in tests 2019-10-23 13:02:00 +02:00
whyrusleeping
fc7c7ddd97 Initial pass at a peer manager 2019-10-23 12:47:22 +02:00
Łukasz Magiera
213ac77d08 on chain deals: Expose more chain state in pond 2019-10-23 12:44:00 +02:00
Łukasz Magiera
99ef51a642 on chain deals: Fix build 2019-10-23 12:44:00 +02:00
Łukasz Magiera
46a0333c9c on chain deals: Wip porting deal systems to storagemarket 2019-10-23 12:44:00 +02:00
Łukasz Magiera
c41dd4efeb actora: register storagemarket 2019-10-23 12:44:00 +02:00
Łukasz Magiera
aab3bd617a REST file import endpoint 2019-10-23 11:39:44 +02:00
whyrusleeping
63b81af23e handle changing default address 2019-10-18 20:42:00 +09:00
Jakub Sztandera
1bf713cb0a
Cleanup imports after rename
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2019-10-18 13:47:41 +09:00
whyrusleeping
d818e20df5 Wallets record default address in keystore 2019-10-17 19:18:40 +09:00
Łukasz Magiera
170b49b625 make: fix install, faster bootstrap 2019-10-17 03:24:45 +02:00
Łukasz Magiera
29f26cb8d1 Compiling with the new weight func 2019-10-15 14:31:34 +02:00
Łukasz Magiera
7d471a6ce3 Revert "wip"
This reverts commit 859256dadbe42f44b7ac77a4b99b56393f52e127.
2019-10-15 14:31:34 +02:00
Łukasz Magiera
2ce338e162 wip weight function 2019-10-15 14:31:34 +02:00
Łukasz Magiera
007bdfaf42 wip 2019-10-15 14:31:34 +02:00
Łukasz Magiera
a576b72364 actors: Sync with the new spec, storage actors 2019-10-15 14:31:34 +02:00
Łukasz Magiera
9a238b7d01
Merge pull request #370 from filecoin-project/fix/chain-sync-test-fail
Fix chain sync test flakiness
2019-10-15 14:30:47 +02:00
whyrusleeping
aa644fcbbb call sync directly during submitblock 2019-10-15 21:19:10 +09:00
whyrusleeping
7c26e3c35f WIP: ensure blocks make it into repo before pushing to pubsub 2019-10-14 23:21:37 +09:00
whyrusleeping
e8a1b54740 Add more info to storage-miner info command output 2019-10-14 11:32:32 +09:00
Łukasz Magiera
379f0116a2
Merge pull request #334 from filecoin-project/feat/bootstrap-config
config: Allow overriding bootstrap peers
2019-10-12 09:31:35 +02:00
whyrusleeping
edcf47ff31 implement commands to list actors and miners 2019-10-12 15:45:48 +09:00
whyrusleeping
9147047062 add command to view chain easily 2019-10-11 15:25:25 +09:00
Łukasz Magiera
9a536e7cc0 config: Allow overriding bootstrap peers 2019-10-11 05:16:12 +02:00
Łukasz Magiera
4334e4d93d
Merge pull request #333 from filecoin-project/feat/th-names
townhall: Node names
2019-10-11 04:55:33 +02:00
Łukasz Magiera
387adae115 townhall: Node names 2019-10-11 04:45:45 +02:00
Łukasz Magiera
177a876cf2
Merge pull request #323 from filecoin-project/feat/tracing-1
add some more tracing to chain sync
2019-10-11 04:19:12 +02:00
Łukasz Magiera
1b96c6488b
Merge pull request #327 from filecoin-project/feat/get-genesis
Add get genesis api endpoint
2019-10-11 04:17:46 +02:00
whyrusleeping
1b263f685b Add get genesis api endpoint 2019-10-11 11:14:22 +09:00
Łukasz Magiera
40267e15b2
Merge pull request #326 from filecoin-project/feat/periodic-bootstrap
Periodic bootstrap
2019-10-11 04:09:01 +02:00
Łukasz Magiera
c0179bd4fa Periodic bootstrap 2019-10-11 02:31:26 +02:00
Łukasz Magiera
4c5157d270 Lotus Townhall 2019-10-10 14:02:43 +02:00
whyrusleeping
3f342d7ae2 add some more tracing to chain sync 2019-10-10 20:13:26 +09:00
Łukasz Magiera
356c1cfab0
Merge pull request #321 from filecoin-project/feat/chain-set-head
expose command to set chainstore head
2019-10-10 06:00:54 +02:00
whyrusleeping
acec79cf3f expose command to set chainstore head 2019-10-10 12:50:50 +09:00
Łukasz Magiera
f8ccbe92c1
Merge pull request #319 from filecoin-project/fix/bad-expansion
don't add bad blocks to tipsetcache
2019-10-10 05:50:03 +02:00
whyrusleeping
85684ba7e2 don't add bad blocks to tipsetcache 2019-10-10 12:04:10 +09:00
Łukasz Magiera
b32d197bca
Merge pull request #313 from filecoin-project/fix/genesis-timestamp
Fix timestamp in genesis
2019-10-10 04:18:58 +02:00
Jakub Sztandera
79ee959a90
Use log.Warn
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2019-10-09 22:23:04 +02:00
Jakub Sztandera
2a9ab727c8
Make version print nicely
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2019-10-09 22:18:53 +02:00
Jakub Sztandera
22ad0e176d
Fix timestamp in genesis
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2019-10-09 19:08:06 +02:00
whyrusleeping
14c4a8bee6 implement looking in the past for messages 2019-10-09 09:33:18 +02:00
whyrusleeping
84985ef96f add tipset message was executed in back to waitmsg call 2019-10-09 09:30:12 +02:00
Łukasz Magiera
b8bc54fd5b
Merge pull request #296 from filecoin-project/feat/verify-block-msg-signatures
Feat/verify block msg signatures
2019-10-09 09:25:21 +02:00
Łukasz Magiera
752654ab03 Devnet 3; Builtin bootstrap; NAT Port Map 2019-10-09 05:16:35 +02:00
whyrusleeping
68c1170250 compute signatures over msg cids instead of raw bytes 2019-10-09 10:32:08 +09:00
whyrusleeping
80b40e7e70 make magik happier 2019-10-08 18:46:36 +09:00
whyrusleeping
b40de6995b implement key import and export 2019-10-08 18:17:03 +09:00
Łukasz Magiera
2b04a9b6be mpool: check origin balance before actually pushing to mpool 2019-10-08 15:09:07 +09:00
Łukasz Magiera
4107c49db2 pond: Fix block explorer after stateroot refactor 2019-10-08 14:58:10 +09:00
whyrusleeping
76ceb1f25a a bit more hacking to make the test framework bend to my will 2019-10-05 17:18:39 -06:00
whyrusleeping
fca5a4765d begin allowing test framework to generate forks 2019-10-05 10:04:58 -06:00
whyrusleeping
6dd8ed7d7a pass those tests 2019-10-04 10:06:05 -06:00
whyrusleeping
27f120bfce improve accuracy of block printing with getblock 2019-10-03 13:22:21 -07:00
Łukasz Magiera
1534536590 Store libp2p key in keystore 2019-10-03 02:11:31 +02:00
whyrusleeping
c0e6e611be clean up usage of stmgr.TipSetState 2019-10-02 14:03:27 -06:00
whyrusleeping
65def6cc58 handle getting state for genesis block 2019-10-02 12:00:08 -06:00
whyrusleeping
b9cc6f61b6 rebase and fix tests 2019-10-01 15:34:53 -06:00
whyrusleeping
1419031f1e switch to parent state roots 2019-10-01 15:21:01 -06:00
whyrusleeping
404e14d3eb Add a command to read an object by its cid 2019-10-01 10:28:07 -06:00
whyrusleeping
af18cbac53 Add a command to inspect sync state progress 2019-09-30 15:06:47 -06:00
Łukasz Magiera
fe8e1fe1e4 Almost working new post code 2019-09-27 01:07:40 +02:00
whyrusleeping
0a0a4d30aa fix account balances to cover costs and collateral 2019-09-26 12:23:03 -07:00
Łukasz Magiera
18211b7bee storageminer: Fix PledgeCollateral calc on init 2019-09-26 12:13:43 -07:00
Łukasz Magiera
a2a2169ef8 Setup first devnet params 2019-09-26 12:13:43 -07:00
Łukasz Magiera
2fe4ffdfdc deals: more atomic voucher handling 2019-09-25 14:56:04 +02:00
Łukasz Magiera
caa767e081 Incremental deal payments 2019-09-24 23:13:47 +02:00
Łukasz Magiera
5fa1a74e74 Bump test genesis token amount 2019-09-24 13:02:54 +02:00
Łukasz Magiera
a6dafed486 tests: Basic mining integration test 2019-09-23 19:50:15 +02:00
Łukasz Magiera
18651ecaa3 pond: Integrate StateReply 2019-09-23 13:15:16 +02:00
Łukasz Magiera
4202da62cd
Merge pull request #216 from filecoin-project/feat/consensus-slashing
Feat/consensus slashing
2019-09-20 16:58:03 +02:00
Łukasz Magiera
9d36a499b6 post merge fixes 2019-09-20 14:22:46 +02:00
Łukasz Magiera
b58246d128 Merge remote-tracking branch 'origin/master' into feat/post-schedule 2019-09-20 14:22:22 +02:00
whyrusleeping
3154374132 fix account balances to make tests pass 2019-09-19 22:25:10 -07:00
whyrusleeping
394edc6317 refactor to use 'randomness' as input to new vm creation 2019-09-19 20:08:44 -07:00
whyrusleeping
f7e3762cfc add state replay api and command 2019-09-19 13:25:18 -07:00
Łukasz Magiera
cc82cc9675 miner: Initial event system integration 2019-09-18 15:32:21 +02:00
Łukasz Magiera
fe7efa753d events: Build on chain API calls 2019-09-18 13:01:52 +02:00
whyrusleeping
02887a63a3 simplify stateminersectors impl 2019-09-17 20:14:51 -07:00
whyrusleeping
b1e77748e7 scaffolding and refactoring to make post scheduler work 2019-09-17 19:50:03 -07:00
whyrusleeping
cc877f5c04 WIP: expanding API to serve post producer needs 2019-09-17 17:08:49 -07:00
Łukasz Magiera
7f68fa9567 Fix tests 2019-09-17 16:45:09 +02:00
Łukasz Magiera
f2ecb772fa repo: Close datastore in Close 2019-09-17 16:34:22 +02:00
Łukasz Magiera
83f1a336a6 node: Basic graceful shutdown 2019-09-17 16:23:08 +02:00
Łukasz Magiera
8f84aa7097 Fix stmgr.GetMinerPeerID 2019-09-17 10:34:41 +02:00
Łukasz Magiera
5ea1459275 Use atomic moppl API in more places 2019-09-17 10:15:26 +02:00
Łukasz Magiera
567ae92ff2 Move more logic into statemanager 2019-09-17 10:00:38 +02:00
Łukasz Magiera
f8a2ecaf52 gofmt; mod tidy 2019-09-16 23:26:19 +02:00
Łukasz Magiera
9fe198dc6f retrieval: payment validation 2019-09-16 23:25:23 +02:00
Łukasz Magiera
0a853ac0e7 pond: Retrieve button in deal client 2019-09-16 22:11:17 +02:00
Łukasz Magiera
18675bb052 impl: Fix ClientQueryAsk post rebase 2019-09-16 20:39:18 +02:00
Łukasz Magiera
12c777a3c7 paych: Set nil cid in ChannelMessage if not creating channel 2019-09-16 20:08:24 +02:00
Łukasz Magiera
b88d23fd8b paych: Fix createPaych 2019-09-16 20:08:24 +02:00
Łukasz Magiera
eda72468ce Sector Commitment tracker 2019-09-16 20:08:24 +02:00
Łukasz Magiera
1e07a12a2e More atomic mpool APIs 2019-09-16 20:08:23 +02:00
Łukasz Magiera
385e0cfd48 Paych improvements; Retrieval payments 2019-09-16 20:08:23 +02:00
whyrusleeping
1075c9a5e0 implement ask query protocol 2019-09-13 16:49:27 -07:00
Łukasz Magiera
6a31ff2f2e deals: Wait for channel messagi in handler 2019-09-13 19:59:10 +02:00
Łukasz Magiera
c121d9b8af pond: List client deals 2019-09-13 19:59:10 +02:00
Łukasz Magiera
1fc7a48759 deals: API to list client deals 2019-09-13 19:59:10 +02:00
Łukasz Magiera
388e3ffa96 paych: Api to reuse open channels for new payments 2019-09-13 19:59:10 +02:00
Łukasz Magiera
72a406ec7e deals: Better client deal tracking 2019-09-13 19:59:10 +02:00
whyrusleeping
512da42cde address review feedback 2019-09-09 19:14:27 -07:00
whyrusleeping
ed45d1c2b4 refactor state utilities into StateManager package, implement proper election proofs 2019-09-09 19:14:00 -07:00
whyrusleeping
6e21372ccb initial refactor for creating tipsets with multiple parents 2019-09-09 19:12:32 -07:00
Łukasz Magiera
5200a37349 paychmgr: store proofs with vouchers 2019-09-09 15:59:07 +02:00
Łukasz Magiera
4acf6d9d47 Partial payment integration in deals 2019-09-07 00:42:01 +02:00
Łukasz Magiera
7b7f128e43 paych: Fix paych init 2019-09-06 19:43:05 +02:00
Łukasz Magiera
57d0f7c722
Merge pull request #162 from filecoin-project/feat/retrieval
Retrieval
2019-08-31 00:29:00 +02:00
whyrusleeping
b69557251c Add proper timestamping and checking of timestamps 2019-08-29 19:59:54 -07:00
Łukasz Magiera
fe6d5ff3a8 retrieval: resolve some TODOs 2019-08-29 17:51:52 +02:00
Łukasz Magiera
a5d3122ba5 Make deals work with chunked files 2019-08-29 17:50:19 +02:00
Łukasz Magiera
c0566399c6 retrieval: Way to get the data 2019-08-29 17:50:19 +02:00
Łukasz Magiera
6714240653 SectorSize const 2019-08-29 17:50:19 +02:00
Łukasz Magiera
be30bc79a5 Retrieval works! 2019-08-29 17:50:19 +02:00
Łukasz Magiera
60eedb699e retrieval: Client impl 2019-08-29 17:48:58 +02:00
Łukasz Magiera
28d3eb38eb basic retrieval content discovery 2019-08-29 17:48:19 +02:00
Łukasz Magiera
cad3efb9ba Command to list sealed blocks 2019-08-29 17:48:19 +02:00
Łukasz Magiera
e0dc17bc1a Correctly construct sealbstore 2019-08-29 17:48:19 +02:00
Łukasz Magiera
9691211df1 Sealed blockstore 2019-08-29 17:48:19 +02:00
whyrusleeping
ccdc1575d6 add signatures to blocks 2019-08-26 17:46:39 -07:00
whyrusleeping
7eb89f90d1 Replace most marshaling with codegen 2019-08-22 12:53:32 -07:00
Łukasz Magiera
89dc87d890 use StateMinerPower in 'state power' cmd 2019-08-22 00:15:45 +02:00
Łukasz Magiera
fd2f0ed4f2 pond: Display miner power 2019-08-22 00:15:45 +02:00
Łukasz Magiera
e01ab507ca pond: New miner spawning 2019-08-22 00:15:45 +02:00
Łukasz Magiera
90dd19fe49 miner.Unregister 2019-08-20 20:05:17 +02:00
Łukasz Magiera
eda26faf21 Register miner address from storageminer process 2019-08-20 19:19:24 +02:00
Łukasz Magiera
4431dffc39 miner: Create miner in DI 2019-08-20 18:50:17 +02:00
Łukasz Magiera
e087cc2e7a impl: Split full node implementation 2019-08-20 18:48:33 +02:00
whyrusleeping
b2d425b891 TEMP: accept miner address from cli 2019-08-16 12:39:13 -07:00
whyrusleeping
f7dc253669 (mostly) proper ticket generation 2019-08-16 12:39:13 -07:00
whyrusleeping
e9d1f3e7c9 WIP: base mining on power and VRFs 2019-08-16 12:39:12 -07:00
Łukasz Magiera
3327781e60 chain: Better ReadState 2019-08-16 04:33:59 +02:00
Łukasz Magiera
760ebc341f storageminer: Split PaymentVerify into 2 methods 2019-08-15 22:57:14 +02:00
Łukasz Magiera
eb962940bd deals: wire up PaymentVerify 2019-08-15 17:04:40 +02:00
Łukasz Magiera
4c5ffb185e deals: setup payment channel for deals 2019-08-15 02:28:52 +02:00
Łukasz Magiera
baf4fbe309 sectorstore: Address review feetback 2019-08-15 00:46:15 +02:00
Łukasz Magiera
e6493afd46 move poller to sector store 2019-08-14 23:34:43 +02:00
Łukasz Magiera
399f91940b Sector store 2019-08-14 22:27:32 +02:00
Whyrusleeping
e050d56594
Merge pull request #132 from filecoin-project/feat/paych-manager
Implement payment channel manager
2019-08-13 12:13:23 -07:00
whyrusleeping
47efaece60 address review feedback 2019-08-13 11:47:40 -07:00
Łukasz Magiera
3a7a21ee83
Merge pull request #134 from filecoin-project/feat/more-deals
More deals progress
2019-08-13 19:32:58 +02:00
whyrusleeping
12acee5242 add payment channel CLI and finish up commands 2019-08-12 21:27:54 -07:00
Łukasz Magiera
9733e1f011 deals: use GetWorkerAddr 2019-08-13 01:54:53 +02:00
whyrusleeping
c986267a2e finish up initial api calls 2019-08-12 12:51:01 -07:00
whyrusleeping
ae34757e2a pull chain call into its own method and fix paych module 2019-08-12 11:30:20 -07:00
whyrusleeping
6d52abcb2e WIP: wiring up the payment channel manager to the api 2019-08-12 10:54:17 -07:00
whyrusleeping
6979c28e05 Add API interface for payment channels and a few tests 2019-08-12 10:12:51 -07:00
Łukasz Magiera
2229fae79d pond: basic state inspection 2019-08-10 03:54:52 +02:00
Łukasz Magiera
f99c8e032d pond: +1k button for addresses 2019-08-09 17:59:12 +02:00
whyrusleeping
28ef081d0e use wallet has instead of list 2019-08-08 10:56:14 -07:00
whyrusleeping
959fe371b0 move storage miner keys to full node 2019-08-08 10:56:14 -07:00
Łukasz Magiera
b2c3434bcd deals: Upstream bitswap changes 2019-08-08 19:16:41 +02:00
Łukasz Magiera
2114e8f555 deals: Show proposal cid in cli 2019-08-07 20:20:04 -07:00
Łukasz Magiera
3e2d04a540 deals: Use temp files for AddPiece 2019-08-07 20:02:05 -07:00
Łukasz Magiera
7423327b26 deals: Use real data in client 2019-08-07 20:01:51 -07:00
Łukasz Magiera
c79cb7bf31 deals: Almost sealing client data 2019-08-07 20:01:51 -07:00
Łukasz Magiera
b65041cac1 deals: Sending initial proposal works 2019-08-07 20:01:22 -07:00
Łukasz Magiera
549e7db12f deals: Implement basic handshake logic 2019-08-07 20:01:22 -07:00
Łukasz Magiera
ad9e433232 Start implementing storage deals 2019-08-07 20:00:49 -07:00
whyrusleeping
ba0d648546 sealing garbage data into a sector that gets accepted by the chain works! 2019-08-07 18:16:58 -07:00
whyrusleeping
5c32725510 sector commitments make it all the way to the chain 2019-08-07 16:22:35 -07:00
whyrusleeping
b7c6333fef implement sector commitments and proof verification 2019-08-06 23:35:57 -07:00
Łukasz Magiera
b1aee461ae
Merge pull request #110 from filecoin-project/feat/pond-storage-miners
Storage Miners in Pond
2019-08-06 18:11:51 +02:00
Whyrusleeping
3e768742a2
Merge pull request #113 from filecoin-project/feat/bls-spec-change-refactor
refactoring to accomodate the bls message changes in the spec
2019-08-05 12:09:01 -07:00
Whyrusleeping
c18711b3f9
Merge pull request #105 from filecoin-project/feat/multisig
Implement multisig
2019-08-05 12:08:32 -07:00
Jakub Sztandera
9577348422 Dual impl
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
2019-08-03 13:26:35 +02:00
Łukasz Magiera
282654bf7b pond: storage miner init 2019-08-02 16:15:14 +02:00
whyrusleeping
ff3433baa1 fix chain progression after restarting process 2019-08-01 23:46:14 -07:00
whyrusleeping
e5f4c75ca4 fix up the tests and cli 2019-08-01 20:51:34 -07:00
whyrusleeping
dc7c0fcabe refactoring to accomodate the bls message changes in the spec 2019-08-01 18:19:22 -07:00
Łukasz Magiera
cfc3ac795d Fix tests 2019-08-01 16:26:12 +02:00
Łukasz Magiera
542f645c28 gofmt 2019-08-01 16:20:50 +02:00
Łukasz Magiera
9ae450620a Cleanup node/modules 2019-08-01 16:19:53 +02:00
Łukasz Magiera
6a4b9a6515 More separation for storage types in di modules 2019-08-01 16:14:16 +02:00
Łukasz Magiera
0f2334f513 chain sync: rebase 'fixes' 2019-07-31 10:43:14 -07:00
Łukasz Magiera
cdf0e0c858 chain: Test 'manual' sync 2019-07-31 10:43:13 -07:00
Łukasz Magiera
412a168151 chain: more work on chain sync, sync testing 2019-07-31 10:43:13 -07:00
Łukasz Magiera
9ef5e1266e chain: Test basinc sync on generated chain 2019-07-31 10:43:13 -07:00
Łukasz Magiera
a656aea7fe chain: WIP Generated node sync test 2019-07-31 10:43:13 -07:00
Łukasz Magiera
006fbe556f Use correct ctx for SectorBuilder/Miner 2019-07-31 19:01:04 +02:00
Łukasz Magiera
d8bd222cb1 Optional tipset param for ChainCall 2019-07-31 18:54:28 +02:00
whyrusleeping
ee224e5b21 Implement 'storage miner' module, wire up a few bits it needs to start 2019-07-29 17:46:56 -07:00
whyrusleeping
259b38eb55 move sectorbuilder DI stuff to Online option 2019-07-29 12:11:55 -07:00
whyrusleeping
b83ff6b9dc Wire up sector builder commands through the api 2019-07-29 12:08:47 -07:00
whyrusleeping
4fb4835b35 can we store it? YES WE CAN 2019-07-29 12:08:47 -07:00
whyrusleeping
f1432826d5 start integrating sector builder 2019-07-29 12:08:05 -07:00
whyrusleeping
0c67d66198 Make message wait work and use it for the storage-miner init 2019-07-29 11:58:30 -07:00
whyrusleeping
fa5e27d7b9 finish wiring up message wait 2019-07-29 11:57:48 -07:00
Whyrusleeping
54c78877bb
Merge pull request #104 from filecoin-project/feat/chain-notifs
expose head change notifications through api
2019-07-29 11:36:04 -07:00
whyrusleeping
03f653b88e expose head change notifications through api 2019-07-28 12:19:33 -07:00
whyrusleeping
71baa5cbfe implement chain generator 2019-07-26 13:47:29 -07:00
Jakub Sztandera
0e35240fe9 Wire in context to VMContext
License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
2019-07-26 21:01:02 +02:00
Łukasz Magiera
590b5f0299 Allocate funds in testing.MakeGenesis 2019-07-26 14:51:32 +02:00
whyrusleeping
78da356752 pull more things apart 2019-07-26 13:49:30 +02:00
Łukasz Magiera
12baee0e57 Use xerrors 2019-07-26 13:45:25 +02:00
whyrusleeping
2facece1f6 improve errors a bit 2019-07-25 20:26:29 -07:00