Resolve Miscellaneous Prysm TODOs (#3465)

* resolve

* resolve

* return

* remove deprecated protos

* rem deprecated pbs

* resolve cache

* resolve md TODO

* node server

* resolve config todo

* resolve even more

* broken build
This commit is contained in:
Raul Jordan
2019-09-16 15:45:03 -05:00
committed by GitHub
parent 9683a83750
commit 49a529388b
35 changed files with 446 additions and 6678 deletions

View File

@@ -15,15 +15,14 @@ prevents deterministically generating more keys than those.
Prysm supports a few ways to quickly launch a beacon node from basic configurations:
- `SSZ Genesis`: Launches a beacon node from a .ssz file containing a SSZ-encoded, genesis beacon state **(Recommended)**
- `Yaml Genesis`: Launches a beacon node from a .yaml file specifying a genesis beacon state - binary data is _base64 encoded_
- `JSON Genesis`: Launches a beacon node from a .json file specifying a genesis beacon state - binary data is _base64 encoded_
- `NumValidators + GenesisTime`: Launches a beacon node by deterministically generating a state from a num-validators flag along with a genesis time **(Recommended)**
- `SSZ Genesis`: Launches a beacon node from a .ssz file containing a SSZ-encoded, genesis beacon state
## Generating a Genesis State
To setup the necessary files for these quick starts, Prysm provides a tool to generate `genesis.yaml`, `genesis.ssz`, `genesis.json` from an
To setup the necessary files for these quick starts, Prysm provides a tool to generate a `genesis.ssz` from
a deterministically generated set of validator private keys following the official interop YAML format
[here](https://github.com/ethereum/eth2.0-pm/blob/master/interop/mocked_start). If you already have a genesis state in this format, you can skip this section.
[here](https://github.com/ethereum/eth2.0-pm/blob/master/interop/mocked_start).
You can use `bazel run //tools/genesis-state-gen` to create a deterministic genesis state for interop.
@@ -32,17 +31,67 @@ You can use `bazel run //tools/genesis-state-gen` to create a deterministic gene
- **--genesis-time** uint: Unix timestamp used as the genesis time in the generated genesis state
- **--mainnet-config** bool: Select whether genesis state should be generated with mainnet or minimal (default) params
- **--num-validators** int: Number of validators to deterministically include in the generated genesis state
- **--output-json** string: Output filename of the JSON marshaling of the generated genesis state
- **--output-ssz** string: Output filename of the SSZ marshaling of the generated genesis state
- **--output-yaml** string: Output filename of the YAML marshaling of the generated genesis state
The example below creates 10 validator keys, instantiates a genesis state with those 10 validators and with genesis time 1567542540,
The example below creates 64 validator keys, instantiates a genesis state with those 64 validators and with genesis unix timestamp 1567542540,
and finally writes a YAML encoded output to ~/Desktop/genesis.yaml. This file can be used to kickstart the beacon chain in the next section.
```
bazel run //tools/genesis-state-gen -- --output-yaml ~/Desktop/genesis.yaml --num-validators 10 --genesis-time 1567542540
bazel run //tools/genesis-state-gen -- --output-yaml ~/Desktop/genesis.yaml --num-validators 64 --genesis-time 1567542540
```
## Launching a Beacon Node + Validator Client
TODO: Add section after incorporating the mock start functionality into the beacon chain and validator bazel binaries.
### Launching from Pure CLI Flags
Open up two terminal windows, run:
```
bazel run //beacon-chain -- \
--no-genesis-delay \
--bootstrap-node= \
--deposit-contract 0xD775140349E6A5D12524C6ccc3d6A1d4519D4029 \
--clear-db \
--interop-num-validators 64 \
--interop-genesis-time=$(date +%s) \
--interop-eth1data-votes
```
This will deterministically generate a beacon genesis state and start
the system with 64 validators and the genesis time set to the current unix timestamp.
Wait a bit until your beacon chain starts, and in the other window:
```
bazel run //validator -- --interop-num-validators 64
```
This will launch and kickstart the system with your 64 validators performing their duties accordingly.
specify which keys
### Launching from `genesis.ssz`
Assuming you generated a `genesis.ssz` file with 64 validators, open up two terminal windows, run:
```
bazel run //beacon-chain -- \
--no-genesis-delay \
--bootstrap-node= \
--deposit-contract 0xD775140349E6A5D12524C6ccc3d6A1d4519D4029 \
--clear-db \
--interop-genesis-state /path/to/genesis.ssz \
--interop-eth1data-votes
```
Wait a bit until your beacon chain starts, and in the other window:
```
bazel run //validator -- --interop-num-validators 64
```
This will launch and kickstart the system with your 64 validators performing their duties accordingly.

View File

@@ -17,6 +17,11 @@ type ChainInfoFetcher interface {
FinalizationFetcher
}
// GenesisTimeFetcher retrieves the Eth2 genesis timestamp.
type GenesisTimeFetcher interface {
GenesisTime() time.Time
}
// HeadFetcher defines a common interface for methods in blockchain service which
// directly retrieves head related data.
type HeadFetcher interface {

View File

@@ -14,6 +14,7 @@ import (
// Ensure Service implements chain info interface.
var _ = ChainInfoFetcher(&Service{})
var _ = GenesisTimeFetcher(&Service{})
func TestFinalizedCheckpt_Nil(t *testing.T) {
c := setupBeaconChain(t, nil)

View File

@@ -175,8 +175,8 @@ func (s *Service) Stop() error {
return nil
}
// Status always returns nil.
// TODO(1202): Add service health checks.
// Status always returns nil unless there is an error condition that causes
// this service to be unhealthy.
func (s *Service) Status() error {
if runtime.NumGoroutine() > int(s.maxRoutines) {
return fmt.Errorf("too many goroutines %d", runtime.NumGoroutine())

View File

@@ -70,7 +70,7 @@ func (ms *ChainService) ReceiveAttestationNoPubsub(context.Context, *ethpb.Attes
// GenesisTime mocks the same method in the chain service.
func (ms *ChainService) GenesisTime() time.Time {
return time.Now()
return time.Unix(0, 0)
}
// StateInitializedFeed mocks the same method in the chain service.

View File

@@ -7,7 +7,6 @@ go_library(
"active_count.go",
"active_indices.go",
"attestation_data.go",
"block.go",
"checkpoint_state.go",
"common.go",
"eth1_data.go",
@@ -41,7 +40,6 @@ go_test(
"active_indices_test.go",
"attestation_data_test.go",
"benchmarks_test.go",
"block_test.go",
"checkpoint_state_test.go",
"eth1_data_test.go",
"feature_flag_test.go",

View File

@@ -1,115 +0,0 @@
package cache
import (
"errors"
"strconv"
"sync"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"k8s.io/client-go/tools/cache"
)
var (
// ErrNotAncestorCacheObj will be returned when a cache object is not a pointer to
// block ancestor cache obj.
ErrNotAncestorCacheObj = errors.New("object is not an ancestor object for cache")
// Metrics
ancestorBlockCacheMiss = promauto.NewCounter(prometheus.CounterOpts{
Name: "ancestor_block_cache_miss",
Help: "The number of ancestor block requests that aren't present in the cache.",
})
ancestorBlockCacheHit = promauto.NewCounter(prometheus.CounterOpts{
Name: "ancestor_block_cache_hit",
Help: "The number of ancestor block requests that are present in the cache.",
})
ancestorBlockCacheSize = promauto.NewGauge(prometheus.GaugeOpts{
Name: "ancestor_block_cache_size",
Help: "The number of ancestor blocks in the ancestorBlock cache",
})
)
// AncestorInfo defines the cached ancestor block object for height.
type AncestorInfo struct {
Height uint64
Hash []byte
Target *pb.AttestationTarget
}
// AncestorBlockCache structs with 1 queue for looking up block ancestor by height.
type AncestorBlockCache struct {
ancestorBlockCache *cache.FIFO
lock sync.RWMutex
}
// heightKeyFn takes the string representation of the block hash + height as the key
// for the ancestor of a given block (AncestorInfo).
func heightKeyFn(obj interface{}) (string, error) {
aInfo, ok := obj.(*AncestorInfo)
if !ok {
return "", ErrNotAncestorCacheObj
}
return string(aInfo.Hash) + strconv.Itoa(int(aInfo.Height)), nil
}
// NewBlockAncestorCache creates a new block ancestor cache for storing/accessing block ancestor
// from memory.
func NewBlockAncestorCache() *AncestorBlockCache {
return &AncestorBlockCache{
ancestorBlockCache: cache.NewFIFO(heightKeyFn),
}
}
// AncestorBySlot fetches block's ancestor by height. Returns true with a
// reference to the ancestor block, if exists. Otherwise returns false, nil.
func (a *AncestorBlockCache) AncestorBySlot(blockHash []byte, height uint64) (*AncestorInfo, error) {
if !featureconfig.FeatureConfig().EnableAncestorBlockCache {
// Return a miss result if cache is not enabled.
ancestorBlockCacheMiss.Inc()
return nil, nil
}
a.lock.RLock()
defer a.lock.RUnlock()
obj, exists, err := a.ancestorBlockCache.GetByKey(string(blockHash) + strconv.Itoa(int(height)))
if err != nil {
return nil, err
}
if exists {
ancestorBlockCacheHit.Inc()
} else {
ancestorBlockCacheMiss.Inc()
return nil, nil
}
aInfo, ok := obj.(*AncestorInfo)
if !ok {
return nil, ErrNotAncestorCacheObj
}
return aInfo, nil
}
// AddBlockAncestor adds block ancestor object to the cache. This method also trims the least
// recently added ancestor if the cache size has ready the max cache size limit.
func (a *AncestorBlockCache) AddBlockAncestor(ancestorInfo *AncestorInfo) error {
if !featureconfig.FeatureConfig().EnableAncestorBlockCache {
return nil
}
a.lock.Lock()
defer a.lock.Unlock()
if err := a.ancestorBlockCache.AddIfNotPresent(ancestorInfo); err != nil {
return err
}
trim(a.ancestorBlockCache, maxCacheSize)
ancestorBlockCacheSize.Set(float64(len(a.ancestorBlockCache.ListKeys())))
return nil
}

View File

@@ -1,111 +0,0 @@
package cache
import (
"reflect"
"strconv"
"testing"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
)
func TestHeightHeightFn_OK(t *testing.T) {
height := uint64(999)
hash := []byte{'A'}
aInfo := &AncestorInfo{
Height: height,
Hash: hash,
Target: &pb.AttestationTarget{
Slot: height,
BeaconBlockRoot: hash,
},
}
key, err := heightKeyFn(aInfo)
if err != nil {
t.Fatal(err)
}
strHeightKey := string(aInfo.Target.BeaconBlockRoot) + strconv.Itoa(int(aInfo.Target.Slot))
if key != strHeightKey {
t.Errorf("Incorrect hash key: %s, expected %s", key, strHeightKey)
}
}
func TestHeightKeyFn_InvalidObj(t *testing.T) {
_, err := heightKeyFn("bad")
if err != ErrNotAncestorCacheObj {
t.Errorf("Expected error %v, got %v", ErrNotAncestorCacheObj, err)
}
}
func TestAncestorCache_AncestorInfoByHeight(t *testing.T) {
cache := NewBlockAncestorCache()
height := uint64(123)
hash := []byte{'B'}
aInfo := &AncestorInfo{
Height: height,
Hash: hash,
Target: &pb.AttestationTarget{
Slot: height,
BeaconBlockRoot: hash,
},
}
fetchedInfo, err := cache.AncestorBySlot(hash, height)
if err != nil {
t.Fatal(err)
}
if fetchedInfo != nil {
t.Error("Expected ancestor info not to exist in empty cache")
}
if err := cache.AddBlockAncestor(aInfo); err != nil {
t.Fatal(err)
}
fetchedInfo, err = cache.AncestorBySlot(hash, height)
if err != nil {
t.Fatal(err)
}
if fetchedInfo == nil {
t.Fatal("Expected ancestor info to exist")
}
if fetchedInfo.Height != height {
t.Errorf(
"Expected fetched slot number to be %d, got %d",
aInfo.Target.Slot,
fetchedInfo.Target.Slot,
)
}
if !reflect.DeepEqual(fetchedInfo.Target, aInfo.Target) {
t.Errorf(
"Expected fetched info committee to be %v, got %v",
aInfo.Target,
fetchedInfo.Target,
)
}
}
func TestBlockAncestor_maxSize(t *testing.T) {
cache := NewBlockAncestorCache()
for i := 0; i < maxCacheSize+10; i++ {
aInfo := &AncestorInfo{
Height: uint64(i),
Target: &pb.AttestationTarget{
Slot: uint64(i),
},
}
if err := cache.AddBlockAncestor(aInfo); err != nil {
t.Fatal(err)
}
}
if len(cache.ancestorBlockCache.ListKeys()) != maxCacheSize {
t.Errorf(
"Expected hash cache key size to be %d, got %d",
maxCacheSize,
len(cache.ancestorBlockCache.ListKeys()),
)
}
}

View File

@@ -10,13 +10,6 @@ import (
"github.com/prysmaticlabs/prysm/shared/params"
)
func init() {
// TODO(2312): remove this and use the mainnet count.
c := params.BeaconConfig()
c.MinGenesisActiveValidatorCount = 16384
params.OverrideBeaconConfig(c)
}
func TestIsActiveValidator_OK(t *testing.T) {
tests := []struct {
a uint64
@@ -156,6 +149,9 @@ func TestBeaconProposerIndex_OK(t *testing.T) {
t.Errorf("SlotsPerEpoch should be 64 for these tests to pass")
}
c := params.BeaconConfig()
c.MinGenesisActiveValidatorCount = 16384
params.OverrideBeaconConfig(c)
validators := make([]*ethpb.Validator, params.BeaconConfig().MinGenesisActiveValidatorCount/8)
for i := 0; i < len(validators); i++ {
validators[i] = &ethpb.Validator{

View File

@@ -17,41 +17,40 @@ import (
// GenesisBeaconState gets called when MinGenesisActiveValidatorCount count of
// full deposits were made to the deposit contract and the ChainStart log gets emitted.
// TODO(#2307): Update the comments here.
//
// Spec pseudocode definition:
// def initialize_beacon_state_from_eth1(eth1_block_hash: Hash,
// eth1_timestamp: uint64,
// deposits: Sequence[Deposit]) -> BeaconState:
// state = BeaconState(
// genesis_time=eth1_timestamp - eth1_timestamp % SECONDS_PER_DAY + 2 * SECONDS_PER_DAY,
// eth1_data=Eth1Data(block_hash=eth1_block_hash, deposit_count=len(deposits)),
// latest_block_header=BeaconBlockHeader(body_root=hash_tree_root(BeaconBlockBody())),
// )
// def initialize_beacon_state_from_eth1(eth1_block_hash: Hash,
// eth1_timestamp: uint64,
// deposits: Sequence[Deposit]) -> BeaconState:
// state = BeaconState(
// genesis_time=eth1_timestamp - eth1_timestamp % SECONDS_PER_DAY + 2 * SECONDS_PER_DAY,
// eth1_data=Eth1Data(block_hash=eth1_block_hash, deposit_count=len(deposits)),
// latest_block_header=BeaconBlockHeader(body_root=hash_tree_root(BeaconBlockBody())),
// )
//
// # Process deposits
// leaves = list(map(lambda deposit: deposit.data, deposits))
// for index, deposit in enumerate(deposits):
// deposit_data_list = List[DepositData, 2**DEPOSIT_CONTRACT_TREE_DEPTH](*leaves[:index + 1])
// state.eth1_data.deposit_root = hash_tree_root(deposit_data_list)
// process_deposit(state, deposit)
// # Process deposits
// leaves = list(map(lambda deposit: deposit.data, deposits))
// for index, deposit in enumerate(deposits):
// deposit_data_list = List[DepositData, 2**DEPOSIT_CONTRACT_TREE_DEPTH](*leaves[:index + 1])
// state.eth1_data.deposit_root = hash_tree_root(deposit_data_list)
// process_deposit(state, deposit)
//
// # Process activations
// for index, validator in enumerate(state.validators):
// balance = state.balances[index]
// validator.effective_balance = min(balance - balance % EFFECTIVE_BALANCE_INCREMENT, MAX_EFFECTIVE_BALANCE)
// if validator.effective_balance == MAX_EFFECTIVE_BALANCE:
// validator.activation_eligibility_epoch = GENESIS_EPOCH
// validator.activation_epoch = GENESIS_EPOCH
// # Process activations
// for index, validator in enumerate(state.validators):
// balance = state.balances[index]
// validator.effective_balance = min(balance - balance % EFFECTIVE_BALANCE_INCREMENT, MAX_EFFECTIVE_BALANCE)
// if validator.effective_balance == MAX_EFFECTIVE_BALANCE:
// validator.activation_eligibility_epoch = GENESIS_EPOCH
// validator.activation_epoch = GENESIS_EPOCH
//
// # Populate active_index_roots and compact_committees_roots
// indices_list = List[ValidatorIndex, VALIDATOR_REGISTRY_LIMIT](get_active_validator_indices(state, GENESIS_EPOCH))
// active_index_root = hash_tree_root(indices_list)
// committee_root = get_compact_committees_root(state, GENESIS_EPOCH)
// for index in range(EPOCHS_PER_HISTORICAL_VECTOR):
// state.active_index_roots[index] = active_index_root
// state.compact_committees_roots[index] = committee_root
// return state
// # Populate active_index_roots and compact_committees_roots
// indices_list = List[ValidatorIndex, VALIDATOR_REGISTRY_LIMIT](get_active_validator_indices(state, GENESIS_EPOCH))
// active_index_root = hash_tree_root(indices_list)
// committee_root = get_compact_committees_root(state, GENESIS_EPOCH)
// for index in range(EPOCHS_PER_HISTORICAL_VECTOR):
// state.active_index_roots[index] = active_index_root
// state.compact_committees_roots[index] = committee_root
// return state
func GenesisBeaconState(deposits []*ethpb.Deposit, genesisTime uint64, eth1Data *ethpb.Eth1Data) (*pb.BeaconState, error) {
randaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector)
for i := 0; i < len(randaoMixes); i++ {

View File

@@ -15,13 +15,6 @@ import (
"github.com/prysmaticlabs/prysm/shared/testutil"
)
func init() {
// TODO(2312): remove this and use the mainnet count.
c := params.BeaconConfig()
c.MinGenesisActiveValidatorCount = 16384
params.OverrideBeaconConfig(c)
}
func TestGenesisBeaconState_OK(t *testing.T) {
if params.BeaconConfig().SlotsPerEpoch != 64 {
t.Errorf("SlotsPerEpoch should be 64 for these tests to pass")
@@ -52,9 +45,6 @@ func TestGenesisBeaconState_OK(t *testing.T) {
t.Error("HistoricalRootsLimit should be 16777216 for these tests to pass")
}
if params.BeaconConfig().MinGenesisActiveValidatorCount != 16384 {
t.Error("MinGenesisActiveValidatorCount should be 16384 for these tests to pass")
}
depositsForChainStart := 100
if params.BeaconConfig().EpochsPerSlashingsVector != 8192 {

View File

@@ -441,6 +441,7 @@ func (b *BeaconNode) registerRPCService(ctx *cli.Context) error {
BlockReceiver: chainService,
AttestationReceiver: chainService,
StateFeedListener: chainService,
GenesisTimeFetcher: chainService,
AttestationsPool: operationService,
OperationsHandler: operationService,
POWChainService: web3Service,

View File

@@ -11,7 +11,6 @@ go_library(
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder",
visibility = [
"//beacon-chain:__subpackages__",
"//shared/deprecated-p2p:__pkg__", # TODO(3147): Remove.
],
deps = [
"@com_github_gogo_protobuf//proto:go_default_library",

View File

@@ -1,6 +1,8 @@
/*
Package encoder ...
TODO(3147): Add details about encoder registration, etc.
Package encoder allows for registering custom data encoders for information
sent as raw bytes over the wire via p2p to other nodes. Examples of encoders
are SSZ (SimpleSerialize), SSZ with Snappy compression, among others. Providing
an abstract interface for these encoders allows for future flexibility of
Ethereum beacon node p2p.
*/
package encoder

View File

@@ -94,6 +94,7 @@ go_test(
"//shared/testutil:go_default_library",
"//shared/trieutil:go_default_library",
"//shared/version:go_default_library",
"@com_github_ethereum_go_ethereum//common:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
"@com_github_gogo_protobuf//types:go_default_library",
"@com_github_golang_mock//gomock:go_default_library",

View File

@@ -79,13 +79,6 @@ func (bs *BeaconServer) BlockTree(ctx context.Context, _ *ptypes.Empty) (*pb.Blo
return nil, status.Error(codes.Unimplemented, "not implemented")
}
// BlockTreeBySlots returns the current tree of saved blocks and their
// votes starting from the justified state.
func (bs *BeaconServer) BlockTreeBySlots(ctx context.Context, req *pb.TreeBlockSlotRequest) (*pb.BlockTreeResponse, error) {
// TODO(3219): Add after new fork choice service.
return nil, status.Error(codes.Unimplemented, "not implemented")
}
func constructMerkleProof(trie *trieutil.MerkleTrie, index int, deposit *ethpb.Deposit) (*ethpb.Deposit, error) {
proof, err := trie.MerkleProof(index)
if err != nil {

View File

@@ -5,6 +5,7 @@ import (
"sort"
ptypes "github.com/gogo/protobuf/types"
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain"
"github.com/prysmaticlabs/prysm/beacon-chain/db"
"github.com/prysmaticlabs/prysm/beacon-chain/sync"
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
@@ -18,9 +19,10 @@ import (
// providing RPC endpoints for verifying a beacon node's sync status, genesis and
// version information, and services the node implements and runs.
type NodeServer struct {
syncChecker sync.Checker
server *grpc.Server
beaconDB db.Database
syncChecker sync.Checker
server *grpc.Server
beaconDB db.Database
genesisTimeFetcher blockchain.GenesisTimeFetcher
}
// GetSyncStatus checks the current network sync status of the node.
@@ -32,8 +34,19 @@ func (ns *NodeServer) GetSyncStatus(ctx context.Context, _ *ptypes.Empty) (*ethp
// GetGenesis fetches genesis chain information of Ethereum 2.0.
func (ns *NodeServer) GetGenesis(ctx context.Context, _ *ptypes.Empty) (*ethpb.Genesis, error) {
// TODO(3045): Use the getter from the blockchain service.
return nil, status.Error(codes.Unimplemented, "not implemented")
contractAddr, err := ns.beaconDB.DepositContractAddress(ctx)
if err != nil {
return nil, status.Errorf(codes.Internal, "could not retrieve contract address from db: %v", err)
}
genesisTime := ns.genesisTimeFetcher.GenesisTime()
gt, err := ptypes.TimestampProto(genesisTime)
if err != nil {
return nil, status.Errorf(codes.Internal, "could not convert genesis time to proto: %v", err)
}
return &ethpb.Genesis{
GenesisTime: gt,
DepositContractAddress: contractAddr,
}, nil
}
// GetVersion checks the version information of the beacon node.

View File

@@ -1,10 +1,15 @@
package rpc
import (
"bytes"
"context"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
ptypes "github.com/gogo/protobuf/types"
mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/version"
"google.golang.org/grpc"
@@ -45,6 +50,34 @@ func TestNodeServer_GetSyncStatus(t *testing.T) {
}
}
func TestNodeServer_GetGenesis(t *testing.T) {
db := dbutil.SetupDB(t)
defer dbutil.TeardownDB(t, db)
ctx := context.Background()
addr := common.Address{1, 2, 3}
if err := db.SaveDepositContractAddress(ctx, addr); err != nil {
t.Fatal(err)
}
ns := &NodeServer{
beaconDB: db,
genesisTimeFetcher: &mock.ChainService{},
}
res, err := ns.GetGenesis(context.Background(), &ptypes.Empty{})
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(res.DepositContractAddress, addr.Bytes()) {
t.Errorf("Wanted DepositContractAddress() = %#x, received %#x", addr.Bytes(), res.DepositContractAddress)
}
pUnix, err := ptypes.TimestampProto(time.Unix(0, 0))
if err != nil {
t.Fatal(err)
}
if !res.GenesisTime.Equal(pUnix) {
t.Errorf("Wanted GenesisTime() = %v, received %v", pUnix, res.GenesisTime)
}
}
func TestNodeServer_GetVersion(t *testing.T) {
v := version.GetVersion()
ns := &NodeServer{}

View File

@@ -111,9 +111,6 @@ func (ps *ProposerServer) RequestBlock(ctx context.Context, req *pb.BlockRequest
// ProposeBlock is called by a proposer during its assigned slot to create a block in an attempt
// to get it processed by the beacon node as the canonical head.
func (ps *ProposerServer) ProposeBlock(ctx context.Context, blk *ethpb.BeaconBlock) (*pb.ProposeResponse, error) {
// TODO(#78): To protect against blk not filling, this will be handled within the SSZ code codebase.
// https://github.com/prysmaticlabs/go-ssz/issues/78
blk.Body.Graffiti = make([]byte, 32)
root, err := ssz.SigningRoot(blk)
if err != nil {
return nil, errors.Wrap(err, "could not tree hash block")

View File

@@ -42,6 +42,7 @@ type Service struct {
beaconDB db.Database
stateFeedListener blockchain.ChainFeeds
headFetcher blockchain.HeadFetcher
genesisTimeFetcher blockchain.GenesisTimeFetcher
attestationReceiver blockchain.AttestationReceiver
blockReceiver blockchain.BlockReceiver
powChainService powchain.Chain
@@ -75,6 +76,7 @@ type Config struct {
BlockReceiver blockchain.BlockReceiver
POWChainService powchain.Chain
ChainStartFetcher powchain.ChainStartFetcher
GenesisTimeFetcher blockchain.GenesisTimeFetcher
MockEth1Votes bool
OperationsHandler operations.Handler
AttestationsPool operations.Pool
@@ -94,6 +96,7 @@ func NewService(ctx context.Context, cfg *Config) *Service {
beaconDB: cfg.BeaconDB,
stateFeedListener: cfg.StateFeedListener,
headFetcher: cfg.HeadFetcher,
genesisTimeFetcher: cfg.GenesisTimeFetcher,
attestationReceiver: cfg.AttestationReceiver,
blockReceiver: cfg.BlockReceiver,
p2p: cfg.Broadcaster,
@@ -189,9 +192,10 @@ func (s *Service) Start() {
depositFetcher: s.depositFetcher,
}
nodeServer := &NodeServer{
beaconDB: s.beaconDB,
server: s.grpcServer,
syncChecker: s.syncService,
beaconDB: s.beaconDB,
server: s.grpcServer,
syncChecker: s.syncService,
genesisTimeFetcher: s.genesisTimeFetcher,
}
beaconChainServer := &BeaconChainServer{
beaconDB: s.beaconDB,

View File

@@ -2,7 +2,6 @@ package sync
import (
"context"
"errors"
"time"
"github.com/gogo/protobuf/proto"
@@ -23,11 +22,6 @@ var ttfbTimeout = 5 * time.Second
// not be relayed to the peer.
type rpcHandler func(context.Context, interface{}, libp2pcore.Stream) error
// TODO(3147): Delete after all handlers implemented.
func notImplementedRPCHandler(_ context.Context, _ proto.Message, _ libp2pcore.Stream) error {
return errors.New("not implemented")
}
// registerRPCHandlers for p2p RPC.
func (r *RegularSync) registerRPCHandlers() {
r.registerRPC(

File diff suppressed because it is too large Load Diff

View File

@@ -2,10 +2,6 @@ syntax = "proto3";
package ethereum.beacon.p2p.v1;
import "proto/beacon/p2p/v1/types.proto";
import "proto/eth/v1alpha1/attestation.proto";
import "proto/eth/v1alpha1/beacon_block.proto";
import "google/protobuf/timestamp.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
message Hello {
@@ -43,167 +39,3 @@ message RecentBeaconBlocksRequest {
message ErrorMessage {
string error_message = 1;
}
// TODO(3147): Delete below this line.
enum Topic {
UNKNOWN = 0;
BEACON_BLOCK_ANNOUNCE = 1 [deprecated=true];
BEACON_BLOCK_REQUEST = 2 [deprecated=true];
BEACON_BLOCK_REQUEST_BY_SLOT_NUMBER = 3 [deprecated=true];
BEACON_BLOCK_RESPONSE = 4 [deprecated=true];
BATCHED_BEACON_BLOCK_REQUEST = 5 [deprecated=true];
BATCHED_BEACON_BLOCK_RESPONSE = 6 [deprecated=true];
CHAIN_HEAD_REQUEST = 7 [deprecated=true];
CHAIN_HEAD_RESPONSE = 8 [deprecated=true];
BEACON_STATE_HASH_ANNOUNCE = 9 [deprecated=true];
BEACON_STATE_REQUEST = 10 [deprecated=true];
BEACON_STATE_RESPONSE = 11 [deprecated=true];
BEACON_ATTESTATION = 12 [deprecated=true];
}
message Envelope {
bytes span_context = 1;
bytes payload = 2;
google.protobuf.Timestamp timestamp = 3;
}
message BeaconBlockAnnounce {
option deprecated = true;
bytes hash = 1;
uint64 slot_number = 2;
}
message BeaconBlockRequest {
option deprecated = true;
bytes hash = 1;
}
message BeaconBlockRequestBySlotNumber {
option deprecated = true;
uint64 slot_number = 1;
}
message BeaconBlockResponse {
option deprecated = true;
ethereum.eth.v1alpha1.BeaconBlock block = 1;
ethereum.eth.v1alpha1.Attestation attestation = 2;
}
message BatchedBeaconBlockRequest {
option deprecated = true;
uint64 start_slot = 1 [deprecated=true];
uint64 end_slot = 2 [deprecated=true];
bytes finalized_root = 3;
bytes canonical_root = 4;
}
message BatchedBeaconBlockResponse {
option deprecated = true;
repeated ethereum.eth.v1alpha1.BeaconBlock batched_blocks = 1;
}
message ChainHeadRequest {
option deprecated = true;
}
message ChainHeadResponse {
option deprecated = true;
uint64 canonical_slot = 1;
bytes canonical_state_root_hash32 = 2;
bytes finalized_state_root_hash32s = 3;
bytes canonical_block_root = 4;
bytes finalized_block_root = 5;
}
message BeaconStateHashAnnounce {
option deprecated = true;
bytes hash = 1;
}
message BeaconStateRequest {
option deprecated = true;
bytes finalized_state_root_hash32s = 1;
}
message BeaconStateResponse {
option deprecated = true;
BeaconState finalized_state = 1;
ethereum.eth.v1alpha1.BeaconBlock finalized_block = 2;
}
message FinalizedStateAnnounce {
option deprecated = true;
bytes block_root = 1;
bytes state_root = 2;
uint64 slot = 3;
}
message ProposerSlashingAnnounce {
option deprecated = true;
bytes hash = 1;
}
message ProposerSlashingRequest {
option deprecated = true;
bytes hash = 1;
}
message ProposerSlashingResponse {
option deprecated = true;
bytes hash = 1;
ethereum.eth.v1alpha1.ProposerSlashing proposer_slashing = 2;
}
message AttesterSlashingAnnounce {
option deprecated = true;
bytes hash = 1;
}
message AttesterSlashingRequest {
option deprecated = true;
bytes hash = 1;
}
message AttesterSlashingResponse {
option deprecated = true;
bytes hash = 1;
ethereum.eth.v1alpha1.AttesterSlashing Attester_slashing = 2;
}
message DepositAnnounce {
option deprecated = true;
bytes hash = 1;
}
message DepositRequest {
option deprecated = true;
bytes hash = 1;
}
message DepositResponse {
option deprecated = true;
bytes hash = 1;
ethereum.eth.v1alpha1.Deposit deposit = 2;
}
message ExitAnnounce {
option deprecated = true;
bytes hash = 1;
}
message ExitRequest {
option deprecated = true;
bytes hash = 1;
}
message ExitResponse {
option deprecated = true;
bytes hash = 1;
ethereum.eth.v1alpha1.VoluntaryExit voluntary_exit = 2;
}
message Handshake {
option deprecated = true;
string deposit_contract_address = 1;
}

View File

@@ -5,13 +5,12 @@ package ethereum_beacon_p2p_v1
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -7,15 +7,14 @@ import (
context "context"
encoding_binary "encoding/binary"
fmt "fmt"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
@@ -1420,124 +1419,123 @@ func init() {
func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) }
var fileDescriptor_9eb4e94b85965285 = []byte{
// 1859 bytes of a gzipped FileDescriptorProto
// 1841 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x5f, 0x6f, 0x1b, 0xc7,
0x11, 0xcf, 0x51, 0x12, 0x2d, 0x8f, 0x28, 0x89, 0x5a, 0xcb, 0xb2, 0x4c, 0xff, 0xbb, 0x5e, 0x9d,
0x54, 0x12, 0xa2, 0xa3, 0x44, 0x07, 0x46, 0xaa, 0xc0, 0x4d, 0x29, 0x89, 0x96, 0x59, 0x0b, 0x14,
0x73, 0xa4, 0xed, 0x14, 0x79, 0xb8, 0x2e, 0x8f, 0x6b, 0xf2, 0x6a, 0xde, 0xed, 0xf9, 0x6e, 0xc9,
0x58, 0x7d, 0x28, 0xd0, 0xbe, 0xf6, 0xa9, 0xe9, 0x07, 0xc8, 0x87, 0xe8, 0x43, 0x81, 0xa2, 0xcf,
0x45, 0xd0, 0xa7, 0x02, 0x7d, 0x6c, 0x51, 0x14, 0x46, 0x1e, 0xfa, 0x31, 0x82, 0xfd, 0x73, 0xc7,
0x13, 0x29, 0x5a, 0x94, 0x9f, 0x78, 0x3b, 0x33, 0xbf, 0x99, 0xd9, 0xd9, 0xd9, 0x99, 0x59, 0x82,
0x11, 0x84, 0x94, 0xd1, 0x62, 0x8b, 0x60, 0x87, 0xfa, 0xc5, 0x30, 0x70, 0x8a, 0x83, 0xdd, 0x62,
0x44, 0xc2, 0x81, 0xeb, 0x90, 0xc8, 0x14, 0x4c, 0xb4, 0x46, 0x58, 0x97, 0x84, 0xa4, 0xef, 0x99,
0x52, 0xcc, 0x0c, 0x03, 0xc7, 0x1c, 0xec, 0x16, 0x6e, 0x75, 0x28, 0xed, 0xf4, 0x48, 0x51, 0x48,
0xb5, 0xfa, 0x2f, 0x8b, 0xc4, 0x0b, 0xd8, 0xa9, 0x04, 0x15, 0x3e, 0x94, 0x8a, 0x09, 0xeb, 0x16,
0x07, 0xbb, 0xb8, 0x17, 0x74, 0xf1, 0xae, 0xb2, 0x62, 0xb7, 0x7a, 0xd4, 0x79, 0xa5, 0xc4, 0xee,
0x9f, 0x23, 0x86, 0x19, 0x23, 0x11, 0xc3, 0xcc, 0xa5, 0xbe, 0x92, 0xba, 0xad, 0x2c, 0xe1, 0xc0,
0x2d, 0x62, 0xdf, 0xa7, 0x92, 0xa9, 0xfc, 0x2b, 0x7c, 0x2c, 0x7e, 0x9c, 0xed, 0x0e, 0xf1, 0xb7,
0xa3, 0xaf, 0x71, 0xa7, 0x43, 0xc2, 0x22, 0x0d, 0x84, 0xc4, 0xb8, 0xb4, 0x71, 0x04, 0xb9, 0x7d,
0xee, 0x80, 0x45, 0x5e, 0xf7, 0x49, 0xc4, 0x10, 0x82, 0xd9, 0xa8, 0x47, 0xd9, 0xba, 0xa6, 0x6b,
0x1b, 0xb3, 0x96, 0xf8, 0x46, 0x3f, 0x86, 0xc5, 0x10, 0xfb, 0x6d, 0x4c, 0xed, 0x90, 0x0c, 0x08,
0xee, 0xad, 0x67, 0x74, 0x6d, 0x23, 0x67, 0xe5, 0x24, 0xd1, 0x12, 0x34, 0x63, 0x07, 0x96, 0xeb,
0x21, 0x0d, 0x68, 0x44, 0x2c, 0x12, 0x05, 0xd4, 0x8f, 0x08, 0xba, 0x03, 0x20, 0x36, 0x67, 0x87,
0x54, 0x69, 0xcc, 0x59, 0x57, 0x05, 0xc5, 0xa2, 0x94, 0x19, 0x03, 0x40, 0xe5, 0xe1, 0xde, 0x62,
0x07, 0xee, 0x00, 0x04, 0xfd, 0x56, 0xcf, 0x75, 0xec, 0x57, 0xe4, 0x34, 0x06, 0x49, 0xca, 0x53,
0x72, 0x8a, 0x6e, 0xc0, 0x95, 0x80, 0x3a, 0x76, 0xcb, 0x65, 0xca, 0x8b, 0x6c, 0x40, 0x9d, 0x7d,
0x77, 0xe8, 0xf8, 0x4c, 0xca, 0xf1, 0x55, 0x98, 0x8b, 0xba, 0x38, 0x6c, 0xaf, 0xcf, 0x0a, 0xa2,
0x5c, 0x18, 0xf7, 0x61, 0x49, 0xda, 0x4d, 0x1c, 0x45, 0x30, 0x9b, 0x72, 0x51, 0x7c, 0x1b, 0x75,
0xb8, 0xf5, 0x1c, 0xf7, 0xdc, 0x36, 0x66, 0x34, 0xac, 0x93, 0xf0, 0x25, 0x0d, 0x3d, 0xec, 0x3b,
0xe4, 0x5d, 0x71, 0x3a, 0xeb, 0x7a, 0x66, 0xc4, 0x75, 0xe3, 0x7b, 0x0d, 0x6e, 0x9f, 0xaf, 0x52,
0xb9, 0xb1, 0x0e, 0x57, 0x5a, 0xb8, 0xc7, 0x49, 0x4a, 0x6d, 0xbc, 0x44, 0x9b, 0x90, 0x67, 0x94,
0xe1, 0x9e, 0x3d, 0x88, 0xf1, 0x91, 0xd0, 0x3f, 0x6b, 0x2d, 0x0b, 0x7a, 0xa2, 0x36, 0x42, 0x0f,
0xe1, 0x86, 0x14, 0xc5, 0x0e, 0x73, 0x07, 0x24, 0x8d, 0x90, 0xa1, 0xb9, 0x2e, 0xd8, 0x65, 0xc1,
0x4d, 0xe1, 0x8e, 0x40, 0xc7, 0x03, 0x12, 0xe2, 0x0e, 0x19, 0x43, 0xda, 0xb1, 0x57, 0x3c, 0x8c,
0x19, 0xeb, 0x8e, 0x92, 0x1b, 0x51, 0xb1, 0x2f, 0x85, 0x8c, 0x47, 0x50, 0x48, 0x68, 0x42, 0xe4,
0xcc, 0xf1, 0xde, 0x83, 0x85, 0x61, 0x8c, 0xa2, 0x75, 0x4d, 0x9f, 0xd9, 0xc8, 0x59, 0x90, 0x04,
0x29, 0x32, 0xbe, 0xcd, 0xa4, 0x02, 0x9f, 0xc6, 0xab, 0x20, 0x3d, 0x84, 0xeb, 0x58, 0x52, 0x49,
0xdb, 0x1e, 0x53, 0xb5, 0x9f, 0x59, 0xd7, 0xac, 0x6b, 0x89, 0x40, 0x3d, 0xd1, 0x8b, 0x9e, 0xc3,
0x3c, 0xcf, 0xb4, 0x7e, 0x44, 0x78, 0xe8, 0x66, 0x36, 0x16, 0x4a, 0x7b, 0xe6, 0xf9, 0x37, 0xd9,
0x7c, 0x87, 0x79, 0xb3, 0x21, 0x74, 0x58, 0x89, 0xae, 0x42, 0x00, 0x59, 0x49, 0xbb, 0x28, 0x73,
0x8f, 0x20, 0x2b, 0x41, 0xe2, 0xe4, 0x16, 0x4a, 0xc5, 0x0b, 0xcd, 0x2b, 0x5b, 0xca, 0xb4, 0xa5,
0xe0, 0xc6, 0x1e, 0xdc, 0xa8, 0xbc, 0x71, 0x19, 0x69, 0x0f, 0x4f, 0x6f, 0xea, 0xe8, 0x7e, 0x06,
0xeb, 0xe3, 0x58, 0x15, 0xd9, 0x0b, 0xc1, 0x5f, 0x00, 0x3a, 0xe8, 0x62, 0xd7, 0x6f, 0x30, 0x1c,
0xb2, 0x74, 0xd6, 0x46, 0x9c, 0x40, 0xda, 0x62, 0xcf, 0xf3, 0x56, 0xbc, 0x44, 0x3f, 0x82, 0x5c,
0x87, 0xf8, 0x24, 0x72, 0x23, 0x9b, 0xb9, 0x1e, 0x51, 0x19, 0xbb, 0xa0, 0x68, 0x4d, 0xd7, 0x23,
0xc6, 0x43, 0xb8, 0x9e, 0x78, 0x52, 0xf5, 0xdb, 0xe4, 0xcd, 0x74, 0x65, 0xc0, 0x30, 0x61, 0x6d,
0x14, 0xa7, 0xdc, 0x59, 0x85, 0x39, 0x97, 0x13, 0xd4, 0x15, 0x92, 0x0b, 0xe3, 0x19, 0xac, 0x94,
0xa3, 0xc8, 0xed, 0xf8, 0x1e, 0xf1, 0x59, 0x2a, 0x5a, 0x24, 0xa0, 0x4e, 0xd7, 0x16, 0x0e, 0x2b,
0x00, 0x08, 0x92, 0xd8, 0xe2, 0x68, 0x44, 0x32, 0x63, 0x11, 0xf9, 0x7f, 0x06, 0x50, 0x5a, 0xaf,
0xf2, 0xe1, 0x35, 0xac, 0x0e, 0x2f, 0x0f, 0x4e, 0xf8, 0x22, 0xa4, 0x0b, 0xa5, 0x9f, 0x4d, 0x3a,
0xf8, 0x71, 0x4d, 0xa9, 0x54, 0x1c, 0xf2, 0xae, 0x0d, 0xc6, 0x89, 0x85, 0xff, 0x6a, 0x70, 0xed,
0x1c, 0x61, 0x74, 0x1b, 0xae, 0x3a, 0xd4, 0xf3, 0x5c, 0xc6, 0x08, 0x11, 0xf6, 0x67, 0xad, 0x21,
0x61, 0x58, 0x20, 0x33, 0xa9, 0x02, 0x79, 0x6e, 0x29, 0xbd, 0x07, 0x0b, 0x6e, 0x64, 0x07, 0xb2,
0xc2, 0x87, 0xa2, 0x12, 0xcc, 0x5b, 0xe0, 0x46, 0xaa, 0xe6, 0x87, 0x23, 0x07, 0x36, 0x37, 0x9a,
0xfd, 0x9f, 0x27, 0xd9, 0x9f, 0xd5, 0xb5, 0x8d, 0xa5, 0xd2, 0x4f, 0xa6, 0xcd, 0xfe, 0x38, 0xeb,
0xff, 0x92, 0x81, 0x1b, 0x13, 0x6e, 0x46, 0x4a, 0xb9, 0xf6, 0x5e, 0xca, 0xd1, 0x4f, 0xe1, 0x26,
0x61, 0xdd, 0x5d, 0xbb, 0x4d, 0x02, 0x1a, 0xb9, 0x4c, 0xf6, 0x64, 0xdb, 0xef, 0x7b, 0x2d, 0x12,
0xaa, 0xd8, 0xf0, 0xb6, 0xbf, 0x7b, 0x28, 0xf9, 0xa2, 0x63, 0xd6, 0x04, 0x17, 0x7d, 0x02, 0x6b,
0x31, 0xca, 0xf5, 0x9d, 0x5e, 0x3f, 0x72, 0xa9, 0x6f, 0xa7, 0xc2, 0xb7, 0xaa, 0xb8, 0xd5, 0x98,
0xd9, 0xe0, 0xe1, 0xdc, 0x84, 0x3c, 0x4e, 0x8a, 0x8b, 0x2d, 0x52, 0x4e, 0x35, 0xa9, 0xe5, 0x21,
0xbd, 0xc2, 0xc9, 0xe8, 0x73, 0xb8, 0x2d, 0x14, 0x70, 0x41, 0xd7, 0xb7, 0x53, 0xb0, 0xd7, 0x7d,
0xd2, 0x27, 0x22, 0xd4, 0xb3, 0xd6, 0xcd, 0x58, 0xa6, 0xea, 0x0f, 0xab, 0xd6, 0x17, 0x5c, 0xc0,
0x78, 0x04, 0x8b, 0x87, 0xd4, 0xc3, 0x6e, 0x52, 0x83, 0x57, 0x61, 0x4e, 0x5a, 0x54, 0x57, 0x44,
0x2c, 0xd0, 0x1a, 0x64, 0xdb, 0x42, 0x2c, 0x6e, 0xac, 0x72, 0x65, 0x7c, 0x06, 0x4b, 0x31, 0x5c,
0x85, 0x7b, 0x13, 0xf2, 0x3c, 0xbf, 0x30, 0xeb, 0x87, 0xc4, 0x56, 0x18, 0xa9, 0x6a, 0x39, 0xa1,
0x4b, 0x88, 0xf1, 0xc7, 0x0c, 0xac, 0x88, 0x68, 0x35, 0x43, 0x32, 0x6c, 0x74, 0x8f, 0x61, 0x96,
0x85, 0x2a, 0x1f, 0x17, 0x4a, 0xa5, 0x49, 0xa7, 0x35, 0x06, 0x34, 0xf9, 0xa2, 0x46, 0xdb, 0xc4,
0x12, 0xf8, 0xc2, 0x9f, 0x35, 0x98, 0x8f, 0x49, 0xe8, 0x53, 0x98, 0x13, 0xc7, 0x26, 0x5c, 0x59,
0x28, 0x19, 0x43, 0xad, 0x84, 0x75, 0xcd, 0x78, 0x9c, 0x32, 0xf7, 0x85, 0x09, 0x39, 0xf3, 0x48,
0xc0, 0xc8, 0x9c, 0x92, 0x19, 0x99, 0x53, 0xd0, 0x36, 0xa0, 0x00, 0x87, 0xcc, 0x75, 0xdc, 0x40,
0x34, 0x9d, 0x01, 0x65, 0x24, 0x6e, 0xa6, 0x2b, 0x69, 0xce, 0x73, 0xce, 0xe0, 0x37, 0x45, 0xf5,
0x6a, 0x21, 0x27, 0x4f, 0x15, 0x64, 0x9b, 0xe6, 0x14, 0xe3, 0x18, 0x56, 0xb9, 0xd3, 0xc2, 0x05,
0x9e, 0x0c, 0xf1, 0xb1, 0xdc, 0x82, 0xab, 0x3c, 0x6f, 0xec, 0x97, 0x21, 0xf5, 0x54, 0x3c, 0xe7,
0x39, 0xe1, 0x71, 0x48, 0x3d, 0x3e, 0xf7, 0x08, 0x26, 0xa3, 0x2a, 0x1f, 0xb3, 0x7c, 0xd9, 0xa4,
0x5b, 0x9f, 0xc2, 0x62, 0x92, 0xd5, 0x16, 0xed, 0x11, 0xb4, 0x00, 0x57, 0x9e, 0xd5, 0x9e, 0xd6,
0x4e, 0x5e, 0xd4, 0xf2, 0x1f, 0xa0, 0x1c, 0xcc, 0x97, 0x9b, 0xcd, 0x4a, 0xa3, 0x59, 0xb1, 0xf2,
0x1a, 0x5f, 0xd5, 0xad, 0x93, 0xfa, 0x49, 0xa3, 0x62, 0xe5, 0x33, 0x5b, 0x7f, 0xd0, 0x60, 0x79,
0xe4, 0x42, 0x20, 0x04, 0x4b, 0x0a, 0x6c, 0x37, 0x9a, 0xe5, 0xe6, 0xb3, 0x46, 0xfe, 0x03, 0x4e,
0xab, 0x57, 0x6a, 0x87, 0xd5, 0xda, 0x91, 0x5d, 0x3e, 0x68, 0x56, 0x9f, 0x57, 0xf2, 0x1a, 0x02,
0xc8, 0xaa, 0xef, 0x0c, 0xe7, 0x57, 0x6b, 0xd5, 0x66, 0xb5, 0xdc, 0xac, 0x1c, 0xda, 0x95, 0x2f,
0xab, 0xcd, 0xfc, 0x0c, 0xca, 0x43, 0xee, 0x45, 0xb5, 0xf9, 0xe4, 0xd0, 0x2a, 0xbf, 0x28, 0xef,
0x1f, 0x57, 0xf2, 0xb3, 0x1c, 0xc1, 0x79, 0x95, 0xc3, 0xfc, 0x1c, 0x47, 0xc8, 0x6f, 0xbb, 0x71,
0x5c, 0x6e, 0x3c, 0xa9, 0x1c, 0xe6, 0xb3, 0xa5, 0xbf, 0xcf, 0xc0, 0xa2, 0x3c, 0x9b, 0x86, 0x9c,
0xb7, 0xd1, 0x2f, 0x61, 0xe5, 0x05, 0x76, 0xd9, 0x63, 0x1a, 0x0e, 0xbb, 0x0e, 0x5a, 0x33, 0xe5,
0xf0, 0x6b, 0xc6, 0x63, 0xb6, 0x59, 0xe1, 0x63, 0x76, 0x61, 0x6b, 0x52, 0x12, 0x8d, 0x77, 0xac,
0x1d, 0x0d, 0x3d, 0x85, 0xc5, 0x03, 0xec, 0x53, 0xdf, 0x75, 0x70, 0xef, 0x09, 0xc1, 0xed, 0x89,
0x6a, 0xa7, 0xc8, 0x22, 0xf4, 0xad, 0x06, 0x57, 0x93, 0x54, 0x9d, 0xa8, 0x69, 0x73, 0xea, 0x2c,
0x37, 0x4e, 0xbe, 0x29, 0xef, 0x20, 0xf3, 0x31, 0x61, 0x4e, 0x97, 0x44, 0xba, 0x48, 0x44, 0x9d,
0xe7, 0xbb, 0x1e, 0xb9, 0xbe, 0x43, 0xf4, 0x1e, 0x8e, 0x98, 0xfe, 0xd2, 0xf5, 0x71, 0xcf, 0xfd,
0x0d, 0x69, 0x4b, 0xbe, 0xf9, 0xfb, 0x7f, 0x7d, 0xff, 0xa7, 0xcc, 0x1a, 0x5a, 0xe5, 0x0f, 0x16,
0xf5, 0x7c, 0x11, 0x0c, 0x8e, 0x43, 0xaf, 0x20, 0x9f, 0x58, 0xd9, 0x3f, 0xe5, 0x39, 0x17, 0xa1,
0x8f, 0x27, 0xf9, 0x73, 0x5e, 0x6e, 0x5e, 0xc2, 0xfb, 0xd2, 0x7f, 0x34, 0x58, 0x96, 0xf3, 0x35,
0x09, 0xe3, 0xa3, 0xec, 0x02, 0x52, 0x9a, 0x52, 0x13, 0x3f, 0x9a, 0x78, 0x66, 0xe3, 0xcf, 0x82,
0xc2, 0x47, 0x13, 0x0e, 0x22, 0x25, 0x7a, 0x88, 0x19, 0x46, 0x36, 0xac, 0x34, 0xfa, 0x2d, 0xcf,
0x3d, 0x63, 0xc8, 0xb8, 0x18, 0x9c, 0x36, 0x70, 0x9e, 0x33, 0xc9, 0xf6, 0xbe, 0xd3, 0x92, 0x87,
0x4e, 0xb2, 0xbd, 0x2f, 0x21, 0xa7, 0xfc, 0x94, 0x19, 0x71, 0xff, 0x9d, 0xd1, 0x8a, 0xb7, 0x34,
0x4d, 0x6e, 0x7d, 0x05, 0x39, 0x65, 0x4c, 0xae, 0xa7, 0xc0, 0x14, 0x26, 0x76, 0xbf, 0x91, 0xf7,
0x59, 0xe9, 0x6f, 0x59, 0xc8, 0x0f, 0x0b, 0x80, 0xda, 0xcb, 0x57, 0x00, 0xb2, 0x76, 0x8b, 0x70,
0x7e, 0x38, 0x49, 0xd7, 0x99, 0x8e, 0x32, 0x39, 0x78, 0x23, 0x9d, 0xe3, 0xb7, 0xc9, 0x95, 0x1e,
0x36, 0x29, 0x54, 0xba, 0xd4, 0x1c, 0x2e, 0x0d, 0x3e, 0x78, 0x8f, 0xd9, 0x7d, 0x47, 0x43, 0x14,
0x96, 0xce, 0x8e, 0x8d, 0x68, 0xfb, 0x42, 0x45, 0xe9, 0xb1, 0xb4, 0x60, 0x4e, 0x2b, 0xae, 0x36,
0xdc, 0x83, 0x6b, 0x07, 0xf1, 0xb4, 0x95, 0x9a, 0xca, 0x36, 0xa7, 0x19, 0x01, 0xa5, 0xc5, 0xad,
0xe9, 0xa7, 0x45, 0xf4, 0x7a, 0xbc, 0xa0, 0x5f, 0x72, 0x7f, 0x97, 0x7d, 0x94, 0xa0, 0xdf, 0x69,
0xb0, 0x7a, 0xde, 0xa3, 0x16, 0x5d, 0x7c, 0x42, 0xe3, 0xaf, 0xea, 0xc2, 0x27, 0x97, 0x03, 0x29,
0x1f, 0xfa, 0x90, 0x1f, 0x7d, 0xd4, 0xa0, 0x89, 0x1b, 0x99, 0xf0, 0x74, 0x2a, 0xec, 0x4c, 0x0f,
0x90, 0x66, 0xf7, 0xff, 0x31, 0xf3, 0x4d, 0xf9, 0xaf, 0x33, 0xe8, 0xdf, 0x1a, 0xcc, 0xd5, 0xc3,
0xd3, 0xc8, 0x43, 0xf7, 0x7f, 0xd1, 0x38, 0xa9, 0xe9, 0x56, 0xfd, 0x40, 0x8f, 0xff, 0x32, 0xd2,
0x83, 0x90, 0x0e, 0xdc, 0x36, 0xaf, 0xd2, 0xa7, 0xba, 0x10, 0x32, 0x8d, 0x03, 0x58, 0x12, 0x5f,
0x98, 0xb9, 0x8e, 0x7e, 0x8c, 0x5b, 0x11, 0xba, 0xd9, 0x65, 0x2c, 0x88, 0xf6, 0x8a, 0xc5, 0x20,
0xa6, 0xf7, 0x70, 0x2b, 0x32, 0x1d, 0xea, 0x15, 0xd6, 0x18, 0xc1, 0xde, 0xcf, 0xc7, 0xe8, 0x5b,
0xbf, 0x82, 0x7b, 0x47, 0xb5, 0x67, 0xfa, 0x11, 0xf1, 0x49, 0x88, 0x7b, 0xba, 0x7c, 0xe7, 0xea,
0xc7, 0xae, 0x43, 0xfc, 0x88, 0xe8, 0x83, 0x07, 0xe6, 0x0e, 0x7a, 0x14, 0x6b, 0xed, 0xb8, 0xac,
0xdb, 0x6f, 0x71, 0xd8, 0x59, 0x03, 0x72, 0xc5, 0xdb, 0x44, 0xab, 0xe8, 0x61, 0x5e, 0xae, 0x8b,
0xc7, 0xd5, 0x83, 0x4a, 0xad, 0x51, 0x31, 0xbd, 0x76, 0x69, 0x6e, 0xc7, 0xdc, 0x31, 0x77, 0x0a,
0xcb, 0x38, 0x70, 0xcd, 0x20, 0x3c, 0x15, 0x96, 0x7d, 0xc2, 0xb6, 0xb4, 0x4c, 0x29, 0x8f, 0x83,
0xa0, 0xe7, 0x3a, 0xe2, 0x72, 0x15, 0x7f, 0x1d, 0x51, 0xbf, 0x74, 0x33, 0x4d, 0xe9, 0x84, 0x81,
0xb3, 0xfd, 0x35, 0x69, 0x6d, 0x33, 0xf2, 0x86, 0x4d, 0x60, 0xbd, 0x03, 0xc5, 0x59, 0x7b, 0x63,
0x26, 0xf6, 0x26, 0x9b, 0x08, 0x1f, 0xf2, 0x22, 0x79, 0x1a, 0x79, 0xfa, 0x91, 0xd8, 0x29, 0xfa,
0x68, 0xba, 0x9d, 0x7f, 0xf7, 0xf6, 0xae, 0xf6, 0xcf, 0xb7, 0x77, 0xb5, 0xff, 0xbd, 0xbd, 0xab,
0xb5, 0xb2, 0xa2, 0x5d, 0x3f, 0xf8, 0x21, 0x00, 0x00, 0xff, 0xff, 0x99, 0x12, 0xeb, 0xfa, 0x02,
0x14, 0x00, 0x00,
0x54, 0x12, 0xaa, 0xa3, 0x44, 0x07, 0x46, 0xaa, 0xc0, 0x4d, 0x29, 0x89, 0x96, 0x59, 0x0b, 0x94,
0x72, 0xa4, 0xed, 0x14, 0x79, 0xb8, 0x2e, 0x8f, 0x6b, 0x72, 0x1b, 0xde, 0xed, 0xf9, 0x6e, 0xc9,
0x58, 0x7d, 0x28, 0xd0, 0xbe, 0xf6, 0xa9, 0xe9, 0x07, 0xc8, 0x87, 0xe8, 0x43, 0x81, 0xa2, 0x1f,
0x20, 0xe8, 0x53, 0x81, 0x3e, 0x15, 0x2d, 0x8a, 0xc2, 0xc8, 0x43, 0x3f, 0x46, 0xb1, 0x7f, 0x8e,
0x3c, 0x91, 0xa2, 0x45, 0xfb, 0x89, 0xb7, 0x33, 0xf3, 0x9b, 0x99, 0x9d, 0x9d, 0x9d, 0x99, 0x25,
0x58, 0x61, 0xc4, 0x38, 0x2b, 0x36, 0x09, 0xf6, 0x58, 0x50, 0x8c, 0x42, 0xaf, 0xd8, 0xdf, 0x2d,
0xc6, 0x24, 0xea, 0x53, 0x8f, 0xc4, 0xb6, 0x64, 0xa2, 0x35, 0xc2, 0x3b, 0x24, 0x22, 0x3d, 0xdf,
0x56, 0x62, 0x76, 0x14, 0x7a, 0x76, 0x7f, 0xb7, 0x70, 0xab, 0xcd, 0x58, 0xbb, 0x4b, 0x8a, 0x52,
0xaa, 0xd9, 0x7b, 0x59, 0x24, 0x7e, 0xc8, 0xcf, 0x14, 0xa8, 0xf0, 0xa1, 0x52, 0x4c, 0x78, 0xa7,
0xd8, 0xdf, 0xc5, 0xdd, 0xb0, 0x83, 0x77, 0xb5, 0x15, 0xb7, 0xd9, 0x65, 0xde, 0x57, 0x5a, 0xec,
0xfe, 0x05, 0x62, 0x98, 0x73, 0x12, 0x73, 0xcc, 0x29, 0x0b, 0xb4, 0xd4, 0x6d, 0x6d, 0x09, 0x87,
0xb4, 0x88, 0x83, 0x80, 0x29, 0xa6, 0xf6, 0xaf, 0xf0, 0x63, 0xf9, 0xe3, 0x6d, 0xb7, 0x49, 0xb0,
0x1d, 0x7f, 0x8d, 0xdb, 0x6d, 0x12, 0x15, 0x59, 0x28, 0x25, 0xc6, 0xa5, 0xad, 0x23, 0xc8, 0xed,
0x0b, 0x07, 0x1c, 0xf2, 0xaa, 0x47, 0x62, 0x8e, 0x10, 0xcc, 0xc6, 0x5d, 0xc6, 0xd7, 0x0d, 0xd3,
0xd8, 0x98, 0x75, 0xe4, 0x37, 0xfa, 0x21, 0x2c, 0x46, 0x38, 0x68, 0x61, 0xe6, 0x46, 0xa4, 0x4f,
0x70, 0x77, 0x3d, 0x63, 0x1a, 0x1b, 0x39, 0x27, 0xa7, 0x88, 0x8e, 0xa4, 0x59, 0x3b, 0xb0, 0x7c,
0x1a, 0xb1, 0x90, 0xc5, 0xc4, 0x21, 0x71, 0xc8, 0x82, 0x98, 0xa0, 0x3b, 0x00, 0x72, 0x73, 0x6e,
0xc4, 0xb4, 0xc6, 0x9c, 0x73, 0x55, 0x52, 0x1c, 0xc6, 0xb8, 0xd5, 0x07, 0x54, 0x1e, 0xee, 0x2d,
0x71, 0xe0, 0x0e, 0x40, 0xd8, 0x6b, 0x76, 0xa9, 0xe7, 0x7e, 0x45, 0xce, 0x12, 0x90, 0xa2, 0x3c,
0x25, 0x67, 0xe8, 0x06, 0x5c, 0x09, 0x99, 0xe7, 0x36, 0x29, 0xd7, 0x5e, 0x64, 0x43, 0xe6, 0xed,
0xd3, 0xa1, 0xe3, 0x33, 0x29, 0xc7, 0x57, 0x61, 0x2e, 0xee, 0xe0, 0xa8, 0xb5, 0x3e, 0x2b, 0x89,
0x6a, 0x61, 0xdd, 0x87, 0x25, 0x65, 0x77, 0xe0, 0x28, 0x82, 0xd9, 0x94, 0x8b, 0xf2, 0xdb, 0x3a,
0x85, 0x5b, 0xcf, 0x71, 0x97, 0xb6, 0x30, 0x67, 0xd1, 0x29, 0x89, 0x5e, 0xb2, 0xc8, 0xc7, 0x81,
0x47, 0xde, 0x16, 0xa7, 0xf3, 0xae, 0x67, 0x46, 0x5c, 0xb7, 0xbe, 0x37, 0xe0, 0xf6, 0xc5, 0x2a,
0xb5, 0x1b, 0xeb, 0x70, 0xa5, 0x89, 0xbb, 0x82, 0xa4, 0xd5, 0x26, 0x4b, 0xb4, 0x09, 0x79, 0xce,
0x38, 0xee, 0xba, 0xfd, 0x04, 0x1f, 0x4b, 0xfd, 0xb3, 0xce, 0xb2, 0xa4, 0x0f, 0xd4, 0xc6, 0xe8,
0x21, 0xdc, 0x50, 0xa2, 0xd8, 0xe3, 0xb4, 0x4f, 0xd2, 0x08, 0x15, 0x9a, 0xeb, 0x92, 0x5d, 0x96,
0xdc, 0x14, 0xee, 0x08, 0x4c, 0xdc, 0x27, 0x11, 0x6e, 0x93, 0x31, 0xa4, 0x9b, 0x78, 0x25, 0xc2,
0x98, 0x71, 0xee, 0x68, 0xb9, 0x11, 0x15, 0xfb, 0x4a, 0xc8, 0x7a, 0x04, 0x85, 0x01, 0x4d, 0x8a,
0x9c, 0x3b, 0xde, 0x7b, 0xb0, 0x30, 0x8c, 0x51, 0xbc, 0x6e, 0x98, 0x33, 0x1b, 0x39, 0x07, 0x06,
0x41, 0x8a, 0xad, 0x6f, 0x33, 0xa9, 0xc0, 0xa7, 0xf1, 0x3a, 0x48, 0x0f, 0xe1, 0x3a, 0x56, 0x54,
0xd2, 0x72, 0xc7, 0x54, 0xed, 0x67, 0xd6, 0x0d, 0xe7, 0xda, 0x40, 0xe0, 0x74, 0xa0, 0x17, 0x3d,
0x87, 0x79, 0x91, 0x69, 0xbd, 0x98, 0x88, 0xd0, 0xcd, 0x6c, 0x2c, 0x94, 0xf6, 0xec, 0x8b, 0x6f,
0xb2, 0xfd, 0x16, 0xf3, 0x76, 0x5d, 0xea, 0x70, 0x06, 0xba, 0x0a, 0x21, 0x64, 0x15, 0xed, 0xb2,
0xcc, 0x3d, 0x82, 0xac, 0x02, 0xc9, 0x93, 0x5b, 0x28, 0x15, 0x2f, 0x35, 0xaf, 0x6d, 0x69, 0xd3,
0x8e, 0x86, 0x5b, 0x7b, 0x70, 0xa3, 0xf2, 0x9a, 0x72, 0xd2, 0x1a, 0x9e, 0xde, 0xd4, 0xd1, 0xfd,
0x14, 0xd6, 0xc7, 0xb1, 0x3a, 0xb2, 0x97, 0x82, 0x3f, 0x07, 0x74, 0xd0, 0xc1, 0x34, 0xa8, 0x73,
0x1c, 0xf1, 0x74, 0xd6, 0xc6, 0x82, 0x40, 0x5a, 0x72, 0xcf, 0xf3, 0x4e, 0xb2, 0x44, 0x3f, 0x80,
0x5c, 0x9b, 0x04, 0x24, 0xa6, 0xb1, 0xcb, 0xa9, 0x4f, 0x74, 0xc6, 0x2e, 0x68, 0x5a, 0x83, 0xfa,
0xc4, 0x7a, 0x08, 0xd7, 0x07, 0x9e, 0x54, 0x83, 0x16, 0x79, 0x3d, 0x5d, 0x19, 0xb0, 0x6c, 0x58,
0x1b, 0xc5, 0x69, 0x77, 0x56, 0x61, 0x8e, 0x0a, 0x82, 0xbe, 0x42, 0x6a, 0x61, 0x3d, 0x83, 0x95,
0x72, 0x1c, 0xd3, 0x76, 0xe0, 0x93, 0x80, 0xa7, 0xa2, 0x45, 0x42, 0xe6, 0x75, 0x5c, 0xe9, 0xb0,
0x06, 0x80, 0x24, 0xc9, 0x2d, 0x8e, 0x46, 0x24, 0x33, 0x16, 0x91, 0xff, 0x65, 0x00, 0xa5, 0xf5,
0x6a, 0x1f, 0x5e, 0xc1, 0xea, 0xf0, 0xf2, 0xe0, 0x01, 0x5f, 0x86, 0x74, 0xa1, 0xf4, 0xd3, 0x49,
0x07, 0x3f, 0xae, 0x29, 0x95, 0x8a, 0x43, 0xde, 0xb5, 0xfe, 0x38, 0xb1, 0xf0, 0x1f, 0x03, 0xae,
0x5d, 0x20, 0x8c, 0x6e, 0xc3, 0x55, 0x8f, 0xf9, 0x3e, 0xe5, 0x9c, 0x10, 0x69, 0x7f, 0xd6, 0x19,
0x12, 0x86, 0x05, 0x32, 0x93, 0x2a, 0x90, 0x17, 0x96, 0xd2, 0x7b, 0xb0, 0x40, 0x63, 0x37, 0x54,
0x15, 0x3e, 0x92, 0x95, 0x60, 0xde, 0x01, 0x1a, 0xeb, 0x9a, 0x1f, 0x8d, 0x1c, 0xd8, 0xdc, 0x68,
0xf6, 0x7f, 0x36, 0xc8, 0xfe, 0xac, 0x69, 0x6c, 0x2c, 0x95, 0x7e, 0x34, 0x6d, 0xf6, 0x27, 0x59,
0xff, 0xe7, 0x0c, 0xdc, 0x98, 0x70, 0x33, 0x52, 0xca, 0x8d, 0xf7, 0x52, 0x8e, 0x7e, 0x02, 0x37,
0x09, 0xef, 0xec, 0xba, 0x2d, 0x12, 0xb2, 0x98, 0x72, 0xd5, 0x93, 0xdd, 0xa0, 0xe7, 0x37, 0x49,
0xa4, 0x63, 0x23, 0xda, 0xfe, 0xee, 0xa1, 0xe2, 0xcb, 0x8e, 0x59, 0x93, 0x5c, 0xf4, 0x31, 0xac,
0x25, 0x28, 0x1a, 0x78, 0xdd, 0x5e, 0x4c, 0x59, 0xe0, 0xa6, 0xc2, 0xb7, 0xaa, 0xb9, 0xd5, 0x84,
0x59, 0x17, 0xe1, 0xdc, 0x84, 0x3c, 0x1e, 0x14, 0x17, 0x57, 0xa6, 0x9c, 0x6e, 0x52, 0xcb, 0x43,
0x7a, 0x45, 0x90, 0xd1, 0x67, 0x70, 0x5b, 0x2a, 0x10, 0x82, 0x34, 0x70, 0x53, 0xb0, 0x57, 0x3d,
0xd2, 0x23, 0x32, 0xd4, 0xb3, 0xce, 0xcd, 0x44, 0xa6, 0x1a, 0x0c, 0xab, 0xd6, 0xe7, 0x42, 0xc0,
0x7a, 0x04, 0x8b, 0x87, 0xcc, 0xc7, 0x74, 0x50, 0x83, 0x57, 0x61, 0x4e, 0x59, 0xd4, 0x57, 0x44,
0x2e, 0xd0, 0x1a, 0x64, 0x5b, 0x52, 0x2c, 0x69, 0xac, 0x6a, 0x65, 0x7d, 0x0a, 0x4b, 0x09, 0x5c,
0x87, 0x7b, 0x13, 0xf2, 0x22, 0xbf, 0x30, 0xef, 0x45, 0xc4, 0xd5, 0x18, 0xa5, 0x6a, 0x79, 0x40,
0x57, 0x10, 0xeb, 0x0f, 0x19, 0x58, 0x91, 0xd1, 0x6a, 0x44, 0x64, 0xd8, 0xe8, 0x1e, 0xc3, 0x2c,
0x8f, 0x74, 0x3e, 0x2e, 0x94, 0x4a, 0x93, 0x4e, 0x6b, 0x0c, 0x68, 0x8b, 0x45, 0x8d, 0xb5, 0x88,
0x23, 0xf1, 0x85, 0x3f, 0x19, 0x30, 0x9f, 0x90, 0xd0, 0x27, 0x30, 0x27, 0x8f, 0x4d, 0xba, 0xb2,
0x50, 0xb2, 0x86, 0x5a, 0x09, 0xef, 0xd8, 0xc9, 0x38, 0x65, 0xef, 0x4b, 0x13, 0x6a, 0xe6, 0x51,
0x80, 0x91, 0x39, 0x25, 0x33, 0x32, 0xa7, 0xa0, 0x6d, 0x40, 0x21, 0x8e, 0x38, 0xf5, 0x68, 0x28,
0x9b, 0x4e, 0x9f, 0x71, 0x92, 0x34, 0xd3, 0x95, 0x34, 0xe7, 0xb9, 0x60, 0x88, 0x9b, 0xa2, 0x7b,
0xb5, 0x94, 0x53, 0xa7, 0x0a, 0xaa, 0x4d, 0x0b, 0x8a, 0x75, 0x0c, 0xab, 0xc2, 0x69, 0xe9, 0x82,
0x48, 0x86, 0xe4, 0x58, 0x6e, 0xc1, 0x55, 0x91, 0x37, 0xee, 0xcb, 0x88, 0xf9, 0x3a, 0x9e, 0xf3,
0x82, 0xf0, 0x38, 0x62, 0xbe, 0x98, 0x7b, 0x24, 0x93, 0x33, 0x9d, 0x8f, 0x59, 0xb1, 0x6c, 0xb0,
0xad, 0x4f, 0x60, 0x71, 0x90, 0xd5, 0x0e, 0xeb, 0x12, 0xb4, 0x00, 0x57, 0x9e, 0xd5, 0x9e, 0xd6,
0x4e, 0x5e, 0xd4, 0xf2, 0x1f, 0xa0, 0x1c, 0xcc, 0x97, 0x1b, 0x8d, 0x4a, 0xbd, 0x51, 0x71, 0xf2,
0x86, 0x58, 0x9d, 0x3a, 0x27, 0xa7, 0x27, 0xf5, 0x8a, 0x93, 0xcf, 0x6c, 0xfd, 0xde, 0x80, 0xe5,
0x91, 0x0b, 0x81, 0x10, 0x2c, 0x69, 0xb0, 0x5b, 0x6f, 0x94, 0x1b, 0xcf, 0xea, 0xf9, 0x0f, 0x04,
0xed, 0xb4, 0x52, 0x3b, 0xac, 0xd6, 0x8e, 0xdc, 0xf2, 0x41, 0xa3, 0xfa, 0xbc, 0x92, 0x37, 0x10,
0x40, 0x56, 0x7f, 0x67, 0x04, 0xbf, 0x5a, 0xab, 0x36, 0xaa, 0xe5, 0x46, 0xe5, 0xd0, 0xad, 0x7c,
0x51, 0x6d, 0xe4, 0x67, 0x50, 0x1e, 0x72, 0x2f, 0xaa, 0x8d, 0x27, 0x87, 0x4e, 0xf9, 0x45, 0x79,
0xff, 0xb8, 0x92, 0x9f, 0x15, 0x08, 0xc1, 0xab, 0x1c, 0xe6, 0xe7, 0x04, 0x42, 0x7d, 0xbb, 0xf5,
0xe3, 0x72, 0xfd, 0x49, 0xe5, 0x30, 0x9f, 0x2d, 0xfd, 0x33, 0x03, 0x8b, 0xea, 0x6c, 0xea, 0x6a,
0xde, 0x46, 0xbf, 0x80, 0x95, 0x17, 0x98, 0xf2, 0xc7, 0x2c, 0x1a, 0x76, 0x1d, 0xb4, 0x66, 0xab,
0xe1, 0xd7, 0x4e, 0xc6, 0x6c, 0xbb, 0x22, 0xc6, 0xec, 0xc2, 0xd6, 0xa4, 0x24, 0x1a, 0xef, 0x58,
0x3b, 0x06, 0x7a, 0x0a, 0x8b, 0x07, 0x38, 0x60, 0x01, 0xf5, 0x70, 0xf7, 0x09, 0xc1, 0xad, 0x89,
0x6a, 0xa7, 0xc8, 0x22, 0xf4, 0xad, 0x01, 0x57, 0x07, 0xa9, 0x3a, 0x51, 0xd3, 0xe6, 0xd4, 0x59,
0x6e, 0x9d, 0x7c, 0x53, 0xde, 0x41, 0xf6, 0x63, 0xc2, 0xbd, 0x0e, 0x89, 0x4d, 0x99, 0x88, 0xa6,
0xc8, 0x77, 0x33, 0xa6, 0x81, 0x47, 0xcc, 0x2e, 0x8e, 0xb9, 0xf9, 0x92, 0x06, 0xb8, 0x4b, 0x7f,
0x4d, 0x5a, 0x8a, 0x6f, 0xff, 0xee, 0x1f, 0xdf, 0xff, 0x31, 0xb3, 0x86, 0x56, 0xc5, 0x83, 0x45,
0x3f, 0x5f, 0x24, 0x43, 0xe0, 0x4a, 0xff, 0x36, 0x60, 0x59, 0x8d, 0xbc, 0x24, 0x4a, 0xa2, 0xdb,
0x01, 0xa4, 0x13, 0x2f, 0x35, 0x84, 0xa3, 0x89, 0x61, 0x1c, 0x9f, 0xd4, 0x0b, 0x1f, 0x4d, 0x88,
0x4d, 0x4a, 0xf4, 0x10, 0x73, 0x8c, 0x5c, 0x58, 0xa9, 0xf7, 0x9a, 0x3e, 0x3d, 0x67, 0xc8, 0xba,
0x1c, 0x9c, 0x36, 0x70, 0x91, 0x33, 0x49, 0xbc, 0x4a, 0xdf, 0x19, 0x83, 0xb7, 0xc7, 0x60, 0x7b,
0x5f, 0x40, 0x4e, 0xfb, 0xa9, 0x0e, 0xe9, 0xfe, 0x5b, 0xc3, 0x9f, 0x6c, 0x69, 0x9a, 0xe3, 0xfe,
0x12, 0x72, 0xda, 0x98, 0x5a, 0x4f, 0x81, 0x29, 0x4c, 0x6c, 0x48, 0x23, 0x4f, 0xa6, 0xd2, 0x5f,
0xb3, 0x90, 0x1f, 0xde, 0x49, 0xbd, 0x97, 0x2f, 0x01, 0x54, 0x39, 0x95, 0xe1, 0xfc, 0x70, 0x92,
0xae, 0x73, 0x45, 0x7e, 0x72, 0xf0, 0x46, 0x8a, 0xf9, 0x6f, 0x06, 0xb7, 0x6c, 0xd8, 0x37, 0x50,
0xe9, 0x9d, 0x46, 0x63, 0x65, 0xf0, 0xc1, 0x7b, 0x8c, 0xd3, 0x3b, 0x06, 0x62, 0xb0, 0x74, 0x7e,
0x92, 0x43, 0xdb, 0x97, 0x2a, 0x4a, 0x4f, 0x8a, 0x05, 0x7b, 0x5a, 0x71, 0xbd, 0xe1, 0x2e, 0x5c,
0x3b, 0x48, 0x06, 0xa0, 0xd4, 0xa0, 0xb4, 0x39, 0xcd, 0x54, 0xa6, 0x2c, 0x6e, 0x4d, 0x3f, 0xc0,
0xa1, 0x57, 0xe3, 0x35, 0xf6, 0x1d, 0xf7, 0xf7, 0xae, 0xef, 0x04, 0xf4, 0x5b, 0x03, 0x56, 0x2f,
0x7a, 0x67, 0xa2, 0xcb, 0x4f, 0x68, 0xfc, 0xa1, 0x5b, 0xf8, 0xf8, 0xdd, 0x40, 0xda, 0x87, 0x1e,
0xe4, 0x47, 0xdf, 0x19, 0x68, 0xe2, 0x46, 0x26, 0xbc, 0x66, 0x0a, 0x3b, 0xd3, 0x03, 0x94, 0xd9,
0xfd, 0xbf, 0xcd, 0x7c, 0x53, 0xfe, 0xcb, 0x0c, 0xfa, 0x97, 0x01, 0x73, 0xa7, 0xd1, 0x59, 0xec,
0xa3, 0xfb, 0x3f, 0xaf, 0x9f, 0xd4, 0x4c, 0xe7, 0xf4, 0xc0, 0x4c, 0xfe, 0xc5, 0x31, 0xc3, 0x88,
0xf5, 0x69, 0x4b, 0x14, 0xce, 0x33, 0x53, 0x0a, 0xd9, 0xd6, 0x01, 0x2c, 0xc9, 0x2f, 0xcc, 0xa9,
0x67, 0x1e, 0xe3, 0x66, 0x8c, 0x6e, 0x76, 0x38, 0x0f, 0xe3, 0xbd, 0x62, 0x31, 0x4c, 0xe8, 0x5d,
0xdc, 0x8c, 0x6d, 0x8f, 0xf9, 0x85, 0x35, 0x4e, 0xb0, 0xff, 0xb3, 0x31, 0xfa, 0xd6, 0x2f, 0xe1,
0xde, 0x51, 0xed, 0x99, 0x79, 0x44, 0x02, 0x12, 0xe1, 0xae, 0xa9, 0x9e, 0x9e, 0xe6, 0x31, 0xf5,
0x48, 0x10, 0x13, 0xb3, 0xff, 0xc0, 0xde, 0x41, 0x8f, 0x12, 0xad, 0x6d, 0xca, 0x3b, 0xbd, 0xa6,
0x80, 0x9d, 0x37, 0xa0, 0x56, 0xa2, 0x72, 0x37, 0x8b, 0x3e, 0x16, 0xe5, 0xba, 0x78, 0x5c, 0x3d,
0xa8, 0xd4, 0xea, 0x15, 0xdb, 0x6f, 0x95, 0xe6, 0x76, 0xec, 0x1d, 0x7b, 0xa7, 0xb0, 0x8c, 0x43,
0x6a, 0x87, 0xd1, 0x99, 0xb4, 0x1c, 0x10, 0xbe, 0x65, 0x64, 0x4a, 0x79, 0x1c, 0x86, 0x5d, 0xea,
0xc9, 0xcb, 0x55, 0xfc, 0x55, 0xcc, 0x82, 0xd2, 0xcd, 0x34, 0xa5, 0x1d, 0x85, 0xde, 0xf6, 0xd7,
0xa4, 0xb9, 0xcd, 0xc9, 0x6b, 0x3e, 0x81, 0xf5, 0x16, 0x94, 0x60, 0xed, 0x8d, 0x99, 0xd8, 0x9b,
0x6c, 0x22, 0x7a, 0x28, 0x8a, 0xe4, 0x59, 0xec, 0x9b, 0x47, 0x72, 0xa7, 0xe8, 0xa3, 0xe9, 0x76,
0xfe, 0xdd, 0x9b, 0xbb, 0xc6, 0xdf, 0xdf, 0xdc, 0x35, 0xfe, 0xfb, 0xe6, 0xae, 0xd1, 0xcc, 0xca,
0x0e, 0xfa, 0xe0, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x9a, 0xad, 0x81, 0x95, 0x13, 0x00,
0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1555,7 +1553,6 @@ type BeaconServiceClient interface {
WaitForChainStart(ctx context.Context, in *types.Empty, opts ...grpc.CallOption) (BeaconService_WaitForChainStartClient, error)
CanonicalHead(ctx context.Context, in *types.Empty, opts ...grpc.CallOption) (*v1alpha1.BeaconBlock, error)
BlockTree(ctx context.Context, in *types.Empty, opts ...grpc.CallOption) (*BlockTreeResponse, error)
BlockTreeBySlots(ctx context.Context, in *TreeBlockSlotRequest, opts ...grpc.CallOption) (*BlockTreeResponse, error)
}
type beaconServiceClient struct {
@@ -1616,21 +1613,11 @@ func (c *beaconServiceClient) BlockTree(ctx context.Context, in *types.Empty, op
return out, nil
}
func (c *beaconServiceClient) BlockTreeBySlots(ctx context.Context, in *TreeBlockSlotRequest, opts ...grpc.CallOption) (*BlockTreeResponse, error) {
out := new(BlockTreeResponse)
err := c.cc.Invoke(ctx, "/ethereum.beacon.rpc.v1.BeaconService/BlockTreeBySlots", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// BeaconServiceServer is the server API for BeaconService service.
type BeaconServiceServer interface {
WaitForChainStart(*types.Empty, BeaconService_WaitForChainStartServer) error
CanonicalHead(context.Context, *types.Empty) (*v1alpha1.BeaconBlock, error)
BlockTree(context.Context, *types.Empty) (*BlockTreeResponse, error)
BlockTreeBySlots(context.Context, *TreeBlockSlotRequest) (*BlockTreeResponse, error)
}
func RegisterBeaconServiceServer(s *grpc.Server, srv BeaconServiceServer) {
@@ -1694,24 +1681,6 @@ func _BeaconService_BlockTree_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _BeaconService_BlockTreeBySlots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TreeBlockSlotRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(BeaconServiceServer).BlockTreeBySlots(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethereum.beacon.rpc.v1.BeaconService/BlockTreeBySlots",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(BeaconServiceServer).BlockTreeBySlots(ctx, req.(*TreeBlockSlotRequest))
}
return interceptor(ctx, in, info, handler)
}
var _BeaconService_serviceDesc = grpc.ServiceDesc{
ServiceName: "ethereum.beacon.rpc.v1.BeaconService",
HandlerType: (*BeaconServiceServer)(nil),
@@ -1724,10 +1693,6 @@ var _BeaconService_serviceDesc = grpc.ServiceDesc{
MethodName: "BlockTree",
Handler: _BeaconService_BlockTree_Handler,
},
{
MethodName: "BlockTreeBySlots",
Handler: _BeaconService_BlockTreeBySlots_Handler,
},
},
Streams: []grpc.StreamDesc{
{

View File

@@ -49,7 +49,6 @@ service BeaconService {
get: "/v1/beacon/blocktree";
};
}
rpc BlockTreeBySlots(TreeBlockSlotRequest) returns (BlockTreeResponse);
}
service AttesterService {

View File

@@ -6,14 +6,13 @@ package ethereum_beacon_rpc_v1
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
empty "github.com/golang/protobuf/ptypes/empty"
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
@@ -1234,123 +1233,121 @@ func init() {
func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) }
var fileDescriptor_9eb4e94b85965285 = []byte{
// 1843 bytes of a gzipped FileDescriptorProto
// 1824 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x5f, 0x73, 0xdb, 0xc6,
0x11, 0x0f, 0x28, 0x89, 0x91, 0x57, 0xb4, 0x44, 0x9f, 0x65, 0x59, 0xa6, 0xed, 0x31, 0x8a, 0x3a,
0xa9, 0xa4, 0x89, 0x40, 0x89, 0xce, 0x78, 0x52, 0x65, 0xdc, 0x94, 0x92, 0x68, 0x99, 0xb5, 0x86,
0x52, 0x40, 0xda, 0x4e, 0x27, 0x0f, 0xe8, 0x11, 0x3c, 0x93, 0x57, 0x13, 0x38, 0x18, 0x38, 0x32,
0x11, 0x0f, 0x28, 0x89, 0x96, 0x57, 0xb4, 0x44, 0x9d, 0x65, 0x59, 0xa6, 0xed, 0x31, 0x8a, 0x3a,
0xa9, 0xa4, 0xa9, 0x40, 0x89, 0xce, 0x78, 0x52, 0x65, 0xdc, 0x94, 0x92, 0x68, 0x99, 0xb5, 0x86,
0x52, 0x40, 0xda, 0x4e, 0x27, 0x0f, 0xe8, 0x11, 0x3c, 0x93, 0xd7, 0x10, 0x38, 0x18, 0x38, 0x32,
0x56, 0x1f, 0x3a, 0xd3, 0xbe, 0xf6, 0xa9, 0xe9, 0x07, 0xc8, 0x87, 0xe8, 0x43, 0x67, 0x3a, 0x9d,
0x3e, 0x76, 0xfa, 0xde, 0xc7, 0x76, 0xfa, 0x94, 0x87, 0x7e, 0x8c, 0xce, 0xfd, 0x01, 0x08, 0x91,
0xa2, 0x45, 0xe5, 0x89, 0xb8, 0xdd, 0xfd, 0xed, 0xee, 0xed, 0xed, 0xed, 0xee, 0x11, 0xac, 0x30,
0x62, 0x9c, 0x95, 0xdb, 0x04, 0x7b, 0x2c, 0x28, 0x47, 0xa1, 0x57, 0x1e, 0xee, 0x96, 0x63, 0x12,
0x0d, 0xa9, 0x47, 0x62, 0x5b, 0x32, 0xd1, 0x1a, 0xe1, 0x3d, 0x12, 0x91, 0x81, 0x6f, 0x2b, 0x31,
0x3b, 0x0a, 0x3d, 0x7b, 0xb8, 0x5b, 0xba, 0xdb, 0x65, 0xac, 0xdb, 0x27, 0x65, 0x29, 0xd5, 0x1e,
0xbc, 0x2e, 0x13, 0x3f, 0xe4, 0x67, 0x0a, 0x54, 0xfa, 0x48, 0x29, 0x26, 0xbc, 0x57, 0x1e, 0xee,
0xe2, 0x7e, 0xd8, 0xc3, 0xbb, 0xda, 0x8a, 0xdb, 0xee, 0x33, 0xef, 0x8d, 0x16, 0x7b, 0x78, 0x81,
0x18, 0xe6, 0x9c, 0xc4, 0x1c, 0x73, 0xca, 0x02, 0x2d, 0x75, 0x4f, 0x5b, 0xc2, 0x21, 0x2d, 0xe3,
0x20, 0x60, 0x8a, 0xa9, 0xfd, 0x2b, 0x7d, 0x22, 0x7f, 0xbc, 0xed, 0x2e, 0x09, 0xb6, 0xe3, 0x6f,
0x70, 0xb7, 0x4b, 0xa2, 0x32, 0x0b, 0xa5, 0xc4, 0xa4, 0xb4, 0x75, 0x04, 0x85, 0x7d, 0xe1, 0x80,
0x43, 0xde, 0x0e, 0x48, 0xcc, 0x11, 0x82, 0xf9, 0xb8, 0xcf, 0xf8, 0xba, 0x61, 0x1a, 0x1b, 0xf3,
0x8e, 0xfc, 0x46, 0x3f, 0x86, 0xeb, 0x11, 0x0e, 0x3a, 0x98, 0xb9, 0x11, 0x19, 0x12, 0xdc, 0x5f,
0xcf, 0x99, 0xc6, 0x46, 0xc1, 0x29, 0x28, 0xa2, 0x23, 0x69, 0xd6, 0x0e, 0xac, 0x9c, 0x46, 0x2c,
0x64, 0x31, 0x71, 0x48, 0x1c, 0xb2, 0x20, 0x26, 0xe8, 0x3e, 0x80, 0xdc, 0x9c, 0x1b, 0x31, 0xad,
0xb1, 0xe0, 0x5c, 0x93, 0x14, 0x87, 0x31, 0x6e, 0x0d, 0x01, 0x55, 0x47, 0x7b, 0x4b, 0x1c, 0xb8,
0x0f, 0x10, 0x0e, 0xda, 0x7d, 0xea, 0xb9, 0x6f, 0xc8, 0x59, 0x02, 0x52, 0x94, 0xe7, 0xe4, 0x0c,
0xdd, 0x86, 0x0f, 0x43, 0xe6, 0xb9, 0x6d, 0xca, 0xb5, 0x17, 0xf9, 0x90, 0x79, 0xfb, 0x74, 0xe4,
0xf8, 0x5c, 0xc6, 0xf1, 0x55, 0x58, 0x88, 0x7b, 0x38, 0xea, 0xac, 0xcf, 0x4b, 0xa2, 0x5a, 0x58,
0x0f, 0x61, 0x59, 0xd9, 0x4d, 0x1d, 0x45, 0x30, 0x9f, 0x71, 0x51, 0x7e, 0x5b, 0xa7, 0x70, 0xf7,
0x25, 0xee, 0xd3, 0x0e, 0xe6, 0x2c, 0x3a, 0x25, 0xd1, 0x6b, 0x16, 0xf9, 0x38, 0xf0, 0xc8, 0xfb,
0xe2, 0x74, 0xde, 0xf5, 0xdc, 0x98, 0xeb, 0xd6, 0xf7, 0x06, 0xdc, 0xbb, 0x58, 0xa5, 0x76, 0x63,
0x1d, 0x3e, 0x6c, 0xe3, 0xbe, 0x20, 0x69, 0xb5, 0xc9, 0x12, 0x6d, 0x42, 0x91, 0x33, 0x8e, 0xfb,
0xee, 0x30, 0xc1, 0xc7, 0x52, 0xff, 0xbc, 0xb3, 0x22, 0xe9, 0xa9, 0xda, 0x18, 0x3d, 0x86, 0xdb,
0x4a, 0x14, 0x7b, 0x9c, 0x0e, 0x49, 0x16, 0xa1, 0x42, 0x73, 0x4b, 0xb2, 0xab, 0x92, 0x9b, 0xc1,
0x1d, 0x81, 0x89, 0x87, 0x24, 0xc2, 0x5d, 0x32, 0x81, 0x74, 0x13, 0xaf, 0x44, 0x18, 0x73, 0xce,
0x7d, 0x2d, 0x37, 0xa6, 0x62, 0x5f, 0x09, 0x59, 0x4f, 0xa0, 0x94, 0xd2, 0xa4, 0xc8, 0xb9, 0xe3,
0x7d, 0x00, 0x4b, 0xa3, 0x18, 0xc5, 0xeb, 0x86, 0x39, 0xb7, 0x51, 0x70, 0x20, 0x0d, 0x52, 0x6c,
0x7d, 0x97, 0xcb, 0x04, 0x3e, 0x8b, 0xd7, 0x41, 0x7a, 0x0c, 0xb7, 0xb0, 0xa2, 0x92, 0x8e, 0x3b,
0xa1, 0x6a, 0x3f, 0xb7, 0x6e, 0x38, 0x37, 0x53, 0x81, 0xd3, 0x54, 0x2f, 0x7a, 0x09, 0x8b, 0x22,
0xd3, 0x06, 0x31, 0x11, 0xa1, 0x9b, 0xdb, 0x58, 0xaa, 0xec, 0xd9, 0x17, 0xdf, 0x64, 0xfb, 0x3d,
0xe6, 0xed, 0xa6, 0xd4, 0xe1, 0xa4, 0xba, 0x4a, 0x21, 0xe4, 0x15, 0xed, 0xb2, 0xcc, 0x3d, 0x82,
0xbc, 0x02, 0xc9, 0x93, 0x5b, 0xaa, 0x94, 0x2f, 0x35, 0xaf, 0x6d, 0x69, 0xd3, 0x8e, 0x86, 0x5b,
0x7b, 0x70, 0xbb, 0xf6, 0x8e, 0x72, 0xd2, 0x19, 0x9d, 0xde, 0xcc, 0xd1, 0xfd, 0x1c, 0xd6, 0x27,
0xb1, 0x3a, 0xb2, 0x97, 0x82, 0xbf, 0x04, 0x74, 0xd0, 0xc3, 0x34, 0x68, 0x72, 0x1c, 0xf1, 0x6c,
0xd6, 0xc6, 0x82, 0x40, 0x3a, 0x72, 0xcf, 0x8b, 0x4e, 0xb2, 0x44, 0x3f, 0x82, 0x42, 0x97, 0x04,
0x24, 0xa6, 0xb1, 0xcb, 0xa9, 0x4f, 0x74, 0xc6, 0x2e, 0x69, 0x5a, 0x8b, 0xfa, 0xc4, 0x7a, 0x0c,
0xb7, 0x52, 0x4f, 0xea, 0x41, 0x87, 0xbc, 0x9b, 0xad, 0x0c, 0x58, 0x36, 0xac, 0x8d, 0xe3, 0xb4,
0x3b, 0xab, 0xb0, 0x40, 0x05, 0x41, 0x5f, 0x21, 0xb5, 0xb0, 0x5e, 0xc0, 0x8d, 0x6a, 0x1c, 0xd3,
0x3e, 0xf7, 0xbd, 0x4f, 0x9d, 0x76, 0xfa, 0x94, 0x87, 0x7e, 0x8c, 0xcc, 0xfd, 0x01, 0x08, 0x91,
0xa2, 0x45, 0xe7, 0x89, 0xb8, 0xdd, 0xfd, 0xed, 0xee, 0xed, 0xed, 0xed, 0xee, 0x11, 0xac, 0x30,
0x62, 0x9c, 0x95, 0xdb, 0x04, 0x7b, 0x2c, 0x28, 0x47, 0xa1, 0x57, 0x1e, 0xee, 0x95, 0x63, 0x12,
0x0d, 0xa9, 0x47, 0x62, 0x5b, 0x32, 0xd1, 0x3a, 0xe1, 0x3d, 0x12, 0x91, 0x81, 0x6f, 0x2b, 0x31,
0x3b, 0x0a, 0x3d, 0x7b, 0xb8, 0x57, 0xba, 0xdb, 0x65, 0xac, 0xdb, 0x27, 0x65, 0x29, 0xd5, 0x1e,
0xbc, 0x2e, 0x13, 0x3f, 0xe4, 0xe7, 0x0a, 0x54, 0xfa, 0x50, 0x29, 0x26, 0xbc, 0x57, 0x1e, 0xee,
0xe1, 0x7e, 0xd8, 0xc3, 0x7b, 0xda, 0x8a, 0xdb, 0xee, 0x33, 0xef, 0x2b, 0x2d, 0xf6, 0xf0, 0x12,
0x31, 0xcc, 0x39, 0x89, 0x39, 0xe6, 0x94, 0x05, 0x5a, 0xea, 0x9e, 0xb6, 0x84, 0x43, 0x5a, 0xc6,
0x41, 0xc0, 0x14, 0x53, 0xfb, 0x57, 0xfa, 0xa9, 0xfc, 0xf1, 0x76, 0xba, 0x24, 0xd8, 0x89, 0xbf,
0xc6, 0xdd, 0x2e, 0x89, 0xca, 0x2c, 0x94, 0x12, 0x93, 0xd2, 0xd6, 0x31, 0x14, 0x0e, 0x84, 0x03,
0x0e, 0x79, 0x33, 0x20, 0x31, 0x47, 0x08, 0xe6, 0xe3, 0x3e, 0xe3, 0x1b, 0x86, 0x69, 0x6c, 0xce,
0x3b, 0xf2, 0x1b, 0xfd, 0x18, 0x6e, 0x44, 0x38, 0xe8, 0x60, 0xe6, 0x46, 0x64, 0x48, 0x70, 0x7f,
0x23, 0x67, 0x1a, 0x9b, 0x05, 0xa7, 0xa0, 0x88, 0x8e, 0xa4, 0x59, 0xbb, 0xb0, 0x72, 0x16, 0xb1,
0x90, 0xc5, 0xc4, 0x21, 0x71, 0xc8, 0x82, 0x98, 0xa0, 0xfb, 0x00, 0x72, 0x73, 0x6e, 0xc4, 0xb4,
0xc6, 0x82, 0x73, 0x5d, 0x52, 0x1c, 0xc6, 0xb8, 0x35, 0x04, 0x54, 0x1d, 0xed, 0x2d, 0x71, 0xe0,
0x3e, 0x40, 0x38, 0x68, 0xf7, 0xa9, 0xe7, 0x7e, 0x45, 0xce, 0x13, 0x90, 0xa2, 0x3c, 0x27, 0xe7,
0xe8, 0x36, 0x5c, 0x0b, 0x99, 0xe7, 0xb6, 0x29, 0xd7, 0x5e, 0xe4, 0x43, 0xe6, 0x1d, 0xd0, 0x91,
0xe3, 0x73, 0x19, 0xc7, 0xd7, 0x60, 0x21, 0xee, 0xe1, 0xa8, 0xb3, 0x31, 0x2f, 0x89, 0x6a, 0x61,
0x3d, 0x84, 0x65, 0x65, 0x37, 0x75, 0x14, 0xc1, 0x7c, 0xc6, 0x45, 0xf9, 0x6d, 0x9d, 0xc1, 0xdd,
0x97, 0xb8, 0x4f, 0x3b, 0x98, 0xb3, 0xe8, 0x8c, 0x44, 0xaf, 0x59, 0xe4, 0xe3, 0xc0, 0x23, 0xef,
0x8a, 0xd3, 0x45, 0xd7, 0x73, 0x63, 0xae, 0x5b, 0xdf, 0x19, 0x70, 0xef, 0x72, 0x95, 0xda, 0x8d,
0x0d, 0xb8, 0xd6, 0xc6, 0x7d, 0x41, 0xd2, 0x6a, 0x93, 0x25, 0xda, 0x82, 0x22, 0x67, 0x1c, 0xf7,
0xdd, 0x61, 0x82, 0x8f, 0xa5, 0xfe, 0x79, 0x67, 0x45, 0xd2, 0x53, 0xb5, 0x31, 0x7a, 0x0c, 0xb7,
0x95, 0x28, 0xf6, 0x38, 0x1d, 0x92, 0x2c, 0x42, 0x85, 0xe6, 0x96, 0x64, 0x57, 0x25, 0x37, 0x83,
0x3b, 0x06, 0x13, 0x0f, 0x49, 0x84, 0xbb, 0x64, 0x02, 0xe9, 0x26, 0x5e, 0x89, 0x30, 0xe6, 0x9c,
0xfb, 0x5a, 0x6e, 0x4c, 0xc5, 0x81, 0x12, 0xb2, 0x9e, 0x40, 0x29, 0xa5, 0x49, 0x91, 0x0b, 0xc7,
0xfb, 0x00, 0x96, 0x46, 0x31, 0x8a, 0x37, 0x0c, 0x73, 0x6e, 0xb3, 0xe0, 0x40, 0x1a, 0xa4, 0xd8,
0xfa, 0x36, 0x97, 0x09, 0x7c, 0x16, 0xaf, 0x83, 0xf4, 0x18, 0x6e, 0x61, 0x45, 0x25, 0x1d, 0x77,
0x42, 0xd5, 0x41, 0x6e, 0xc3, 0x70, 0x6e, 0xa6, 0x02, 0x67, 0xa9, 0x5e, 0xf4, 0x12, 0x16, 0x45,
0xa6, 0x0d, 0x62, 0x22, 0x42, 0x37, 0xb7, 0xb9, 0x54, 0xd9, 0xb7, 0x2f, 0xbf, 0xc9, 0xf6, 0x3b,
0xcc, 0xdb, 0x4d, 0xa9, 0xc3, 0x49, 0x75, 0x95, 0x42, 0xc8, 0x2b, 0xda, 0x55, 0x99, 0x7b, 0x0c,
0x79, 0x05, 0x92, 0x27, 0xb7, 0x54, 0x29, 0x5f, 0x69, 0x5e, 0xdb, 0xd2, 0xa6, 0x1d, 0x0d, 0xb7,
0xf6, 0xe1, 0x76, 0xed, 0x2d, 0xe5, 0xa4, 0x33, 0x3a, 0xbd, 0x99, 0xa3, 0xfb, 0x29, 0x6c, 0x4c,
0x62, 0x75, 0x64, 0xaf, 0x04, 0x7f, 0x0e, 0xe8, 0xb0, 0x87, 0x69, 0xd0, 0xe4, 0x38, 0xe2, 0xd9,
0xac, 0x8d, 0x05, 0x81, 0x74, 0xe4, 0x9e, 0x17, 0x9d, 0x64, 0x89, 0x7e, 0x04, 0x85, 0x2e, 0x09,
0x48, 0x4c, 0x63, 0x97, 0x53, 0x9f, 0xe8, 0x8c, 0x5d, 0xd2, 0xb4, 0x16, 0xf5, 0x89, 0xf5, 0x18,
0x6e, 0xa5, 0x9e, 0xd4, 0x83, 0x0e, 0x79, 0x3b, 0x5b, 0x19, 0xb0, 0x6c, 0x58, 0x1f, 0xc7, 0x69,
0x77, 0xd6, 0x60, 0x81, 0x0a, 0x82, 0xbe, 0x42, 0x6a, 0x61, 0xbd, 0x80, 0xd5, 0x6a, 0x1c, 0xd3,
0x6e, 0xe0, 0x93, 0x80, 0x67, 0xa2, 0x45, 0x42, 0xe6, 0xf5, 0x5c, 0xe9, 0xb0, 0x06, 0x80, 0x24,
0xc9, 0x2d, 0x8e, 0x47, 0x24, 0x37, 0x11, 0x91, 0xff, 0xe5, 0x00, 0x65, 0xf5, 0x6a, 0x1f, 0xde,
0xc2, 0xea, 0xe8, 0xf2, 0xe0, 0x94, 0x2f, 0x43, 0xba, 0x54, 0xf9, 0xd9, 0xb4, 0x83, 0x9f, 0xd4,
0x94, 0x49, 0xc5, 0x11, 0xef, 0xe6, 0x70, 0x92, 0x58, 0xfa, 0xaf, 0x01, 0x37, 0x2f, 0x10, 0x46,
0xf7, 0xe0, 0x9a, 0xc7, 0x7c, 0x9f, 0x72, 0x4e, 0x88, 0xb4, 0x3f, 0xef, 0x8c, 0x08, 0xa3, 0x02,
0x99, 0xcb, 0x14, 0xc8, 0x0b, 0x4b, 0xe9, 0x03, 0x58, 0xa2, 0xb1, 0x1b, 0xaa, 0x0a, 0x1f, 0xc9,
0x4a, 0xb0, 0xe8, 0x00, 0x8d, 0x75, 0xcd, 0x8f, 0xc6, 0x0e, 0x6c, 0x61, 0x3c, 0xfb, 0xbf, 0x48,
0xb3, 0x3f, 0x6f, 0x1a, 0x1b, 0xcb, 0x95, 0x9f, 0xcc, 0x9a, 0xfd, 0x49, 0xd6, 0xff, 0x25, 0x07,
0xb7, 0xa7, 0xdc, 0x8c, 0x8c, 0x72, 0xe3, 0x07, 0x29, 0x47, 0x3f, 0x85, 0x3b, 0x84, 0xf7, 0x76,
0xdd, 0x0e, 0x09, 0x59, 0x4c, 0xb9, 0xea, 0xc9, 0x6e, 0x30, 0xf0, 0xdb, 0x24, 0xd2, 0xb1, 0x11,
0x6d, 0x7f, 0xf7, 0x50, 0xf1, 0x65, 0xc7, 0x6c, 0x48, 0x2e, 0xfa, 0x14, 0xd6, 0x12, 0x14, 0x0d,
0xbc, 0xfe, 0x20, 0xa6, 0x2c, 0x70, 0x33, 0xe1, 0x5b, 0xd5, 0xdc, 0x7a, 0xc2, 0x6c, 0x8a, 0x70,
0x6e, 0x42, 0x11, 0xa7, 0xc5, 0xc5, 0x95, 0x29, 0xa7, 0x9b, 0xd4, 0xca, 0x88, 0x5e, 0x13, 0x64,
0xf4, 0x05, 0xdc, 0x93, 0x0a, 0x84, 0x20, 0x0d, 0xdc, 0x0c, 0xec, 0xed, 0x80, 0x0c, 0x88, 0x0c,
0xf5, 0xbc, 0x73, 0x27, 0x91, 0xa9, 0x07, 0xa3, 0xaa, 0xf5, 0xa5, 0x10, 0xb0, 0x9e, 0xc0, 0xf5,
0x43, 0xe6, 0x63, 0x9a, 0xd6, 0xe0, 0x55, 0x58, 0x50, 0x16, 0xf5, 0x15, 0x91, 0x0b, 0xb4, 0x06,
0xf9, 0x8e, 0x14, 0x4b, 0x1a, 0xab, 0x5a, 0x59, 0x9f, 0xc3, 0x72, 0x02, 0xd7, 0xe1, 0xde, 0x84,
0xc9, 0x2d, 0x8e, 0x47, 0x24, 0x37, 0x11, 0x91, 0xff, 0xe7, 0x00, 0x65, 0xf5, 0x6a, 0x1f, 0xde,
0xc0, 0xda, 0xe8, 0xf2, 0xe0, 0x94, 0x2f, 0x43, 0xba, 0x54, 0xf9, 0xf9, 0xb4, 0x83, 0x9f, 0xd4,
0x94, 0x49, 0xc5, 0x11, 0xef, 0xe6, 0x70, 0x92, 0x58, 0xfa, 0x9f, 0x01, 0x37, 0x2f, 0x11, 0x46,
0xf7, 0xe0, 0xba, 0xc7, 0x7c, 0x9f, 0x72, 0x4e, 0x88, 0xb4, 0x3f, 0xef, 0x8c, 0x08, 0xa3, 0x02,
0x99, 0xcb, 0x14, 0xc8, 0x4b, 0x4b, 0xe9, 0x03, 0x58, 0xa2, 0xb1, 0x1b, 0xaa, 0x0a, 0x1f, 0xc9,
0x4a, 0xb0, 0xe8, 0x00, 0x8d, 0x75, 0xcd, 0x8f, 0xc6, 0x0e, 0x6c, 0x61, 0x3c, 0xfb, 0x3f, 0x4b,
0xb3, 0x3f, 0x6f, 0x1a, 0x9b, 0xcb, 0x95, 0x9f, 0xcc, 0x9a, 0xfd, 0x49, 0xd6, 0xff, 0x35, 0x07,
0xb7, 0xa7, 0xdc, 0x8c, 0x8c, 0x72, 0xe3, 0x07, 0x29, 0x47, 0x3f, 0x83, 0x3b, 0x84, 0xf7, 0xf6,
0xdc, 0x0e, 0x09, 0x59, 0x4c, 0xb9, 0xea, 0xc9, 0x6e, 0x30, 0xf0, 0xdb, 0x24, 0xd2, 0xb1, 0x11,
0x6d, 0x7f, 0xef, 0x48, 0xf1, 0x65, 0xc7, 0x6c, 0x48, 0x2e, 0xfa, 0x18, 0xd6, 0x13, 0x14, 0x0d,
0xbc, 0xfe, 0x20, 0xa6, 0x2c, 0x70, 0x33, 0xe1, 0x5b, 0xd3, 0xdc, 0x7a, 0xc2, 0x6c, 0x8a, 0x70,
0x6e, 0x41, 0x11, 0xa7, 0xc5, 0xc5, 0x95, 0x29, 0xa7, 0x9b, 0xd4, 0xca, 0x88, 0x5e, 0x13, 0x64,
0xf4, 0x19, 0xdc, 0x93, 0x0a, 0x84, 0x20, 0x0d, 0xdc, 0x0c, 0xec, 0xcd, 0x80, 0x0c, 0x88, 0x0c,
0xf5, 0xbc, 0x73, 0x27, 0x91, 0xa9, 0x07, 0xa3, 0xaa, 0xf5, 0xb9, 0x10, 0xb0, 0x9e, 0xc0, 0x8d,
0x23, 0xe6, 0x63, 0x9a, 0xd6, 0xe0, 0x35, 0x58, 0x50, 0x16, 0xf5, 0x15, 0x91, 0x0b, 0xb4, 0x0e,
0xf9, 0x8e, 0x14, 0x4b, 0x1a, 0xab, 0x5a, 0x59, 0x9f, 0xc2, 0x72, 0x02, 0xd7, 0xe1, 0xde, 0x82,
0xa2, 0xc8, 0x2f, 0xcc, 0x07, 0x11, 0x71, 0x35, 0x46, 0xa9, 0x5a, 0x49, 0xe9, 0x0a, 0x62, 0xfd,
0x31, 0x07, 0x37, 0x64, 0xb4, 0x5a, 0x11, 0x19, 0x35, 0xba, 0xa7, 0x30, 0xcf, 0x23, 0x9d, 0x8f,
0x4b, 0x95, 0xca, 0xb4, 0xd3, 0x9a, 0x00, 0xda, 0x62, 0xd1, 0x60, 0x1d, 0xe2, 0x48, 0x7c, 0xe9,
0xcf, 0x06, 0x2c, 0x26, 0x24, 0xf4, 0x19, 0x2c, 0xc8, 0x63, 0x93, 0xae, 0x2c, 0x55, 0xac, 0x91,
0x56, 0xc2, 0x7b, 0x76, 0x32, 0x4e, 0xd9, 0xfb, 0xd2, 0x84, 0x9a, 0x79, 0x14, 0x60, 0x6c, 0x4e,
0xc9, 0x8d, 0xcd, 0x29, 0x68, 0x1b, 0x50, 0x88, 0x23, 0x4e, 0x3d, 0x1a, 0xca, 0xa6, 0x33, 0x64,
0x9c, 0x24, 0xcd, 0xf4, 0x46, 0x96, 0xf3, 0x52, 0x30, 0xc4, 0x4d, 0xd1, 0xbd, 0x5a, 0xca, 0xa9,
0x53, 0x05, 0xd5, 0xa6, 0x05, 0xc5, 0x3a, 0x86, 0x55, 0xe1, 0xb4, 0x74, 0x41, 0x24, 0x43, 0x72,
0x2c, 0x77, 0xe1, 0x9a, 0xc8, 0x1b, 0xf7, 0x75, 0xc4, 0x7c, 0x1d, 0xcf, 0x45, 0x41, 0x78, 0x1a,
0x31, 0x5f, 0xcc, 0x3d, 0x92, 0xc9, 0x99, 0xce, 0xc7, 0xbc, 0x58, 0xb6, 0xd8, 0xd6, 0x67, 0x70,
0x3d, 0xcd, 0x6a, 0x87, 0xf5, 0x09, 0x5a, 0x82, 0x0f, 0x5f, 0x34, 0x9e, 0x37, 0x4e, 0x5e, 0x35,
0x8a, 0x1f, 0xa0, 0x02, 0x2c, 0x56, 0x5b, 0xad, 0x5a, 0xb3, 0x55, 0x73, 0x8a, 0x86, 0x58, 0x9d,
0x3a, 0x27, 0xa7, 0x27, 0xcd, 0x9a, 0x53, 0xcc, 0x6d, 0xfd, 0xc1, 0x80, 0x95, 0xb1, 0x0b, 0x81,
0x10, 0x2c, 0x6b, 0xb0, 0xdb, 0x6c, 0x55, 0x5b, 0x2f, 0x9a, 0xc5, 0x0f, 0x04, 0xed, 0xb4, 0xd6,
0x38, 0xac, 0x37, 0x8e, 0xdc, 0xea, 0x41, 0xab, 0xfe, 0xb2, 0x56, 0x34, 0x10, 0x40, 0x5e, 0x7f,
0xe7, 0x04, 0xbf, 0xde, 0xa8, 0xb7, 0xea, 0xd5, 0x56, 0xed, 0xd0, 0xad, 0x7d, 0x55, 0x6f, 0x15,
0xe7, 0x50, 0x11, 0x0a, 0xaf, 0xea, 0xad, 0x67, 0x87, 0x4e, 0xf5, 0x55, 0x75, 0xff, 0xb8, 0x56,
0x9c, 0x17, 0x08, 0xc1, 0xab, 0x1d, 0x16, 0x17, 0x04, 0x42, 0x7d, 0xbb, 0xcd, 0xe3, 0x6a, 0xf3,
0x59, 0xed, 0xb0, 0x98, 0xaf, 0xfc, 0x63, 0x0e, 0xae, 0xab, 0xb3, 0x69, 0xaa, 0x79, 0x1b, 0xfd,
0x12, 0x6e, 0xbc, 0xc2, 0x94, 0x3f, 0x65, 0xd1, 0xa8, 0xeb, 0xa0, 0x35, 0x5b, 0x0d, 0xbf, 0x76,
0x32, 0x66, 0xdb, 0x35, 0x31, 0x66, 0x97, 0xb6, 0xa6, 0x25, 0xd1, 0x64, 0xc7, 0xda, 0x31, 0xd0,
0x73, 0xb8, 0x7e, 0x80, 0x03, 0x16, 0x50, 0x0f, 0xf7, 0x9f, 0x11, 0xdc, 0x99, 0xaa, 0x76, 0x86,
0x2c, 0x42, 0xdf, 0x19, 0x70, 0x2d, 0x4d, 0xd5, 0xa9, 0x9a, 0x36, 0x67, 0xce, 0x72, 0xeb, 0xe4,
0xdb, 0xea, 0x0e, 0xb2, 0x9f, 0x12, 0xee, 0xf5, 0x48, 0x6c, 0xca, 0x44, 0x34, 0x45, 0xbe, 0x9b,
0x31, 0x0d, 0x3c, 0x62, 0xf6, 0x71, 0xcc, 0xcd, 0xd7, 0x34, 0xc0, 0x7d, 0xfa, 0x1b, 0xd2, 0x51,
0x7c, 0xfb, 0xf7, 0xff, 0xfa, 0xfe, 0x4f, 0xb9, 0x35, 0xb4, 0x2a, 0x1e, 0x2c, 0xfa, 0xf9, 0x22,
0x19, 0x02, 0x87, 0xde, 0x40, 0x31, 0xb5, 0xb2, 0x7f, 0x26, 0x72, 0x2e, 0x46, 0x9f, 0x4c, 0xf3,
0xe7, 0xa2, 0xdc, 0xbc, 0x82, 0xf7, 0x95, 0xff, 0x18, 0xb0, 0xa2, 0xe6, 0x6b, 0x12, 0x25, 0x47,
0xd9, 0x03, 0xa4, 0x35, 0x65, 0x26, 0x7e, 0x34, 0xf5, 0xcc, 0x26, 0x9f, 0x05, 0xa5, 0x8f, 0xa7,
0x1c, 0x44, 0x46, 0xf4, 0x10, 0x73, 0x8c, 0x5c, 0xb8, 0xd1, 0x1c, 0xb4, 0x7d, 0x7a, 0xce, 0x90,
0x75, 0x39, 0x38, 0x6b, 0xe0, 0x22, 0x67, 0xd2, 0xed, 0xfd, 0xd3, 0x48, 0x1f, 0x3a, 0xe9, 0xf6,
0xbe, 0x82, 0x82, 0xf6, 0x53, 0x65, 0xc4, 0xc3, 0xf7, 0x46, 0x2b, 0xd9, 0xd2, 0x2c, 0xb9, 0xf5,
0x35, 0x14, 0xb4, 0x31, 0xb5, 0x9e, 0x01, 0x53, 0x9a, 0xda, 0xfd, 0xc6, 0xde, 0x67, 0x95, 0xbf,
0xe5, 0xa1, 0x38, 0x2a, 0x00, 0x7a, 0x2f, 0x5f, 0x03, 0xa8, 0xda, 0x2d, 0xc3, 0xf9, 0xd1, 0x34,
0x5d, 0xe7, 0x3a, 0xca, 0xf4, 0xe0, 0x8d, 0x75, 0x8e, 0xdf, 0xa6, 0x57, 0x7a, 0xd4, 0xa4, 0x50,
0xe5, 0x4a, 0x73, 0xb8, 0x32, 0xf8, 0xe8, 0x07, 0xcc, 0xee, 0x3b, 0x06, 0x62, 0xb0, 0x7c, 0x7e,
0x6c, 0x44, 0xdb, 0x97, 0x2a, 0xca, 0x8e, 0xa5, 0x25, 0x7b, 0x56, 0x71, 0xbd, 0xe1, 0x3e, 0xdc,
0x3c, 0x48, 0xa6, 0xad, 0xcc, 0x54, 0xb6, 0x39, 0xcb, 0x08, 0xa8, 0x2c, 0x6e, 0xcd, 0x3e, 0x2d,
0xa2, 0xb7, 0x93, 0x05, 0xfd, 0x8a, 0xfb, 0xbb, 0xea, 0xa3, 0x04, 0xfd, 0xce, 0x80, 0xd5, 0x8b,
0x1e, 0xb5, 0xe8, 0xf2, 0x13, 0x9a, 0x7c, 0x55, 0x97, 0x3e, 0xbd, 0x1a, 0x48, 0xfb, 0x30, 0x80,
0xe2, 0xf8, 0xa3, 0x06, 0x4d, 0xdd, 0xc8, 0x94, 0xa7, 0x53, 0x69, 0x67, 0x76, 0x80, 0x32, 0xbb,
0xff, 0xf7, 0xb9, 0x6f, 0xab, 0x7f, 0x9d, 0x43, 0xff, 0x36, 0x60, 0xe1, 0x34, 0x3a, 0x8b, 0x7d,
0xf4, 0xf0, 0x17, 0xcd, 0x93, 0x86, 0xe9, 0x9c, 0x1e, 0x98, 0xc9, 0x5f, 0x46, 0x66, 0x18, 0xb1,
0x21, 0xed, 0x88, 0x2a, 0x7d, 0x66, 0x4a, 0x21, 0xdb, 0x3a, 0x80, 0x65, 0xf9, 0x85, 0x39, 0xf5,
0xcc, 0x63, 0xdc, 0x8e, 0xd1, 0x9d, 0x1e, 0xe7, 0x61, 0xbc, 0x57, 0x2e, 0x87, 0x09, 0xbd, 0x8f,
0xdb, 0xb1, 0xed, 0x31, 0xbf, 0xb4, 0xc6, 0x09, 0xf6, 0x7f, 0x3e, 0x41, 0xdf, 0xfa, 0x15, 0x3c,
0x38, 0x6a, 0xbc, 0x30, 0x8f, 0x48, 0x40, 0x22, 0xdc, 0x37, 0xd5, 0x3b, 0xd7, 0x3c, 0xa6, 0x1e,
0x09, 0x62, 0x62, 0x0e, 0x1f, 0xd9, 0x3b, 0xe8, 0x49, 0xa2, 0xb5, 0x4b, 0x79, 0x6f, 0xd0, 0x16,
0xb0, 0xf3, 0x06, 0xd4, 0x4a, 0xb4, 0x89, 0x76, 0xd9, 0xc7, 0xa2, 0x5c, 0x97, 0x8f, 0xeb, 0x07,
0xb5, 0x46, 0xb3, 0x66, 0xfb, 0x9d, 0xca, 0xc2, 0x8e, 0xbd, 0x63, 0xef, 0x94, 0x56, 0x70, 0x48,
0xed, 0x30, 0x3a, 0x93, 0x96, 0x03, 0xc2, 0xb7, 0x8c, 0x5c, 0xa5, 0x88, 0xc3, 0xb0, 0x4f, 0x3d,
0x79, 0xb9, 0xca, 0xbf, 0x8e, 0x59, 0x50, 0xb9, 0x93, 0xa5, 0x74, 0xa3, 0xd0, 0xdb, 0xfe, 0x86,
0xb4, 0xb7, 0x39, 0x79, 0xc7, 0xa7, 0xb0, 0xde, 0x83, 0x12, 0xac, 0xbd, 0x09, 0x13, 0x7b, 0xd3,
0x4d, 0x44, 0x8f, 0x45, 0x91, 0x3c, 0x8b, 0x7d, 0xf3, 0x48, 0xee, 0x14, 0x7d, 0x3c, 0xdb, 0xce,
0xdb, 0x79, 0xd9, 0xa2, 0x1f, 0xfd, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xed, 0xc9, 0x96, 0xa4, 0xf6,
0x13, 0x00, 0x00,
0x29, 0x07, 0xab, 0x32, 0x5a, 0xad, 0x88, 0x8c, 0x1a, 0xdd, 0x53, 0x98, 0xe7, 0x91, 0xce, 0xc7,
0xa5, 0x4a, 0x65, 0xda, 0x69, 0x4d, 0x00, 0x6d, 0xb1, 0x68, 0xb0, 0x0e, 0x71, 0x24, 0xbe, 0xf4,
0x17, 0x03, 0x16, 0x13, 0x12, 0xfa, 0x04, 0x16, 0xe4, 0xb1, 0x49, 0x57, 0x96, 0x2a, 0xd6, 0x48,
0x2b, 0xe1, 0x3d, 0x3b, 0x19, 0xa7, 0xec, 0x03, 0x69, 0x42, 0xcd, 0x3c, 0x0a, 0x30, 0x36, 0xa7,
0xe4, 0xc6, 0xe6, 0x14, 0xb4, 0x03, 0x28, 0xc4, 0x11, 0xa7, 0x1e, 0x0d, 0x65, 0xd3, 0x19, 0x32,
0x4e, 0x92, 0x66, 0xba, 0x9a, 0xe5, 0xbc, 0x14, 0x0c, 0x71, 0x53, 0x74, 0xaf, 0x96, 0x72, 0xea,
0x54, 0x41, 0xb5, 0x69, 0x41, 0xb1, 0x4e, 0x60, 0x4d, 0x38, 0x2d, 0x5d, 0x10, 0xc9, 0x90, 0x1c,
0xcb, 0x5d, 0xb8, 0x2e, 0xf2, 0xc6, 0x7d, 0x1d, 0x31, 0x5f, 0xc7, 0x73, 0x51, 0x10, 0x9e, 0x46,
0xcc, 0x17, 0x73, 0x8f, 0x64, 0x72, 0xa6, 0xf3, 0x31, 0x2f, 0x96, 0x2d, 0xb6, 0xfd, 0x09, 0xdc,
0x48, 0xb3, 0xda, 0x61, 0x7d, 0x82, 0x96, 0xe0, 0xda, 0x8b, 0xc6, 0xf3, 0xc6, 0xe9, 0xab, 0x46,
0xf1, 0x03, 0x54, 0x80, 0xc5, 0x6a, 0xab, 0x55, 0x6b, 0xb6, 0x6a, 0x4e, 0xd1, 0x10, 0xab, 0x33,
0xe7, 0xf4, 0xec, 0xb4, 0x59, 0x73, 0x8a, 0xb9, 0xed, 0x3f, 0x1a, 0xb0, 0x32, 0x76, 0x21, 0x10,
0x82, 0x65, 0x0d, 0x76, 0x9b, 0xad, 0x6a, 0xeb, 0x45, 0xb3, 0xf8, 0x81, 0xa0, 0x9d, 0xd5, 0x1a,
0x47, 0xf5, 0xc6, 0xb1, 0x5b, 0x3d, 0x6c, 0xd5, 0x5f, 0xd6, 0x8a, 0x06, 0x02, 0xc8, 0xeb, 0xef,
0x9c, 0xe0, 0xd7, 0x1b, 0xf5, 0x56, 0xbd, 0xda, 0xaa, 0x1d, 0xb9, 0xb5, 0x2f, 0xea, 0xad, 0xe2,
0x1c, 0x2a, 0x42, 0xe1, 0x55, 0xbd, 0xf5, 0xec, 0xc8, 0xa9, 0xbe, 0xaa, 0x1e, 0x9c, 0xd4, 0x8a,
0xf3, 0x02, 0x21, 0x78, 0xb5, 0xa3, 0xe2, 0x82, 0x40, 0xa8, 0x6f, 0xb7, 0x79, 0x52, 0x6d, 0x3e,
0xab, 0x1d, 0x15, 0xf3, 0x95, 0x7f, 0xe7, 0xe0, 0x86, 0x3a, 0x9b, 0xa6, 0x9a, 0xb7, 0xd1, 0xaf,
0x60, 0xf5, 0x15, 0xa6, 0xfc, 0x29, 0x8b, 0x46, 0x5d, 0x07, 0xad, 0xdb, 0x6a, 0xf8, 0xb5, 0x93,
0x31, 0xdb, 0xae, 0x89, 0x31, 0xbb, 0xb4, 0x3d, 0x2d, 0x89, 0x26, 0x3b, 0xd6, 0xae, 0x81, 0x9e,
0xc3, 0x8d, 0x43, 0x1c, 0xb0, 0x80, 0x7a, 0xb8, 0xff, 0x8c, 0xe0, 0xce, 0x54, 0xb5, 0x33, 0x64,
0x11, 0xfa, 0xd6, 0x80, 0xeb, 0x69, 0xaa, 0x4e, 0xd5, 0xb4, 0x35, 0x73, 0x96, 0x5b, 0xa7, 0xdf,
0x54, 0x77, 0x91, 0xfd, 0x94, 0x70, 0xaf, 0x47, 0x62, 0x53, 0x26, 0xa2, 0x29, 0xf2, 0xdd, 0x8c,
0x69, 0xe0, 0x11, 0xb3, 0x8f, 0x63, 0x6e, 0xbe, 0xa6, 0x01, 0xee, 0xd3, 0xdf, 0x92, 0x8e, 0xe2,
0xdb, 0x7f, 0xf8, 0xd7, 0x77, 0x7f, 0xce, 0xad, 0xa3, 0x35, 0xf1, 0x60, 0xd1, 0xcf, 0x17, 0xc9,
0x10, 0xb8, 0xca, 0x7f, 0x0d, 0x58, 0x51, 0x23, 0x2f, 0x89, 0x92, 0xe8, 0xf6, 0x00, 0xe9, 0xc4,
0xcb, 0x0c, 0xe1, 0x68, 0x6a, 0x18, 0x27, 0x27, 0xf5, 0xd2, 0x47, 0x53, 0x62, 0x93, 0x11, 0x3d,
0xc2, 0x1c, 0x23, 0x17, 0x56, 0x9b, 0x83, 0xb6, 0x4f, 0x2f, 0x18, 0xb2, 0xae, 0x06, 0x67, 0x0d,
0x5c, 0xe6, 0x4c, 0x12, 0xaf, 0xca, 0x3f, 0x8d, 0xf4, 0xed, 0x91, 0x6e, 0xef, 0x0b, 0x28, 0x68,
0x3f, 0xd5, 0x21, 0x3d, 0x7c, 0x67, 0xf8, 0x93, 0x2d, 0xcd, 0x72, 0xdc, 0x5f, 0x42, 0x41, 0x1b,
0x53, 0xeb, 0x19, 0x30, 0xa5, 0xa9, 0x0d, 0x69, 0xec, 0xc9, 0x54, 0xf9, 0x7b, 0x1e, 0x8a, 0xa3,
0x3b, 0xa9, 0xf7, 0xf2, 0x25, 0x80, 0x2a, 0xa7, 0x32, 0x9c, 0x1f, 0x4e, 0xd3, 0x75, 0xa1, 0xc8,
0x4f, 0x0f, 0xde, 0x58, 0x31, 0xff, 0x5d, 0x7a, 0xcb, 0x46, 0x7d, 0x03, 0x55, 0xde, 0x6b, 0x34,
0x56, 0x06, 0x1f, 0xfd, 0x80, 0x71, 0x7a, 0xd7, 0x40, 0x0c, 0x96, 0x2f, 0x4e, 0x72, 0x68, 0xe7,
0x4a, 0x45, 0xd9, 0x49, 0xb1, 0x64, 0xcf, 0x2a, 0xae, 0x37, 0xdc, 0x87, 0x9b, 0x87, 0xc9, 0x00,
0x94, 0x19, 0x94, 0xb6, 0x66, 0x99, 0xca, 0x94, 0xc5, 0xed, 0xd9, 0x07, 0x38, 0xf4, 0x66, 0xb2,
0xc6, 0xbe, 0xe7, 0xfe, 0xde, 0xf7, 0x9d, 0x80, 0x7e, 0x6f, 0xc0, 0xda, 0x65, 0xef, 0x4c, 0x74,
0xf5, 0x09, 0x4d, 0x3e, 0x74, 0x4b, 0x1f, 0xbf, 0x1f, 0x48, 0xfb, 0x30, 0x80, 0xe2, 0xf8, 0x3b,
0x03, 0x4d, 0xdd, 0xc8, 0x94, 0xd7, 0x4c, 0x69, 0x77, 0x76, 0x80, 0x32, 0x7b, 0xf0, 0x8f, 0xb9,
0x6f, 0xaa, 0x7f, 0x9b, 0x43, 0xff, 0x31, 0x60, 0xe1, 0x2c, 0x3a, 0x8f, 0x7d, 0xf4, 0xf0, 0x97,
0xcd, 0xd3, 0x86, 0xe9, 0x9c, 0x1d, 0x9a, 0xc9, 0xbf, 0x38, 0x66, 0x18, 0xb1, 0x21, 0xed, 0x88,
0xc2, 0x79, 0x6e, 0x4a, 0x21, 0xdb, 0x3a, 0x84, 0x65, 0xf9, 0x85, 0x39, 0xf5, 0xcc, 0x13, 0xdc,
0x8e, 0xd1, 0x9d, 0x1e, 0xe7, 0x61, 0xbc, 0x5f, 0x2e, 0x87, 0x09, 0xbd, 0x8f, 0xdb, 0xb1, 0xed,
0x31, 0xbf, 0xb4, 0xce, 0x09, 0xf6, 0x7f, 0x31, 0x41, 0xdf, 0xfe, 0x35, 0x3c, 0x38, 0x6e, 0xbc,
0x30, 0x8f, 0x49, 0x40, 0x22, 0xdc, 0x37, 0xd5, 0xd3, 0xd3, 0x3c, 0xa1, 0x1e, 0x09, 0x62, 0x62,
0x0e, 0x1f, 0xd9, 0xbb, 0xe8, 0x49, 0xa2, 0xb5, 0x4b, 0x79, 0x6f, 0xd0, 0x16, 0xb0, 0x8b, 0x06,
0xd4, 0x4a, 0x54, 0xee, 0x76, 0xd9, 0xc7, 0xa2, 0x5c, 0x97, 0x4f, 0xea, 0x87, 0xb5, 0x46, 0xb3,
0x66, 0xfb, 0x9d, 0xca, 0xc2, 0xae, 0xbd, 0x6b, 0xef, 0x96, 0x56, 0x70, 0x48, 0xed, 0x30, 0x3a,
0x97, 0x96, 0x03, 0xc2, 0xb7, 0x8d, 0x5c, 0xa5, 0x88, 0xc3, 0xb0, 0x4f, 0x3d, 0x79, 0xb9, 0xca,
0xbf, 0x89, 0x59, 0x50, 0xb9, 0x93, 0xa5, 0x74, 0xa3, 0xd0, 0xdb, 0xf9, 0x9a, 0xb4, 0x77, 0x38,
0x79, 0xcb, 0xa7, 0xb0, 0xde, 0x81, 0x12, 0xac, 0xfd, 0x09, 0x13, 0xfb, 0xd3, 0x4d, 0x44, 0x8f,
0x45, 0x91, 0x3c, 0x8f, 0x7d, 0xf3, 0x58, 0xee, 0x14, 0x7d, 0x34, 0xdb, 0xce, 0xdb, 0x79, 0xd9,
0x35, 0x1f, 0x7d, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xca, 0x93, 0x32, 0x45, 0x89, 0x13, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1368,7 +1365,6 @@ type BeaconServiceClient interface {
WaitForChainStart(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (BeaconService_WaitForChainStartClient, error)
CanonicalHead(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*v1alpha1.BeaconBlock, error)
BlockTree(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*BlockTreeResponse, error)
BlockTreeBySlots(ctx context.Context, in *TreeBlockSlotRequest, opts ...grpc.CallOption) (*BlockTreeResponse, error)
}
type beaconServiceClient struct {
@@ -1429,21 +1425,11 @@ func (c *beaconServiceClient) BlockTree(ctx context.Context, in *empty.Empty, op
return out, nil
}
func (c *beaconServiceClient) BlockTreeBySlots(ctx context.Context, in *TreeBlockSlotRequest, opts ...grpc.CallOption) (*BlockTreeResponse, error) {
out := new(BlockTreeResponse)
err := c.cc.Invoke(ctx, "/ethereum.beacon.rpc.v1.BeaconService/BlockTreeBySlots", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// BeaconServiceServer is the server API for BeaconService service.
type BeaconServiceServer interface {
WaitForChainStart(*empty.Empty, BeaconService_WaitForChainStartServer) error
CanonicalHead(context.Context, *empty.Empty) (*v1alpha1.BeaconBlock, error)
BlockTree(context.Context, *empty.Empty) (*BlockTreeResponse, error)
BlockTreeBySlots(context.Context, *TreeBlockSlotRequest) (*BlockTreeResponse, error)
}
func RegisterBeaconServiceServer(s *grpc.Server, srv BeaconServiceServer) {
@@ -1507,24 +1493,6 @@ func _BeaconService_BlockTree_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _BeaconService_BlockTreeBySlots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TreeBlockSlotRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(BeaconServiceServer).BlockTreeBySlots(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethereum.beacon.rpc.v1.BeaconService/BlockTreeBySlots",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(BeaconServiceServer).BlockTreeBySlots(ctx, req.(*TreeBlockSlotRequest))
}
return interceptor(ctx, in, info, handler)
}
var _BeaconService_serviceDesc = grpc.ServiceDesc{
ServiceName: "ethereum.beacon.rpc.v1.BeaconService",
HandlerType: (*BeaconServiceServer)(nil),
@@ -1537,10 +1505,6 @@ var _BeaconService_serviceDesc = grpc.ServiceDesc{
MethodName: "BlockTree",
Handler: _BeaconService_BlockTree_Handler,
},
{
MethodName: "BlockTreeBySlots",
Handler: _BeaconService_BlockTreeBySlots_Handler,
},
},
Streams: []grpc.StreamDesc{
{

View File

@@ -5,12 +5,11 @@ package eth
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -5,11 +5,10 @@ package eth
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -7,14 +7,13 @@ import (
context "context"
encoding_binary "encoding/binary"
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -6,13 +6,12 @@ package eth
import (
context "context"
fmt "fmt"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -6,11 +6,10 @@ package eth
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
grpc "google.golang.org/grpc"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -6,14 +6,13 @@ package eth
import (
context "context"
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -5,10 +5,9 @@ package ethereum_sharding_p2p_v1
import (
fmt "fmt"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -27,7 +27,6 @@ var (
func main() {
flag.Parse()
// TODO(#3398): Cannot generate more than 190 keys due to BLS errors.
if *numValidators == 0 {
log.Fatal("Expected --num-validators to have been provided, received 0")
}