Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support hashable-1.4.3 #1717

Merged
merged 3 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,3 @@ allow-newer: base16-bytestring:*
-- servant does not yet support aeson 2.2
constraints: aeson <2.2

-- this indicates a bug in chainweb-node or pact where code depends on ordering
-- of items in hashmap
constraints: hashable <1.4.3
8 changes: 4 additions & 4 deletions cabal.project.freeze
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ constraints: any.Boolean ==0.2.4,
any.ghc-prim ==0.10.0,
any.groups ==0.5.3,
any.happy ==1.20.1.1,
any.hashable ==1.4.2.0,
any.hashable ==1.4.3.0,
hashable +integer-gmp -random-initial-seed,
any.hashes ==0.2.3,
hashes -benchmark-cryptonite -openssl-use-pkg-config -test-cryptonite +with-openssl,
Expand Down Expand Up @@ -321,7 +321,7 @@ constraints: any.Boolean ==0.2.4,
any.strict ==0.5,
any.strict-concurrency ==0.2.4.3,
any.string-conversions ==0.4.0.1,
any.syb ==0.7.2.3,
any.syb ==0.7.2.4,
any.tagged ==0.8.7,
tagged +deepseq +transformers,
any.tasty ==1.4.3,
Expand All @@ -344,7 +344,7 @@ constraints: any.Boolean ==0.2.4,
any.time-compat ==1.9.6.1,
time-compat -old-locale,
any.time-manager ==0.0.0,
any.tls ==1.7.0,
any.tls ==1.7.1,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this update is unrelated, but nice to have.

tls +compat -hans +network,
any.tls-session-manager ==0.0.4,
any.token-bucket ==0.1.0.1,
Expand Down Expand Up @@ -403,4 +403,4 @@ constraints: any.Boolean ==0.2.4,
yet-another-logger -tbmqueue,
any.zlib ==0.6.3.0,
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config
index-state: hackage.haskell.org 2023-07-25T17:03:00Z
index-state: hackage.haskell.org 2023-08-01T16:48:53Z
5 changes: 2 additions & 3 deletions src/Chainweb/Version/Utils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,8 @@ someChainId v = someChainIdAt v maxBound
-- chain ids for the chainweb at the given height.
--
someChainIdAt :: HasCallStack => HasChainwebVersion v => v -> BlockHeight -> ChainId
someChainIdAt v h = head . toList $ chainIdsAt v h
-- 'head' is guaranteed to succeed because the empty graph isn't a valid chain
-- graph.
someChainIdAt v h = minimum $ chainIdsAt v h
-- guaranteed to succeed because the empty graph isn't a valid chain graph.
Comment on lines +226 to +227
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could have fixed the value to value with the previous version of hashable, which would have avoided updating of golden files. But using the minimum seems like a more reasonable and intuitive default.

{-# INLINE someChainIdAt #-}

isGraphChange :: HasChainwebVersion v => v -> BlockHeight -> Bool
Expand Down
32 changes: 26 additions & 6 deletions test/Chainweb/Test/Cut/TestBlockDb.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,14 @@ module Chainweb.Test.Cut.TestBlockDb

import Control.Concurrent.MVar
import Control.Monad.Catch
import Data.Bifunctor (first)
import qualified Data.HashMap.Strict as HM

import Chainweb.BlockHeader
import Chainweb.BlockHeaderDB
import Chainweb.ChainId
import Chainweb.Cut
import Chainweb.Test.Utils (testRocksDb)
import Chainweb.Test.Cut (GenBlockTime, testMine')
import Chainweb.Test.Cut (GenBlockTime, testMine', MineFailure(BadAdjacents))
import Chainweb.Payload
import Chainweb.Payload.PayloadStore
import Chainweb.Payload.PayloadStore.RocksDB
Expand Down Expand Up @@ -64,13 +63,34 @@ mkTestBlockDb cv rdb = do
return $! TestBlockDb wdb pdb initCut

-- | Add a block.
addTestBlockDb :: TestBlockDb -> Nonce -> GenBlockTime -> ChainId -> PayloadWithOutputs -> IO ()
--
-- Returns False when mining fails due to BadAdjacents, which usually means that
-- the chain is blocked. Retry with another chain!
--
addTestBlockDb
:: TestBlockDb
-> Nonce
-> GenBlockTime
-> ChainId
-> PayloadWithOutputs
-> IO Bool
addTestBlockDb (TestBlockDb wdb pdb cmv) n gbt cid outs = do
c <- takeMVar cmv
r <- testMine' wdb n gbt (_payloadWithOutputsPayloadHash outs) cid c
(T2 _ c') <- fromEitherM $ first (userError . show) $ r
casInsert pdb outs
putMVar cmv c'
case r of
-- success
Right (T2 _ c') -> do
casInsert pdb outs
putMVar cmv c'
return True

-- mining failed, probably because chain is blocked
Left BadAdjacents -> do
putMVar cmv c
return False
Comment on lines +88 to +90
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before the function would fail with an userError in this case. This change informs the caller when mining fails.

In practice there are tests where it can happen that the mining of a blocked chain is attempted. It was by pure chance that this didn't showed up before. The latest version of hashable changed the hash value of chain ids and thus the ordering of chains in tests, which caused this issue to surface.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about applying a "if comments on github make it easy to understand the PR, they should be in the code" rule here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure in case of this comments, since they talk an old version of the code and the diff with the new version. I think, PR comments my be a better place for those.

But, generally, I agree, that comments that explain the behavior of the new code should be code comments.


-- something went wrong
Left e -> throwM $ userError (show e)

-- | Get header for chain on current cut.
getParentTestBlockDb :: TestBlockDb -> ChainId -> IO BlockHeader
Expand Down
6 changes: 3 additions & 3 deletions test/Chainweb/Test/Pact/ModuleCacheOnRestart.hs
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ testCoinbase
testCoinbase iobdb = (initPayloadState >> doCoinbase,snapshotCache)
where
doCoinbase = do
bdb <- liftIO $ iobdb
bdb <- liftIO iobdb
pwo <- execNewBlock mempty (ParentHeader genblock) noMiner
liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo
void $ liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo
nextH <- liftIO $ getParentTestBlockDb bdb testChainId
void $ execValidateBlock mempty nextH (payloadWithOutputsToPayloadData pwo)

Expand Down Expand Up @@ -259,7 +259,7 @@ doNextCoinbase iobdb = do
bdb <- liftIO iobdb
prevH <- liftIO $ getParentTestBlockDb bdb testChainId
pwo <- execNewBlock mempty (ParentHeader prevH) noMiner
liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo
void $ liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo
nextH <- liftIO $ getParentTestBlockDb bdb testChainId
(valPWO, _g) <- execValidateBlock mempty nextH (payloadWithOutputsToPayloadData pwo)
return (nextH, valPWO)
Expand Down
4 changes: 2 additions & 2 deletions test/Chainweb/Test/Pact/PactMultiChainTest.hs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ import Chainweb.Test.TestVersions
import Chainweb.Time
import Chainweb.Utils
import Chainweb.Version
import Chainweb.Version.Utils
import Chainweb.WebPactExecutionService

import Chainweb.Storage.Table (casLookupM)
Expand All @@ -71,7 +70,8 @@ testVersion :: ChainwebVersion
testVersion = slowForkingCpmTestVersion peterson

cid :: ChainId
cid = someChainId testVersion
cid = unsafeChainId 9
-- several tests in this file expect chain 9
Comment on lines +73 to +74
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the new hashable version the value of someChainId changes. This fixes the previous value.


data MultiEnv = MultiEnv
{ _menvBdb :: !TestBlockDb
Expand Down
8 changes: 5 additions & 3 deletions test/Chainweb/Test/Pact/Utils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -711,9 +711,11 @@ runCut v bdb pact genTime noncer miner =
ph <- ParentHeader <$> getParentTestBlockDb bdb cid
pout <- _webPactNewBlock pact miner ph
n <- noncer cid
addTestBlockDb bdb n genTime cid pout
h <- getParentTestBlockDb bdb cid
void $ _webPactValidateBlock pact h (payloadWithOutputsToPayloadData pout)

-- skip this chain if mining fails and retry with the next chain.
whenM (addTestBlockDb bdb n genTime cid pout) $ do
h <- getParentTestBlockDb bdb cid
void $ _webPactValidateBlock pact h (payloadWithOutputsToPayloadData pout)

initializeSQLite :: IO SQLiteEnv
initializeSQLite = open2 file >>= \case
Expand Down
6 changes: 3 additions & 3 deletions test/golden/empty-block-tests-expected.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
results:
coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJa1l3UXpsdFJUVkpNM2RsTFRsR05uRmxSV3RaYldSaWVYQXdUMk5sYUhKZmIwWkpNbXB1YkRVdGQwa2kiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9
coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJbXRNTUVWWWEyc3lkMlJrVFZkeU1sRkJUVU5YUkRaelFqZHBNR3hPVTFZM2VGWm5XSGN5YWxBelNFMGkiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9
minerData: eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119
outputsHash: CVJw7e4GM7lv0fTF6UQ_Bh9AskyHw2TWzgRLUyyKRqo
payloadHash: k_2HP1fYNLkKZQfXaijxIVlrN4hoxkG9--s060A9He4
outputsHash: BRFFHFEHv4IbjOUrIkWgp2N0eU-6mijYqRU1pcGVHJ8
payloadHash: h490ZOFfkwbnGOFgAtxj8v7B-u2BJiMzmySXUwB2Fq4
transactions: []
transactionsHash: lL9ztEiU-NwzrlTpBbvhT4M1l5Shsht94OwFyhBaFD0
test-group: new-block
8 changes: 4 additions & 4 deletions test/golden/new-block-0-expected.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
results:
coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJa1l3UXpsdFJUVkpNM2RsTFRsR05uRmxSV3RaYldSaWVYQXdUMk5sYUhKZmIwWkpNbXB1YkRVdGQwa2kiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9
coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJbXRNTUVWWWEyc3lkMlJrVFZkeU1sRkJUVU5YUkRaelFqZHBNR3hPVTFZM2VGWm5XSGN5YWxBelNFMGkiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9
minerData: eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119
outputsHash: 0xwr7re1jD50YtNtdzhIUUL-PEeyhiZ_DKRwVZS-DzE
payloadHash: MeRwZKToHy1mcewCOqHmuETKAt6CNMWntwVPtj6kO9Y
outputsHash: 9ZzMlVJFvUJP7Z--MALWu9r8EKkuvvExTJUZyidk3yM
payloadHash: G3LQ7UEnUBMQBg2-mtICF7i2AKoAp_8tJZs7a8SG0lI
transactions:
- - eyJoYXNoIjoiSWxGRDdhOVVZT0dXMUJHRUZjYWRwejVUVW1XLVc5ZkJ5NkZIVzYzaXEzayIsInNpZ3MiOlt7InNpZyI6ImYzZTc5Mjc4MGRmNTIwZmVkMjg5MDc3MjllMjI1NTA4NTk2MzJhMzNiMTQzMTM0MDlkOTkyZmRmMjJjNTZlZDEwMzdiZTcxNDYyNWRkMTZmYWI5MmVlNjZhZmQ1MjhiNWViZjEwYWNhZjY2ZjRlZGVmMWM2ZjZjY2Q4OTkxMjA0In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihkZWZpbmUta2V5c2V0ICd0ZXN0LWFkbWluIChyZWFkLWtleXNldCBcXFwidGVzdC1hZG1pbi1rZXlzZXRcXFwiKSlcXG5cXG4obmFtZXNwYWNlICdmcmVlKVxcblxcbihtb2R1bGUgdGVzdDEgJ3Rlc3QtYWRtaW5cXG5cXG4gIChkZWZzY2hlbWEgYWNjb3VudFxcbiAgICBiYWxhbmNlOmRlY2ltYWxcXG4gICAgYW1vdW50OmRlY2ltYWxcXG4gICAgZGF0YSlcXG5cXG4gIChkZWZ0YWJsZSBhY2NvdW50czp7YWNjb3VudH0pXFxuXFxuICAoZGVmdW4gY3JlYXRlLWFjY291bnQgKGlkIGluaXQtYmFsKVxcbiAgICAoaW5zZXJ0IGFjY291bnRzIGlkXFxuICAgICAgICAgeyBcXFwiYmFsYW5jZVxcXCI6IGluaXQtYmFsLCBcXFwiYW1vdW50XFxcIjogaW5pdC1iYWwsIFxcXCJkYXRhXFxcIjogXFxcIkNyZWF0ZWQgYWNjb3VudFxcXCIgfSkpXFxuXFxuICAoZGVmdW4gdHJhbnNmZXIgKHNyYyBkZXN0IGFtb3VudClcXG4gICAgXFxcInRyYW5zZmVyIEFNT1VOVCBmcm9tIFNSQyB0byBERVNUIGZvciB1bmVuY3J5cHRlZCBhY2NvdW50c1xcXCJcXG4gICAgKGRlYml0IHNyYyBhbW91bnQgeyBcXFwidHJhbnNmZXItdG9cXFwiOiBkZXN0IH0pXFxuICAgIChjcmVkaXQgZGVzdCBhbW91bnQgeyBcXFwidHJhbnNmZXItZnJvbVxcXCI6IHNyYyB9KSlcXG5cXG4gIChkZWZwYWN0IHBheW1lbnQgKHNyYy1lbnRpdHkgc3JjIGRlc3QtZW50aXR5IGRlc3QgYW1vdW50KVxcbiAgICBcXFwiVHdvLXBoYXNlIGNvbmZpZGVudGlhbCBwYXltZW50LCBzZW5kaW5nIG1vbmV5IGZyb20gU1JDIGF0IFNSQy1FTlRJVFkgdG8gREVTVCBhdCBERVNULUVOVElUWS5cXFwiXFxuXFxuICAgIChzdGVwLXdpdGgtcm9sbGJhY2tcXG4gICAgIHNyYy1lbnRpdHlcXG4gICAgIChsZXQgKChyZXN1bHQgKGRlYml0IHNyYyBhbW91bnQgeyBcXFwidHJhbnNmZXItdG9cXFwiOiBkZXN0LCBcXFwibWVzc2FnZVxcXCI6IFxcXCJTdGFydGluZyBwYWN0XFxcIiB9KSkpXFxuICAgICAgICh5aWVsZCB7IFxcXCJyZXN1bHRcXFwiOiByZXN1bHQsIFxcXCJhbW91bnRcXFwiOiBhbW91bnQsIFxcXCJ0eFxcXCI6IChwYWN0LWlkKSB9KSlcXG4gICAgIChjcmVkaXQgc3JjIGFtb3VudCB7IFxcXCJyb2xsYmFja1xcXCI6IChwYWN0LWlkKSB9KSlcXG5cXG4gICAgKHN0ZXBcXG4gICAgIGRlc3QtZW50aXR5XFxuICAgICAocmVzdW1lIHsgXFxcInJlc3VsdFxcXCI6PSByZXN1bHQsIFxcXCJhbW91bnRcXFwiOj0gZGViaXQtYW1vdW50IH1cXG4gICAgICAgKGNyZWRpdCBkZXN0IGRlYml0LWFtb3VudFxcbiAgICAgICAgICAgICAgIHsgXFxcInRyYW5zZmVyLWZyb21cXFwiOiBzcmMsIFxcXCJkZWJpdC1yZXN1bHRcXFwiOiByZXN1bHQsIFxcXCJ0eFxcXCI6IChwYWN0LWlkKSB9KSkpKVxcblxcbiAgKGRlZnVuIGRlYml0IChhY2N0IGFtb3VudCBkYXRhKVxcbiAgICBcXFwiRGViaXQgQUNDVCBmb3IgQU1PVU5ULCBlbmZvcmNpbmcgcG9zaXRpdmUgYW1vdW50IGFuZCBzdWZmaWNpZW50IGZ1bmRzLCBhbm5vdGF0aW5nIHdpdGggREFUQVxcXCJcXG4gICAgKGVuZm9yY2UtcG9zaXRpdmUgYW1vdW50KVxcbiAgICAod2l0aC1yZWFkIGFjY291bnRzIGFjY3QgeyBcXFwiYmFsYW5jZVxcXCI6PSBiYWxhbmNlIH1cXG4gICAgICAoY2hlY2stYmFsYW5jZSBiYWxhbmNlIGFtb3VudClcXG4gICAgICAodXBkYXRlIGFjY291bnRzIGFjY3RcXG4gICAgICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIjogKC0gYmFsYW5jZSBhbW91bnQpLCBcXFwiYW1vdW50XFxcIjogKC0gYW1vdW50KVxcbiAgICAgICAgICAgICwgXFxcImRhdGFcXFwiOiBkYXRhIH0pKSlcXG5cXG4gIChkZWZ1biBjcmVkaXQgKGFjY3QgYW1vdW50IGRhdGEpXFxuICAgIFxcXCJDcmVkaXQgQUNDVCBmb3IgQU1PVU5ULCBlbmZvcmNpbmcgcG9zaXRpdmUgYW1vdW50XFxcIlxcbiAgICAoZW5mb3JjZS1wb3NpdGl2ZSBhbW91bnQpXFxuICAgICh3aXRoLXJlYWQgYWNjb3VudHMgYWNjdCB7IFxcXCJiYWxhbmNlXFxcIjo9IGJhbGFuY2UgfVxcbiAgICAgICh1cGRhdGUgYWNjb3VudHMgYWNjdFxcbiAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiOiAoKyBiYWxhbmNlIGFtb3VudCksIFxcXCJhbW91bnRcXFwiOiBhbW91bnRcXG4gICAgICAgICAgICAsIFxcXCJkYXRhXFxcIjogZGF0YSB9KSkpXFxuXFxuXFxuICAoZGVmdW4gcmVhZC1hY2NvdW50IChpZClcXG4gICAgXFxcIlJlYWQgZGF0YSBmb3IgYWNjb3VudCBJRFxcXCJcXG4gICAgKCsgeyBcXFwiYWNjb3VudFxcXCI6IGlkIH0gKHJlYWQgYWNjb3VudHMgaWQpKSlcXG5cXG4gIChkZWZ1biBjaGVjay1iYWxhbmNlIChiYWxhbmNlIGFtb3VudClcXG4gICAgKGVuZm9yY2UgKDw9IGFtb3VudCBiYWxhbmNlKSBcXFwiSW5zdWZmaWNpZW50IGZ1bmRzXFxcIikpXFxuXFxuICAoZGVmdW4gZW5mb3JjZS1wb3NpdGl2ZSAoYW1vdW50KVxcbiAgICAoZW5mb3JjZSAoPj0gYW1vdW50IDAuMCkgXFxcImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIikpXFxuXFxuIChkZWZ1biByZWFkLWFsbCAoKVxcbiAgIChtYXAgKHJlYWQtYWNjb3VudCkgKGtleXMgYWNjb3VudHMpKSlcXG5cXG4gKGRlZnVuIHJlYWQtYWxsLWdsb2JhbCAoKVxcbiAgIChtYXAgKHJlYWQtYWNjb3VudCkgW1xcXCJBY2N0MVxcXCIgXFxcIkFjY3QyXFxcIl0pKVxcblxcbiAoZGVmdW4gY3JlYXRlLWdsb2JhbC1hY2NvdW50cyAoKVxcbiAgIChjcmVhdGUtYWNjb3VudCBcXFwiQWNjdDFcXFwiIDEwMDAwMDAuMClcXG4gICAoY3JlYXRlLWFjY291bnQgXFxcIkFjY3QyXFxcIiAwLjApXFxuICAgKHJlYWQtYWxsKSlcXG5cXG4gKGRlZnBhY3QgY3JlYXRlLXByaXZhdGUtYWNjb3VudHMgKClcXG4gICAoc3RlcCBcXFwiQWxpY2VcXFwiIChjcmVhdGUtYWNjb3VudCBcXFwiQVxcXCIgMTAwMC4wKSlcXG4gICAoc3RlcCBcXFwiQm9iXFxcIiAoY3JlYXRlLWFjY291bnQgXFxcIkJcXFwiIDEwMDAuMCkpXFxuICAgKHN0ZXAgXFxcIkNhcm9sXFxcIiAoY3JlYXRlLWFjY291bnQgXFxcIkNcXFwiIDEwMDAuMCkpXFxuICAgKHN0ZXAgXFxcIkRpbmVzaFxcXCIgKGNyZWF0ZS1hY2NvdW50IFxcXCJEXFxcIiAxMDAwLjApKSlcXG5cXG4pXFxuXCJ9fSxcInNpZ25lcnNcIjpbe1wicHViS2V5XCI6XCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJ9XSxcIm1ldGFcIjp7XCJjcmVhdGlvblRpbWVcIjowLFwidHRsXCI6MTAwMDAwMCxcImdhc0xpbWl0XCI6MTAwMDAsXCJjaGFpbklkXCI6XCIwXCIsXCJnYXNQcmljZVwiOjEuMGUtMixcInNlbmRlclwiOlwic2VuZGVyMDBcIn0sXCJub25jZVwiOlwiMTBcIn0ifQ
- eyJnYXMiOjY0OSwicmVzdWx0Ijp7InN0YXR1cyI6InN1Y2Nlc3MiLCJkYXRhIjoiTG9hZGVkIG1vZHVsZSBmcmVlLnRlc3QxLCBoYXNoIEI2WkpnZldENW9iUEdtWWNfaVJLaXJETVA2LVVHbTJwVVY3bXRIRC1Sc1EifSwicmVxS2V5IjoiSWxGRDdhOVVZT0dXMUJHRUZjYWRwejVUVW1XLVc5ZkJ5NkZIVzYzaXEzayIsImxvZ3MiOiJMRm51NzRDaE4wZS1IbGI3azlqZlAzcmpmcWh6WjFweUpibXpkX1lOMFdZIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MTF9
Expand All @@ -13,7 +13,7 @@ results:
- - eyJoYXNoIjoicFBrLWxFUE1jRnRDWXdXR2ZaejV2bGdzZ1ZYV3dYbXhmQVJ6bkFCbUVONCIsInNpZ3MiOlt7InNpZyI6IjM3YjI4MmY1YWQ0YWY0Yzk2YmE1NzA5YWEzOTI2NTU1YjU5MDEwYzczZmVmZTUwNzQyMGYyODVjZTI1MmQ5ZjM1YzQ5NjAxYTgwMDYxZGU2NzEzNTcxNzY2MTNmODIyODQxMDU0MjliZTVkOTEzNWMzODAxMzcyN2UyMmI3ZjA2In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihmcmVlLnRlc3QxLnRyYW5zZmVyIFxcXCJBY2N0MVxcXCIgXFxcIkFjY3QyXFxcIiAxLjAwKVwifX0sXCJzaWduZXJzXCI6W3tcInB1YktleVwiOlwiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwifV0sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjEwMDAwMDAsXCJnYXNMaW1pdFwiOjEwMDAwLFwiY2hhaW5JZFwiOlwiMFwiLFwiZ2FzUHJpY2VcIjoxLjBlLTIsXCJzZW5kZXJcIjpcInNlbmRlcjAwXCJ9LFwibm9uY2VcIjpcIjEzXCJ9In0
- eyJnYXMiOjQwNywicmVzdWx0Ijp7InN0YXR1cyI6InN1Y2Nlc3MiLCJkYXRhIjoiV3JpdGUgc3VjY2VlZGVkIn0sInJlcUtleSI6InBQay1sRVBNY0Z0Q1l3V0dmWno1dmxnc2dWWFd3WG14ZkFSem5BQm1FTjQiLCJsb2dzIjoib3hWd2tvU21xM2JZeVh5aHYwT0V3ZTN2c0tGbWlkRTBtTEotQ2FZWVhRayIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjIwfQ
- - eyJoYXNoIjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsInNpZ3MiOlt7InNpZyI6IjZhODRiMWRkNGFkNDE5ZGY3YThhODA4NGYwNWEyZDM5YzExNTBmMjI5ZTM3OTFlM2UwY2E0OTkyZDkwNGNhOGVlMTk4MTljNTE3YTVjNjM5M2E3ZmYyNWI1NjdiNjJjOTYwZTFiYmI4ZTE2YjZiMWU2YmRkNDU1Njk3ODc1MDA5In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAncHJldi1ibG9jay1oYXNoIChjaGFpbi1kYXRhKSlcIn19LFwic2lnbmVyc1wiOlt7XCJwdWJLZXlcIjpcIjM2ODgyMGY4MGMzMjRiYmM3YzJiMDYxMDY4OGE3ZGE0M2UzOWY5MWQxMTg3MzI2NzFjZDljNzUwMGZmNDNjY2FcIn1dLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxMDAwMDAwLFwiZ2FzTGltaXRcIjoxMDAwMCxcImNoYWluSWRcIjpcIjBcIixcImdhc1ByaWNlXCI6MS4wZS0yLFwic2VuZGVyXCI6XCJzZW5kZXIwMFwifSxcIm5vbmNlXCI6XCIxNFwifSJ9
- eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkRoVzNJa1VOMTJ0bXAzWGt5d3lnSk5lLTNXZDl5dUNFTHdRX2lIYnM2V2cifSwicmVxS2V5IjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsImxvZ3MiOiJUVVVlWFJmRFlnQlZTdjFZU0ktU3lfRVdtcHRaWXZqQlNmY1ZMc2ZzcVpVIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MjN9
- eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6ImdqTmVmdmM3STRpblNOOUxFZkVCN0c0OUlvWC0ycGxEQmVUbFpwU1czQTQifSwicmVxS2V5IjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsImxvZ3MiOiJUVVVlWFJmRFlnQlZTdjFZU0ktU3lfRVdtcHRaWXZqQlNmY1ZMc2ZzcVpVIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MjN9
- - eyJoYXNoIjoiTzhoWU1TVUhnSkNPRXFoTy0yRFRNRGJhTzBIZmx6VjM0UHRzM0dlUHBJUSIsInNpZ3MiOlt7InNpZyI6ImMxYjQ5OTQwNTQ0MjZmNzE2NWM2NmZjNjY0MzE0N2M1N2QxYTczYzM3NjEwMjU4OGU0M2QyMzA1ZjBhY2FhYTQyMDRkZGRmNGRhMWFiMzk0OTdkY2FiM2FjZWU1NmQ0NmQ3NzJkNDZkNjAyNmU5ZjQ4MGFmMWNiMWIyNWFmYzA3In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAnYmxvY2stdGltZSAoY2hhaW4tZGF0YSkpXCJ9fSxcInNpZ25lcnNcIjpbe1wicHViS2V5XCI6XCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJ9XSxcIm1ldGFcIjp7XCJjcmVhdGlvblRpbWVcIjowLFwidHRsXCI6MTAwMDAwMCxcImdhc0xpbWl0XCI6MTAwMDAsXCJjaGFpbklkXCI6XCIwXCIsXCJnYXNQcmljZVwiOjEuMGUtMixcInNlbmRlclwiOlwic2VuZGVyMDBcIn0sXCJub25jZVwiOlwiMTVcIn0ifQ
- eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJ0aW1lIjoiMTk3MC0wMS0wMVQwMDowMDowMFoifX0sInJlcUtleSI6Ik84aFlNU1VIZ0pDT0VxaE8tMkRUTURiYU8wSGZselYzNFB0czNHZVBwSVEiLCJsb2dzIjoidTdKNDU3dGdzNDJ1dGhjOU1TbWtkaTkxT2tUb2FCNFpGei1QUWtSajJhdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjI2fQ
- - eyJoYXNoIjoiSGFsbTJLYUV5Qm5weXJqMkxHMmJQcVZDUmZBYk8yWHZzZWlnaURaZElLOCIsInNpZ3MiOlt7InNpZyI6ImI0MDNlZWI3ODI0NzA0OWU0NjEzNGQzYWQ0MWZlMTAwNWMxM2I0NzNhNjUzZGNmNTVlN2ZmMzIzOGU5N2VkYmRmZTMyZmFmODczODViYTc0MmNmMDFmYmFkMDU2ODEwNWVjNDhhMDk1MzIyNWJmMmY0ODJjNjhiMjkyZGNmOTAzIn1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAnYmxvY2staGVpZ2h0IChjaGFpbi1kYXRhKSlcIn19LFwic2lnbmVyc1wiOlt7XCJwdWJLZXlcIjpcIjM2ODgyMGY4MGMzMjRiYmM3YzJiMDYxMDY4OGE3ZGE0M2UzOWY5MWQxMTg3MzI2NzFjZDljNzUwMGZmNDNjY2FcIn1dLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxMDAwMDAwLFwiZ2FzTGltaXRcIjoxMDAwMCxcImNoYWluSWRcIjpcIjBcIixcImdhc1ByaWNlXCI6MS4wZS0yLFwic2VuZGVyXCI6XCJzZW5kZXIwMFwifSxcIm5vbmNlXCI6XCIxNlwifSJ9
Expand Down
Loading