From 55b03ff405020b2cecd0c65350ac487b5c11a2f0 Mon Sep 17 00:00:00 2001 From: colin <102356659+colinlyguo@users.noreply.github.com> Date: Thu, 4 Apr 2024 18:52:23 +0800 Subject: [PATCH] feat(rollup-verifier): support codecv1 (#678) --- params/version.go | 2 +- rollup/rollup_sync_service/batch_header.go | 123 ----- rollup/rollup_sync_service/block.go | 167 ------ rollup/rollup_sync_service/chunk.go | 155 ------ rollup/rollup_sync_service/l1client.go | 6 +- rollup/rollup_sync_service/l1client_test.go | 4 +- .../rollup_sync_service.go | 112 +++- .../rollup_sync_service_test.go | 298 ++++++++-- ...t_batch_tx.rlp => commitBatch_codecv0.rlp} | Bin .../testdata/commitBatch_codecv1.rlp | Bin 0 -> 1237 bytes .../testdata/commitBatch_input_codecv0.json | 27 + .../testdata/commitBatch_input_codecv1.json | 31 ++ .../testdata/commit_batch_transaction.json | 3 - rollup/types/encoding/bitmap.go | 64 +++ rollup/types/encoding/codecv0/codecv0.go | 480 ++++++++++++++++ rollup/types/encoding/codecv1/codecv1.go | 522 ++++++++++++++++++ rollup/types/encoding/da.go | 259 +++++++++ 17 files changed, 1732 insertions(+), 521 deletions(-) delete mode 100644 rollup/rollup_sync_service/batch_header.go delete mode 100644 rollup/rollup_sync_service/block.go delete mode 100644 rollup/rollup_sync_service/chunk.go rename rollup/rollup_sync_service/testdata/{commit_batch_tx.rlp => commitBatch_codecv0.rlp} (100%) create mode 100644 rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp create mode 100644 rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json create mode 100644 rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json delete mode 100644 rollup/rollup_sync_service/testdata/commit_batch_transaction.json create mode 100644 rollup/types/encoding/bitmap.go create mode 100644 rollup/types/encoding/codecv0/codecv0.go create mode 100644 rollup/types/encoding/codecv1/codecv1.go create mode 100644 rollup/types/encoding/da.go diff --git a/params/version.go b/params/version.go index 16d0ed43db..5b0b627548 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 5 // Major version component of the current release VersionMinor = 1 // Minor version component of the current release - VersionPatch = 30 // Patch version component of the current release + VersionPatch = 31 // Patch version component of the current release VersionMeta = "mainnet" // Version metadata to append to the version string ) diff --git a/rollup/rollup_sync_service/batch_header.go b/rollup/rollup_sync_service/batch_header.go deleted file mode 100644 index 2930d859af..0000000000 --- a/rollup/rollup_sync_service/batch_header.go +++ /dev/null @@ -1,123 +0,0 @@ -package rollup_sync_service - -import ( - "encoding/binary" - "fmt" - "math/big" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" -) - -const batchHeaderVersion = 0 - -// BatchHeader contains batch header info to be committed. -type BatchHeader struct { - // Encoded in BatchHeaderV0Codec - version uint8 - batchIndex uint64 - l1MessagePopped uint64 - totalL1MessagePopped uint64 - dataHash common.Hash - parentBatchHash common.Hash - skippedL1MessageBitmap []byte -} - -// NewBatchHeader creates a new BatchHeader -func NewBatchHeader(version uint8, batchIndex, totalL1MessagePoppedBefore uint64, parentBatchHash common.Hash, chunks []*Chunk) (*BatchHeader, error) { - // buffer for storing chunk hashes in order to compute the batch data hash - var dataBytes []byte - - // skipped L1 message bitmap, an array of 256-bit bitmaps - var skippedBitmap []*big.Int - - // the first queue index that belongs to this batch - baseIndex := totalL1MessagePoppedBefore - - // the next queue index that we need to process - nextIndex := totalL1MessagePoppedBefore - - for chunkID, chunk := range chunks { - // build data hash - totalL1MessagePoppedBeforeChunk := nextIndex - chunkHash, err := chunk.Hash(totalL1MessagePoppedBeforeChunk) - if err != nil { - return nil, err - } - dataBytes = append(dataBytes, chunkHash.Bytes()...) - - // build skip bitmap - for blockID, block := range chunk.Blocks { - for _, tx := range block.Transactions { - if tx.Type != types.L1MessageTxType { - continue - } - currentIndex := tx.Nonce - - if currentIndex < nextIndex { - return nil, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. Batch index: %d, chunk index in batch: %d, block index in chunk: %d, block hash: %v, transaction hash: %v", nextIndex, currentIndex, batchIndex, chunkID, blockID, block.Header.Hash(), tx.TxHash) - } - - // mark skipped messages - for skippedIndex := nextIndex; skippedIndex < currentIndex; skippedIndex++ { - quo := int((skippedIndex - baseIndex) / 256) - rem := int((skippedIndex - baseIndex) % 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) - } - skippedBitmap[quo].SetBit(skippedBitmap[quo], rem, 1) - } - - // process included message - quo := int((currentIndex - baseIndex) / 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) - } - - nextIndex = currentIndex + 1 - } - } - } - - // compute data hash - dataHash := crypto.Keccak256Hash(dataBytes) - - // compute skipped bitmap - bitmapBytes := make([]byte, len(skippedBitmap)*32) - for ii, num := range skippedBitmap { - bytes := num.Bytes() - padding := 32 - len(bytes) - copy(bitmapBytes[32*ii+padding:], bytes) - } - - return &BatchHeader{ - version: version, - batchIndex: batchIndex, - l1MessagePopped: nextIndex - totalL1MessagePoppedBefore, - totalL1MessagePopped: nextIndex, - dataHash: dataHash, - parentBatchHash: parentBatchHash, - skippedL1MessageBitmap: bitmapBytes, - }, nil -} - -// Encode encodes the BatchHeader into RollupV2 BatchHeaderV0Codec Encoding. -func (b *BatchHeader) Encode() []byte { - batchBytes := make([]byte, 89+len(b.skippedL1MessageBitmap)) - batchBytes[0] = b.version - binary.BigEndian.PutUint64(batchBytes[1:], b.batchIndex) - binary.BigEndian.PutUint64(batchBytes[9:], b.l1MessagePopped) - binary.BigEndian.PutUint64(batchBytes[17:], b.totalL1MessagePopped) - copy(batchBytes[25:], b.dataHash[:]) - copy(batchBytes[57:], b.parentBatchHash[:]) - copy(batchBytes[89:], b.skippedL1MessageBitmap[:]) - return batchBytes -} - -// Hash calculates the hash of the batch header. -func (b *BatchHeader) Hash() common.Hash { - return crypto.Keccak256Hash(b.Encode()) -} diff --git a/rollup/rollup_sync_service/block.go b/rollup/rollup_sync_service/block.go deleted file mode 100644 index e86fb020b4..0000000000 --- a/rollup/rollup_sync_service/block.go +++ /dev/null @@ -1,167 +0,0 @@ -package rollup_sync_service - -import ( - "encoding/binary" - "errors" - "fmt" - "math" - "math/big" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/common/hexutil" - "github.com/scroll-tech/go-ethereum/core/types" -) - -const blockContextByteSize = 60 - -// WrappedBlock contains the block's Header, Transactions and WithdrawTrieRoot hash. -type WrappedBlock struct { - Header *types.Header `json:"header"` - // Transactions is only used for recover types.Transactions, the from of types.TransactionData field is missing. - Transactions []*types.TransactionData `json:"transactions"` - WithdrawRoot common.Hash `json:"withdraw_trie_root,omitempty"` -} - -// BlockContext represents the essential data of a block in the ScrollChain. -// It provides an overview of block attributes including hash values, block numbers, gas details, and transaction counts. -type BlockContext struct { - BlockHash common.Hash - ParentHash common.Hash - BlockNumber uint64 - Timestamp uint64 - BaseFee *big.Int - GasLimit uint64 - NumTransactions uint16 - NumL1Messages uint16 -} - -// numL1Messages returns the number of L1 messages in this block. -// This number is the sum of included and skipped L1 messages. -func (w *WrappedBlock) numL1Messages(totalL1MessagePoppedBefore uint64) uint64 { - var lastQueueIndex *uint64 - for _, txData := range w.Transactions { - if txData.Type == types.L1MessageTxType { - lastQueueIndex = &txData.Nonce - } - } - if lastQueueIndex == nil { - return 0 - } - // note: last queue index included before this block is totalL1MessagePoppedBefore - 1 - // TODO: cache results - return *lastQueueIndex - totalL1MessagePoppedBefore + 1 -} - -// Encode encodes the WrappedBlock into RollupV2 BlockContext Encoding. -func (w *WrappedBlock) Encode(totalL1MessagePoppedBefore uint64) ([]byte, error) { - bytes := make([]byte, 60) - - if !w.Header.Number.IsUint64() { - return nil, errors.New("block number is not uint64") - } - - // note: numL1Messages includes skipped messages - numL1Messages := w.numL1Messages(totalL1MessagePoppedBefore) - if numL1Messages > math.MaxUint16 { - return nil, errors.New("number of L1 messages exceeds max uint16") - } - - // note: numTransactions includes skipped messages - numL2Transactions := w.numL2Transactions() - numTransactions := numL1Messages + numL2Transactions - if numTransactions > math.MaxUint16 { - return nil, errors.New("number of transactions exceeds max uint16") - } - - binary.BigEndian.PutUint64(bytes[0:], w.Header.Number.Uint64()) - binary.BigEndian.PutUint64(bytes[8:], w.Header.Time) - // TODO: [16:47] Currently, baseFee is 0, because we disable EIP-1559. - binary.BigEndian.PutUint64(bytes[48:], w.Header.GasLimit) - binary.BigEndian.PutUint16(bytes[56:], uint16(numTransactions)) - binary.BigEndian.PutUint16(bytes[58:], uint16(numL1Messages)) - - return bytes, nil -} - -func txsToTxsData(txs types.Transactions) []*types.TransactionData { - txsData := make([]*types.TransactionData, len(txs)) - for i, tx := range txs { - v, r, s := tx.RawSignatureValues() - - nonce := tx.Nonce() - - // We need QueueIndex in `NewBatchHeader`. However, `TransactionData` - // does not have this field. Since `L1MessageTx` do not have a nonce, - // we reuse this field for storing the queue index. - if msg := tx.AsL1MessageTx(); msg != nil { - nonce = msg.QueueIndex - } - - txsData[i] = &types.TransactionData{ - Type: tx.Type(), - TxHash: tx.Hash().String(), - Nonce: nonce, - ChainId: (*hexutil.Big)(tx.ChainId()), - Gas: tx.Gas(), - GasPrice: (*hexutil.Big)(tx.GasPrice()), - To: tx.To(), - Value: (*hexutil.Big)(tx.Value()), - Data: hexutil.Encode(tx.Data()), - IsCreate: tx.To() == nil, - V: (*hexutil.Big)(v), - R: (*hexutil.Big)(r), - S: (*hexutil.Big)(s), - } - } - return txsData -} - -func convertTxDataToRLPEncoding(txData *types.TransactionData) ([]byte, error) { - data, err := hexutil.Decode(txData.Data) - if err != nil { - return nil, fmt.Errorf("failed to decode txData.Data: %s, err: %w", txData.Data, err) - } - - tx := types.NewTx(&types.LegacyTx{ - Nonce: txData.Nonce, - To: txData.To, - Value: txData.Value.ToInt(), - Gas: txData.Gas, - GasPrice: txData.GasPrice.ToInt(), - Data: data, - V: txData.V.ToInt(), - R: txData.R.ToInt(), - S: txData.S.ToInt(), - }) - - rlpTxData, err := tx.MarshalBinary() - if err != nil { - return nil, fmt.Errorf("failed to marshal binary of the tx: %+v, err: %w", tx, err) - } - - return rlpTxData, nil -} - -func (w *WrappedBlock) numL2Transactions() uint64 { - var count uint64 - for _, txData := range w.Transactions { - if txData.Type != types.L1MessageTxType { - count++ - } - } - return count -} - -func decodeBlockContext(encodedBlockContext []byte) (*BlockContext, error) { - if len(encodedBlockContext) != blockContextByteSize { - return nil, errors.New("block encoding is not 60 bytes long") - } - - return &BlockContext{ - BlockNumber: binary.BigEndian.Uint64(encodedBlockContext[0:8]), - Timestamp: binary.BigEndian.Uint64(encodedBlockContext[8:16]), - GasLimit: binary.BigEndian.Uint64(encodedBlockContext[48:56]), - NumTransactions: binary.BigEndian.Uint16(encodedBlockContext[56:58]), - NumL1Messages: binary.BigEndian.Uint16(encodedBlockContext[58:60]), - }, nil -} diff --git a/rollup/rollup_sync_service/chunk.go b/rollup/rollup_sync_service/chunk.go deleted file mode 100644 index dff2eca7e6..0000000000 --- a/rollup/rollup_sync_service/chunk.go +++ /dev/null @@ -1,155 +0,0 @@ -package rollup_sync_service - -import ( - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "strings" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/rawdb" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" -) - -// Chunk contains blocks to be encoded -type Chunk struct { - Blocks []*WrappedBlock `json:"blocks"` -} - -// NumL1Messages returns the number of L1 messages in this chunk. -// This number is the sum of included and skipped L1 messages. -func (c *Chunk) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { - var numL1Messages uint64 - for _, block := range c.Blocks { - numL1MessagesInBlock := block.numL1Messages(totalL1MessagePoppedBefore) - numL1Messages += numL1MessagesInBlock - totalL1MessagePoppedBefore += numL1MessagesInBlock - } - // TODO: cache results - return numL1Messages -} - -// Encode encodes the Chunk into RollupV2 Chunk Encoding. -func (c *Chunk) Encode(totalL1MessagePoppedBefore uint64) ([]byte, error) { - numBlocks := len(c.Blocks) - - if numBlocks > 255 { - return nil, errors.New("number of blocks exceeds 1 byte") - } - if numBlocks == 0 { - return nil, errors.New("number of blocks is 0") - } - - var chunkBytes []byte - chunkBytes = append(chunkBytes, byte(numBlocks)) - - var l2TxDataBytes []byte - - for _, block := range c.Blocks { - blockBytes, err := block.Encode(totalL1MessagePoppedBefore) - if err != nil { - return nil, fmt.Errorf("failed to encode block: %v", err) - } - totalL1MessagePoppedBefore += block.numL1Messages(totalL1MessagePoppedBefore) - - if len(blockBytes) != 60 { - return nil, fmt.Errorf("block encoding is not 60 bytes long %x", len(blockBytes)) - } - - chunkBytes = append(chunkBytes, blockBytes...) - - // Append rlp-encoded l2Txs - for _, txData := range block.Transactions { - if txData.Type == types.L1MessageTxType { - continue - } - rlpTxData, err := convertTxDataToRLPEncoding(txData) - if err != nil { - return nil, err - } - var txLen [4]byte - binary.BigEndian.PutUint32(txLen[:], uint32(len(rlpTxData))) - l2TxDataBytes = append(l2TxDataBytes, txLen[:]...) - l2TxDataBytes = append(l2TxDataBytes, rlpTxData...) - } - } - - chunkBytes = append(chunkBytes, l2TxDataBytes...) - - return chunkBytes, nil -} - -// Hash hashes the Chunk into RollupV2 Chunk Hash -func (c *Chunk) Hash(totalL1MessagePoppedBefore uint64) (common.Hash, error) { - chunkBytes, err := c.Encode(totalL1MessagePoppedBefore) - if err != nil { - return common.Hash{}, err - } - numBlocks := chunkBytes[0] - - // concatenate block contexts - var dataBytes []byte - for i := 0; i < int(numBlocks); i++ { - // only the first 58 bytes of each BlockContext are needed for the hashing process - dataBytes = append(dataBytes, chunkBytes[1+60*i:60*i+59]...) - } - - // concatenate l1 and l2 tx hashes - for _, block := range c.Blocks { - var l1TxHashes []byte - var l2TxHashes []byte - for _, txData := range block.Transactions { - txHash := strings.TrimPrefix(txData.TxHash, "0x") - hashBytes, err := hex.DecodeString(txHash) - if err != nil { - return common.Hash{}, err - } - if txData.Type == types.L1MessageTxType { - l1TxHashes = append(l1TxHashes, hashBytes...) - } else { - l2TxHashes = append(l2TxHashes, hashBytes...) - } - } - dataBytes = append(dataBytes, l1TxHashes...) - dataBytes = append(dataBytes, l2TxHashes...) - } - - hash := crypto.Keccak256Hash(dataBytes) - return hash, nil -} - -// DecodeChunkBlockRanges decodes the provided chunks into a list of block ranges. Each chunk -// contains information about multiple blocks, which are decoded and their ranges (from the -// start block to the end block) are returned. -func DecodeChunkBlockRanges(chunks [][]byte) ([]*rawdb.ChunkBlockRange, error) { - var chunkBlockRanges []*rawdb.ChunkBlockRange - for _, chunk := range chunks { - if len(chunk) < 1 { - return nil, fmt.Errorf("invalid chunk, length is less than 1") - } - - numBlocks := int(chunk[0]) - if len(chunk) < 1+numBlocks*blockContextByteSize { - return nil, fmt.Errorf("chunk size doesn't match with numBlocks, byte length of chunk: %v, expected length: %v", len(chunk), 1+numBlocks*blockContextByteSize) - } - - blockContexts := make([]*BlockContext, numBlocks) - for i := 0; i < numBlocks; i++ { - startIdx := 1 + i*blockContextByteSize // add 1 to skip numBlocks byte - endIdx := startIdx + blockContextByteSize - blockContext, err := decodeBlockContext(chunk[startIdx:endIdx]) - if err != nil { - return nil, err - } - blockContexts[i] = blockContext - } - - chunkBlockRanges = append(chunkBlockRanges, &rawdb.ChunkBlockRange{ - StartBlockNumber: blockContexts[0].BlockNumber, - EndBlockNumber: blockContexts[len(blockContexts)-1].BlockNumber, - }) - } - return chunkBlockRanges, nil -} diff --git a/rollup/rollup_sync_service/l1client.go b/rollup/rollup_sync_service/l1client.go index 0aaf4466ca..34ffc4db1b 100644 --- a/rollup/rollup_sync_service/l1client.go +++ b/rollup/rollup_sync_service/l1client.go @@ -56,7 +56,7 @@ func newL1Client(ctx context.Context, l1Client sync_service.EthClient, l1ChainId } // fetcRollupEventsInRange retrieves and parses commit/revert/finalize rollup events between block numbers: [from, to]. -func (c *L1Client) fetchRollupEventsInRange(ctx context.Context, from, to uint64) ([]types.Log, error) { +func (c *L1Client) fetchRollupEventsInRange(from, to uint64) ([]types.Log, error) { log.Trace("L1Client fetchRollupEventsInRange", "fromBlock", from, "toBlock", to) query := ethereum.FilterQuery{ @@ -80,8 +80,8 @@ func (c *L1Client) fetchRollupEventsInRange(ctx context.Context, from, to uint64 } // getLatestFinalizedBlockNumber fetches the block number of the latest finalized block from the L1 chain. -func (c *L1Client) getLatestFinalizedBlockNumber(ctx context.Context) (uint64, error) { - header, err := c.client.HeaderByNumber(ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) +func (c *L1Client) getLatestFinalizedBlockNumber() (uint64, error) { + header, err := c.client.HeaderByNumber(c.ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) if err != nil { return 0, err } diff --git a/rollup/rollup_sync_service/l1client_test.go b/rollup/rollup_sync_service/l1client_test.go index 79c82c8a31..5b9de12743 100644 --- a/rollup/rollup_sync_service/l1client_test.go +++ b/rollup/rollup_sync_service/l1client_test.go @@ -26,11 +26,11 @@ func TestL1Client(t *testing.T) { l1Client, err := newL1Client(ctx, mockClient, 11155111, scrollChainAddress, scrollChainABI) require.NoError(t, err, "Failed to initialize L1Client") - blockNumber, err := l1Client.getLatestFinalizedBlockNumber(ctx) + blockNumber, err := l1Client.getLatestFinalizedBlockNumber() assert.NoError(t, err, "Error getting latest confirmed block number") assert.Equal(t, uint64(36), blockNumber, "Unexpected block number") - logs, err := l1Client.fetchRollupEventsInRange(ctx, 0, blockNumber) + logs, err := l1Client.fetchRollupEventsInRange(0, blockNumber) assert.NoError(t, err, "Error fetching rollup events in range") assert.Empty(t, logs, "Expected no logs from fetchRollupEventsInRange") } diff --git a/rollup/rollup_sync_service/rollup_sync_service.go b/rollup/rollup_sync_service/rollup_sync_service.go index 455c097baf..44de86b3e3 100644 --- a/rollup/rollup_sync_service/rollup_sync_service.go +++ b/rollup/rollup_sync_service/rollup_sync_service.go @@ -20,6 +20,9 @@ import ( "github.com/scroll-tech/go-ethereum/rollup/rcfg" "github.com/scroll-tech/go-ethereum/rollup/sync_service" + "github.com/scroll-tech/go-ethereum/rollup/types/encoding" + "github.com/scroll-tech/go-ethereum/rollup/types/encoding/codecv0" + "github.com/scroll-tech/go-ethereum/rollup/types/encoding/codecv1" "github.com/scroll-tech/go-ethereum/rollup/withdrawtrie" ) @@ -150,7 +153,7 @@ func (s *RollupSyncService) Stop() { } func (s *RollupSyncService) fetchRollupEvents() { - latestConfirmed, err := s.client.getLatestFinalizedBlockNumber(s.ctx) + latestConfirmed, err := s.client.getLatestFinalizedBlockNumber() if err != nil { log.Warn("failed to get latest confirmed block number", "err", err) return @@ -170,7 +173,7 @@ func (s *RollupSyncService) fetchRollupEvents() { to = latestConfirmed } - logs, err := s.client.fetchRollupEventsInRange(s.ctx, from, to) + logs, err := s.client.fetchRollupEventsInRange(from, to) if err != nil { log.Error("failed to fetch rollup events in range", "from block", from, "to block", to, "err", err) return @@ -225,7 +228,7 @@ func (s *RollupSyncService) parseAndUpdateRollupEventLogs(logs []types.Log, endB return fmt.Errorf("failed to get local node info, batch index: %v, err: %w", batchIndex, err) } - endBlock, finalizedBatchMeta, err := validateBatch(event, parentBatchMeta, chunks, s.stack) + endBlock, finalizedBatchMeta, err := validateBatch(event, parentBatchMeta, chunks, s.bc.Config(), s.stack) if err != nil { return fmt.Errorf("fatal: validateBatch failed: finalize event: %v, err: %w", event, err) } @@ -249,7 +252,7 @@ func (s *RollupSyncService) parseAndUpdateRollupEventLogs(logs []types.Log, endB return nil } -func (s *RollupSyncService) getLocalInfoForBatch(batchIndex uint64) (*rawdb.FinalizedBatchMeta, []*Chunk, error) { +func (s *RollupSyncService) getLocalInfoForBatch(batchIndex uint64) (*rawdb.FinalizedBatchMeta, []*encoding.Chunk, error) { chunkBlockRanges := rawdb.ReadBatchChunkRanges(s.db, batchIndex) if len(chunkBlockRanges) == 0 { return nil, nil, fmt.Errorf("failed to get batch chunk ranges, empty chunk block ranges") @@ -277,21 +280,21 @@ func (s *RollupSyncService) getLocalInfoForBatch(batchIndex uint64) (*rawdb.Fina return nil, nil, fmt.Errorf("local node is not synced up to the required block height: %v, local synced block height: %v", endBlockNumber, localSyncedBlockHeight) } - chunks := make([]*Chunk, len(chunkBlockRanges)) + chunks := make([]*encoding.Chunk, len(chunkBlockRanges)) for i, cr := range chunkBlockRanges { - chunks[i] = &Chunk{Blocks: make([]*WrappedBlock, cr.EndBlockNumber-cr.StartBlockNumber+1)} + chunks[i] = &encoding.Chunk{Blocks: make([]*encoding.Block, cr.EndBlockNumber-cr.StartBlockNumber+1)} for j := cr.StartBlockNumber; j <= cr.EndBlockNumber; j++ { block := s.bc.GetBlockByNumber(j) if block == nil { return nil, nil, fmt.Errorf("failed to get block by number: %v", i) } - txData := txsToTxsData(block.Transactions()) + txData := encoding.TxsToTxsData(block.Transactions()) state, err := s.bc.StateAt(block.Root()) if err != nil { return nil, nil, fmt.Errorf("failed to get block state, block: %v, err: %w", block.Hash().Hex(), err) } withdrawRoot := withdrawtrie.ReadWTRSlot(rcfg.L2MessageQueueAddress, state) - chunks[i].Blocks[j-cr.StartBlockNumber] = &WrappedBlock{ + chunks[i].Blocks[j-cr.StartBlockNumber] = &encoding.Block{ Header: block.Header(), Transactions: txData, WithdrawRoot: withdrawRoot, @@ -362,22 +365,17 @@ func (s *RollupSyncService) decodeChunkBlockRanges(txData []byte) ([]*rawdb.Chun SkippedL1MessageBitmap []byte } var args commitBatchArgs - err = method.Inputs.Copy(&args, values) - if err != nil { + if err = method.Inputs.Copy(&args, values); err != nil { return nil, fmt.Errorf("failed to decode calldata into commitBatch args, values: %+v, err: %w", values, err) } - if args.Version != batchHeaderVersion { - return nil, fmt.Errorf("unexpected batch version, expected: %v, got: %v", batchHeaderVersion, args.Version) - } - - return DecodeChunkBlockRanges(args.Chunks) + return decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) } // validateBatch verifies the consistency between the L1 contract and L2 node data. // The function will terminate the node and exit if any consistency check fails. // It returns the number of the end block, a finalized batch meta data, and an error if any. -func validateBatch(event *L1FinalizeBatchEvent, parentBatchMeta *rawdb.FinalizedBatchMeta, chunks []*Chunk, stack *node.Node) (uint64, *rawdb.FinalizedBatchMeta, error) { +func validateBatch(event *L1FinalizeBatchEvent, parentBatchMeta *rawdb.FinalizedBatchMeta, chunks []*encoding.Chunk, chainCfg *params.ChainConfig, stack *node.Node) (uint64, *rawdb.FinalizedBatchMeta, error) { if len(chunks) == 0 { return 0, nil, fmt.Errorf("invalid argument: length of chunks is 0, batch index: %v", event.BatchIndex.Uint64()) } @@ -408,15 +406,31 @@ func validateBatch(event *L1FinalizeBatchEvent, parentBatchMeta *rawdb.Finalized os.Exit(1) } - // Note: All params for NewBatchHeader are calculated locally based on the block data. - batchHeader, err := NewBatchHeader(batchHeaderVersion, event.BatchIndex.Uint64(), parentBatchMeta.TotalL1MessagePopped, parentBatchMeta.BatchHash, chunks) - if err != nil { - return 0, nil, fmt.Errorf("failed to construct batch header, batch index: %v, err: %w", event.BatchIndex.Uint64(), err) + // Note: All params of batch are calculated locally based on the block data. + batch := &encoding.Batch{ + Index: event.BatchIndex.Uint64(), + TotalL1MessagePoppedBefore: parentBatchMeta.TotalL1MessagePopped, + ParentBatchHash: parentBatchMeta.BatchHash, + Chunks: chunks, + } + + var localBatchHash common.Hash + if !chainCfg.IsBernoulli(startBlock.Header.Number) { + daBatch, err := codecv0.NewDABatch(batch) + if err != nil { + return 0, nil, fmt.Errorf("failed to create codecv0 DA batch, batch index: %v, err: %w", event.BatchIndex.Uint64(), err) + } + localBatchHash = daBatch.Hash() + } else { + daBatch, err := codecv1.NewDABatch(batch) + if err != nil { + return 0, nil, fmt.Errorf("failed to create codecv1 DA batch, batch index: %v, err: %w", event.BatchIndex.Uint64(), err) + } + localBatchHash = daBatch.Hash() } // Note: If the batch headers match, this ensures the consistency of blocks and transactions // (including skipped transactions) between L1 and L2. - localBatchHash := batchHeader.Hash() if localBatchHash != event.BatchHash { log.Error("Batch hash mismatch", "batch index", event.BatchIndex.Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentBatchMeta.BatchHash.Hex(), "parent TotalL1MessagePopped", parentBatchMeta.TotalL1MessagePopped, "l1 finalized batch hash", event.BatchHash.Hex(), "l2 batch hash", localBatchHash.Hex()) chunksJson, err := json.Marshal(chunks) @@ -440,3 +454,59 @@ func validateBatch(event *L1FinalizeBatchEvent, parentBatchMeta *rawdb.Finalized } return endBlock.Header.Number.Uint64(), finalizedBatchMeta, nil } + +// decodeBlockRangesFromEncodedChunks decodes the provided chunks into a list of block ranges. +func decodeBlockRangesFromEncodedChunks(codecVersion encoding.CodecVersion, chunks [][]byte) ([]*rawdb.ChunkBlockRange, error) { + var chunkBlockRanges []*rawdb.ChunkBlockRange + for _, chunk := range chunks { + if len(chunk) < 1 { + return nil, fmt.Errorf("invalid chunk, length is less than 1") + } + + numBlocks := int(chunk[0]) + + switch codecVersion { + case encoding.CodecV0: + if len(chunk) < 1+numBlocks*60 { + return nil, fmt.Errorf("invalid chunk byte length, expected: %v, got: %v", 1+numBlocks*60, len(chunk)) + } + daBlocks := make([]*codecv0.DABlock, numBlocks) + for i := 0; i < numBlocks; i++ { + startIdx := 1 + i*60 // add 1 to skip numBlocks byte + endIdx := startIdx + 60 + daBlock, err := codecv0.DecodeDABlock(chunk[startIdx:endIdx]) + if err != nil { + return nil, err + } + daBlocks[i] = daBlock + } + + chunkBlockRanges = append(chunkBlockRanges, &rawdb.ChunkBlockRange{ + StartBlockNumber: daBlocks[0].BlockNumber, + EndBlockNumber: daBlocks[len(daBlocks)-1].BlockNumber, + }) + case encoding.CodecV1: + if len(chunk) != 1+numBlocks*60 { + return nil, fmt.Errorf("invalid chunk byte length, expected: %v, got: %v", 1+numBlocks*60, len(chunk)) + } + daBlocks := make([]*codecv1.DABlock, numBlocks) + for i := 0; i < numBlocks; i++ { + startIdx := 1 + i*60 // add 1 to skip numBlocks byte + endIdx := startIdx + 60 + daBlock, err := codecv1.DecodeDABlock(chunk[startIdx:endIdx]) + if err != nil { + return nil, err + } + daBlocks[i] = daBlock + } + + chunkBlockRanges = append(chunkBlockRanges, &rawdb.ChunkBlockRange{ + StartBlockNumber: daBlocks[0].BlockNumber, + EndBlockNumber: daBlocks[len(daBlocks)-1].BlockNumber, + }) + default: + return nil, fmt.Errorf("unexpected batch version %v", codecVersion) + } + } + return chunkBlockRanges, nil +} diff --git a/rollup/rollup_sync_service/rollup_sync_service_test.go b/rollup/rollup_sync_service/rollup_sync_service_test.go index 5bc1515d4d..0e1d4f367b 100644 --- a/rollup/rollup_sync_service/rollup_sync_service_test.go +++ b/rollup/rollup_sync_service/rollup_sync_service_test.go @@ -19,6 +19,8 @@ import ( "github.com/scroll-tech/go-ethereum/ethdb/memorydb" "github.com/scroll-tech/go-ethereum/node" "github.com/scroll-tech/go-ethereum/params" + + "github.com/scroll-tech/go-ethereum/rollup/types/encoding" ) func TestRollupSyncServiceStartAndStop(t *testing.T) { @@ -49,7 +51,7 @@ func TestRollupSyncServiceStartAndStop(t *testing.T) { service.Stop() } -func TestDecodeChunkRanges(t *testing.T) { +func TestDecodeChunkRangesCodecv0(t *testing.T) { scrollChainABI, err := scrollChainMetaData.GetAbi() require.NoError(t, err) @@ -57,17 +59,17 @@ func TestDecodeChunkRanges(t *testing.T) { scrollChainABI: scrollChainABI, } - data, err := os.ReadFile("./testdata/commit_batch_transaction.json") + data, err := os.ReadFile("./testdata/commitBatch_input_codecv0.json") require.NoError(t, err, "Failed to read json file") - type transactionJson struct { - CallData string `json:"calldata"` + type tx struct { + Input string `json:"input"` } - var txObj transactionJson - err = json.Unmarshal(data, &txObj) + var commitBatch tx + err = json.Unmarshal(data, &commitBatch) require.NoError(t, err, "Failed to unmarshal transaction json") - testTxData, err := hex.DecodeString(txObj.CallData[2:]) + testTxData, err := hex.DecodeString(commitBatch.Input[2:]) if err != nil { t.Fatalf("Failed to decode string: %v", err) } @@ -78,14 +80,21 @@ func TestDecodeChunkRanges(t *testing.T) { } expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 335921, EndBlockNumber: 335928}, - {StartBlockNumber: 335929, EndBlockNumber: 335933}, - {StartBlockNumber: 335934, EndBlockNumber: 335938}, - {StartBlockNumber: 335939, EndBlockNumber: 335942}, - {StartBlockNumber: 335943, EndBlockNumber: 335945}, - {StartBlockNumber: 335946, EndBlockNumber: 335949}, - {StartBlockNumber: 335950, EndBlockNumber: 335956}, - {StartBlockNumber: 335957, EndBlockNumber: 335962}, + {StartBlockNumber: 4435142, EndBlockNumber: 4435142}, + {StartBlockNumber: 4435143, EndBlockNumber: 4435144}, + {StartBlockNumber: 4435145, EndBlockNumber: 4435145}, + {StartBlockNumber: 4435146, EndBlockNumber: 4435146}, + {StartBlockNumber: 4435147, EndBlockNumber: 4435147}, + {StartBlockNumber: 4435148, EndBlockNumber: 4435148}, + {StartBlockNumber: 4435149, EndBlockNumber: 4435150}, + {StartBlockNumber: 4435151, EndBlockNumber: 4435151}, + {StartBlockNumber: 4435152, EndBlockNumber: 4435152}, + {StartBlockNumber: 4435153, EndBlockNumber: 4435153}, + {StartBlockNumber: 4435154, EndBlockNumber: 4435154}, + {StartBlockNumber: 4435155, EndBlockNumber: 4435155}, + {StartBlockNumber: 4435156, EndBlockNumber: 4435156}, + {StartBlockNumber: 4435157, EndBlockNumber: 4435157}, + {StartBlockNumber: 4435158, EndBlockNumber: 4435158}, } if len(expectedRanges) != len(ranges) { @@ -94,12 +103,63 @@ func TestDecodeChunkRanges(t *testing.T) { for i := range ranges { if *expectedRanges[i] != *ranges[i] { - t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) + t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) } } } -func TestGetChunkRanges(t *testing.T) { +func TestDecodeChunkRangesCodecv1(t *testing.T) { + scrollChainABI, err := scrollChainMetaData.GetAbi() + require.NoError(t, err) + + service := &RollupSyncService{ + scrollChainABI: scrollChainABI, + } + + data, err := os.ReadFile("./testdata/commitBatch_input_codecv1.json") + require.NoError(t, err, "Failed to read json file") + + type tx struct { + Input string `json:"input"` + } + var commitBatch tx + err = json.Unmarshal(data, &commitBatch) + require.NoError(t, err, "Failed to unmarshal transaction json") + + testTxData, err := hex.DecodeString(commitBatch.Input[2:]) + if err != nil { + t.Fatalf("Failed to decode string: %v", err) + } + + ranges, err := service.decodeChunkBlockRanges(testTxData) + if err != nil { + t.Fatalf("Failed to decode chunk ranges: %v", err) + } + + expectedRanges := []*rawdb.ChunkBlockRange{ + {StartBlockNumber: 1690, EndBlockNumber: 1780}, + {StartBlockNumber: 1781, EndBlockNumber: 1871}, + {StartBlockNumber: 1872, EndBlockNumber: 1962}, + {StartBlockNumber: 1963, EndBlockNumber: 2053}, + {StartBlockNumber: 2054, EndBlockNumber: 2144}, + {StartBlockNumber: 2145, EndBlockNumber: 2235}, + {StartBlockNumber: 2236, EndBlockNumber: 2326}, + {StartBlockNumber: 2327, EndBlockNumber: 2417}, + {StartBlockNumber: 2418, EndBlockNumber: 2508}, + } + + if len(expectedRanges) != len(ranges) { + t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) + } + + for i := range ranges { + if *expectedRanges[i] != *ranges[i] { + t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) + } + } +} + +func TestGetChunkRangesCodecv0(t *testing.T) { genesisConfig := ¶ms.ChainConfig{ Scroll: params.ScrollConfig{ L1Config: ¶ms.L1Config{ @@ -110,7 +170,7 @@ func TestGetChunkRanges(t *testing.T) { } db := rawdb.NewDatabase(memorydb.New()) - rlpData, err := os.ReadFile("./testdata/commit_batch_tx.rlp") + rlpData, err := os.ReadFile("./testdata/commitBatch_codecv0.rlp") if err != nil { t.Fatalf("Failed to read RLP data: %v", err) } @@ -151,45 +211,80 @@ func TestGetChunkRanges(t *testing.T) { } } -func TestValidateBatch(t *testing.T) { - templateBlockTrace1, err := os.ReadFile("./testdata/blockTrace_02.json") - require.NoError(t, err) - wrappedBlock1 := &WrappedBlock{} - err = json.Unmarshal(templateBlockTrace1, wrappedBlock1) - require.NoError(t, err) - chunk1 := &Chunk{Blocks: []*WrappedBlock{wrappedBlock1}} +func TestGetChunkRangesCodecv1(t *testing.T) { + genesisConfig := ¶ms.ChainConfig{ + Scroll: params.ScrollConfig{ + L1Config: ¶ms.L1Config{ + L1ChainId: 11155111, + ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + }, + }, + } + db := rawdb.NewDatabase(memorydb.New()) - templateBlockTrace2, err := os.ReadFile("./testdata/blockTrace_03.json") - require.NoError(t, err) - wrappedBlock2 := &WrappedBlock{} - err = json.Unmarshal(templateBlockTrace2, wrappedBlock2) - require.NoError(t, err) - chunk2 := &Chunk{Blocks: []*WrappedBlock{wrappedBlock2}} + rlpData, err := os.ReadFile("./testdata/commitBatch_codecv1.rlp") + if err != nil { + t.Fatalf("Failed to read RLP data: %v", err) + } + l1Client := &mockEthClient{ + commitBatchRLP: rlpData, + } + bc := &core.BlockChain{} + stack, err := node.New(&node.DefaultConfig) + if err != nil { + t.Fatalf("Failed to new P2P node: %v", err) + } + defer stack.Close() + service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) + if err != nil { + t.Fatalf("Failed to new rollup sync service: %v", err) + } - templateBlockTrace3, err := os.ReadFile("./testdata/blockTrace_04.json") + vLog := &types.Log{ + TxHash: common.HexToHash("0x1"), + } + ranges, err := service.getChunkRanges(1, vLog) require.NoError(t, err) - wrappedBlock3 := &WrappedBlock{} - err = json.Unmarshal(templateBlockTrace3, wrappedBlock3) - require.NoError(t, err) - chunk3 := &Chunk{Blocks: []*WrappedBlock{wrappedBlock3}} + + expectedRanges := []*rawdb.ChunkBlockRange{ + {StartBlockNumber: 1, EndBlockNumber: 11}, + } + + if len(expectedRanges) != len(ranges) { + t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) + } + + for i := range ranges { + if *expectedRanges[i] != *ranges[i] { + t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) + } + } +} + +func TestValidateBatchCodecv0(t *testing.T) { + block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + + block2 := readBlockFromJSON(t, "./testdata/blockTrace_03.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + + block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentBatchMeta1 := &rawdb.FinalizedBatchMeta{} event1 := &L1FinalizeBatchEvent{ BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0xd0f52bc254646e639bf24cc34606319a111975b2fdc431b1381eb6199bc09790"), + BatchHash: common.HexToHash("0xfd3ecf106ce993adc6db68e42ce701bfe638434395abdeeb871f7bd395ae2368"), StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*Chunk{chunk1, chunk2, chunk3}, nil) + + endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, ¶ms.ChainConfig{}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock1) - templateBlockTrace4, err := os.ReadFile("./testdata/blockTrace_05.json") - require.NoError(t, err) - wrappedBlock4 := &WrappedBlock{} - err = json.Unmarshal(templateBlockTrace4, wrappedBlock4) - require.NoError(t, err) - chunk4 := &Chunk{Blocks: []*WrappedBlock{wrappedBlock4}} + block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentBatchMeta2 := &rawdb.FinalizedBatchMeta{ BatchHash: event1.BatchHash, @@ -200,11 +295,11 @@ func TestValidateBatch(t *testing.T) { assert.Equal(t, parentBatchMeta2, finalizedBatchMeta1) event2 := &L1FinalizeBatchEvent{ BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0xfb77bf8f3bf449126ebbf403fdccfcf78636e34d72d62eed8da0e8c9fd38fa63"), + BatchHash: common.HexToHash("0xadb8e526c3fdc2045614158300789cd66e7a945efe5a484db00b5ef9a26016d7"), StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*Chunk{chunk4}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk4}, ¶ms.ChainConfig{}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock2) @@ -216,3 +311,114 @@ func TestValidateBatch(t *testing.T) { } assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) } + +func TestValidateBatchCodecv1(t *testing.T) { + block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + + block2 := readBlockFromJSON(t, "./testdata/blockTrace_03.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + + block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} + + parentBatchMeta1 := &rawdb.FinalizedBatchMeta{} + event1 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(0), + BatchHash: common.HexToHash("0x73cb3310646716cb782702a0ec4ad33cf55633c85daf96b641953c5defe58031"), + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + } + + endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)}, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(13), endBlock1) + + block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} + + parentBatchMeta2 := &rawdb.FinalizedBatchMeta{ + BatchHash: event1.BatchHash, + TotalL1MessagePopped: 11, + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + } + assert.Equal(t, parentBatchMeta2, finalizedBatchMeta1) + event2 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(1), + BatchHash: common.HexToHash("0x8eb3f63fbf286bb51a49879bfc653c53c890621542c640e5b6163cffb5a47aa6"), + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk4}, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)}, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(17), endBlock2) + + parentBatchMeta3 := &rawdb.FinalizedBatchMeta{ + BatchHash: event2.BatchHash, + TotalL1MessagePopped: 42, + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) +} + +func TestValidateBatchFromCodecv0ToCodecv1(t *testing.T) { + block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + + block2 := readBlockFromJSON(t, "./testdata/blockTrace_03.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + + block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} + + parentBatchMeta1 := &rawdb.FinalizedBatchMeta{} + event1 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(0), + BatchHash: common.HexToHash("0xfd3ecf106ce993adc6db68e42ce701bfe638434395abdeeb871f7bd395ae2368"), + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + } + + endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(16)}, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(13), endBlock1) + + block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} + + parentBatchMeta2 := &rawdb.FinalizedBatchMeta{ + BatchHash: event1.BatchHash, + TotalL1MessagePopped: 11, + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + } + assert.Equal(t, parentBatchMeta2, finalizedBatchMeta1) + event2 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(1), + BatchHash: common.HexToHash("0x425ab2830087e2642f0407550d65f108ee93533063ef0bfab1263b0b3c8a4c9e"), + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk4}, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(16)}, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(17), endBlock2) + + parentBatchMeta3 := &rawdb.FinalizedBatchMeta{ + BatchHash: event2.BatchHash, + TotalL1MessagePopped: 42, + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) +} + +func readBlockFromJSON(t *testing.T, filename string) *encoding.Block { + data, err := os.ReadFile(filename) + assert.NoError(t, err) + + block := &encoding.Block{} + assert.NoError(t, json.Unmarshal(data, block)) + return block +} diff --git a/rollup/rollup_sync_service/testdata/commit_batch_tx.rlp b/rollup/rollup_sync_service/testdata/commitBatch_codecv0.rlp similarity index 100% rename from rollup/rollup_sync_service/testdata/commit_batch_tx.rlp rename to rollup/rollup_sync_service/testdata/commitBatch_codecv0.rlp diff --git a/rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp b/rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp new file mode 100644 index 0000000000000000000000000000000000000000..b0feda0443cd8f807869d3adfd8e1deb3bb0e68f GIT binary patch literal 1237 zcmdnVa*6pT%eiL8P3(*<*0WAAfC#>3#)_UP?qNZx!JNNpHd>aN?|ZrY_xd}6ry6#$ zs0gdBS-^lFFyfbHXuvN|NIMID?F5WS}9__V;~ zKzc>sJa(wwLbwP%21qX=iaDTqOYmud%c1H8hj{8A({i{xJ_f2@E|5~7-Zp$%;Bu&X z!RZUA_W@iU9|Kh{K9w-J>({2(&eHgvsk77FVRy=ho~>skSH)budw}WT0!H4tfOF{) zR#GPOV`R>|cl1qMdiUnPPUl%i&EDVl{S)1=fTLz|hmw8igSGD+7f)q+9lG>kb~#7g y!I@u}bPwK`a!h4G`ok5IPIoNW-+qAQMb86^@G_?B|L@d0ygYaJo=p6u*$Cds7 literal 0 HcmV?d00001 diff --git a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json new file mode 100644 index 0000000000..ab2bb62c06 --- /dev/null +++ b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json @@ -0,0 +1,27 @@ +{ + "blockHash": "0xab5112f13fcfae4ce2e9b9ffac41aba17113fedded7c9864f332a8ef4195f1d5", + "blockNumber": "0x129dac3", + "hash": "0x5ec08d23bfc4340e3fc4f799daded1d66ccff2b6a31cc4799f3d3db5ceca8d82", + "yParity": "0x0", + "accessList": [ + { + "address": "0xfa148514d03420b7b1a13ec74da06d2ca875539c", + "storageKeys": [] + } + ], + "transactionIndex": "0x83", + "type": "0x2", + "nonce": "0x1fa2c", + "input": "0x1325aca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001c440000000000000000000000000000000000000000000000000000000000000005900000000000001fa2b0000000000000000000000000003c46d21938370953ecbc239ac066a14c60b16a637db1ca34f7c0ce8698b0bae71ceb8e6c4ba1924589e26d6eeb2f7cafb63a1af0cf38bac082e0b961c79783034a12600000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000066e000000000000000000000000000000000000000000000000000000000000075800000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000cd40000000000000000000000000000000000000000000000000000000000000f3200000000000000000000000000000000000000000000000000000000000011ca00000000000000000000000000000000000000000000000000000000000013b600000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000197e0000000000000000000000000000000000000000000000000000000000001a020000000000000000000000000000000000000000000000000000000000001b860000000000000000000000000000000000000000000000000000000000000177b01000000000043acc6000000006603090600000000000000000000000000000000000000000000000000000000000000000000000000989680000e00000000027af90277830829f084202fbf00830a987c94581b26f362ad383f7b51ef8a165efa13dde398a48703328b944c4000b902048624ba07000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e5961c58754af82c631b06f68d19aef0329cc0b30000000000000000000000000000000000000000000000000003328b944c4000000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb000000000000000000000000000000000000000000000000000000000000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe0400000000000000000000000000000000000000000000000000000000000001447efbdeef07f0f2080075d76d1d0afefa64aa41cfa08321d5135b2fa7fce56bda000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000038e280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a03fc0e58b12802aa5022458678375e4eb96a909c80d7f648c588aa9919917279fa0779517565c9954b15ff4d09ed715b0d02746bd32ec7e22036585d7ff5255cf23000000b1f8af831111ae841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000d799f02456cb96496af2e851ef42476ad43935160000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a084139c52a998a8fe5c0bad1e014128efe4932091d06a9175b1e408c3acc6184aa05e8278540b7aef2b549c2d6a5e3050b680ca62e684539ace6aecdaa40576b6c7000000b1f8af831111af841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c0000000000000000000000001387206062803f7f343ccb79ebcadea44ebe2e2f0000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a0af45bb15bc6ceaae0acc495e5795f6844fae52cc2afa3b39be198016342db6f6a0734ace753f76e53ea7b327d27fe64ddcee7aaa5a48d8ad9642e09aaa9e8dacd1000000aef8ac0b841c29c720830161379406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c6900000000000000000000000000000000000000000000000000000000004be11983104ec3a017077e130e10cb386969ec690af223056dfd65d6fb826a4e5f89bbaf295cc869a018d2c3d6cbf241f410aeafc1681a9721a4feeed24b3fded75cf67ca87648912b000002d0f902cd15841c29c72083040ea29480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000205efd70000000000000000000000000000000000000000000000000000018e7bed9871000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000021081cb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000a0dae0ca50c5eb8dcafa71d416d3f77597fbe79c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a047aa0887bb2643e5ad31d4a254552a7216ee5046bb1b698455bf12e7c2ed7a90a05188da1bb93a6cec86c49b995d857c2d0a71184a7c5759e7740692cb79e7f55f00000390f9038d07841b6b0b008306f8669474670a3998d9d6622e32d0847ff5977c37e0ec9180b90324186aaba2000000000000000000000000ff428b209697c64f8d2d3e23d88e95e7ae2306fc000000000000000000000000ff428b209697c64f8d2d3e23d88e95e7ae2306fc000000000000000000000000c7cc19ef9a37cca9855402f14ee6ad16d36fb571000000000000000000000000c7cc19ef9a37cca9855402f14ee6ad16d36fb571000000000000000000000000000000000000000000000000000258000f07945b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000012f525c1dc6f6f54b506060a746110fd26f26864d2527168fbac027466a0441e26a37ab98d678c6d8229debfd490e5fc4406c456ff9a07a51c2964ff9c7effb67ec8817337bbe3cbe5f9ccaccc9bfd520b47159ae2a30869327359ea85b402965554b6d2f7870ad81601d62e81543fbf7dbe356996a3d7b669924cc579fc52ccfb0e2b1409265c9340e495b119360eb75523869643dce1ac006d980984c535620d8467de329641fd7b62bf0536946a92d746ae67931a2370ff3b957b9dee5eca57bf16a2e5482c98c4355318260bb0ec931c4561ce7a50485dd46f140c56a73fa1fe8adcde644b661dbad7adbd30864e795c1fd7ee0642771ed05d32a200eb24107efa080c8db5b35ec87bd296378a7513dc574a0a8d6712f01801a6a83b6db9140d1afaa0477d65bb15183b33daf3e1002fba63bb6b46f114fdc5a82ed18fb812c1329d1be59ebbf55e2284e6810c2c819fcc36bf71ac75d4e77782bcfb87a8909cb00622f7a5a32892f21306c0dc00234a47d4bdaa8fe0151446a745e770073ea0d6078ab324e8ed79a3393b6921ec837e7132364230e5274c765b95a8a1f74aad09099a1d3b42acdaa390cf8d9cd4135a55fcd66059ecfd4c3cd84a90db9847a8d921633b3d96fa2185f5a985e455a044c491972bb01970a5673492c8679dd08d48411e24b167dd4cdcdeee1e2b2955f04dfeb68ada073678aa0919d9608b5d278ed601865b3dfb9746459e64a573bb617c7f8e8a2639f10e41bed4ebc15ba4409fb296f7878186e544bf73d21bab49e97f4c5569b03439248ab023cb9a244683104ec4a05c64033e21e83f2852a67ac27709dddf292f43a0138ae58c38cb8aec7b17a3a2a01e28f0a406e2d13bcb72b99bd468771a55b65847772ae84c798c5bd6bae56ec700000210f9020d05841ad27480830267d294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320c56a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000033ed5bed42be70000000000000000000000000000000000000000000000000000000000000000083104ec3a02ba17e8b51764c6f68fe8e29e56576f51416f501e47298bd3b41be0789653c28a04f5c5688198e03d625e69c62a5860207949ff03890953e4027d8a66f797c1b0c000000adf8ab0e841ad2748082e89494f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0ed0c29fb6307d37ad5b84d5280bc52c9faa2c435160f847b586f5acaa01dc1a1a074a986e7becf2b8c5e694f3f9b1a9de3219f2a878eb5e468d4c5221ad0406bcb00000072f87014841ad2748082ecff94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec3a0a70ca4f4524a6109a046dd64de4ecb5138feed7c92b5a18eb65ce6cfde7005cfa028742449538c4c94a1ac3181ab4f2f6839f026b1a3643c63fd90c573284dda1b00000597f905940f841ad274808308e4fe944e998615ad430c1ca46a69d813ede6eb3ec55edb87038d7ea4c68000b90524301a3720000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000030275b89f5789800000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000066030b500000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ab5819ac14dc28008e63ba0b8159495c06acde9e000000000000000000000000585245f79829fc75f8e2fd224b90d19449c6a0f6000000000000000000000000585245f79829fc75f8e2fd224b90d19449c6a0f6000000000000000000000000000000000000000000000000000000000000000300000000000000000000000083ffefbca071347df469c4e64820c95b01b957be000000000000000000000000a631b2a2c3469aa1bf5dc49977207f378d16d7d80000000000000000000000003bdb8ee4cabf15a7239cf0726f20ea37d190edd80000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ab5819ac14dc28008e63ba0b8159495c06acde9e000000000000000000000000a631b2a2c3469aa1bf5dc49977207f378d16d7d80000000000000000000000003bdb8ee4cabf15a7239cf0726f20ea37d190edd80000000000000000000000004e998615ad430c1ca46a69d813ede6eb3ec55edb0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3cb000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000000000400000000000000000000000006c1c420c04f4d563d6588a97693af902b87be5f100000000000000000000000000000000000000000000000000038d7ea4c6800083104ec4a0d8a6441660f20fc6c91ff8bf10cebdeff6db8d7e51354ecc58fb602683551563a032962f4928d52af98506c47bd1ef7599325b1a713b89cee840fe6b8cc456383d000000aef8ac63841ad2748083066ee494ec53c830f4444a8a56455c6836b5d2aa794289aa80b844962941780000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000000120668883104ec3a0eba3f5004bff6e9beddb1df6e0db58623d5ed8cbf1b767f2ca34a4d81409c651a02bfa80d7a63b1384398e80a7d61ec53d1ebafdaaf99d4ff8d741bddb6a5017b20000008cf88a45841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec3a042d14df620658bf6a551c06ccd30e2f04fb28d3492a97f359147354e5aac747ea0170b85008421c32336b8d89a682dfa1deeb4754949c98ac21bfec66251f335540000016ff9016c20841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000403633396637616538663934613464663630323961303366643830333761383837323264383064356136653265666131376537303530633738353730623463613300000000000000000000000000000000000000000000000000000000000000403430313462396265653466373934346264313839323561343361303163323864636331353037353562613436646333623636663136393130343238613763633783104ec4a08e3068a36c592243ad71c7ec408660d063985f3c12558320a36aca7335ea70c7a01b12c5c4a55abd5cc7a8ae3089ef7de1338498c67912f12fa9fc1da8cc5acfbf000000adf8ab10841ad2748082679a94b65ad8d81d1e4cb2975352338805af6e39ba8be880b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7000000000000000000000000000000000000000000004ef81231e69da0fb63ee83104ec4a080b6d9c83ec16fa443cf544f283e44a9ee04689503a9d71e62e636502bbbc4c3a0641a349ea60010f88692a7545dea558dafc65e8a0fbfb06ffdcc39eec29c406500000000000000000000000000000000000000000000000000000000000000000000002fcc02000000000043acc7000000006603090900000000000000000000000000000000000000000000000000000000000000000000000000989680000f0000000000000043acc8000000006603090c00000000000000000000000000000000000000000000000000000000000000000000000000989680000f0000000000aef8ac258435a4e900830161139406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000000122960d6e391478bfe8fb2408ba412d5600f621000000000000000000000000000000010000000000000000000000000000000083104ec3a059385c2658560e9e1e62e652d3b6cbf85c4947bcd2e6dd8cf0e4f9f58e5e3b35a0492325e052fc52d7ad695c3e1c9c5c8ee95c891c9f1a706d5b1e5b7d8f345e9600000073f871068426be36808302067194978132d279905cdfd0d80af13bb9dd2066076099862d79883d2000841249c58b83104ec3a021b2c3bb04bdea993ba86308794373aa3547aa23adafeba9b4b64d3004e20430a0656d8ebe00433595082dcf3b47859ec3746dfcda6ffb0b302ec1cb9470964ad600000072f8708303a972841d8119c0827b0c942a03256195029f21594d03b71367e874b98369bb8703eb2c332ff0068083104ec3a0cedd197b18f95501ccb1938b0bfb791737b5a54846093a7c492695b7b9a32e04a02f4d44c199d3963f575eca6d07b14b82474b574437081ff6858cec10cb31abb500000095f89316841c9c380083018a43940241fb446d6793866245b936f2c3418f818bdcd3880b0e11a89e598000a4b6b55f250000000000000000000000000000000000000000000000000b086849b46f800083104ec3a09445d5975e0524ba981f5dff888f4b5235790f4e3784016b4cd1611a3647febea00c9e9bce629d48895925e2bcd377ab846b537de9a50dc764f9cd41221a096638000000aef8ac01841c9c3800830163539406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a04c4f4c22bad767e0912848437903d47587b30d659646bd601a862bbbb4366befa0431fe80c2c6b5f347940eb7c2341e5aeebf5469f904e95e0abde7c2290a1a523000000adf8ab0c841c29c72082eaba9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f0000000000000000000000000000000000000000000000000000000000f9f16d83104ec3a00d8d15eb86c813dd8d3c8e6b503ecccaa0b9db8464d02d43b59694013e71196aa06ce267796ee24dc88369e49af8877072718c1cce8fb7010ea992d643156436a2000000adf8ab09841c29c72082eca29406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0c34ae30a24a494a9eb4e9416287a24def677baaa6296941142ebcbf65e95caa2a01652b61e30c6e84d43ebb4611e70f8925c8925354150bc9ab1926eb7a59001b200000210f9020d1d841b6b0b008302b89794aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002154fd7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001000000000000000000000000000000000000000000000000022995260e51b1c0000000000000000000000000000000000000000000000000000000000000000083104ec3a001ac7b4e716fcd997508ef2ff0db4bb568f5fa64522d0e302d1162ac69907266a0530eb83f3ff54a7fa296e1cf2d1f1b4152a7d84cfc250586fb0d6a9f102d959f00000275f902720e841ad9524f830a90a7941502d025bfa624469892289d45c0352997251728854033d6d929b90204ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016496f639ed000000000000000000000000ec9e48c59d388bf55d55fef2120d427cd3d5168c00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000002f3a0000000000000000000000000000000000000000000000000000000000002f7c400000000000000000000000000000000000000000000000000000000000003e40000000000000000000000000000000000000000000000000000004033d6d929000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066124b440000000000000000000000000000000000000000000000000000000083104ec4a0ffe3a30fdd5bca926295fa0b1d51bb45fb885c8288a5087a660790213238f5f0a026ac2b2e3e2959d18261176fa0dab6663676710a3e43b4eafe494be651cfe7f20000006ff86d18841ad27480827bb494a49a2afa779f4dfbf4e1c36952c1a5a4d9a8d96a8087646174613a2c3083104ec4a02e843fdc0ece6e86f7271a9e0e708a11ef90275bb115717cd7f7ebf82b504b16a03e6783607a46b6dad1e8f36aba497f21dbe923ae45436d09cb03ccd9cea90de1000000adf8ab13841ad2748082eb7a9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000018b71386418a9fca5ae7165e31c385a5130011b6000000000000000000000000000000000000000000000000000000000028124783104ec3a086ba8a486d0e641bb1b4ab77ea2ee73aadb531519bb890bfb46aded41b1660c5a07710a68ab768cbd9da53fc3f0c68a5ddea1ff8a8d5f7dceef772de521b5fd16b00000bd2f90bcf820696841ad27480830239c394ce16f69375520ab01377ce7b88f5ba8c48f8d66680b90b641a98b2e06bd74f273376604d935a488cbebbaa579001bd04a8876b22f71fc5802d0d194300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000087d0fe00000000000000000000000000000000000000000000000000000000000000046261736500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078636531364636393337353532306162303133373763653742383866354241384334384638443636360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000091dc314e8b095d8a0d04ca5353b4ab3b3a2b86f2000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f405215000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000044095ea7b300000000000000000000000033d91116e0370970444b0281ab117e161febfcdd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000033d91116e0370970444b0281ab117e161febfcdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f40521500000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000ea749fd6ba492dbc14c24fe8a3d08769229b896c0000000000000000000000000000000000000000000000000000018e7bd2f218000000000000000000000000000000000000000000000000000000000087d1e40000000000000000000000000000000000000000000000000000000000868d610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012418a13086000000000000000000000000000000000000000000000000000000000087d9220000000000000000000000000000000000000000000000000008b47f4b6a119600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000091dc314e8b095d8a0d04ca5353b4ab3b3a2b86f20000000000000000000000000000000000000000000000000000018e7bd2f219000000000000000000000000000000000000000000000000000000000000000100000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000761786c555344430000000000000000000000000000000000000000000000000083104ec3a00ba5486806127ab61a698a3a84fcb66f44131141b8c38622bfb87f5c4cace47ba077475ad41ee72bda3edb00843191e1eba6c6ecf55bf5c136642dbd648454f3f600000170f9016d81aa841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406234303937326339353833383562353231306136306462333163313231376631303832366530353561303136316564643863333565616131366133323137376100000000000000000000000000000000000000000000000000000000000000403236613333663364383165373733396132613938616634383564383930316530333832376232613430393865313462303261383737653930386530376463633483104ec4a01af0c3728d0d7c11e424b472599ec77e0b0b15ad2d859da0290b8a0d8c756901a07c3dc394aa52bf1ed369ae938290329f1dd81f15c04ba9ac760f3c6cca47a7f9000007d7f907d426841ad2748083035dfe940cab6977a9c70e04458b740476b498b21401964187030429376a1000b90764a4d730410000000000059e1b6601d06d916bbe845c424dc9317e8b815ca18f207a12c84a03fe10bb5c151ba666295da9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0ca6319198958c74570a8e547538262ae993ca117a0e481f908209137a46268ebea49653b798e1cc5912de2b287648df6cd3a8dfdd14d938cc889223e29d06e430bf3320f1062480100f29d53789c2142cd1804081c1f2d765e838623dafc1d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000680040000000000000000000000068089c372275512e09f5359f82ce68a9d46ce19003201000000000000c803e8916bbe845c424dc9317e8b815ca18f207a12c84a0000000000030429376a100000000000000000000000000000000000000005c10000000000030429376a100000000000000000000000000000000000000004de0000000000030429376a100000000000000000000000000000000000000005d10000000000030429376a100000000000000000000000000000000000000003ed0000000000030429376a100000000000000000000000000000000000000004d70000000000030429376a100000000000000000000000000000000000000005c40000000000030429376a100000000000000000000000000000000000000005c20000000000030429376a100000000000000000000000000000000000000005c50000000000030429376a100000000000000000000000000000000000000004d30000000000030429376a100000000000000000000000000000000000000004d10000000000030429376a100000000000000000000000000000000000000004d20000000000030429376a100000000000000000000000000000000000000005c60000000000030429376a100000000000000000000000000000000000000004d60000000000030429376a100000000000000000000000000000000000000005c70000000000030429376a100000000000000000000000000000000000000004d50000000000030429376a100000000000000000000000000000000000000004d40000000000030429376a100000000000000000000000000000000000000006840000000000030429376a100000000000000000000000000000000000000005930000000000030429376a100000000000000000000000000000000000000005940000000000030429376a100000000000000000000000000000000000000005950000000000030429376a100000000000000000000000000000000000000005920000000000030429376a1000000000000000000000000000000000000000058c0000000000030429376a100000000000000000000000000000000000000006850000000000030429376a1000000000000000000000000000000000000000067e0000000000030429376a100000000000000000000000000000000000000005900000000000030429376a100000000000000000000000000000000000000006820000000000030429376a1000000000000000000000000000000000000000067c0000000000030429376a1000000000000000000000000000000000000000067f0000000000030429376a1000000000000000000000000000000000000000058d0000000000030429376a1000000000000000000000000000000000000000067d0000000000030429376a100000000000000000000000000000000000000006810000000000030429376a100000000000000000000000000000000000000005910000000000030429376a100000000000000000000000000000000000000006800000000000030429376a1000000000000000000000000000000000000000058f0000000000030429376a1000000000000000000000000000000000000000067b0000000000030429376a100000000000000000000000000000000000000006830000000000030429376a1000000000000000000000000000000000000000058e0000000000030429376a100000000000000000000000000000000000000005890000000000030429376a1000000000000000000000000000000000000000067a0000000000030429376a100000000000000000000000000000000000000006790000000000030429376a1000000000000000000000000000000000000000058a0000000000030429376a100000000000000000000000000000000000000005870000000000030429376a100000000000000000000000000000000000000007620000000000030429376a100000000000000000000000000000000000000005880000000000030429376a1000000000000000000000000000000000000000058b0000000000030429376a100000000000000000000000000000000000000006740000000000030429376a100000000000000000000000000000000000000005820000000000030429376a100000000000000000000000000000000000000006770000000000030429376a100000000000000000000000000000000000000005850000000000030429376a1000000000000000000000000000000000000000067383104ec4a0d7537cf71019beeeef38dec63e1552a493f7b93125ae44c25bff446c8fdd53e3a018221bb17b86f37e17a92bdd74885f288ed3c3088ee70707a88651088318f369000000cef8cc04841ad274808304029b9411fcfe756c05ad438e312a7fd934381537d3cffe80b86469328dec0000000000000000000000005300000000000000000000000000000000000004ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000073f9ce3e0f57c2b1756061b6890d69cf961fc71683104ec3a07ab506510c7b06ae1e9fdce1a9b665693ca7919c2d3ee09df0d11790414bd1cfa016478eed5cdf6b904a877df6d6a17174e74b02ec883f9dfa5b08a9badd8dd2a000000074f8721784283baec0827e609487627c7e586441eef9ee3c28b66662e897513f338807a58b94a73d800084db6b524683104ec4a09985a299a2ca70c4118d3afbea6c62ed59d80898ba8049ee8c8ea8408fa6a8cca02a1d4cf86bfad3cf126c1d3490b13165f92e141ecc094a6c1b431d11f0de28b2000000aef8ac0684202fbf00830120b094f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b3000000000000000000000000efeb222f8046aaa032c56290416c3192111c00850000000000000000000000000000000000000000000000000000000000569fa583104ec4a0df3ee7466d929537ed0ed740f5a2704f2050e679aad0e75d1d36098b57246986a02b89a5a1a62701fbeddca8165a8cfeaaef00c6a4888010a4dce6769a5af3bbc50000006df86b09841f78a4008302a43b94718aa132efee7c549cf0d732134f868a0f2c604d80841249c58b83104ec3a08a3d077978fd3e6076ea8b0e09ece3588244b6abcba043e19170ddf32ed3c07ba03bf98ef558e903bacf2ee402255e3825dfae38e2a0725e51baa5370362708ff9000000aef8ac20841d8119c083047cd994ec53c830f4444a8a56455c6836b5d2aa794289aa80b844830cbbbd000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000030c47107dca8e2083104ec3a08188c5d85db2fb3c428751ef565031fce3597a1e5ccec338570ead5d8c53edcba06cff8e0ddf358742d0731e67ec8ff9b436917365e969b3b2ffe95fd2aaeb617c00000093f8911a841ad27480830177109416c0baa8a2aa77fab8d0aece9b6947ee1b74b943865af3107a4000a440d097c3000000000000000000000000739815d56a5ffc21950271199d2cf9e23b944f1c83104ec3a042bc7d5b2ad88c6760278b9aa1dc611a8dae979944bbe5af180eba3ee79b3001a043e2cc45b6ec3a8bafa0f2c084a6ce23ac86e3ef96df0a75e4f545a17f3858a0000000adf8ab0a841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000000137083a83104ec4a0d16e001887481b4a553331a8f76b05e60b5a629b220e111263904169ca311139a058d4cebf1558fe8a3707045c4cc4eeabb8581f64faff114d3776cda413f0e897000000adf8ab0c841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000fc30937f5cde93df8d48acaf7e6f5d8d8a31f636000000000000000000000000000000000000000000000000000000000cf1a64b83104ec3a038fdfacb0355f6a3931ed712bb989ee8b4629ac4d65d4926a997eb7e6db178bca0036d3124c13c4dc4b1b54008adf0a5acd017da2c3a783b506667ae08f25b459700000217f9021417841ad2748083025b2294aaaaaaaacb71bf2c8cae522ea5fa455571a741068711c37937e08000b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000000000000010f7945000000000000000000000000000000000000000000000000000000000000000083104ec4a065c7e33cd77a45b2bfd6751fbcb35526c5a1ed017a99968761f73f6a6ed53962a06f06ee3ce7a4d44baf84b18b404709aa3164c77c114005ee919131e3f8a202ac00000210f9020d2c841ad27480830267d294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2c7c530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000f9a085e877a3a4000000000000000000000000000000000000000000000000000000000000000083104ec4a026e5a0043a217b6556efe3c85a1e7ed9b5c800422acb45d2ee089abc7e61c04ea04eaa7703fb3f29a1353c0343c925be4b2e24299764b49eb06221b57cd6f7820300000073f87102841ad274808302067194c110be1cb504502504623f043dc7a3fadf242c72862d79883d2000841249c58b83104ec3a0913d18d1a8909bd664838a1aa807d7b21e43916fddef32764601f89756390fc2a0743b5cc93d16a7956cd45c45923d787dc9abcefd09f06837638038744e85aca100000073f87111841ad2748083020671949fa57d91d457059f03fa323d60c410a32884e396862d79883d2000841249c58b83104ec3a050f5a8624efccc88ad5d58bba87eeb9813fad2d534367ac7ace528ff52b55ba7a04d59c00b2524ae66e72589a8aa512c2bff925d1c092e7312e5f1bfe624b8af4400000281f9027e01841ad27480830249f08086b5e620f48000b9022360806040527389a512a24e9d63e98e41f681bf77f27a7ef89eb76000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161009f90610185565b60006040518083038185875af1925050503d80600081146100dc576040519150601f19603f3d011682016040523d82523d6000602084013e6100e1565b606091505b5050905080610125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011c9061019a565b60405180910390fd5b506101d6565b60006101386007836101c5565b91507f4661696c757265000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006101786000836101ba565b9150600082019050919050565b60006101908261016b565b9150819050919050565b600060208201905081810360008301526101b38161012b565b9050919050565b600081905092915050565b600082825260208201905092915050565b603f806101e46000396000f3fe6080604052600080fdfea264697066735822122095fed2c557b62b9f55f8b3822b0bdc6d15fd93abb95f37503d3f788da6cbb30064736f6c6343000800003383104ec3a0ab015f7c152ac6cf727e71b7d563e4eaa7cf172067a80b72a27b725696946620a05d590c8fa01e05871908cb03b2fcf93823c9311b1511f06939609fe06834734900000210f9020d04841ad27480830267ba94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000000fd4f0b43cdc1000000000000000000000000000000000000000000000000000000000000000083104ec3a080477cee851db13b7be8cbffc2f18c17af3d347bd6cfcd2793293861a475eb85a05a3c594e24f173b95a6e00a9ce4f523ba8d530a9fb721b96ddd4d95a9cf640c7000000aef8ac08841ad27480830999ff94ec53c830f4444a8a56455c6836b5d2aa794289aa80b8444b8a35290000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000012115208083104ec3a02494e24fdc3fe34a06d7251fc1359154f7797ceda668b6ca1c662644fbf1a215a01e338467d6c111789312da503e13094ef6a47d68b19ce6f95e3541b7563c85dd000000adf8ab098417d7840082c08d94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000026cb8660eefcb2f7652e7796ed713c9fb8373f8e000000000000000000000000000000000000000000000000000000001ed2fcf183104ec3a0304c92fcd91dedddee46f1a09880dfc40bb35ad7b71d452f09ca53ebb828c54ea00c8f21732c451b5a382e081d5b5a65c119d6fd6a07e7ec14ed9a03d38415037000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d2f01000000000043acc9000000006603090f00000000000000000000000000000000000000000000000000000000000000000000000000989680000f000000000072f870830849fb84283baec0827b0c943b1d30d4a8d52ac398d80402941e11c65b4aa483873843aae74ed0308083104ec3a0360ca28be08a53b7eba64911972d829449c3aa1e5a48d22b18a8ec05e334f04ea035e7b18452cd67e54483e30f7217e2a33b16fcb7670322982b7a833229dd33db0000017df9017a12841dcd65008301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0ad518686cd77228e8f062597a92cf773a0470a15eadd8b9dc8c54910d37e7a66a06e148d29a567d8eb4d8921c358682f5cdf056143346b0a5d4342e38a3e99df9b000000aef8ac07841c29c720830149aa9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c6900000000000000000000000000000000000000000000000000000000008f24cc83104ec3a0442ed8380de187b862f5eaf2017d8c33a02fd7f71d180280d8dd6cf6c7a6fd0fa0071b96b62316b5f9717542ff6595b4438a537e98c6744c43a1edef235b24d7ea000000aef8ac18841c29c720830149cc9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000002031e8383104ec3a0ef27913a67a82a170f0412967c0c5487fa4145c286ff6353d49f8c473b36d5dea01d3701ea33351d082de532e400f06eaa5faef235b9a9ddd5fbb666bd10722029000000b5f8b308841c29c7208303fe7d94ec53c830f4444a8a56455c6836b5d2aa794289aa870a521505129000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000000a52150512900083104ec4a086c70539d84a46c289c3774baf27161d96eca84432d3ad0fcdde26e52c23ea44a03d565b139e80d3dda4e8048220d05500fc9bdadaaa7f36e8e7966217ab261bd1000000aef8ac11841c29c720830149bb9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c690000000000000000000000000000000000000000000000000000000002b0ec2083104ec3a092f06c1af9d099c8e5c192696eff2ebea11a01d25fa0083851edd90fc93a9184a05d811acfbb7161d9ffd8c57cee86c092db32c01dfb56fc6fd27c7dac7e1127c5000002b7f902b41f841b5bc8c08306b798942db0afd0045f3518c77ec6591a542e326befd3d787740818d25d4000b90244ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000014475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5ddba6fdd5c599a4b0b9379fe28cbf318687ff300000000000000000000000000000000000000000000000000740818d25d40000000000000000000000000000000000000000000000000000000000006ed9d030000000000000000000000000000000000000000000000000000000066030b5d000000000000000000000000000000000000000000000000000000000000004253000000000000000000000000000000000000040001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a40001f4f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec4a04a015249d635ebe05905dc3721c2db492d5490c2fba87d0e5098a92fef1d4a56a050ee7894564d32e9bb1b9862e354864defca236097a8da03a401d4d1530e2b01000000b4f8b22d841ad2748083043a87947dac480d20f322d2ef108a59a465ccb5749371c4860edcee952ec8b844f5c358c6000000000000000000000000000000000000000000000000000000000000a4ec0000000000000000000000000000000000000000000000000000000016a6f3c383104ec3a0f564e165f7d0ec60f0fdf4cf5ee5f86273cb24a87815f6fa3e30b4d24193b335a0767c356448ead916337c9bb7a48b9b61031bf897f707b7cad837f34eb4989f8100000a17f90a141b841ad274808305e1d1946352a56caadc4f1e25cd6c75970fa768a3304e6487470de4df820000b909a490411a320000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be74000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be74000000000000000000000000bf646598aae1aebffff243b7460c299e19610d9800000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000438ee63000000000000000000000000000000000000000000000000000000000443d98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000003487ef9f9b36547e43268b8f0e2349a226c70b5300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000005600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004d0e30db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002449f8654220000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001045761880400000000000000000000000096cfa2a369ec67a93c324a35e693fbeea11c0594000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be7400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003f8c7d3063579bdb0b90997e18a770eae32e1ebb0853000000000000000000000000000000000000040001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000648a6a1e8500000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000353c1f0bc78fbbc245b3c93ef77b1dcc5b77d2a0000000000000000000000000000000000000000000000000000000000443d98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f86542200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f9900000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000bf646598aae1aebffff243b7460c299e19610d980000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a0e976d4e03f5dbc387027934cc0eab6d42d995b1dcb41514d28712794e89dddd5a0390e8545628ddd1e88860718a4b3855adf9d99173bb11e1237de28009970afa1000002d0f902cd09841ad274808302a1349480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000cad3995af2f2680000000000000000000000000000000000000000000000000000000066030dad00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000c9f18d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000003d5870b727f347bedf045f3f55ee430587b22c9d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a052096576a969f41097a5f04e1d1cd03791e6ffdb75658c6617279c5e77636e3aa04b652d544c1f8b07d001116ff199762fdce2c4055b165b865f8b5def2e553b91000002d7f902d40a841ad2748083028d879480e38291e06339d10aab483c65695d004dbd5c698731bced02db0000b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000002ed863800000000000000000000000000000000000000000000000000000000660337e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031bced02db00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000703de8951c7042c3262943168217ce94c89810220000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0e79f5801cc87a91aba5476097bf3054bbbe6797470d33642052b7589acb7461ba02e05d051900972bbdc2341793dc757ddab68d7aa026c6836ddf825709a66b994000000b6f8b432841ad274808304e68094ec53c830f4444a8a56455c6836b5d2aa794289aa88061cc1d9010541f2b844abdb5ea8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000061cc1d9010541f283104ec3a0160427007cd65553c28d9f87cd50394cc8be13082bb3d20216a09035e926164da01f68d16b088b8d317e8f6607455b07162e14f767724811d85a8f00ed1c54458500000310f9030d03841ad274808304bead9480e38291e06339d10aab483c65695d004dbd5c6980b902a4353766c6000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000004001cfee300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c3ace79098d291c10489c165d72bc7089aa9790a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000119abb000000000000000000000000000000000000000000000000000124a38acc3e770000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337e3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000411334a2a2b1c2bb18463bf09af0b8e3be7d7c783652fad4eff628f2c263cbb7b00adbcd75494a604d8f6e3a8cdab02ad0164d6adc8894c64a721105ece52f0e411b0000000000000000000000000000000000000000000000000000000000000083104ec4a0cad600fae8943c28e2d9da00b98cdad5747c3516b3118b16cafe19fc3a579aaba00cdb657c43fc1f595f41af5574fe01824eca228bd308a6405ca259672a1d94db0000006cf86a0d841ad2748082678094ffc3b2cf9bc079c26ddf8837cdae426fd30f72c68084b49004e983104ec4a041b17b2571a62e11d0b13a0d7a5a9adc336e0fac3b1cac45f20c22792d7aeda6a01a7bc2cc94ad11637bef6575f0e088b2573d21a84ff141ec765dc3c965ae3733000000adf8ab1c841ad2748082eb869406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000001b9d6383104ec3a007030700fc9386c23723fd9577f2165a320d7791b04f48647f8fdda243e7d85ea051c87d5d16d09410bd626530123c4476c09cd2c46fa661960f379924472b8e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7701000000000043acca000000006603091200000000000000000000000000000000000000000000000000000000000000000000000000989680000e000000000190f9018d0a8422de64408302ca6b94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a13086000000000000000000000000000000000000000000000000000000000002e006000000000000000000000000000000000000000000000000007d80813d322df800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000475f01342d61234767c2099b100fb52f06eb77cc0000000000000000000000000000000000000000000000000000000066030b0100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec4a05212bbd6dd8ee6b233c4bcc02fccdfa727f743663008ba00e302880590998374a060b933ae52509ff098304815d8a6b7f6cd6409f06696dc53ce6ad797bf4ce6a100000190f9018d098422de64408302ca6b94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a130860000000000000000000000000000000000000000000000000000000000021a30000000000000000000000000000000000000000000000000005c9b7aab58cbf000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000092ce7f1504a8cb95627be59e916bdc6ee69c23ad0000000000000000000000000000000000000000000000000000000066030b0100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a0d33b7ddf0505d1acca3b5a86737bf0293b3851d2689c6c9bfcf50e9c9b7fe4f4a039419f6b00e623699dfe35f7ffad0ffd34046e2512d51ce4844a11db7f410a9100000070f86e15841d8119c0827b0c94e4edb277e41dc89ab076a1f049f4a3efa700bce8880cc4ed5711fd37aa8083104ec3a023fc2e8fee511b3aa3e1d04dfda83b7170630de49664bcb23dc2c087e8f0dd73a031acc3a189928da5c02546227c3b8fd3647c10548eb5315c764d4abdec6f1f62000000adf8ab13841ad274808271b894530000000000000000000000000000000000000480b844095ea7b30000000000000000000000006352a56caadc4f1e25cd6c75970fa768a3304e64000000000000000000000000000000000000000000000000000000000000000083104ec4a0e5b98f5710c6803cef3aeaa136e56f9cfad5b2f213e80318de8537ff5e243768a01e4a0ac5d0bec90d791b8436af2047362e82a28689fa10da0fcac1099794f169000000b5f8b302841ad274808303dc7994ec53c830f4444a8a56455c6836b5d2aa794289aa8712cf6e5bdccaccb844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c0000000000000000000000000000000000000000000000000012cf6e5bdccacc83104ec3a068eeb09d6e2492dabb83bea9c7f8bed36890d3a6dd3ce0409f3bad932e658bf4a03395a3f0fc0bc7dc03ffa64c0ca1c35af3787a1216b182a53cf3ff882f2c17f70000006df86b02841ad274808302067194f4d4e95c1a35381da8e2da1062dcabe9d58fcc9c80841249c58b83104ec4a0d4ea964e2af54269d7f305891ba40f4d8de45cd3a62943ba339601de5832a2dfa050ae51a34909d4449c39ff4b129cba5d698a46ef7e92f741a36cf510d749913a0000008df88b8182841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec3a0c820bc9addd7e44bd58ad16e365c58eaaa1ef160181dd7cc6225e21a504df5d5a0628397057668b4dbcae996d6ada3a4e86e496d555c1e2281582636391fb0b59d000000adf8ab57841ad2748082c1dd94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000025ab3efd52e6470681ce037cd546dc60726948d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a03571e91e056c8ece33c49832d9bc894871da5b32edab58a91d5a9686ce24b364a0751fc29a0af97278eb59dad878a42168cf1a71f1a6b50a34d052b9f3e4daa44400000190f9018d15841ad274808303655c94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a1308600000000000000000000000000000000000000000000000000000000014fb180000000000000000000000000000000000000000000000000001580fb87f3bbcc00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a220c0137d2d5b01782298b38418bbb176b4b40d0000000000000000000000000000000000000000000000000000000066030d5c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec4a0bace7ef791e4a91852b296d4e2559b9323fd62a88309dfa358d0f50e497422fda033ab932efe329778875e0910d8c3112a5fcbbbc735b65615f3be9967d7b11c97000000adf8ab11841ad2748082d33c94ca77eb3fefe3725dc33bccb54edefc3d9f764f9780b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a07f8ce359b34b6f4cd44731e27dc28d77c06000076e9410b7449d37a20bb70195a004d168f42a20735ee67160787c97bb2ed0af47704b6881c948bc109f988e824900000073f8711b841ad274808302067194c2f494b48ad2f056a8044dbee2de2271decf9171862d79883d2000841249c58b83104ec3a0ab4334a7b07567d78b9c4dadfe8a1d5c0a961d11226b0a3aaaca3d036a798d2ca07500d734bcbc44d932c33e1ce9d176d0f55c0975b6f11548369afcb1a3eb61b800000074f8720e841ad27480830206719454a4c52cba8a270a04626a83a48a205c8b7981058701476b081e8000841249c58b83104ec3a0f12e8c70b01cf8f0b046c4b4401eb4ebff4045a98765d02d8d0dbf7e5332413da0617625a549d68692124872775f6bae1f6c8f51b8781fba5ac454915f65e20265000000b5f8b310841ad274808303dc5694ec53c830f4444a8a56455c6836b5d2aa794289aa87470de4df820000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000000470de4df82000083104ec3a054883d0ae061f43811276eb77ce1e4439ff1b0d6894ebd9df345c7c8d1ddc21da00c1c04b375d7b6a2dc5102306065b72a187488783c5d8a10fc6e4beb873bc79100000390f9038d16841ad27480830493d3944e998615ad430c1ca46a69d813ede6eb3ec55edb80b90324301a3720000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000076efcfcd0000000000000000000000000000000000000000000000000000000076a00992000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000066030b5c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000716fcc67dca500a91b4a28c9255262c398d8f971000000000000000000000000000000000000000000000000000000000000000100000000000000000000000025603aedf9b3ebf600a6058eb6be7b97349c002f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000025603aedf9b3ebf600a6058eb6be7b97349c002f0000000000000000000000004e998615ad430c1ca46a69d813ede6eb3ec55edb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006c1c420c04f4d563d6588a97693af902b87be5f1000000000000000000000000000000000000000000000000000000000000000083104ec4a0245a1efa8c2a36d51a30734634cabbfa3f67e04d9c18fe958aa180b5dfa057f3a03aa013180e456fd54b9cb35d2bae11a3e90d7fc057fefb8cfe3207ffae4a0b36000000000000000000000000000000000000000000000000000000000000000000000000000000164101000000000043accb00000000660309150000000000000000000000000000000000000000000000000000000000000000000000000098968000130000000002d7f902d4278435a4e9008303b2f99480e38291e06339d10aab483c65695d004dbd5c69871172e3116d22a0b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000001095a610000000000000000000000000000000000000000000000000000000066124b500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001172e3116d22a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000530000000000000000000000000000000000000400000000000000000000000028b6778cd97e4dbd97f844981a3e82bf1a83858c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a091b3b4e1da13ccb99f5846d4a8a9928b2fcc0b52e63eb98bd7f8b8762aaa9711a04305a1ffbb3eff8004174a6db652246fb52ffbbbd08f310d14c0f0f985fe597000000073f87183070bf884283baec0827b0c94ac061f901252813ef3184af5f029f429296244f588042b617f68f690038083104ec4a02525c7c78955de896e6cc09faebe7595f41a4480d873ddaa477e6db7bd555543a04414a4e55ccd18a7b1b21ff6e4f3ee2b5f8047a0ac06a86781a1ef136a2524ae000000d6f8d401841d34ce8083046edf94ca8edcc306119143dd010a1d61f31c3380f409bb8813d8616c6ccf0000b864d2d0e066000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000013d8616c6ccf0000000000000000000000000000000000000000000000000000000000000000000083104ec3a00809d93e0e8d1154688426fe38e576caa9161351232271f2810a7d82779a7dc8a01639ecdbe179b6738865f56f5dc7eb5574ff169846fc47b9fc3a7ad4b14fc832000000aef8ac04841c29c72083014ba29406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0e2fdde7125d66b7ad34b93aa61c7e94b97800cef1e66f4dcd278b806eff8deeea068d9f04054d3310700cf47d9a1cd71538f9d99f4a1547d0f01534ba8a686f16c000000aef8ac19841c29c720830149bb9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69000000000000000000000000000000000000000000000000000000000175eedb83104ec4a0997810c1d831894172cc6a3edf964f445b7d3219cd9e175d304f6f01382e46a7a0481fb7c83d5f098d1b855d3b3b9505bbb9a58528817917948c845de3c30ec92d000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe0000000000000000000000000000000000000000000000000340b0e6cfe31c000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0c88bfadc38c767d66658d14a8d87c4aa8e52f406752279f4aca4970ba148121ea05a7ff81741e9256b6dfadbe47fecaeef610d7e20dcf51096d6d5d1483d77a2ff00000075f87381c7841b6b0b0082cbdc945300000000000000000000000000000000000004880aaf96eb9d0d000084d0e30db083104ec3a07afd908a6efb57f87ca61a08fb1b1f78a6258a1f4385cc28b22f36af7e5badeaa010dd0da195b88e6e9401fd035861f048281a05c0d12f76674f052bf67f6ca524000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe00000000000000000000000000000000000000000000000003fcd703e6af70000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a0f97e0bdef170e5082759249ba90b25083ffeebc81309e33d56aa00405e93eda3a010a852996450a6678dcb73f27ccda0c57b2a5330f5ec115239d4b4f4ad7b9d4f000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000000000000000000000000000041f992c484787000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a0e6ca4e941cee6290a8637dadb1f62748eee2d0a4cd3b2aee8104e1c6f52bfac6a01135b72b72190c9f18fd83464610c897963894edfc69f743fe5f7eba745e72cd0000008df88b1e841b6b0b008301034c94eeb77b8d450ff62d71df3377e2e0abd0ec6b67e880a43fd1736600000000000000000000000000000000000000000000000000005a0a3bd5300083104ec3a09dbbafb683563d1085c00267fbe64a144ef56a0f0b1ee73d2066bf261cc257efa0541a6fd1fe125dc329a5cf5918209753850cf1318a3fccdedaf0ef06ee898038000000b5f8b30d841ad9524f8304155894ec53c830f4444a8a56455c6836b5d2aa794289aa87bb07303292d620b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000000bb07303292d62083104ec4a08c4b2fb7aa4927e2a62d9923810105306f268c5f5c6168952507993a399858cca07d2bdee13cbdcef332589d1a1270ae3c697cc3406d4efbf56ae26dc2814b5307000000adf8ab10841ad2748082eb869406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000018b71386418a9fca5ae7165e31c385a5130011b600000000000000000000000000000000000000000000000000000000021f2a0b83104ec3a00730a89b6d08dc9dcb55fc056da1f8d78c342a0f84b4e49f1f2275d036fec3b1a004b2befd07f362e0eccd84f1b03b2c4d10ba3403145cf35fbb78eadea2725bc500000190f9018d32841ad2748083034fd894abe292b291a18699b09608de86888d77ad6baf2380b90124b49c99b80000000000000000000000007f69b86bf797176cf5ff0833918fddf842761bae0000000000000000000000000000000000000000000000000000000066045a4c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000413df47d8dd1181c1cad3f5c1f4256a72c98385a9cf9b33de482422fe1b4f4f1130ac2d61af597e8c43e7e9106a22687ae819babeab243c1ec777277aeda5047c31b0000000000000000000000000000000000000000000000000000000000000083104ec4a0e3cdd4ca48e0a17148fb08398e079ca2c0def58f9829b277df38de805bb166dca025266cf7e107c0dbd66cb5c62abc6670ff5efe2879bd55c7aa5724147d6fe21b000000b6f8b428841ad2748083037b9e94ec53c830f4444a8a56455c6836b5d2aa794289aa8802978798d2c3f000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000002978798d2c3f00083104ec3a0399e99b24832643fe32dad689687d808c65f912f8ac090ff06c9ece0450d0e56a024c1ca39a8c0f1c0b216279e650e2a19ae2a780f4816217f936fa1e9525f4df500000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106873129b712748078b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eba2880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000003129b712748078000000000000000000000000000000000000000000000000000000000000000083104ec4a08b53c9bec4781132ba9a95cae6a1bacc33e966f794280fcad2220defa329c49ba07eb696391a3369eefa5aa83f8cbbacd28af772bc5e4c222122ebd61ea0ce4d6d00000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106873339d59b8570ceb901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b01c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000003339d59b8570ce000000000000000000000000000000000000000000000000000000000000000083104ec4a03c697055bd0340b73938e35e22f7c6a510fcd1d17ea2218c6c397f2bb594b7f9a0091ff1628104e0a8eb7213359e676e262dc817a71dd0cb65e912cdf523dd668800000217f9021404841ad2748083024ecb94aaaaaaaacb71bf2c8cae522ea5fa455571a74106872a30be8873b8c5b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002819a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000002a30be8873b8c5000000000000000000000000000000000000000000000000000000000000000083104ec4a0fa226da93cf391710cc5349f7cc9f2c9ab81b65008c18122a7d73d2bfe79ef9ca0496d3c80e571adf5d7af291f0986ec2151ce64724e374ce02fd362fa99ce3fca000001d6f901d330841ad274808303521794734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a8601d1a94a2000b901642646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000001d1a94a200000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000001bbb0000000000000000000000005cff95c443c25796c21fd5ec8f40c5d3761d732f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000700301ffff0201b6dacf7d94d871651a38e23ba8e4028ba604a605530000000000000000000000000000000000000404530000000000000000000000000000000000000400b6dacf7d94d871651a38e23ba8e4028ba604a605005cff95c443c25796c21fd5ec8f40c5d3761d732f000bb80000000000000000000000000000000083104ec3a068a18693e6093929d995b358eff06a2a4cfc4cf4693043373f2d49144d2d84c8a06d4ba3ed50ef3ccb4074dd5cf2ecaa9e7ee8083a77cc02972278e9ac9e7a1d56000000adf8ab0a841ad2748082d22894ca77eb3fefe3725dc33bccb54edefc3d9f764f9780b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000ea066b7f4835ce7e83104ec3a0fa17c5230902287bfe8dcec002746bd089249e02fa061410e78bed3cde636195a05865aa0bdc8168110be0af374e416ae995ede0b2bab62bd40d1ad3c8272efc630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c901000000000043accc000000006603091800000000000000000000000000000000000000000000000000000000000000000000000000989680001d0000000001b7f901b407841ad274808301e07d8080b9015f6080604052348015600e575f80fd5b506101438061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632e64cec1146100385780636057361d14610056575b5f80fd5b610040610072565b60405161004d919061009b565b60405180910390f35b610070600480360381019061006b91906100e2565b61007a565b005b5f8054905090565b805f8190555050565b5f819050919050565b61009581610083565b82525050565b5f6020820190506100ae5f83018461008c565b92915050565b5f80fd5b6100c181610083565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100b4565b5b5f610104848285016100ce565b9150509291505056fea2646970667358221220a6710181372d0f08d0c328ad9dc690bcf7935799fa8c413722ea2563efaa104b64736f6c6343000819003383104ec4a07d86e83fe8d525583ea25ad5746e3a5d428266c22774fa533fd41b3b61bdd119a031b9770cdbf20152cd64bd7563d0612f9ea001c642e37ed939e8315e2da7ccce00000190f9018d0b8422de64408302d42f94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a13086000000000000000000000000000000000000000000000000000000000002e006000000000000000000000000000000000000000000000000007d80813d322df800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000475f01342d61234767c2099b100fb52f06eb77cc0000000000000000000000000000000000000000000000000000000066030b0700000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a01fe43be052ff70ac65495980d44c9b1e905704e44b16b3569fd3071c37f2197fa04bea0c740b627ab769101ea3eb2833ffc6edef1f1cdbe5f8d6bfe70d57fa80b000000190f9018d0a8422de64408302d42f94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a130860000000000000000000000000000000000000000000000000000000000021a30000000000000000000000000000000000000000000000000005c9b7aab58cbf000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000092ce7f1504a8cb95627be59e916bdc6ee69c23ad0000000000000000000000000000000000000000000000000000000066030b0700000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a0022effac4d868312603900cd778557bd2177e02ce3e5bdb1af420c8d25bdefc1a04fb515f79ae7212554dcf42672cf0afd153c6a95f1629155727dce7d6ebc43b800000170f9016d0784202fbf0083036e1294efeb222f8046aaa032c56290416c3192111c008580b9010418cbafe50000000000000000000000000000000000000000000000000000000000569fa5000000000000000000000000000000000000000000000000000559d5f0cee28600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000436e3d22c78fa52cdce1d4157d6dc45b16fba6a1000000000000000000000000000000000000000000000000000000006603171f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000530000000000000000000000000000000000000483104ec3a06591ac2c3771d33030b15fddc632b4d388b21035a1cf61bb31c19706a4c03a08a0316c8dfa0141045312ad539019fd50cd991eee11bdf69b0c70fbfb26608d732800000073f8718303a973841d8119c0827b0c94ca9ad076f2c25571c719df64b2ec1d4087e15f57880d7621dc582100068083104ec3a0791f46a56340e66c96eeff3e65ddc73e0d69e655e6c55b2beab5056b4442fb4aa01e31811b2b870035e2bee93bce3a399069385a72c437e93fb3d1a0fff01ec73500000070f86e0f841c9c3800827b0c94e4edb277e41dc89ab076a1f049f4a3efa700bce8880e0991e40e4ee33f8083104ec4a068ed29a368883c1df9dc94102fbf65601c6d544a752b8a701d02c162b8ce568ba037effe18ac5bb0fa1a75e8ad91fe9f2345300b8cc783aaa7331f011219242bd3000000aef8ac14841c29c720830149cc9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000001e76de283104ec3a034ad705da8eae066174b882040819580094c8e48fa0c4e36c787da23835d49c0a01ce3fc8f51c97a43dd58342a755084443e1bfa9003ed5aaa25eb8b6faca3b35100000217f902140a841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106874afbafabc68896b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004744a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000004afbafabc68896000000000000000000000000000000000000000000000000000000000000000083104ec4a0e18d85930b47ef5cd0f1bfe0ad3058ab32dad5ca4b5ebc982783858adc0346e1a010f109560724d969d5b12fe0e4e3f899b8f6a1f52c9a5f99e8d2a65ba7607d050000017df9017a0e841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0809fe6d0fa8e11ddc844d53883d94e78a96d45ee2c4f58ae1bb8d74b059a2116a0476e07c694de480314bcedc3d3bb773c38a63f171eabbb9f0f420aba9d07748e00000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a741068734194f1bce2714b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031848380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa94710000000000000000000000000000000000000000000000000034194f1bce2714000000000000000000000000000000000000000000000000000000000000000083104ec3a0c17ba1939911153ec8bb51c8e412d26f822772c7528891dbab6f95abdab3855aa057aababb1a6ca4e0d5cf4279104f5c613759e7de99f4a0e06055f5a56c7d25980000006df86b1d841ad274808302067194273e78151cd2db0dc9f4899828c18e521a2941cc80841249c58b83104ec4a019cbcd4f5bcc9cd4215e720ce55d25ff0f696ef249935f308e838447a69aa8b0a07f52c2efcc75fdcdbcfe0cd22662396e113a28dbd21f77c7d7ab7018cfa67d9f000001d0f901cd0a841ad274808303b81094734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a80b901642646478b000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000001e5aa77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000001f30b02abb0daf000000000000000000000000425920b77a8b9819aa95c92c79e30fb68cf6c98a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007002f55bec9cafdbe8730f096aa55dad6d22d44099df01ffff01303260590c0e77d9974b6b20b7d6dd60f8254c3800734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a01530000000000000000000000000000000000000401ffff0200425920b77a8b9819aa95c92c79e30fb68cf6c98a0000000000000000000000000000000083104ec4a0910b6389a4f6a005b31c0ddc249d6de91ba655dec16336be0445cbc9873483f8a0137292aa1630013e6f64c3401262c9d009084a780406b24938bbd5f7124bf67500000270f9026d0c841ad274808303fdab94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009d34dc9c5d525f26d8404e8272aa993739b970e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a0d7b9e6a51fab5e543f897840bb6fb5b622b31208f6d32227ac826fd2563e84baa02bb3b4fe383203cf39e972e8faf0ca2e7727736a3503eb7e503bc91b4db41c15000000aef8ac64841ad27480831e848094ec53c830f4444a8a56455c6836b5d2aa794289aa80b844f2b9fdb80000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000011046260083104ec3a0c960ea7ca90cda112eb232a65a2a2566827247a4b52028f6cbcdf94973a86bfaa02398cf26701b68b0a67338dfe9c49947e8fbade0e61d53b87ab7811b6e417ca7000000adf8ab1b841ad2748082c8b6949595910db7625ab963d2b32a60c2db5bb9fd20c980b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000006f05b59d3b20000083104ec3a01bf31301e3354ff3b9836ebf347b770d4fbee2db5c9e060192353cb297a502c0a07f1eccebe433649bf218911a7230bce64e62d4e194cd79026f614aab6afe2df400000270f9026d04841ad274808303fdab94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000005f24e8fbfd0844ffa2cfb0418d60eff194142cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a0e97d0d66ab74bd413d9521973f1f050accdd09ae8e9c384cd611e9fbeced5723a01e6293ef56b6ce7caed52cd8eb2e9bdf892c59c455283f9c28dfaff123f9d066000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001ee1a51083104ec3a0c20648081296674474f96547dedd9fa3f293584c0984b7ee61726f39732a7971a0788ce9cdb56532cef8ad8f33b13d3fb61579c281bc75666833bf4b07cb5c1691000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000022ccdc7883104ec3a020395401981a8262b6130d0fa38d0f615a349f9c68344df206fb876dd9e71aaca007711903efdc54267e0c8be83c57cb2db31846e9b2bf7d69c80026aacea4036a000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000020a9a69983104ec3a07d34952808501066143a63e5ba3cd6467c4ffd14617d9606ca7adcf062d0ebd6a05b6641b0fb4442541bd698c2c4d4da7840dd4aee3e4728f3d1a02ab9330d0328000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001f4bd9f783104ec3a042ccaf811871cd23a3d2c41e8146bd51ce4e6049e6b857df049d2f2b3567c19fa00cb2cad4f4794bc2626ccd432371b0f8db9326fd9649e4b89a2d64741ae079a3000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001ef0def183104ec4a093b449d504cc75f4192d97bd23c26390e70f345a8eaa8313b6691952f8fd51dda046985aeec26a2d570ed98ebe7674ce45e857aafc2e3d5137b7bc91f33b6771b1000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001fb6898c83104ec4a0fb31f9b731f4f5246dbb8c0a1bd005c91245c567adb04347597520bdadeca646a0077dcb8ebf14edc7fc49c59a240c900bff62cb9a70d98871fc8f039e2ac619d8000000f5f8f322841ad274808305573094ff75a4b698e3ec95e608ac0f22a03b8368e05f5d87038fc4b888fad5b88402c5fcf800000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe00000000000000000000000000000000000000000000000000038fc4b888fad500000000000000000000000000000000000000000000000000000000000000020000000000000000000000004b176a868b4a3803387bf3ce0ffedecc7e0fc50e83104ec3a098f1be3aea29b91cdbe18c1a3ce4f6143c9613d07207c6609d0d7105fe6802b8a02a6d49a7d36a09b3d5a6b7179211127a77885c3499a5a8e482d74ab3c365d1a7000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000215ffd7f83104ec4a087cf97447b37eb7a9fc9b3d98d155ab1eef7a03079573468e10e0520039e8f28a0020dd50b494bc4c63218d11a194136e4a8c8cc481686494272082aa9975d08f0000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001f981cd083104ec3a0ce0aab44f1aea8823a26f2a1838cf8311ed5739c71fb4e8471c8e76b4d6232c9a06e39e759e4d8b9ae186b104874ad4c90822eb7771c3a82ec3d8c773a61a66677000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000219ce99f83104ec3a031ccb64003e742d6b516f1fa6eaac8aeca3648c54d9bfbecd9900bae4bde2365a010c709a9c49fd1e9c64909e3b0b4d2b841ef528541f28cac679ed6b5e48d857b000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000204e59ec83104ec3a0500c9f36d00fbf063f8c5c4288099e3090dd2c2c5e733542ed820aa3c78e5ccfa00bbbc274c36543299e0450ed9a2e3ddf0cdec853fc71b041305b2009baea0957000000d6f8d480841ad27480830493e094ff75a4b698e3ec95e608ac0f22a03b8368e05f5d8801aa535d3d0c0000b864474cf53d00000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000f6871e3d0e0ae33b71c8e8c0abda6d3fe0d8cc2c000000000000000000000000000000000000000000000000000000000000000083104ec3a0e6a8685340b69454139172bd73c7ee6a04699f73e6a9f020f0b7d6d0cecae7caa06c939dbba762d7b5512863bbf2573fcc03d9a4c5aebaffd5fa26a6b0b71b6c3200000190f9018d0a8417d7840083033cba9426cb8660eefcb2f7652e7796ed713c9fb8373f8e80b9012438ed173900000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000b823b09640a0a2eab00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002cc5bb7daaff7d3d538f895e125b0eb2f616722e0000000000000000000000000000000000000000000000000000000066030dbc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ddeb23905f6987d5f786a93c00bbed3d97af1ccc83104ec4a00906883b81dde1ac570704c60b87171cc37ad8f5138350aa8023f73ed1099ae7a001194e98ebaf1db788fe3ff0cd5d7722978785c7212c7cd1076431ad4cf677d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201d02000000000043accd000000006603091b0000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000000000043acce000000006603091e000000000000000000000000000000000000000000000000000000000000000000000000009896800009000000000072f87083070bf984283baec0827b0c946fd089754eafd49e4576776151eba0ea2ec11c7e8713b89ae725f0018083104ec3a02e52f968656b47a019b478218e644de12af47c208adedec9993dd62ad6a3c5aaa02ab7722012ee15c50450c4a3f04885845bad0aa021b51e80b5b25146ac4dd1620000006df86b0284202fbf008302a43b9419fa769fa67663ba72865ca555d6a86a986442a580841249c58b83104ec4a03990ddee11e2a81c24c4edb588dc8fe18fbf2235f9157873113242ba954d0891a06733d1369c4772d7659e48670e0c9a60491a954a167f821ed7efea4c50fa352900000132f9012f830829f184202fbf0083053db4948363302080e711e0cab978c081b9e69308d4980880b8c40894edf1000000000000000000000000000000000000000000000000000000000000004017ce55f79af7ac171133b22daecaadbda722b00cbe2e3a173fc10c51adbd6a7a00000000000000000000000000000000000000000000000000000000000000510100000000000001450000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe0400007606000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb00000000000000000000000000000083104ec4a0fb6a1b9c8b18bc1f6db5985361b436313999ee600a7844345a555401e9d9d92da07819fc92d50a76b0712409cb043d21d3428169dcde380e01b4bdbb5bd629a90c00000072f8708303a974841d8119c0827b0c94dcb2127a1029df85fc795df2e12722d06191bcb08764b82cbf61e0068083104ec4a038c29ff67ba3ba42e210113b31143b06d501db9d9d26f92d73e4a45b74b5bf03a0594a213b08669c58c832b266286d03599fb0fda209b11643b343839b5717b27b00000217f9021414841d8119c08302ab6594aaaaaaaacb71bf2c8cae522ea5fa455571a7410687366d6517b24920b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000366d6517b249200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000000000000032aeb28000000000000000000000000000000000000000000000000000000000000000083104ec3a07e2d92299c3ea8ca1525627883b58ed65d7e491065aa9eccc35f59556ee07d98a02cadcdc0410a9e6fc4adc6f7671496dbff27c82b76416291c9101289834072a6000000d1f8cf831111b0841c29c72083022cc49487627c7e586441eef9ee3c28b66662e897513f3380b8649c66c25d000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000006eb59d313dc6fbb976e5f435a9ca8c2cc6922d0000000000000000000000000000000000000000000000000000000011a02a4183104ec4a0f445c7875a4a42d7d7bf5b125f74afc1e3eef833cae50d9bfc8debd2bc76c229a059cce50a9e1b8a804cd09741d081b0829b1b36ac6a8ebff74cdee5b1511ad42a000000aef8ac0b841c29c72083010d8194f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f00000000000000000000000000000000000000000000000000000000006fe3e483104ec3a045e35c184a01d54a868458ae6ea066eb493e555878a0b6da96f50fe3b34d76efa06d56a84ac6ca303641c572d26b9cde60f4af3d143e1cc0e241a1deb22c0c9077000000b1f8af831111b1841c29c720830152849487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000b3261b2c33af77719b2dda538e667891b301ad7800000000000000000000000000000000000000000000000000f7e395631cdc0083104ec4a0d0856f1e34fbc599974afe5bd69142636d6858a71603ab9ab4882a1779dffe8ba04e7f9d7e956550b7681dba1e56979ca19cdd405d67c2cb0498c7635ecf8a031600000073f87105841ad2748083012fcb94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec4a0847500e5ec91d53c265a5b8dcef136ae760a90fc7cdbcf75968330ad18be4fd2a02732b311ee5f57a5da93e836b1a27fde5320ab97fe757f9759325baf2ba773b800000281f9027e36841ad27480830269518086b5e620f48000b9022360806040527389a512a24e9d63e98e41f681bf77f27a7ef89eb76000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161009f90610185565b60006040518083038185875af1925050503d80600081146100dc576040519150601f19603f3d011682016040523d82523d6000602084013e6100e1565b606091505b5050905080610125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011c9061019a565b60405180910390fd5b506101d6565b60006101386007836101c5565b91507f4661696c757265000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006101786000836101ba565b9150600082019050919050565b60006101908261016b565b9150819050919050565b600060208201905081810360008301526101b38161012b565b9050919050565b600081905092915050565b600082825260208201905092915050565b603f806101e46000396000f3fe6080604052600080fdfea264697066735822122095fed2c557b62b9f55f8b3822b0bdc6d15fd93abb95f37503d3f788da6cbb30064736f6c6343000800003383104ec3a0f911e0e29e1258b995ae71042379cd740f391a691afbc36c3d2447c940ecdc1ea0720fdaee461776981172daccd0fc1944d4aa27516d6cb21c5965d9ff8de8ad0f00000210f9020d13841ad27480830256ea94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8f16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000002f34d2636990f000000000000000000000000000000000000000000000000000000000000000083104ec4a0a27c402c1293b7a584e42af5fc7b70bd57cb198801e4670978265c0627718f38a05223a6e9be820d5cd3406e0c6d475df3e07f826345ccdcbf8b3c91a628b3e6a700000093f8911b841ad274808301771094c5471e35533e887f59df7a31f7c162eb98f367f7865af3107a4000a440d097c3000000000000000000000000739815d56a5ffc21950271199d2cf9e23b944f1c83104ec4a0c2692a2380475366525a34062460ff666ca8f1a32cd0cdabc7d9afeed238bbc8a03c0661ed2c1aafbd940c52cde49032dce96e4f21a8e23a6962d809637f838c650000006ff86d14841ad27480825208945e809a85aa182a9921edd10a4163745bb3e36284870b30e8870ae00c8083104ec3a029e98c9011caf0e63a1bb3d27b4a06c783e842d692b16b811d2d71b0ba90a483a04bba4b777a2a65c6a71182f1aa4aa925bc774d88d01a2983a5e3583b50022d3300000210f9020d23841ad27480830229c294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000010164e6760b7e770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000000000000f49ff11000000000000000000000000000000000000000000000000000000000000000383104ec3a022b2fc4ab92c271c924991a2a579b67d8e6e369bba4fc3b731a4676475179040a05f910e519cd6443fe365fecc0744b727356ce39b4d965a98e7740bc2f606be50000001b0f901ad08841ad274808302a04e94734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a80b901442646478b00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000001e60b98d000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000001e5155d3000000000000000000000000b2daa35f73e7bd029430dd2abc0f97d453113c2400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000420206efdbff2a14a7c8e15944d1f4a48f9f95f663a401ffff01ae5aa896bb93f4c7c5660b7fc894b3892255d01501b2daa35f73e7bd029430dd2abc0f97d453113c2400000000000000000000000000000000000000000000000000000000000083104ec3a06ed42868188e9c95e2069c4e8e72579b9cc936079197847121a755e252e1537aa0348ded211a76b24ee3cc22fe14e8b378d3920b6acacd8360d10636aee263b9c0000000adf8ab18841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000000660b0c083104ec3a0ee48f7e6db2cb90da7519f8562532824bfaf9747b6bd9e56e1bcdba49f26a0fda02ae141d7002a4b0f64af376d74fb4d6855d78287329d4c7a66b79cdaf6c0e3ac00000073f8718303a975841d8119c0827b0c9469c24c302920836f04e886bd64d30c486a778f5788016345785d8a00068083104ec4a0fa64d94ae462bb48e0fcb4ad1d7dd4de3f30435b24ffc07d1ca1a08bbfa26427a02db84c6d7659fa4e44f83c933c97ba02297f4d81fa977d90f077e759db45de8400000238f9023502841c9c38008303dca794aaaaaaaacb71bf2c8cae522ea5fa455571a74106880159584f7fec4290b901c4a15112f9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000002f3cc000000000000000000000000000000000000000000000000000000000002fba00000000000000000000000000000000000000000000000000000000011098e8d000000000000000000000000000000000000000000004048cbb95ee800000000000000000000000000000000000000000000000000004196d922175f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a081f17782e61ebe34e2007b6f3a16a781425e53becb932d6b7a449583ac9344f4a0443c468a02d4fb0f93cc3b4f85bbc369abdb0556575b754e891ce5a125ebc0310000006cf86a06841c03a18082aa4c94c6ca94b94315391617b3fa4428d28c0de17597fc8084b49004e983104ec3a0c66cd99d4c1d26bb853694c0ac5108a79ff1f254d0f601f293f528db768683ada0291e7aac3710358caab0ae265a077bd7335556e4f3cc7c86249de535f6c5a12e000003f0f903ed04841ad27480830526019474670a3998d9d6622e32d0847ff5977c37e0ec9180b90384186aaba2000000000000000000000000c450a132d34a6fc85b8a1c077d389ec7bdb4870c000000000000000000000000c450a132d34a6fc85b8a1c077d389ec7bdb4870c0000000000000000000000004e42d45540d04a828529df0c5290acfbf4cbea970000000000000000000000004e42d45540d04a828529df0c5290acfbf4cbea970000000000000000000000000000000000000000000000000002580019462e9b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000159b1fb28aa415b48ab56e858df5a5b3ad869b1b76d6b72351047f5269f679a0713bb28bec106e0ed9e65f69b739f2c6d018ebf04fd6e0f137f67cbdc75b6334c0864f64b5a9b3cb613d31cdbcea38ae049ad9960a3e9cd81050fee68214bce9d58865a99a1f71ee55db2e9c07bd1e490c596e4dc2b10b18e0fcbed322398649b7e82f2165f4350d9157241cf461fa2836fa09d227cd2898e329181f54f1d80713c8e95c09efa040caa07abce478b5deff0f1f5a5371e81b3ff8961988f48e64c1d8c260b127d26806e1c1eaf5f14971d3ad3829bd62f04203ae7b1f9d41d648aab3eff2c7f89fe827ac5d55d015879a90ffbf5e468a184701e7ad7c81445083227f015c4f2f546dff8b3690e6a99e3ac159cf7dfcd2f595318140ece11123f821e0fa825f3c0ec7baf5a6b4331c799ed802207aa212eb874469c1261fd024da5cd502cccf84e7be4d847fa2f2de49f76966445e9e46316d744fb0aee51348642a0825785e0e6aa8b06a1e289b04c891f0277aa616f9cbcf8f26e76c9bcf65a850f39023e5258e80edbfdf92a61c0ec8af5a8012094c46d6165db2dab7c3b2f5f3abe9f79ea07b41c83d80e14bae4ae3b137e8098f8fd95879af3f73d09593d95e128867c4be9f258bb937de01fe3ba8cc5fdbcc208ed8faa160f262cbc27ef7bb901a3b1f9350982ce7c565af835f55700d83e417c02c5146b7f3f6a957d5649d2dbdd0d815f3158da3950ddd3eeb17486eb68bbdde553657b3b56e4d4605a97081d69cfa58131c093de2a3e8c4a785b9600716ab6230a56aec96f20e930c19c9f4b5357269464dcb91a44fa36a477da5a7611c663adee42398b8413237187ea66c2ecac3c1c4086691092198093106ff7b01548d972b65aebc95d415bbe288e5f764432b9d14c964dc5c5056592e9ef7a2c04322199a1efc9fe7d04930c6058983104ec3a0a65059d01fd97bbb95a91a91026dadbc5a723b8b52fbc56bb64cc71d10789e93a0612cce881c9d823ba69ea9d198b62f347852d6f510c1dd973dba16c9148ce21a00000217f9021402841ad274808302740b94aaaaaaaacb71bf2c8cae522ea5fa455571a74106872e8a616e8ec000b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002e8a616e8ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa94710000000000000000000000000000000000000000000000000000000002c3b5bf000000000000000000000000000000000000000000000000000000000000000083104ec3a02fccfc3b0f7b675350cd4193481ac9582dd301b5b8409b2ce00fdcdeb5b799aba032988936faa724d772033852d10bbe42784f35ed89d39ffae58d1ce704fd78f6000000adf8ab2d841ad2748082861b94f301805be1df81102c957f6d4ce29d2b8c056b2a80b844095ea7b3000000000000000000000000ff75a4b698e3ec95e608ac0f22a03b8368e05f5d00000000000000000000000000000000000000000000000006f05b5a143c3cf683104ec3a0ab48933e0547e0eb1a95b740c464a31099eec141d35720e1dcc568003910c818a048df38d59471b241b8fe72de7bdff81f2ffc44f393234316f0e4211e858ad93f000000f5f8f3822937841ad2748083060f8c94e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf1f55bec9cafdbe8730f096aa55dad6d22d44099df5300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db790b12abb5bcb50c2aa6f1b54447046640010b3393300f8e0469c1dcbbc000000e8d4a5100026ac27292710271f020026f726f783104ec4a06a9c721361a1902f1b8a90b321047b1bc8ea20775603bc677dd48356f731dfe3a01323aa1b012d4ee1e15fb016b2bb5e59a257f49aabe9bf9f9437dc96866c6f370000006df86b0c841ad274808302067194bead4b41cec7c9c3d4d9573f022991d156ab8e6180841249c58b83104ec3a06e428d0c5bfeb2f25b4b56c16ed64e983c5414c73e1f79930757277b27b1867ea07d1761ef7a970e66583311301b6368d6575d01786b77a5855dbb81e2cdd38d12000002d6f902d308841ad2748083025b929480e38291e06339d10aab483c65695d004dbd5c6986fe021b375200b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000d8b8c269b709b45000000000000000000000000000000000000000000000000000000006603172800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe021b37520000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b39880c7a0b752179d6d7d9ae594ab4c02d6e5b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000afc3e152db7f97eb0a731d622e868a482de840260000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0913f608b08d82ed936005e7045c17a25eebf4c9e7ed7b61b6b8cdf8d58392caba021657b08c7e7a910bff2dac689f0d5cd82ea2e60da6c793e34df9a90c0504cfa00000000000000000000000000000000000000000000000000000000000000000025a201000000000043accf00000000660309210000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000002d6f902d3158459682f008302bb209480e38291e06339d10aab483c65695d004dbd5c69877ad8000bbf3601b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000738db3100000000000000000000000000000000000000000000000000000000660337f40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ad8000bbf360100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000482de86c457a243f2c9a11f00436f0808bdcc4a40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0f25f8b2b66dcfcb32ed84d164c3c2b9995d20dd0eb58f7c0d51d2d75b8b585159fd1996b114a0e1df967f8b59a20c60956693f091300a0f08e9db7e3cfcd5747000000b6f8b424841d8119c08304096f94ec53c830f4444a8a56455c6836b5d2aa794289aa88033663a70de5a000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000033663a70de5a00083104ec3a085e28b9f6882336f8b1eeba8dd6399842f566e005b8b9eac2317c0c3572560cba075c4fe034eeeac6b31070c2dc6407fa21a8ae75795a1e1fbffad0b220e3e167d000000a1f89f820631841c29c721832dc6c0949691a483309a9c51d951995c174b6848834981f380b6180166987c33180009c4b4137eaf6a46a871c5c8aec751a154e1ce1db79018040000530000000000000000000000000000000000000483104ec3a0915166da63dc4860eb874d0463a041587735a19a3dca107425c0b3345a671623a0659727ac2766c55fc3316b6c8459b2be507ec79e28eb78b2cf9abd4754555dfe00000170f9016d2e841c29c7208303fe569418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000005d5a500000000000000000000000000000000000000000000000000005c499538f2a6300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001febd2d5bdf7e504eb0fae7f6b805ab5b5934b790000000000000000000000000000000000000000000000000000000066031023000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec4a029555b419e79d7cd8fb4ba86debc6477dbf39dc1df0914bad81384d399471abca051a03e52d1b5965580ff399f964c56dec249665260adee246d8b0a097bb55439000000f5f8f38229a2841c29c720830c350094e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf106efdbff2a14a7c8e15944d1f4a48f9f95f663a45300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db7906905c59be1a7ea32d1f257e302401ec9a1401c5200f8e33cbaf0b1b3000000e8cb4035ea26ac272927102729020026f726f283104ec4a01accbf9170c2af5f2a9184f1389b7ea25f521f0201bef361f597272a61965932a03cac18a2de505c9e8c0527d562fa22300c6afb3c0767f33430de01402568ad04000002d0f902cd11841ad274808303b627942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002467d653f52850e8c0000000000000000000000000000000000000000000000000000002b83196b5acf00000000000000000000000000000000000000000000000000000000066030b36000000000000000000000000000000000000000000000000000000000000002bb65ad8d81d1e4cb2975352338805af6e39ba8be8002710530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c607178c0a0fe335b3880bac259bdc5ca685cad30000000000000000000000000000000000000000000000000000000083104ec3a03ef39feb6370ce664e954a457703c723f4942234f93d4bc874447f48b95a1fc2a002aed6594e91099ba2da28b97339007bb1485db9b6bdef34fc6ade35b6b97219000000adf8ab0e841ad2748082f4449406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0da7a9d95bfba119e044558af8a4018b92dfc4f3f8b3d17b5ab4e0ef3f42ae128a05911620ad73109cc496bcf786c0285871783dcb45e6fff98e6c79ec5a48db0b700000410f9040d12841ad274808303710c9480e38291e06339d10aab483c65695d004dbd5c6980b903a42cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000259b8f93a088f200000000000000000000000000000000000000000000000000000000660337e6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000000251723d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000aff84642ba059a901208839e99c14185fc0773c10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a04b7db67703b4bb61b576b2887e19d49f434beaf5fa4d5710da0bd5822d44f2a5a07826b352886816ffc23ae5811637b97cb82e9024285dd38806464f9ff8432ab100000390f9038d0d841ad27480830345c09480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000eba4078b60eac00000000000000000000000000000000000000000000000000000000660337f6000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337ec000000000000000000000000000000000000000000000000000000000000001cfafffd218898da4dc45995b29a0b29fbd8bf86f900d23980fdfd1c880dc311bb3f453cc594f4b1441613b97c5eff5f2b971b6fdfe0095944a07a2e88757c7771000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000000e87f8a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000d4916b6b4a95c945e903a1474bdd8183cfca47b30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a08686107f87ea482622221780459ca82c85c42c87a146c40e83cd44743f9da633a056bee0efe56aa55e1ba8cf7c758498c2b3ed524ea71c1762da4d786d4c1de00300000418f904150e841ad274808303cee49480e38291e06339d10aab483c65695d004dbd5c6988010c3494671ea766b903a42cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000fc43d2500000000000000000000000000000000000000000000000000000000660337f20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c3494671ea76600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000053000000000000000000000000000000000000040000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000002439654cf4ffc8ac1bf5e913a0aab8c25d32e5a10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0b8fe9aba8fd8a936667532c1d25ed7c4e5103fe8feb37c1ca3345e236454a438a04a6b919679e78ebdd52c8da87c67e20e826cc343d80a39750ce6a6abe8f3821e000002b7f902b402841ad274808305f10b942db0afd0045f3518c77ec6591a542e326befd3d7872e2f6e5e148000b90244ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000014475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000727813b43dd284a81051bef1ade82b387157d357000000000000000000000000000000000000000000000000002e2f6e5e1480000000000000000000000000000000000000000000000000000000000002c3ad2b0000000000000000000000000000000000000000000000000000000066030b6f000000000000000000000000000000000000000000000000000000000000004253000000000000000000000000000000000000040001f4f55bec9cafdbe8730f096aa55dad6d22d44099df0001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec4a0e0b856fc711f140d980bb92545929c1b0745ae922e85179f2bfa75a314d115aaa06d977aa5ab9a2e50f80dac2e05f7f8d77dfcb258347d5f5e2f5be11a0ac07c1400000170f9016d11841ad274808302ed9c9418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000fccf045a0ec600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e6c23a33b8492e2aa9eab7d37853e86c8600da2a0000000000000000000000000000000000000000000000000000000066030dc1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a0f44ce0b36335854a8868118e9cb8d86d04731058c216b496a74c905ed19710a6a04a5393736bd4b36dd984d714deeaec876b191926e5bb874c37f93fa8805ec24200000094f8920a841ad2748083017bdb9422104ebeb88d45d7c5682edb461c73544ab791c8870193d0ce47c000a440d097c30000000000000000000000001943f0ec6cad494b11739525342674e939737f8a83104ec4a0d4c43bc669a0a6f03775e9f39bae0749ce20aa502cdbdc15a025d724b8a61a06a07c87a783473de35a0c468923c8f572cbce2081a1a99a921854b47c8fc6802f98000000f5f8f38228ca841ad27480830c350094e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf106efdbff2a14a7c8e15944d1f4a48f9f95f663a45300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db7906905c59be1a7ea32d1f257e302401ec9a1401c5200f8e36c3d54b220000000e8ceaf2f0026ac272927102729020026f726f283104ec3a0022e2c05509973e3a9e296c09e793e07c6a39a79d4d498573196a6a04ea3ad3fa0460fd082794e439610bc9ad8b804a332e23240eba6cddc62a082572998c9c367000007d7f907d413841ad274808302e492940cab6977a9c70e04458b740476b498b21401964187030429376a1000b90764a4d730410000000000059e1b6601d06d916bbe845c424dc9317e8b815ca18f207a12c84a6ec522b6ca5e44ae66295da9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5f7d80e72b9202bf51c5bc387538262ae993ca117a0e481f908209137a46268ebea49653b798e1cc5912de2b287648df6cd3a8dfdd14d938cc889223e29d06e430bf3320f1062480100f29d53789c2142cd1804081c1f2d765e838623dafc1d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000680180000000000000000000000068089c372275512e09f5359f82ce68a9d46ce19003201000000000000c803e8916bbe845c424dc9317e8b815ca18f207a12c84a0000000000030429376a100000000000000000000000000000000000000005c10000000000030429376a100000000000000000000000000000000000000004de0000000000030429376a100000000000000000000000000000000000000005d10000000000030429376a100000000000000000000000000000000000000003ed0000000000030429376a100000000000000000000000000000000000000004d70000000000030429376a100000000000000000000000000000000000000005c40000000000030429376a100000000000000000000000000000000000000005c20000000000030429376a100000000000000000000000000000000000000005c50000000000030429376a100000000000000000000000000000000000000004d30000000000030429376a100000000000000000000000000000000000000004d10000000000030429376a100000000000000000000000000000000000000004d20000000000030429376a100000000000000000000000000000000000000005c60000000000030429376a100000000000000000000000000000000000000004d60000000000030429376a100000000000000000000000000000000000000005c70000000000030429376a100000000000000000000000000000000000000004d50000000000030429376a100000000000000000000000000000000000000004d40000000000030429376a100000000000000000000000000000000000000006840000000000030429376a100000000000000000000000000000000000000005930000000000030429376a100000000000000000000000000000000000000005940000000000030429376a100000000000000000000000000000000000000005950000000000030429376a100000000000000000000000000000000000000005920000000000030429376a1000000000000000000000000000000000000000058c0000000000030429376a100000000000000000000000000000000000000006850000000000030429376a1000000000000000000000000000000000000000067e0000000000030429376a100000000000000000000000000000000000000005900000000000030429376a100000000000000000000000000000000000000006820000000000030429376a1000000000000000000000000000000000000000067c0000000000030429376a1000000000000000000000000000000000000000067f0000000000030429376a1000000000000000000000000000000000000000058d0000000000030429376a1000000000000000000000000000000000000000067d0000000000030429376a100000000000000000000000000000000000000006810000000000030429376a100000000000000000000000000000000000000005910000000000030429376a100000000000000000000000000000000000000006800000000000030429376a1000000000000000000000000000000000000000058f0000000000030429376a1000000000000000000000000000000000000000067b0000000000030429376a100000000000000000000000000000000000000006830000000000030429376a1000000000000000000000000000000000000000058e0000000000030429376a100000000000000000000000000000000000000005890000000000030429376a1000000000000000000000000000000000000000067a0000000000030429376a100000000000000000000000000000000000000006790000000000030429376a1000000000000000000000000000000000000000058a0000000000030429376a100000000000000000000000000000000000000005870000000000030429376a100000000000000000000000000000000000000007620000000000030429376a100000000000000000000000000000000000000005880000000000030429376a1000000000000000000000000000000000000000058b0000000000030429376a100000000000000000000000000000000000000006740000000000030429376a100000000000000000000000000000000000000005820000000000030429376a100000000000000000000000000000000000000006770000000000030429376a100000000000000000000000000000000000000005850000000000030429376a1000000000000000000000000000000000000000067383104ec3a0c50c30a27cfc14080b1790771935d855fb83ed3c7fe51af2687f94603f4c02f5a010d2845c439255ec424463f2a6bcbd22e5b5e03db5dcdbf5425996d2513899e9000001d7f901d409841ad274808304ce8f94aa111c62cdeef205f70e6722d1e22274274ec12f873272d323cf8000b9016467ffb66a0000000000000000000000000000000000000000000000000000000003062b2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000005e4819feb6ecf0a42422795527f22de8862778060000000000000000000000000000000000000000000000000000000066030b6f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000183104ec4a07ff55bc61e0268fc8ea612415bd4287fceef57ef2712ad9ce1126e9ad53c800ca01975d9200b39e90e7b662476e4ef261cca1b99d33ec3d5dea44bb3b40e992274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000295201000000000043acd00000000066030924000000000000000000000000000000000000000000000000000000000000000000000000009896800016000000000170f9016d268435a4e90083040896940122960d6e391478bfe8fb2408ba412d5600f62180b9010418cbafe50000000000000000000000000000000000000000000000000000000001d97a7a000000000000000000000000000000000000000000000000001e32e1c0e66f9c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cb6daccc8334a87130fecf629a800ce89cd064810000000000000000000000000000000000000000000000000000000066124b5f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec4a0b6b31bd11522834787a9b10f3ee6958da517f3536692c20db2be4e80f9969a72a03d9f42f130cea4314c06e1698bbb83e379d91691dd913ba62a5d9dc0e3036aef00000273f902708307d3d084202fbf00831b24d094cb566e3b6934fa77258d68ea18e931fa75e1aaaa80b902046c459a2800000000000000000000000038de71124f7a447a01d67945a51edce9ff49125100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000066035d7b00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000084704316e5000000000000000000000000000000000000000000000000000000000000006e4f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf00000000000000000000000000000000000000000000000000000000000000144f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000822e7078be9c69af7894ac13390f2adf808a9d0c8243112403660494cfc693d4352feef8c781e100104bc63b14c178fd7469d60cde49b86699023b7d7a18c078391be1600ddc61d2cfb905b96a203e8e655c3a4b4075f9114cbb92f04c511d3fb88c4d2ca3574a41533d992079d7a09435a202b4de8089df61601c8f0b324534de571b00000000000000000000000000000000000000000000000000000000000083104ec3a06d44e5865d0f750648bf85f565b63c9f7733078e98d8e21c75695027d7380aeca026bd68ec8ced0b5baa7f36238018a843a89a35feb6ea00b67f99920e1baf201c00000870f9086d3184202fbf0083045a3f946131b5fae19ea4f9d964eac0408e4408b66337b580b90804e21fd0e90000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000009f5af55fbc3d34d69aae140cc5640a6c80ece46f0000000000000000000000000000000000000000000000000000000066030dcc0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000401b96cfd40000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000083ffefbca071347df469c4e64820c95b01b957be0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc89700000000000000000000000000000000000000000000000000317f8b88feb286fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd008d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000003200000000000000000000000002faf9320000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000009f5af55fbc3d34d69aae140cc5640a6c80ece46f00000000000000000000000000000000000000000000000000317f8b88feb2860000000000000000000000000000000000000000000000000000000002f8af3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000317f8b88feb28600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f07b22536f75726365223a226d6574617661756c74222c22416d6f756e74496e555344223a2234392e3937313432343931373637313137222c22416d6f756e744f7574555344223a2235302e303032323236222c22526566657272616c223a22222c22466c616773223a322c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a224e35535949654d57494349374466514d64722f6a6242777a57376f4d7547717130486a7a4c3759777a59423839682f7a502b4e37786e6b35745335436a58396444765036382f7a78783831546c6e38716253544d596a71694b31656f2f746c383368793363415a37616c6746423437456c42682f43387a656b7052394a5950373157492f454a47316a6c425848396d4b482f4b5433595541376a3667516264574b2b79564d4d526e4a42514b51527939596c30475951426c3363445947416f346f3533795459446d765767447736735277463872697a506c6d784c626262666b313532355a6f6f49716f4867334e4e4e4e724d4c536a5774643131554674414a4e54376b4a5654434e46747a4e717851687178456b59456b542b44396166303267516f74363965706245726370646a4f4163503463594245724c4c484757696d2b4157644c446d486954436b785854674a61685133773d3d227d7d0000000000000000000000000000000083104ec4a0cbba86591e98a23aca6c46ee6232f976b0b1f495991a9f9a8b838da05e26cbf7a02999e4d9440d1b3896e176759898a00d2e3deacc245290c15f703280b54456f9000000b6f8b423841d8119c08305150b94ec53c830f4444a8a56455c6836b5d2aa794289aa88036f07ba018d1000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000036f07ba018d100083104ec4a08845d7939685aacd842e7cc6a6f3ef070024fd041ce57ba86981e6a4c301ccc6a00d4c39ae9c32907b28532afcbe9c85188f9333b738ea162d92bafdd7b6c1665d000000b1f8af831111b2841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000497083a97ec27e943fcccb05b0c3be315a5237e50000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec4a034bf2f88c1909395607fd77fe449b8032a8af2b81473a2d4b8e3243a7afdc83fa066506c9a7ecf266f7480c8d0b10c0440bffdfda88d7985559a8389a6bb510544000000b1f8af831111b3841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c0000000000000000000000007f8e253a0d296cb512fe197f0a723cab3db8b4970000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a0f095612f59dee211b900f1065b083b30aca80dc13d0e44bff0e4ca2de7624856a02f1cf415fdcdf985f865aeaad6fa90684d385c4737d474a67c25fc8bd49eb871000002d0f902cd04841c29c720830471269480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000017331090000000000000000000000000000000000000000000000000000018e7bede9e100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000017ac452000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000004d4c9fd42a9f6370a6ecffed46381a382acf581c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0c00566b4777fe8c98a4ab657e384d4db9a34e71e1d1fcba4254c00b0b87ba804a06775eece4cb8d89d74bee1ab37aca074166c5f5550bff76c73d6dcc52e0a174b0000016ff9016c10841c29c72082a5d59447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406364653563313734333834653633643133653730663033376136633038613034313838653265633162306163313064343763303331613731353963323231623200000000000000000000000000000000000000000000000000000000000000403538666630333132333839356232613234613363623130623736666662303666373332636464393837363332666535616461633534393266396237316139336183104ec4a019a7f935bf8ad662c5269838b441a3f6ce0d0f05b2166a08e817ac1d829d57cea05579fb3baad45daa1b8cef817de3a24b10602dca5b0f8c0f2f83cf0069a44d8a00000230f9022d09841c29c7208305e4459480e38291e06339d10aab483c65695d004dbd5c6980b901c46cbe96fa0000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000d27e4e3f596c8667000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000085640f000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000008551020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a26393f297ffcba780a312d21264b3ad2935664a000000000000000000000000000000000000000000000000000000000000000083104ec4a09e6fc75f445c81588913a169437ffc19794b625b4a70c6fda91b62c48ce866e0a0433e97d8799d0e469d422d45f2045cba9bf62933dc35ff14befc0dd81e563f32000001b6f901b304841b6b0b0083038fe2940cab6977a9c70e04458b740476b498b2140196418612309ce54000b90144a4d73041000000000000011c660308b167d33407b2067a1804fbd7ff7527c8db5cd89658a71211acedcc9a1e662a87c2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee522b81b0de4ea8129a340aff7538262ae993ca117a0e481f908209137a46268e6db2214ef5c92f791dfc2b1701329b53b6a91ba9436ccbb1cc6a60e4cccc04031e39613e9e8fffd6469c812f4b3a82de6472c03c5328182372b0378db683640600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ad0ddcabeffe2898b4435ed2dd41c8308b39d5cb000101000000000000c80000000000000000000000000000000000000000000000000000000012309ce54000000000000000000000000000000000000000087e83104ec3a08dffadaf4cf756735a740a6a341584ad43ff1b7c601faeb4e5e318154e6736a0a06877796bd75fccb048e22fd0b226e19d2c14c3fe78e0d8ee965472523cbf93a100000074f87204841b6b0b008301300e945300000000000000000000000000000000000004879536c70891000084d0e30db083104ec4a090ae57a72c2751dee34c57ad2f5667202d49e6cdff572a25b7a8cef52684d4c6a01e3cc759cb99621587e4257652ca43f21b67063b5b0dd1fb55ee7e856ee4d65b00000390f9038d03841b6b0b008304e83c9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000009d760dd9f127400000000000000000000000000000000000000000000000000000000660337f80000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066033753000000000000000000000000000000000000000000000000000000000000001b974edf9c4d26a7c047313e6c7a2b7e259969cd1aa96b279c0050bfcca6c157c53c9c6a2d47642dc4c515a84398bea5abca7e57eec6057b55529c968a0d61f9820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000000000000000000000000000000000000000038f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000914995cb63da121f14d51bc094ca72fc967b1f4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000093b12677eed78e71ec8f482ff59962415e2926350000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a05b23f65b38915274611a3ec219effb113d09c1501d2da60a753d5b3e54b82a5ba0693e59be5321c36c6dac368bc411fbf42a801c14fc8561e4cc27396c3db6c2510000008bf88929841ad2748082c8a194530000000000000000000000000000000000000480a42e1a7d4d0000000000000000000000000000000000000000000000000011c37937e0800083104ec3a0c017d3d1e9b6b10c726a4bb6554658453744c28489a12795cea6acaede82fff69f6e1f0d2448f1cbf0af1e0c7e4a29f8292696373d0e77ac5c56ef7c7b4140c40000008cf88a02841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a00bb6f56929e36899c692136eb7daa609c7607afdb18b3f0794b64bcfb3a5f83ca05d9696dd8a4c7bdc3c1e0f1cd2f37e7288a40d799281cbb7690e3b877f13848e000000adf8ab1a841ad2748082b4cc94530000000000000000000000000000000000000480b844095ea7b300000000000000000000000063fdafa50c09c49f594f47ea7194b721291ec50f00000000000000000000000000000000000000000000000006623f9014ae000083104ec4a0f43a56a1f7bba744f94c40c3ec87d9d12ee7d97af9e2b5b62686b8d00af6df17a01776bd9b0a8b5b0f76314d15a81f39a65e7231a02a353d6d580011b458f6441a00000390f9038d0a841ad27480830371949480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000001f996833659b34e00000000000000000000000000000000000000000000000000000000660337f700000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337eb000000000000000000000000000000000000000000000000000000000000001b79c59d96ed5d03a724a90b2cab3795ca1fd38e077ae436cd3f1e6167435e7256755203f012d18ab1b76cb8b52d16f6802abdd045d9b978307dc0dad61f4b454300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000001e8d679f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000098a8c69a29722880b508a970b1668d0fc6eab1260000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a051a4447e1a845e1b2163ed2bebb296ec094aed08e9dc8c7e6ac8887ac7c4c283a07244e775208917d692c84241117d1ba9439c45a93448ba631405d72c84ca7562000000b5f8b380841ad27480830f424094ec53c830f4444a8a56455c6836b5d2aa794289aa871ff973cafa8000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000001ff973cafa800083104ec4a0bf951a93c45d70a13f126e433da961fc8cdcd7245ea3478a09619ec447a20098a018a11dd3082811c963e682bb8cc664d20c5c44db33d1ed400b3c9a4ed9b03e9b000001b1f901ae81a0841ad274808303f38994fb5f26851e03449a0403ca945ebb4201415fd1fc80b901443d719cd900000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100020000000000000000000000000000000000000000000000000000000008c3c03b000000000000000000000000000000000000000000000000000000000000000083104ec4a0fd9c5526d247de99f2afd0ef0634e41458cef3d5a8236c18a198a21401180b17a0416e9338612c08422a0dceb63b5c7a139cf03ec1621a846eee8edf774842b9d8000002d0f902cd0f841ad274808303ce969480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000014dd5380000000000000000000000000000000000000000000000000000000066030d4700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000014fb180000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000e50df781ee0f3f92803dab2d7421d1806bc46e3a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0baa6ce4d43355ae757091ca1e027ab34bc31a3e45a81dd994b613840562478aba07867046db34b860ecd8a1fc55b02f391926d2f4573aed2501cd90b3d4d157c2a00000111f9010e828699841ad27480830182249425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd80100000014508000000000002aee6b82000000007b0066031db32750ff0324ff7929f4ff61bebdb61ce5af22fb4b9ba65956a4d9f4c861c77c95ac6f2fcc3bfde928921da7eaf534c3b4ce0ce712012f92fbe1d8c70e800226ef2e014ef9d04f000000000000000000000000f66f8cef0a1fbf4ba83f70da5e9dce197f634b08000000000000000000000000f66f8cef0a1fbf4ba83f70da5e9dce197f634b0883104ec4a07809dacd469c9d272d20319b7d0aa3a3038ca09839f77635b051bda38089cc01a018e494e7357fcd65d76a58c2c7b73a7d0fbdeb47116a3846d5595c269fa6fc7900000111f9010e82869a841ad27480830172789425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd801000000157cc0000000000060a9433a00000000760066031db72750ffe708ff53b38a9dc2360d783efc3941881d94ea6f77bdec23fcd27ae0e2577042d9b53869d7268d735d8c497ab8ad765cf9909df7195980ce54db79f94fdab2f3b64f06000000000000000000000000c12b60fca11708c0c1165ed2ad5d6d3f92ce0a43000000000000000000000000c12b60fca11708c0c1165ed2ad5d6d3f92ce0a4383104ec3a07ff7c2e48d6be5526dfe0bbd9e9677b57145f82583afdef9114830792e54f89ba057c71cd46464ac066644da081339495576cb56f00ea663d16a7d253b8037ec0a0000017df9017a2e841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0d8f52be7cb793636437516143249947c3dbab8d9ade0a1efe422dadac07f880da055d2569431f08bdba22f11f5756dfc388057a57ba6d86d448ff3a7fafb82f3e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8601000000000043acd10000000066030927000000000000000000000000000000000000000000000000000000000000000000000000009896800013000000000390f9038d0884202fbf008305950e9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000001e941960000000000000000000000000000000000000000000000000000000066034f6f00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066034f6f000000000000000000000000000000000000000000000000000000000000001c969b7742745bc5e08fb9730f0a2f17be6e6cc26c6173f48c6d088423fdc0d6d9576b70a9b434344bada4322d2432f7206f1a101e3547eaeb52e0de9a7782630800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000020301ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000436e3d22c78fa52cdce1d4157d6dc45b16fba6a10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a08001aef8d9905dc5d99d5b7cbc6e17a624daaa1ded23cad4592e14294ab519c0a04d185c502be6ed70581762be3d1d879932c5b0f0c9b65f2704b016ad806e06fb000002d0f902cd10841c29c7208305090d942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab9723000000000000000000000000000000000000000000000000000a8e05c261cda30000000000000000000000000000000000000000000000000000000066031027000000000000000000000000000000000000000000000000000000000000002bf55bec9cafdbe8730f096aa55dad6d22d44099df0001f4530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000000a8e05c261cda3000000000000000000000000af9bd2da810ecf5d1b904df15914a0c2bfc98a490000000000000000000000000000000000000000000000000000000083104ec4a087ee766709bc3e7ddb928cb0750cf129902c76ff5749fc44fb585548b9ed435aa0603bed8a267d5ffbfdaf5282492a5b4b31dd7d603d195e3ec05872900f83b782000000aef8ac07841c29c72083010f4494530000000000000000000000000000000000000480b844095ea7b3000000000000000000000000b31d07f716b5cd5c47e5d46e6955d7185f04fd2400000000000000000000000000000000000000000000000002adc7c324fe600083104ec4a0db4ca357ab235ee930ecf57e130c8d17a4229e801c6effbf075fd8f7eea3865aa067eb53db5e813fa178507182704e639853b514c71c21566297c9fae8ada6b5fa000003f0f903ed01841b6b0b00830704f79474670a3998d9d6622e32d0847ff5977c37e0ec9180b90384186aaba2000000000000000000000000274fb07a03b1f1a8ba0b058c55700699fdf00e04000000000000000000000000274fb07a03b1f1a8ba0b058c55700699fdf00e0400000000000000000000000008fb641cafdbaa043545c352dc64df6200ec3e7400000000000000000000000008fb641cafdbaa043545c352dc64df6200ec3e74000000000000000000000000000000000000000000000000000258001dbc2eab00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000153ddcec2b903b14c728ae966fdb7d3fad7a9043fa5f2c06fd79efa8e98f33b03f99a7f65d969c0580c2b79241e73372315bca0aa4c17ce12ae88549e7ac7e095e6784e01e237297eb75e617817474841735318532f1977895d3ee734f75dba75ecee69a95473ab6ed96e1fc05ce087ef6d945a5b1baf9c4b7d810a07163d95d139b704a8fbeb0a4456c7753332d694992f241ff56194659854b5fb975bcf2cd4208fc59b10078e8217f3d7cfe208975c5b3ee9446e98ae2d37326de93a3232b7291c6dad09a16880971a07797b9f0fbaaf17b073223c1f5636d1fecbb4d9325b97cc17112f854b4f30edb0593b369f7290ad1f57c25a8e05e4bf005b367b6172571df3b44fa5931d9ff85e553e2fa5d5f6f9c1decfcd60224dbd6961c283e387e4774a8510512d946b77ccf56b491c7feb857a8b203e3eec3e0124c31c40a2e8a8d6e3a226e1d2940051384dbe56e5b752c5dfae5b9a700a5223cf3592a61ceb4849244a8a99d91af6fd4e7e9ae4ece99af7575790b6d45c9d3a79cc369a1044083ca79c0cbc858038b81f02badbea2d1e63fd594b5f57787cc644c6fd439ac71ef49c7984d2b776dc15564c5540a93074857bd34addfc295569a2032791baf17d799aad761201a56b2b3f52c52d4bb73974dd36a9d605277be82f91c6006528906e1fd88b12ef616ed440023536b9ed4722f3c61006333a1cbda62df1f99653a92e1fab15fafad07c26758935854d825f112b3570da7978033b85934c728d3446efd0f9eaffd40c2fa21708b8edea304a878f18b5d69cbb6dc7deace32b583173a2e95e80c52686a9d2a76a27b7f6a347bec875545a99b41dc3b0095c466a4c4b3b10ec65242e82a46a0b49a819478c227b7d4bb1ecbc24fa9aa28b19940d677f764432b9d14c964dc5c5056592e9ef7a2c04322199a1efc9fe7d04930c6058983104ec3a07d3b7a3f9a7d9339a32a712c4a957f5855bee068b960baac0b39087c62743c60a07f227271a3afc8134e54d33027a112b7c49654803ae39dc28bc5dfd16bac843c000000f4f8f220841b5bc8c083035fc59426da582889f59eaae9da1f063be0140cd93e6a4f861695c574e6a8b88489a281b60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a5ddba6fdd5c599a4b0b9379fe28cbf318687ff30000000000000000000000000000000000000000000000000000000000000001000075ad0000000000000000000000000000000000000000001bcfcc20b1f80083104ec3a0ac8cce4586d99f8f4f212cc6fd69866bb20a6bc9c27f092ea4192f010c9ac3b8a0623e6da348ed2c59b40eb87c5c64064636423f787a684cbfeea2b7fcbd16d6370000008cf88a05841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a0bd34aa24943fdf4692eba7e816f835a3c4b3ab78c4fa572f6eabf2cec2b4ab80a062a1158cea4bee10cab416e4029c7a37fa72d433bb79c1a90daf0930c0e0dfd70000008df88b8183841ad274808265ea94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a004bcb5158645fb97ade1c95e9dfed98f340c34b5fdbfd23bd2339891e89c6310a06b9156980b74e8ac18d9c1ec5c6db79de4cd4682d9d13810c48fdba50fb05a6700000111f9010e82869b841ad27480830182249425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd8010000000dac8000000000005230b4ad00000000700066031d902750ff2329ff0ba93a8a353999c857f7577522114c5b7beed91db3eab2cfabe95fedbcdb834ae4f99dd7fe2365055ad7a0d9e3c68c2780fa869aa6b9c00c3b2447cfbe83a043000000000000000000000000f8071664ac913d1520d3841337c430154a6e36f3000000000000000000000000f8071664ac913d1520d3841337c430154a6e36f383104ec3a0854d4d193d4c9aa575bb8a6a2bfb6620bb120211c4c3c8002eb9fb9e970bd4f7a07762d250a5cd6507f055631d4b42f3901cf4ec6e88cd4d523fabb809dfe94c7000000297f902943f841ad274808303d6eb942db0afd0045f3518c77ec6591a542e326befd3d7876a94d74f430000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000049936e3f4c691f9e59fdafa92f905e0e02a59fba000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000005b5dd702a6ec680000000000000000000000000000000000000000000000000000000066030b68000000000000000000000000000000000000000000000000000000000000002b53000000000000000000000000000000000000040001f4f610a9dfb7c89644979b4a0f27063e9e7d7cda3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec3a0b99f72627143fce405f82ced1ee59b155e7bcc9121a595cd550812112dc502b7a03f5b3cee9eab5c1c7ae3d148659084b2473c766ca493f25c93a379f878b9689a00000093f8910c841ad274808302329894609c2f307940b8f52190b6d3d3a41c762136884e865af3107a4000a440d097c3000000000000000000000000ed8b6576ac0d3eab09f2c2fed3f4a5d4c7b6d86883104ec3a0102f8907c7e15d20a3211d62323ac2aa01e97458b8f7f7fa2e3da00f5b5ae27fa075f7f7066e97aca844e343def9a35532ef28b79e5cc4cfa70e0d29fc44a587ba0000006df86b03841ad2748083020671944c826c813f7d622edacce46abe0d89be3478aa4580841249c58b83104ec3a0263d90c09d5116790e94d944cdf9742f5be2320b28bf9f73d98550ef0bec3f9aa02a6e194b3378f0fb4cc2922b80104adefccfa7f36ad7b2d8ab4939ad59725f3d00000074f87217841ad2748082cab49453000000000000000000000000000000000000048811a70d42ba4c000084d0e30db083104ec4a061047669df72ca970364ef39b62d4ecb6f722d911c4d331276f8942cb013fa2ca0011eea61400cbad2aac8a50343280af61276ab2773d3d9ff31b1a919a44356c1000000cef8cc03841ad27480831e848094ec53c830f4444a8a56455c6836b5d2aa794289aa80b864c299823800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c83104ec3a06df5dfcee74e958e1cd81a4103a5a26733827e683b423bce3b286a036bebea87a01082d0fe47ee3f079c58fa92e3f2a39645dba8b5159215c1a1765345c731e0f100000115f901123a841ad274808302eeda94781e90f1c8fc4611c9b7497c3b47f99ef6969cbc865af3107a4000b8a4b2267a7b000000000000000000000000a58694a524f459b8c0b79241ea28737ba0f7dbc200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a033e756fe05d8649a188250140352daea868b042aabba9635b747fc39d03bf69fa00b7b16f9bf5af1a299c38512435b26c94744c24c8ab44f943c3a3c11e25679e900000237f902340b841ad274808302931a94aaaaaaaacb71bf2c8cae522ea5fa455571a741068718a18092bd78bdb901c4a15112f9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000002f3cc000000000000000000000000000000000000000000000000000000000002fba0000000000000000000000000000000000000000000000000000000000137083a000000000000000000000000000000000000000000004050425309fd00000000000000000000000000000000000000000000000000004196e8335d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a002f2f5db9cdec76ca0ef6410cad2b6a809ef3c7a867ce9ab9615daf4f728f217a0426a7f0c59807fcde28bc8f54327491affc64c967758dee4902b7b07d167eaf9000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d70000000000000000000000000000000000000000000000000000000002fa7d0683104ec4a0e8fe569a3b05e8ef62155e790d8399e4c9cb45d1301121b4f291f04b234ee6cda03b51622a92f7b9ef6ed9b35d3895d28891b830330ff0953665eb5a3a4568be720000016ff9016c07841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000403332636565393739653333323031626266363131323362383239366164303066363931366265653336373439386237336533666537386561363235656232346600000000000000000000000000000000000000000000000000000000000000406132306164653661313434663437643362653737366337653336393035376139366466313765356338616536613632383736326662613436616534303532633883104ec4a05bf84d74b20d6d1383696f407432cd5edfd22ad85f4fe719edd5d148c0eca62ca01f55f37eaa5dd00761615a3382af98577fa0a9ed758ad3592cfb8f48f44d9e0a000002d0f902cd1f841ad274808302a1349480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000001104aaad3346eb000000000000000000000000000000000000000000000000000000006603380200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000010736d000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000009b04f868352a7e99f786d69dba25c4cc1b973cac0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a07fc513b4a9f86a1c8d4e54038618a96bd5bbe0d868a6a262341a3119c888bb3ba0408d16c496463ce3219e23a50157050016de578b2ac6dd63d57c3ef12a1e7f3c000002d0f902cd14841ad274808303e5e7942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026dfd1b0000000000000000000000000000000000000000000000000027c9d726ee04000000000000000000000000000000000000000000000000000000000066030dc7000000000000000000000000000000000000000000000000000000000000002b06efdbff2a14a7c8e15944d1f4a48f9f95f663a4000bb8530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b2995f6803a963391cb537608ee1004e3408bb50000000000000000000000000000000000000000000000000000000083104ec3a08d957616c825f16ba7fff937e66289fe00f418daf6e0b0a833cb3d082fb99007a00d3a92ed753035e788374c5a160a31c9dba97335b35ce473ad21cd743fe830f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136b01000000000043acd2000000006603092a0000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000000b1f8af831111b4841c29c7208301526c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c00000000000000000000000083001915bc8ff18bf61539c86ae92c6870e2f3e6000000000000000000000000000000000000000000000000000e399b91a25c0083104ec4a0218607542f6c3bd9248dd00b40f8b0050904d8ef57604cdacab5ee9aaddcf4afa039e7e002c4ee7e40a59aca501571f7fe9d2cfcdd07a4f7ee9d845cffc17e322300000390f9038d0b841ad274808303719c9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000338e73fb1d813f00000000000000000000000000000000000000000000000000000000660337fe00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337fa000000000000000000000000000000000000000000000000000000000000001c3eb375ee126532a0a2d281a53c39122a2176dd6f74835ef6cb5c2dbfb084a0f664cd66bed53fc82c4c5f56abfc748486f360eb4eacf32ce8feec8446f2cfb2ed00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000032d066900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ac8d1da40dd0a213071f1157e4dd129bc292e3300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a08b52b1e254a5c18cf7ecea2300c16fddf23fc5850ff5eea446181053fd3e128da0459927ef1f5401ad001524aa284b391167bdc3b3cfa1f2a895aaa30c3ac0cc5200000070f86e0f841ad274808252089480c67432656d59144ceff962e8faf8926599bcf88814b66cd7a745632a8083104ec4a04aa8984e35716d83ee39d89aec6f8d056e2cdcc6983a073df312f0cd22af5ff3a029cd303a66ad957783df9223b2fbc508763ae00eb61d1c4e961bd25482dc039400000072f87015841ad2748082ecff94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec4a0f4a3357f1a6840697f7b4fc4228c84241e0083d80e7067bf8572df1d9bb0e5a4a06fd37d38b9d4806c01089e1110c7de09a046cf49c0d99d777ba38b49c578c8d000000390f9038d10841ad2748083035b039480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000037acf7354f7de0000000000000000000000000000000000000000000000000000000066033801000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f97ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337fc000000000000000000000000000000000000000000000000000000000000001bee7d1346903cb919275690ccc0e94600301dcc96ac666a02b1b2ea33b2617f9d63e52af53436870aa3cddc6447000683ea075b4fe911ca3edd8c5d53fb132e84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000031c4945c343d5f4900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b39880c7a0b752179d6d7d9ae594ab4c02d6e5b80000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f970000000000000000000000001af5b3906e388d1cdd56fc5dade1c71e133095770000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0ff82628a2a1d8bb7db3e78b4becf869daafe100e7361e030aa8f492ad96800b9a0456269c095d7b2a02b91921c7bbcdbeefec75161e1690e88563655815c69e86e00000170f9016d14841ad274808302beb29418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe50000000000000000000000000000000000000000000000000000000000281247000000000000000000000000000000000000000000000000000297e49304c9c100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cabadc213648370a9e1b097321a20e9cb3e181450000000000000000000000000000000000000000000000000000000066030dd1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a098fba55df026cb91cada64cdea78a1e5d9862f53f761d1a834858e81e739ea30a0269ce5871a353ded4bff8eb4034e07a58d256ecb107657d371c6901ab627b80b00000073f87107841ad27480830206719483eb631112e4a73f645ad5a9af5925da84c46315862d79883d2000841249c58b83104ec4a0517fd0bf5d6e941035d56a1b379dfa2369df267e28d4bdd99bdca418f717399ca05c62361bd61d9b444a343f813cf02dddd3d7b442311283454fdf3249e616f9390000006ff86d0a841ad274808257ec945e809a85aa182a9921edd10a4163745bb3e3628487fc7927736af4878083104ec4a0ea8736d937c4b9e39fde4db96ff76cfc6a5ec7b3eb4ad1359aac6804ae82661fa07e55ae9a4dfa5dbcf4724f932c5fb7eca4577b6ecde3e1691414eb59e92e0c9a00000210f9020d0b841ad274808302529d94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea056927ef6980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000107b1fb5bb53f8000000000000000000000000000000000000000000000000000000000000000083104ec3a0d5ccdaf3da7723ff61ddfa4815edebcbaffab22f22e609a8bc38f4ac507d0cd0a02e1e0999770fbd0a4a42fa822972c85e09b2d85b2f63cd24b4977fd16b7fbf65000000b5f8b30d841ad274808303dc7994ec53c830f4444a8a56455c6836b5d2aa794289aa872c7c770db8258ab844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000002c7c770db8258a83104ec3a07acf779a50f703d17be89b6a8c7d3edf364f402fe4b02ba40c4c1d9cf4d59ad0a07ee59cdeee71ccb9094a2065acd374194fe00d7384dda118f599c1eff0ad648700000070f86e1e841ad27480825208942fc617e933a52713247ce25730f6695920b3befe8805ef7ee24a6f40008083104ec3a00284ef3e7c41461d8380aba5d4cff5f3f3ea8b976757e426cce8cfe87b6bd55ba0122d5e066cdf8d958416d36e64e19009d15566e246e677862f5e8995ef5448ab0000008cf88a02841ad2748082a73194530000000000000000000000000000000000000480a42e1a7d4d000000000000000000000000000000000000000000000000004380663abb800083104ec4a02535ac88d720011b9259b5901fa978cfeb211286a8481780d9a94479a18f36b6a0029786c8e575ce7afbcde52d4dde703c4663602f7e49333cb8cb5a2e5504d9fc00000094f8920b841ad2748083017bdb94a3e728825a6e462399f12bd702c5d88ceaf32bda870193d0ce47c000a440d097c30000000000000000000000001943f0ec6cad494b11739525342674e939737f8a83104ec4a095c62186cbceef7c958927265d5273c88ef036847b10d73a1d9b212e1650cb2da061b931c8d9a571b232a4c779251064b1a2eaa0c38a5f5faf2e3c6de83f634254000000aef8ac19841ad2748083051f1c94ec53c830f4444a8a56455c6836b5d2aa794289aa80b844abdb5ea80000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f068800000000000000000000000000000000000000000000000000000000064e890083104ec4a020061000ee2e9da025f3ab6ab6a6da82b8ea5b02aa67c139b00e93fe2400fd1da07cc43bf458ee5383be9ceb2ef298bfbdd2a7b38344003bb5044c469c7e60c84a000001d7f901d417841ad274808302860394734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a87470de4df820000b901642646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000439a8a6000000000000000000000000fb57a1b563d78692636f198476a63b2b3e566e8500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000700301ffff0201734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a530000000000000000000000000000000000000401530000000000000000000000000000000000000401ffff01e64ae4128e725868e8fe52e771e3d272e787b04100fb57a1b563d78692636f198476a63b2b3e566e850000000000000000000000000000000083104ec4a02a8eaa57f513a3af4acf89777ba8d9674ed491cbb55592d211396f89d0045b6fa06db7057a3cf32cb457cb2db59be9478082212b207da5776c4f5f885a09e690150000010ff9010c58841ad274808301551b9425ab3efd52e6470681ce037cd546dc60726948d380b8a4c8173c4401000217ae76800000000000647d518400000fc73b0066031e1a2329092750022fb857f9ae326148176453a628f0aeb3a123ba854a6f394c428a5ad29750b9ebc9465f1430234b8ce02cd1bff277e5486c01954272be29a813b62bde8fdab6d40000000000000000000000001a8c1ce5ef00ae99d12a0d39c76e7ce6dea8f8440000000000000000000000001a8c1ce5ef00ae99d12a0d39c76e7ce6dea8f84483104ec3a0f3f420d6f1af631c3a86060824a9f314e7d836ee57472b99d6c1cabcf22ea16aa02dad8a3088d739975e293009e3cce080619d2ff74c3d583e3774b837289167a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048bb01000000000043acd3000000006603092d0000000000000000000000000000000000000000000000000000000000000000000000000098968000060000000000aef8ac08841c29c720830127cb94f610a9dfb7c89644979b4a0f27063e9e7d7cda3280b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0a4783c5c1e7bedd5b0216bf850837033e7dd1cf180c9fc4b6450b6eea84bdf5ea0152fbb72147da90300cb8286144e70a8b58f43f1218638c75aa51415a927c94700000156f9015380841ad274808302ae0b9418b71386418a9fca5ae7165e31c385a5130011b68706276d3dae1000b8e47ff36ab500000000000000000000000000000000000000000000000000000000005d21690000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c3b765f3a6ffcc60c8a01f2e74f7c6450d24b3ac0000000000000000000000000000000000000000000000000000000066030dd80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a483104ec3a0143070ac74d0a336d4f009c0eb0be4fc6ecd029aaaffa9e68c05d872ec6a6ecfa0183bc3cd059710fe834b09875503e015fe71fef45cc7aa36a76792e073ff66ae00004298f9429514841ad27480830c27d4947b2e3fc7510d1a51b3bef735f985446589219354880a70a55dd6c8524ab94224819bc4b9000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000013e31000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000ca9ad076f2c25571c719df64b2ec1d4087e15f5700000000000000000000000000000000000000000000000000000000000041a00000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000844e21fd0e90000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000000000000006603301300000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040e756cac1000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000a688906bd8b000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc8970000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000a760000000000000000000000009fab7486000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000000000000000000009edf13f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f17b22536f75726365223a22696e746572706f7274222c22416d6f756e74496e555344223a22323638392e343033353534353834373835222c22416d6f756e744f7574555344223a22323637382e3831333833222c22526566657272616c223a22222c22466c616773223a322c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a224a4a2f533847356c7349654d6c2f7a624a676467716c436f6f34446854494a56424a4e2b6e48314f6d684c647054573066776e7437454f62782f61696a445a616c39697251774348764d59422f61684453446945422f386e592f31334b69573734326d364c757050765a7861564264557a30724a635359473639472f62324b47314a5068635648734f64684e316577374b6675615632696b756c73366c31767141687670527645414d337972434b566d6468464c7a4a664d6238786a374c30655772677849597338676836333941462b63682f36563233614352323348472b2b566d3430444d5a663542342b586147485a6b614c372f336f46306934322b78587345455653573861554356784b6e4a6c6273313856705350586f322b49623452506c67396c3847686d6d4142444172694231746552716d76717a4b752b4c494a654b584d447731365a726f48504c2b70664f756756773d3d227d7d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001c2000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000913802896bc9a6600000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000913802896bc9a660000000000000000000000000000000000000000000000000000a54fb72a1cc217b0000000000000000000000000000000000000000000000000a7d42d9bcf3a00a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000913802896bc9a660000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009112d57a6f8518a40000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000009112d57a6f8518a4000000000000000000000000000000000000000000000000000a5256679c22037c0000000000000000000000000000000000000000000000000a7a937f4771ccf500000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000009112d57a6f8518a4000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090eda86b73408ae80000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090eda86b73408ae8000000000000000000000000000000000000000000000000000a4fb15c8cf8a1d40000000000000000000000000000000000000000000000000a77e424c84baffc00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090eda86b73408ae8000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090c87b5c76fbfd2c0000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090c87b5c76fbfd2c000000000000000000000000000000000000000000000000000a4d0c51744ffc4d0000000000000000000000000000000000000000000000000a7534ca3f8148ea00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090c87b5c76fbfd2c000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a34e4d7ab76f700000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090a34e4d7ab76f70000000000000000000000000000000000000000000000000000a4a6746522812b70000000000000000000000000000000000000000000000000a72856fad12978c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090a34e4d7ab76f70000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000907e213e7e72e1b40000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000907e213e7e72e1b4000000000000000000000000000000000000000000000000000a47c23b2680e4dd0000000000000000000000000000000000000000000000000a6fd61510ff9bad00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000907e213e7e72e1b4000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000b527a00000000000000000000000000000000000000000000000000017d509f3b3a0583104ec3a071aa96a80804c6dfc1014244c659c0a290220ade2d2c79d9cd483495f650c54ea02cbb97df055bcd39a97a3edf63e03f8ac5b28ff611b9537d7f2fe8ca04046c4c000000adf8ab11841ad2748082e89494f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a05f31c45c3514b8248ae59b510e5264c1288aef2dd4d9a9d299756d630247db3aa07f8ce62a896f05e0dedca103e13544b5e81a10a649c24852be1b188738495519000000adf8ab1c841ad274808285ea949595910db7625ab963d2b32a60c2db5bb9fd20c980b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000001bc16d674ec8000083104ec3a017ca7389809af3cdb672e30a4d74cd15e6b400e3e36967aaddefa7abb53a4a1da019ca37ed89bb6c4ff4d6f3d643818b8854ccad4f7c63c8439c9abf397d7cc6fa00000270f9026d05841ad274808303fd9f94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ba9d00bc72a74f426361a42a9b9e162dab996e5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a032ad67f4218d4ea21645f1ab9d57e676f90ea8e7845b9f2cf53caf59bb8e0473a06943e034025509c4eef60fb5dd68f028a98c526c639bcd84c09b0367b7ea5be20000000000000000000000000000000000000000000000000000000000000000000000080501000000000043acd40000000066030930000000000000000000000000000000000000000000000000000000000000000000000000009896800007000000000279f90276830829f284202fbf00830a987c94581b26f362ad383f7b51ef8a165efa13dde398a4865af3107a4000b902048624ba07000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e35b8d65fbe2824e3a6bffa6a0799a224dd8723c00000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb000000000000000000000000000000000000000000000000000000000000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe040000000000000000000000000000000000000000000000000000000000000145c2b4914e4ceb8f50e13b6a0f74ec8db5fe92e6c34e8b37e038f2162b763ad424000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000038e280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01fd1cda32a91e6d4be86c62d49dd1f235de2812004af66f01c21688ed1ac7e24a07acc1d7be6f563264dbfb4d8d0f4a647fb78efefc23399f04f9cc6784f6dd4d4000000aef8ac0b841c29c720830120c194f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c690000000000000000000000000000000000000000000000000000000001f6845783104ec4a0957e4f361b9bce36fc9c4ca7abd600fc7d44c70fde31c35a035532754dd96855a078256d219e17d2c625c972af5e811e803ab67cf9ddf0ac3d9bf210f08a465c7500000177f901740f841c29c72083045ef194aa111c62cdeef205f70e6722d1e22274274ec12f872461a3059c1e6bb9010467ffb66a000000000000000000000000000000000000000000000000000000000226a67b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000006de48b08c8f57403fa595a57f1032b406b68333a0000000000000000000000000000000000000000000000000000018e7bee22ea0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000083104ec4a04608564b5478f5f1d462eb2789e7a05c821d17a70d7bafb2a069a3dadaa2607ca06be968c83acfc022cc4d0629ac225c971024408a017c8479685428a9318c7aef00000156f9015339841c29c72083041241940122960d6e391478bfe8fb2408ba412d5600f6218707de6f82e5db95b8e47ff36ab50000000000000000000000000000000000000000000000000000000000738f0c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e8c91b44fead8e62794e934684ee3443fe84348800000000000000000000000000000000000000000000000000000000660310340000000000000000000000000000000000000000000000000000000000000002000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a483104ec3a00374b4cc43709b761889c76e9d8ae0a1645c34fce6e364dd14453bfc1e629e2ca056bf3d599cf64f2e832911fdcf2c0276a799d54e1517cace3f99c1fc621c94f700000073f87120841ad274808302067194953ef35fd705d3b835e12a7a80205c5224bd692d862d79883d2000841249c58b83104ec3a093d713ffa84b87ec85370982b511122f6afc66e1993748e8e46c0782781f673aa02356eca2bbb0746db7f95c6cddf8ef218ffa3381e687e54a6f41ce91e9464f96000000d5f8d309841ad274808303cfc394ff75a4b698e3ec95e608ac0f22a03b8368e05f5d870da175549c1800b864474cf53d00000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000e1587c4f84db5bce07f570178f34e52d6a57beaf000000000000000000000000000000000000000000000000000000000000000083104ec3a0ef5910a7cd86b54b8e09c91719a8b777b48d14001d2a6e8c57875981040345b4a024334e4abbddf796c19618ca2a502004bd5cb4022cabc4e530218d708ea8109900000070f86e818c841ad27480825208945e809a85aa182a9921edd10a4163745bb3e362848717a023c7c1a0048083104ec4a0b169ec51e7a5cde6ec404507acd37df96b55effe5792f6bfffcf34f7cf6174f5a0309c16020e714717ba1ff6d8e6458d4ef6d61781bd261958a39d3db219860229000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180e01000000000043acd5000000006603093300000000000000000000000000000000000000000000000000000000000000000000000000989680000f000000000073f871830849fc84283baec0827b0c9400076e1ea45645fa760e671326deb4281c676e8588111380206f7c40158083104ec3a098f1962d150c11bc3780b81743adc96debb75a390e63e774ac78cea601222638a05d3c1889320a8ec84861b87840a845844469ed0692f1581b5cafe29544ad9948000001faf901f7830829f384202fbf00830f8d5c94a658742d33ebd2ce2f0bdff73515aa797fd161d987470de4df820000b901840508941e000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000007dfb5e7808b5eb4fb8b9e7169537575f6ff1a2180000000000000000000000000000000000000000000000000000000000030d404f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf4f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000ae314a21792fbce6427ceef079cc68e78300a0d700000000000000000000000000000000000000000000000000000000000000680000000000000000000000004d73adb72bc3dd368966edd0f0b2148401a178e2000000000000ffb0006e4ae8cebccd7027820ba83188dfd73ccad0a9280600d67dfb5e7808b5eb4fb8b9e7169537575f6ff1a218ae314a21792fbce6427ceef079cc68e78300a0d700000000000000000000000000000000000000000000000083104ec4a0ecd6065e08a5ac8507099acbeb75fe08e69a838d1f03edae01d6d5fc441f8bfba078521acacb1a0b0e03309e312b4ce859225d35a63a0fc94b7a30234f59cbae6b00000093f89107841f78a4008302329894609c2f307940b8f52190b6d3d3a41c762136884e865af3107a4000a440d097c3000000000000000000000000b4a726f320b429730b2f1d2165c2ce06b932808583104ec4a0496daeceb48a12606bc67f89f2b03248e6ca3db6cd1a3d7ebb6ba77fbc995adaa06905c3999444b450d9227c0e424749de85852bc03344387dc4665d27acf19ab1000002d0f902cd0c841c29c7208303f1bc9480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000004a9ae1aa764dd000000000000000000000000000000000000000000000000000000006603103400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000004be11900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000007141b84ef27b67b7192d95a672f70996e40c5c2d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a03c8bf9d078f6cf64ea8c373e4e84e822a9192dcb181b25ca6787e0fbaac94709a03b4d63b2394e6668a72d78339256c21152c324d5483cc0b9d0606d58417b218c000000adf8ab21841b5bc8c082c1dd94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0f2cdb7edf3e4bad66d60d70f35c80187451ebb9578b3298a1ebd205543b9f615a07006b3ae108254c05843c6530c65e1c0e6e6ef40d3322544d079cf567f6d9007000000adf8ab08841b3337ac82fa7e9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0ce1fd84a4522db88cc05194f81d874ad55a7afde2664a33b5d107ebfcb5c8856a07c18899a7b9c2762e94c8d0a78d15e5ebebecedf491199d896ddab5c026a09c7000002d7f902d409841ad274808302bb2c9480e38291e06339d10aab483c65695d004dbd5c6987471b46d16ce0f0b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000042378250000000000000000000000000000000000000000000000000000000066030dce000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000471b46d16ce0f000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000cf60ec7ff940b6ab942ac77e2b689374139f36810000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a00d3755e9af3f8878385789c9cc678ce88df461a1468d9dee7752fbdd99e3bf36a07e8ba44daa4e1af80a2c499fbc6075270976a0ae8e4d0be45cdcf014adfb6b0f000002d0f902cd06841ad2748083051b0a94470ab53a2e939bee3cc9d0064034cff925a9c8c580b90264fc8791900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066124b6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044752414200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000449474f4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b516d61696d32667a7a6534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01aea9c26624c7b6c4061991a9cb84f4693274de3388e77863e5667c6dfc26623a05900464b1c65ed2772b3d659555e3eb07a48adf404829b820bcb2ed2b77151f50000006cf86a2f841ad2748082aa4c94d55d9eae96ce441890f403329252c9f3812a68d68084b49004e983104ec4a07bb33cf4d6d742f6b1d82add55aa484d4d926e1f5bc7d97d3b4ed69e95414ca7a0529626e404c76ba49bd96396647187c6a91fd72d3e6e724ef6c774dd1889415d0000017df9017a05841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec3a04294f9d3dad1faf18c17393c72bf51c06060923599b57d5808f0892c468cc621a04942bc3d7938aa50a6a8e5835e437aadc04c431f906f3a8e04d5c016ffc11faa00000170f9016d11841ad274808302bebf9418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000021f2a0b00000000000000000000000000000000000000000000000000234773521cce3e00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000008c2a9e424048ce25cf317fa404c5a45521d0f09e0000000000000000000000000000000000000000000000000000000066030d4a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a0ac939a12190ca5626c21c5d397e8ef424e5bcad972d719b6cc1a6d854688487ca05f8a2f1b745741a4707e167566ba205db072bdf49ba10894351353bd331f5d0400000218f902155e841ad27480830291ba94aaaaaaaacb71bf2c8cae522ea5fa455571a741068803a026b8759bd33eb901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000372261400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000003a026b8759bd33e000000000000000000000000000000000000000000000000000000000000000083104ec4a0ade3e0d76fdb8797692b6193ab3830da8706c82d795d31d6f887a5b06ddacaf3a052849362e62694c712b31a96699e6f58cb5883f6f309539cb2f0b8c8b305ed6b00000073f8713f841ad2748083013072946e55472109e6abe4054a8e8b8d9edffcb31032c586f5904616e000841249c58b83104ec4a081a9664d9bd0e4525bd67d4024de958f4cef4a4c3803d7a84ba8656d6b5d11a1a0175e5fdf1184dc29a3fdd54f0876c01557565ea7e8086cfec82f5ac6893e776e000002d0f902cd18841ad2748083037d289480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000101f7200000000000000000000000000000000000000000000000000000000066030dcf00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000001036640000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000009c248d7e81394c2226f33afb2e896b6af895bb380000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a038de7c589fc0050b4148025eae889997015b9d4fb82c190aaeb683ad893a8798a01732e54a4f3c1ce929aeb885ee7ffb836ca32c1d4e94748a5e0c978c84fa31fe00000210f9020d0d841ad274808302b7dc94fc30937f5cde93df8d48acaf7e6f5d8d8a31f63680b901a45ae401dc000000000000000000000000000000000000000000000000000000006603101800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000cf1a64b000000000000000000000000000000000000000000000000000000000ce1d9f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01f703e487e503c56700530ee5915457da31c2b8953a7c4f28ba8d7f6fe17b223a071a0b443345f8881e04621c1d8c2a7917cabc4765fce94a1493046f53b5fcae40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8c01000000000043acd60000000066030936000000000000000000000000000000000000000000000000000000000000000000000000009896800008000000000190f9018d10841c29c7208303ba9494aa111c62cdeef205f70e6722d1e22274274ec12f80b90124f41766d80000000000000000000000000000000000000000000000000000000000f4c3ec0000000000000000000000000000000000000000000000000000000000efdeba00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000130e2ffe04d96e0afc1bd7fba9eb0d7167e1b7c70000000000000000000000000000000000000000000000000000018e7bee2c5d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000183104ec3a066299aa22610a71b7996bcc22aa2497c7956012faa9a14d831ba9774692a7581a07ced28f289f005e0e69035a3e4e4269c80203724218441cbd063b531d35c3aa6000000b1f8af831111b5841c29c720830152849487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000a4e25ef85e8f8c987dadece5dd5d872628e5889500000000000000000000000000000000000000000000000000334a281f81f00083104ec3a0e72bba63a3428a02f6a5896b377b4db2bbbb89c0127f4eb7281169aa533bffffa03ad352dc0a155754425d719e04b4e7d9ee03a64c4dd2ccccdcc19d9eef848639000000f6f8f408841b6b0b008305815294ff75a4b698e3ec95e608ac0f22a03b8368e05f5d880342c5d306e41923b88402c5fcf800000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe0000000000000000000000000000000000000000000000000342c5d306e419230000000000000000000000000000000000000000000000000000000000000002000000000000000000000000332a07d6dd6692f59b4359fb988b8f7bfd3b322c83104ec3a00c1a26211ee6bac59fa2b1c7c2042eb51477fb010823027a3b723f5c1dfa06e8a072b0dc3450f25ffc949744fe11f5beb607b762f188688808b0e39060e5d551f800000190f9018d0a841ad2748083039f009418b71386418a9fca5ae7165e31c385a5130011b680b9012438ed173900000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000017182d390f56a4c3e6a980da00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cb5f02599139712f8923f531c1da87a8fcb2a36e0000000000000000000000000000000000000000000000000000000066030dba000000000000000000000000000000000000000000000000000000000000000300000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ce3cfe8781e6dd5ee185d63100236743469acfa183104ec4a0be937dd9eb747650be9bb7db8749d79ba3dfded187127110d22637f90f122a15a0603cd263fbf8d147a4544d778701fb0690635d71691d35101ea2d4b98f3a71a200000074f8720f841ad274808302086994af52c2731e304e83cf2fb5763ffca5b0f62e2738870110d9316ec000841249c58b83104ec3a0635b99363f302765a25c23be555a8848f51bd55c478d83645905d8dc140a5a8aa07976482755a97fa022ccbd2dd70de4fc198db1c02a93a0e6f4c53ce4eaae3105000002d7f902d409841ad274808303b2e89480e38291e06339d10aab483c65695d004dbd5c69879fdf42f6e48000b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000966846700000000000000000000000000000000000000000000000000000000660338040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000530000000000000000000000000000000000000400000000000000000000000065d0fe3f22babd624d0176f107c8147cb1a9d9ae0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a04d16b68da6b1e630b7269837f79f48df6729a7d40d2249e8a5feee62596d51d1a007772c00159a45754615df9bcbae675856cc8f2fd499e57b7dd21541cf10f7500000016ff9016c0b841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406466383536346435636233363763383033336432343131666637653863393962386363376636376538336337346163633165366364363264313566336133396100000000000000000000000000000000000000000000000000000000000000406364613761373764643861373530366239393463663633626535303639373763646639343563316637656565363138306463623238656639663363313232643283104ec4a050bf755a953e1dc2aa2ab1e897050c96dd543ed46641a91e543bd562b4a118c8a0462656f64ce1fcdbe7c5a65a7a1d34915f0c13fbda39458c7e5fd006eaa046a5000000aef8ac1b841ad274808301b2599463fdafa50c09c49f594f47ea7194b721291ec50f80b84414fa10e10000000000000000000000003a2b90a49757175491d790085528cde6e169805d00000000000000000000000000000000000000000000000006623f9014ae000083104ec4a0fa3c84092d89f196844e32a9b8af395c2f36ae8a11758275753f7613bc52a35fa02c832c90d93dbd9fd8e7272e51d9d9d65892f636c485033bb97587849d04e3af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "r": "0x936d6a4bdeac41d80fc8bc53c0426697c3994f6d27ea3017f06ea4965261ae0e", + "s": "0x471b21b32a9a7a52ea4f490d15ad9012a4cf790d2e8553e33c9fbcbcfe2a3936", + "chainId": "0x1", + "v": "0x0", + "gas": "0x18d8fe", + "maxPriorityFeePerGas": "0x989680", + "from": "0xcf2898225ed05be911d3709d9417e86e0b4cfc8f", + "to": "0xa13baf47339d63b743e7da8741db5456dac1e556", + "maxFeePerGas": "0x141619bae6", + "value": "0x0", + "gasPrice": "0x9af5330fe" +} diff --git a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json new file mode 100644 index 0000000000..43306d66d8 --- /dev/null +++ b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json @@ -0,0 +1,31 @@ +{ + "blockHash": "0x4ca0d33ed0d052e0e77bfb37cf2a48ca33fe04ba3673b8d902e0b7609a37f6e8", + "blockNumber": "0x15d4", + "from": "0xf472086186382fca55cd182de196520abd76f69d", + "gas": "0x150916", + "gasPrice": "0x3b9aca07", + "maxFeePerGas": "0x3b9aca0e", + "maxPriorityFeePerGas": "0x3b9aca00", + "maxFeePerBlobGas": "0x2", + "hash": "0x36b78570eca623a486eb484066d8d082737ae9508b35f2213ef34c2928fbf875", + "input": "0x1325aca0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000c3e0000000000000000000000000000000000000000000000000000000000000007901000000000000000700000000000000000000000000000000bef7359ed0c915f1db15d599d1c17aad248915474964569f490a2aef2bfb75b401c0b331128cb2c6990fbf9c444e36511bcddb06e8eda91b52ae9adc1b1dc6349cb06474aa0b2d6c93864c0fb4a8fdb4225895c5eeea2d829a7a6f3d73188e64000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000002c2000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000006ca0000000000000000000000000000000000000000000000000000000000000822000000000000000000000000000000000000000000000000000000000000097a0000000000000000000000000000000000000000000000000000000000000ad2000000000000000000000000000000000000000000000000000000000000015555b000000000000069a000000006602f9810000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069b000000006602f9840000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069c000000006602f9870000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069d000000006602f98b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069e000000006602f98e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069f000000006602f991000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a0000000006602f994000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a1000000006602f997000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a2000000006602f99a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a3000000006602f99d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a4000000006602f9a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a5000000006602f9a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a6000000006602f9a6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a7000000006602f9aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a8000000006602f9ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a9000000006602f9b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006aa000000006602f9b3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ab000000006602f9b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ac000000006602f9ba000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ad000000006602f9bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ae000000006602f9c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006af000000006602f9c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b0000000006602f9c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b1000000006602f9c9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b2000000006602f9cc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b3000000006602f9cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b4000000006602f9d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b5000000006602f9d5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b6000000006602f9d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b7000000006602f9dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b8000000006602f9df000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b9000000006602f9e2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ba000000006602f9e5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bb000000006602f9e8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bc000000006602f9ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bd000000006602f9ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006be000000006602f9f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bf000000006602f9f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c0000000006602f9f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c1000000006602f9fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c2000000006602f9fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c3000000006602fa01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c4000000006602fa04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c5000000006602fa08000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c6000000006602fa0b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c7000000006602fa0e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c8000000006602fa11000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c9000000006602fa14000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ca000000006602fa18000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cb000000006602fa1b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cc000000006602fa1e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cd000000006602fa21000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ce000000006602fa24000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cf000000006602fa27000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d0000000006602fa2a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d1000000006602fa2d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d2000000006602fa30000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d3000000006602fa34000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d4000000006602fa37000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d5000000006602fa3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d6000000006602fa3d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d7000000006602fa40000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d8000000006602fa44000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d9000000006602fa47000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006da000000006602fa4a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006db000000006602fa4d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006dc000000006602fa50000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006dd000000006602fa53000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006de000000006602fa56000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006df000000006602fa5a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e0000000006602fa5d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e1000000006602fa60000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e2000000006602fa63000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e3000000006602fa66000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e4000000006602fa69000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e5000000006602fa6c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e6000000006602fa6f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e7000000006602fa72000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e8000000006602fa76000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e9000000006602fa7a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ea000000006602fa7d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006eb000000006602fa80000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ec000000006602fa83000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ed000000006602fa86000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ee000000006602fa89000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ef000000006602fa8c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f0000000006602fa8f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f1000000006602fa93000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f2000000006602fa96000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f3000000006602fa99000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f4000000006602fa9c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000006f5000000006602fa9f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f6000000006602faa2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f7000000006602faa5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f8000000006602faa8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f9000000006602faac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fa000000006602faaf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fb000000006602fab2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fc000000006602fab5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fd000000006602fab8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fe000000006602fabc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ff000000006602fabf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000700000000006602fac200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000701000000006602fac500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000702000000006602fac800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000703000000006602facb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000704000000006602facf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000705000000006602fad200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000706000000006602fad500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000707000000006602fad800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000708000000006602fadb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000709000000006602fade0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070a000000006602fae20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070b000000006602fae50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070c000000006602fae80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070d000000006602faeb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070e000000006602faee0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070f000000006602faf100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000710000000006602faf400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000711000000006602faf800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000712000000006602fafb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000713000000006602fafe00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000714000000006602fb0100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000715000000006602fb0400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000716000000006602fb0700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000717000000006602fb0a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000718000000006602fb0d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000719000000006602fb100000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071a000000006602fb140000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071b000000006602fb170000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071c000000006602fb1a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071d000000006602fb1d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071e000000006602fb200000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071f000000006602fb2300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000720000000006602fb2600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000721000000006602fb2900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000722000000006602fb2d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000723000000006602fb3000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000724000000006602fb3300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000725000000006602fb3600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000726000000006602fb3900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000727000000006602fb3d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000728000000006602fb4000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000729000000006602fb430000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072a000000006602fb460000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072b000000006602fb490000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072c000000006602fb4c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072d000000006602fb4f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072e000000006602fb520000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072f000000006602fb5500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000730000000006602fb5800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000731000000006602fb5c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000732000000006602fb5f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000733000000006602fb6200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000734000000006602fb6500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000735000000006602fb6800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000736000000006602fb6b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000737000000006602fb6e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000738000000006602fb7100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000739000000006602fb740000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073a000000006602fb770000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073b000000006602fb7b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073c000000006602fb7e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073d000000006602fb810000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073e000000006602fb840000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073f000000006602fb8800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000740000000006602fb8b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000741000000006602fb8e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000742000000006602fb9100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000743000000006602fb9400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000744000000006602fb9700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000745000000006602fb9a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000746000000006602fb9d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000747000000006602fba000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000748000000006602fba400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000749000000006602fba70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074a000000006602fbaa0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074b000000006602fbad0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074c000000006602fbb00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074d000000006602fbb30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074e000000006602fbb70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074f000000006602fbba0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000750000000006602fbbd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000751000000006602fbc000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000752000000006602fbc300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000753000000006602fbc600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000754000000006602fbc900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000755000000006602fbcc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000756000000006602fbd000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000757000000006602fbd300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000758000000006602fbd600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000759000000006602fbd90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075a000000006602fbdc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075b000000006602fbdf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075c000000006602fbe30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075d000000006602fbe60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075e000000006602fbe90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075f000000006602fbec00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000760000000006602fbef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000761000000006602fbf200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000762000000006602fbf600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000763000000006602fbf900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000764000000006602fbfc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000765000000006602fbff00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000766000000006602fc0200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000767000000006602fc0500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000768000000006602fc0800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000769000000006602fc0c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076a000000006602fc0f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076b000000006602fc120000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076c000000006602fc150000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076d000000006602fc180000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076e000000006602fc1b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076f000000006602fc1e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000770000000006602fc2100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000771000000006602fc2500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000772000000006602fc2800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000773000000006602fc2b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000774000000006602fc2e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000775000000006602fc3100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000776000000006602fc3400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000777000000006602fc3700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000778000000006602fc3a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000779000000006602fc3d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077a000000006602fc400000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077b000000006602fc440000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077c000000006602fc470000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077d000000006602fc4a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077e000000006602fc4d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077f000000006602fc5000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000780000000006602fc5300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000781000000006602fc5600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000782000000006602fc5900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000783000000006602fc5d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000784000000006602fc6000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000785000000006602fc6300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000786000000006602fc6600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000787000000006602fc6900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000788000000006602fc6c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000789000000006602fc6f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078a000000006602fc720000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078b000000006602fc750000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078c000000006602fc780000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078d000000006602fc7c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078e000000006602fc7f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078f000000006602fc8200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000790000000006602fc8500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000791000000006602fc8800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000792000000006602fc8c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000793000000006602fc8f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000794000000006602fc9200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000795000000006602fc9500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000796000000006602fc9800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000797000000006602fc9b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000798000000006602fc9e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000799000000006602fca10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079a000000006602fca40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079b000000006602fca70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079c000000006602fcab0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079d000000006602fcae0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079e000000006602fcb10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079f000000006602fcb4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a0000000006602fcb7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a1000000006602fcbb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a2000000006602fcbe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a3000000006602fcc1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a4000000006602fcc4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a5000000006602fcc7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a6000000006602fcca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a7000000006602fcce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a8000000006602fcd1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a9000000006602fcd4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007aa000000006602fcd70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000007ab000000006602fcda000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ac000000006602fcdd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ad000000006602fce0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ae000000006602fce3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007af000000006602fce6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b0000000006602fcea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b1000000006602fced000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b2000000006602fcf1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b3000000006602fcf4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b4000000006602fcf7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b5000000006602fcfb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b6000000006602fcfe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b7000000006602fd01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b8000000006602fd04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b9000000006602fd07000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ba000000006602fd0a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bb000000006602fd0d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bc000000006602fd10000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bd000000006602fd14000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007be000000006602fd17000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bf000000006602fd1a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c0000000006602fd1d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c1000000006602fd20000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c2000000006602fd23000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c3000000006602fd26000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c4000000006602fd2a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c5000000006602fd2d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c6000000006602fd30000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c7000000006602fd33000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c8000000006602fd36000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c9000000006602fd3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ca000000006602fd3d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cb000000006602fd40000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cc000000006602fd43000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cd000000006602fd46000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ce000000006602fd49000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cf000000006602fd4c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d0000000006602fd4f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d1000000006602fd52000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d2000000006602fd56000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d3000000006602fd59000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d4000000006602fd5c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d5000000006602fd5f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d6000000006602fd62000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d7000000006602fd65000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d8000000006602fd68000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d9000000006602fd6b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007da000000006602fd6f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007db000000006602fd72000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007dc000000006602fd75000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007dd000000006602fd78000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007de000000006602fd7b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007df000000006602fd7e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e0000000006602fd81000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e1000000006602fd84000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e2000000006602fd87000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e3000000006602fd8b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e4000000006602fd8e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e5000000006602fd91000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e6000000006602fd94000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e7000000006602fd97000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e8000000006602fd9a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e9000000006602fd9d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ea000000006602fda1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007eb000000006602fda4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ec000000006602fda7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ed000000006602fdaa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ee000000006602fdad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ef000000006602fdb0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f0000000006602fdb3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f1000000006602fdb6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f2000000006602fdb9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f3000000006602fdbc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f4000000006602fdc0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f5000000006602fdc3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f6000000006602fdc6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f7000000006602fdc9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f8000000006602fdcc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f9000000006602fdd0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fa000000006602fdd3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fb000000006602fdd6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fc000000006602fdd9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fd000000006602fddd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fe000000006602fde0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ff000000006602fde300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000800000000006602fde600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000801000000006602fde900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000802000000006602fdec00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000803000000006602fdef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000804000000006602fdf200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000805000000006602fdf60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000806000000006602fdf900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000807000000006602fdfc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000808000000006602fdff00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000809000000006602fe020000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080a000000006602fe050000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080b000000006602fe090000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080c000000006602fe0c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080d000000006602fe0f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080e000000006602fe120000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080f000000006602fe1500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000810000000006602fe1800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000811000000006602fe1c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000812000000006602fe1f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000813000000006602fe2200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000814000000006602fe2500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000815000000006602fe2800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000816000000006602fe2b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000817000000006602fe2e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000818000000006602fe3100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000819000000006602fe350000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081a000000006602fe380000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081b000000006602fe3b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081c000000006602fe3e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081d000000006602fe420000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081e000000006602fe450000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081f000000006602fe4800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000820000000006602fe4b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000821000000006602fe4e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000822000000006602fe5100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000823000000006602fe5500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000824000000006602fe5800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000825000000006602fe5b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000826000000006602fe5e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000827000000006602fe6100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000828000000006602fe6400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000829000000006602fe670000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082a000000006602fe6b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082b000000006602fe6e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082c000000006602fe710000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082d000000006602fe740000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082e000000006602fe770000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082f000000006602fe7a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000830000000006602fe7d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000831000000006602fe8000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000832000000006602fe8300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000833000000006602fe8700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000834000000006602fe8a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000835000000006602fe8d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000836000000006602fe9000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000837000000006602fe9300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000838000000006602fe9600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000839000000006602fe990000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083a000000006602fe9d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083b000000006602fea00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083c000000006602fea30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083d000000006602fea60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083e000000006602fea90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083f000000006602feac00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000840000000006602feaf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000841000000006602feb200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000842000000006602feb500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000843000000006602feb900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000844000000006602febc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000845000000006602febf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000846000000006602fec200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000847000000006602fec600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000848000000006602fec900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000849000000006602fecc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084a000000006602fecf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084b000000006602fed20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084c000000006602fed50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084d000000006602fed80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084e000000006602fedb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084f000000006602fede00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000850000000006602fee200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000851000000006602fee500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000852000000006602fee800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000853000000006602feeb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000854000000006602feef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000855000000006602fef200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000856000000006602fef500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000857000000006602fef800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000858000000006602fefb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000859000000006602fefe0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085a000000006602ff010000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085b000000006602ff040000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085c000000006602ff080000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085d000000006602ff0b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085e000000006602ff0e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085f000000006602ff1100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000860000000006602ff140000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000861000000006602ff1700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000862000000006602ff1a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000863000000006602ff1d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000864000000006602ff2100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000865000000006602ff2400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000866000000006602ff2700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000867000000006602ff2a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000868000000006602ff2d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000869000000006602ff310000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086a000000006602ff340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086b000000006602ff370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086c000000006602ff3a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086d000000006602ff3d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086e000000006602ff400000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086f000000006602ff4300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000870000000006602ff4600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000871000000006602ff4900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000872000000006602ff4d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000873000000006602ff5000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000874000000006602ff5300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000875000000006602ff5600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000876000000006602ff5a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000877000000006602ff5d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000878000000006602ff6100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000879000000006602ff640000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087a000000006602ff670000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087b000000006602ff6a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087c000000006602ff6d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087d000000006602ff700000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087e000000006602ff730000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087f000000006602ff7700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000880000000006602ff7a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000881000000006602ff7d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000882000000006602ff8000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000883000000006602ff8300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000884000000006602ff8600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000885000000006602ff8a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000886000000006602ff8d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000887000000006602ff9000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000888000000006602ff9300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000889000000006602ff960000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088a000000006602ff9a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088b000000006602ff9d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088c000000006602ffa00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088d000000006602ffa40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088e000000006602ffa70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088f000000006602ffaa00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000890000000006602ffad00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000891000000006602ffb000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000892000000006602ffb300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000893000000006602ffb600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000894000000006602ffba00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000895000000006602ffbd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000896000000006602ffc000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000897000000006602ffc300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000898000000006602ffc600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000899000000006602ffc90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089a000000006602ffcc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089b000000006602ffd00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089c000000006602ffd30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089d000000006602ffd60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089e000000006602ffd90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089f000000006602ffdc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a0000000006602ffdf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a1000000006602ffe2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a2000000006602ffe5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a3000000006602ffe9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a4000000006602ffec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a5000000006602ffef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a6000000006602fff2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a7000000006602fff5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a8000000006602fff8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a9000000006602fffc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008aa000000006602ffff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ab0000000066030002000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ac0000000066030005000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ad0000000066030008000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ae000000006603000b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008af000000006603000e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b00000000066030011000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b10000000066030014000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b20000000066030018000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b3000000006603001b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b4000000006603001e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b50000000066030021000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b60000000066030024000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b70000000066030027000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b8000000006603002b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b9000000006603002e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ba0000000066030031000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bb00000000660300340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000008bc0000000066030037000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bd000000006603003a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008be000000006603003d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bf0000000066030040000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c00000000066030043000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c10000000066030047000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c2000000006603004a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c3000000006603004d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c40000000066030050000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c50000000066030053000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c60000000066030057000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c7000000006603005a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c8000000006603005d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c90000000066030060000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ca0000000066030063000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cb0000000066030067000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cc000000006603006a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cd000000006603006e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ce0000000066030071000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cf0000000066030074000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d00000000066030077000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d1000000006603007a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d2000000006603007d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d30000000066030081000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d40000000066030084000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d50000000066030087000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d6000000006603008a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d7000000006603008d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d80000000066030090000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d90000000066030094000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008da0000000066030097000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008db000000006603009a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008dc000000006603009d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008dd00000000660300a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008de00000000660300a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008df00000000660300a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e000000000660300aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e100000000660300ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e200000000660300b1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e300000000660300b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e400000000660300b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e500000000660300ba000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e600000000660300bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e700000000660300c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e800000000660300c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e900000000660300c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ea00000000660300ca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008eb00000000660300cd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ec00000000660300d0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ed00000000660300d3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ee00000000660300d6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ef00000000660300d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f000000000660300dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f100000000660300e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f200000000660300e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f300000000660300e7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f400000000660300ea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f500000000660300ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f600000000660300f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f700000000660300f4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f800000000660300f7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f900000000660300fa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fa00000000660300fd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fb0000000066030100000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fc0000000066030103000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fd0000000066030106000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fe000000006603010a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ff000000006603010d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000900000000006603011000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000901000000006603011300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000902000000006603011700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000903000000006603011a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000904000000006603011d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000905000000006603012000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000906000000006603012300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000907000000006603012600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000908000000006603012a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000909000000006603012e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090a00000000660301310000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090b00000000660301340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090c00000000660301370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090d000000006603013b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090e000000006603013e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090f000000006603014100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000910000000006603014400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000911000000006603014700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000912000000006603014a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000913000000006603014d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091400000000660301500000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091500000000660301530000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091600000000660301560000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000917000000006603015a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000918000000006603015d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091900000000660301600000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091a00000000660301630000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091b00000000660301660000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091c00000000660301690000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091d000000006603016c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091e000000006603016f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091f000000006603017300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000920000000006603017600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000921000000006603017a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000922000000006603017d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000923000000006603018000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000924000000006603018300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000925000000006603018600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000926000000006603018900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000927000000006603018c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092800000000660301900000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092900000000660301930000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092a00000000660301960000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092b00000000660301990000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092c000000006603019c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092d000000006603019f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092e00000000660301a30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092f00000000660301a60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093000000000660301a90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093100000000660301ac0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093200000000660301af0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093300000000660301b20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093400000000660301b50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093500000000660301b90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093600000000660301bc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093700000000660301bf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093800000000660301c20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093900000000660301c50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093a00000000660301c80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093b00000000660301cb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093c00000000660301cf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093d00000000660301d20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093e00000000660301d50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093f00000000660301d80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094000000000660301db0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094100000000660301de0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094200000000660301e10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094300000000660301e40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094400000000660301e80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094500000000660301eb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094600000000660301ee0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094700000000660301f10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094800000000660301f40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094900000000660301f80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094a00000000660301fb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094b00000000660301fe0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094c00000000660302010000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094d00000000660302040000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094e00000000660302070000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094f000000006603020a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000950000000006603020d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000951000000006603021100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000952000000006603021400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000953000000006603021700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000954000000006603021a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000955000000006603021d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000956000000006603022100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000957000000006603022400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000958000000006603022700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000959000000006603022a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095a000000006603022d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095b00000000660302300000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095c00000000660302330000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095d00000000660302370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095e000000006603023a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095f000000006603023d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000960000000006603024000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000961000000006603024300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000962000000006603024600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000963000000006603024900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000964000000006603024c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000965000000006603025000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000966000000006603025300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000967000000006603025600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000968000000006603025900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000969000000006603025c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096a000000006603025f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096b00000000660302630000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096c00000000660302660000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096d00000000660302690000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096e000000006603026c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096f000000006603026f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097000000000660302720000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097100000000660302750000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000972000000006603027900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000973000000006603027c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000974000000006603027f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000975000000006603028200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000976000000006603028500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000977000000006603028800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000978000000006603028b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000979000000006603028f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097a00000000660302920000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097b00000000660302950000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097c00000000660302980000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097d000000006603029b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097e000000006603029e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097f00000000660302a10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098000000000660302a40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098100000000660302a70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098200000000660302ab0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098300000000660302ae0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098400000000660302b10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098500000000660302b40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098600000000660302b70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098700000000660302ba0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098800000000660302bd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098900000000660302c00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098a00000000660302c30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098b00000000660302c70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098c00000000660302ca0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098d00000000660302cd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098e00000000660302d00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098f00000000660302d30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099000000000660302d60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099100000000660302d90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099200000000660302dd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099300000000660302e00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099400000000660302e30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099500000000660302e60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099600000000660302e90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099700000000660302ec0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099800000000660302ef0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099900000000660302f30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099a00000000660302f60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099b00000000660302f90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099c00000000660302fc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099d00000000660302ff0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099e00000000660303020000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099f0000000066030305000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a00000000066030308000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a1000000006603030c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a2000000006603030f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a30000000066030312000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a40000000066030315000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a50000000066030318000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a6000000006603031b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a7000000006603031f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a80000000066030322000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a90000000066030325000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009aa0000000066030328000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ab000000006603032b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ac000000006603032e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ad0000000066030331000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ae0000000066030334000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009af0000000066030338000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b0000000006603033b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b1000000006603033e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b20000000066030341000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b30000000066030344000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b40000000066030347000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b5000000006603034b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b6000000006603034e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b70000000066030351000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b80000000066030354000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b90000000066030357000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ba000000006603035a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bb000000006603035e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bc0000000066030361000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bd0000000066030364000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009be0000000066030367000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bf000000006603036a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c0000000006603036d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c10000000066030370000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c20000000066030373000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c30000000066030377000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c4000000006603037a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c5000000006603037d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c60000000066030380000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c70000000066030383000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c80000000066030386000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c90000000066030389000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ca000000006603038c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009cb0000000066030390000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009cc0000000066030393000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x8", + "to": "0x475652655309fa7cb1397537bee9a7fbafdc11ca", + "transactionIndex": "0x0", + "value": "0x0", + "type": "0x3", + "accessList": [ + { + "address": "0x3d9a28f7692cb94740bb64f08cb5cd19aa5cd3dd", + "storageKeys": [] + } + ], + "chainId": "0x1b207", + "blobVersionedHashes": [ + "0x017896a992b0cfbf966e0e3bec1c9f7fbb40bf02ef6926d8daa52cd3f06b62eb" + ], + "v": "0x1", + "r": "0x19e791f54c7337548fa819dd0ef50f9bfc762ef83804f154144c9e3e18c7d07f", + "s": "0x2fe18775bf12877844bed3651d3fec73296222db390a5d5cddd515fc6938b7cc", + "yParity": "0x1" +} diff --git a/rollup/rollup_sync_service/testdata/commit_batch_transaction.json b/rollup/rollup_sync_service/testdata/commit_batch_transaction.json deleted file mode 100644 index 60fbb16d09..0000000000 --- a/rollup/rollup_sync_service/testdata/commit_batch_transaction.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "calldata": "0x1325aca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000018a800000000000000000000000000000000000000000000000000000000000000059000000000000004694000000000000000000000000000725186d74e28d3de9082c4dc34a2c243d4bcc772404b3a6d6e4fa4c6036d01acacc7adf2fe7745a5317950129bdc5da5ddb535ee34d03da817d41d5f6d65a2e918fb1000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000008460000000000000000000000000000000000000000000000000000000000000c480000000000000000000000000000000000000000000000000000000000000de40000000000000000000000000000000000000000000000000000000000000f6200000000000000000000000000000000000000000000000000000000000013e6000000000000000000000000000000000000000000000000000000000000046d80800000000000520310000000064ef32be000000000000000000000000000000000000000000000000000000000000000000000000007a12000003000000000000000520320000000064ef32c1000000000000000000000000000000000000000000000000000000000000000000000000007a12000004000000000000000520330000000064ef32c4000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000000000520340000000064ef32c7000000000000000000000000000000000000000000000000000000000000000000000000007a12000003000000000000000520350000000064ef32ca000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000000000520360000000064ef32cd000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000000000520370000000064ef32d0000000000000000000000000000000000000000000000000000000000000000000000000007a12000006000000000000000520380000000064ef32d3000000000000000000000000000000000000000000000000000000000000000000000000007a120000060000000002d8f902d508850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8706651728988000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b4000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000007cb1b48688424970000000000000000000000000000000000000000000000000006133c6690e000000000000000000000000000000000000000000000000000076759eb3017228000000000000000000000000014aa56aa6ad893a8296c2443772b054c9157aa830000000000000000000000000000000000000000000000000000000064ef363800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a012fcc3e3caaea891fa4b2b5d4130c2bb3477e5f8d2d51679a80b0269cd2ec0d9a0345462a5ba083e1640daf5a5fe665d39630edf15fa871f74b321270242aeb76c000003f1f903ee2a850ba43b7400830521a694bbad0e891922a8a4a7e9c39d4cc0559117016fec80b90384ac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000008717000000000000000000000000000000000000000000000008642d8cc50b5377f400000000000000000000000000000000000000000000000004c26f9c0df588b3000000000000000000000000000000000000000000000e128204e60b2085ced80000000000000000000000000000000000000000000000000000000064ef33db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000008717000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000004c7951a55fb5d9d000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b652000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb000000000000000000000000690000ef01dece82d837b5faa2719ae47b156697000000000000000000000000000000000000000000000e231f5cd8ee1615ba33000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b6520000000000000000000000000000000000000000000000000000000083104ec1a04256aa1ade44f69215193312b91d66f5f855d00ed3bc80c4b342bde7613121fba05d1aa1cf8679c10925ef6998439ff09a738089eec679de113a3ae0ebb2ece67d00000075f87301850ba43b740082ca909453000000000000000000000000000000000000048801aa535d3d0c000084d0e30db083104ec2a01123959614fdc45dca47b62493ca3a48e4b59246f45f5515cf747483099e5441a01527faefaabbb05b5c6c80dc438229194706403a23a8de8a12b8f41caef2b3a8000002d8f902d508850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8703e871b540c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000004c33b81baaa30a70000000000000000000000000000000000000000000000000003b66c05ca500000000000000000000000000000000000000000000000000004864554d7bb47c0000000000000000000000000bcfbf5511d5cb462c20ccd7c186cf9d5f00660ad0000000000000000000000000000000000000000000000000000000064ef363d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0a3646d98cf66c85efb80c78022ecf568c79edd25af014313f61ddbc4933cf673a0288635040cedf157e5d42516b6435c0bc525892eafc110983a909382ef56aa9900000073f87106850ba43b740082ca9094530000000000000000000000000000000000000486c7cfb233750b84d0e30db083104ec1a0e770b755fc5afc41d3179bd796bf7c2b82eb0e705b2fa56c9e1a1df2d9bb9d9ca0670e965c91ed311809987e58deecd77dba3f7cd4cd7a4d5e8941fe333d58093100000072f870821bc9850ba43b74008261a894d90bf40ef846c3513ae474a9fa42bab5d137c44f87470de4df8200008083104ec1a0a0530f15a1eef30e49a193586f83e22c6bc31fad7a1d471b887c09b9b8fc6cd5a01c727ddc32579d8008a1ecee361b87016371e8a90b8c9f26de94c98afcabb227000000aff8ad18850ba43b7400830110dd94c72e15551717923a7a7a162f4771de96c6e6f54680b844095ea7b3000000000000000000000000ce87dbc5176cf0e37cf54741faf30e3e489e1799fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83104ec2a020e5953a44ec49b768ce4e22ca7a0339992b2c8eaf4a73771d35eb9d483521c2a030d47d3a3cc2859c8938019fbe60c49db837e998ab132287126a96e74081ce4e000000b7f8b50f850ba43b740083044d58949ad3c5617ecaa556d6e166787a97081907171230880429d069189e0000b844c7cdea370000000000000000000000000000000000000000000000000429d069189e0000000000000000000000000000000000000000000000000000000000000000000083104ec2a08c673d0f28dc28fb8c5c4b9f97b4ea7195f68ea5bcba4fa69afd90cff8d36899a032def9531076b4a7697e9ab3ddc744df4d215f85a6154181cfc45791a0cacab400000070f86e01850ba43b740082520894ccdf5f933a2caf4fff8090e2aa1c9d02b02ffd20872386f26fc100008083104ec1a0ae4fce22ffcaa2863e961279ee6f611c7a8b48c8adfcc5c74eb77fe7a145df1ea013205baa60b2fd1c0e58e61f6662f0b1f4abefb551f0c81d63367da51d4e4c2c00000219f9021615850ba43b74008302a45a9417afd0263d6909ba1f9a8eac697f76532365fb95880429d069189e0000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef33db00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000006de40ee67a0eb6dc0b1378733359f2064f15ce610000000000000000000000000000000000000000000000000429d069189e0000000000000000000000000000000000000000000000000005114dc5700c81b11a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a031b26bb7c4a128abab486f6ae88dc8d50e4d6e998950885a36cb6202cb75aff2a050b47b53f217ad05f9fa1ac37f870106b5c6aee5187750369784ee9e49a2cf6000000219f9021605850ba43b74008302f6f19417afd0263d6909ba1f9a8eac697f76532365fb9588016345785d8a0000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef33e700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000008c25caf7e3873d1d5b4973ff7e13af004d7c98cc000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000001b080340166d4252c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a0ded58c0fd58331b26c5da9348242873b68806f91762e7777bfa305b1e2eaa801a076ae942a3e8c92b111225b5caf5dd03867b70ff89cc6ca44568d857cbf57fe4b000000aef8ac08850cce41660082c0a594d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000000000008ac7230489e8000083104ec1a080d341f51667bdb43292b6cf129c82de0c4a9af8087d8efa1a38931ea0bc4c81a02b101f84ad1c3c7cb15b8fc29b17b5e1408e1d438e71f4d551c7b91b92536a13000000aef8ac08850cce41660082c0a594d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000000000008ac7230489e8000083104ec2a0b7a31191d83054810613ce172e8f525c9219d0e26da593f98b4fc1cc31126161a019d3f6f15974096de7d45f134df6894e356f1f6e707835d4aae5439fa18af850000000d2f8d080850ba43b74008302ac328080b87b6066806015600039303360006000a2806000f350fe6000803560e01c60008114602e5760018114603a5760028114604657600381146052576101008114605e576063565b634cfc9f2d8283a16063565b635961ec688283a16063565b633f85c0e98283a16063565b636f4c5fd58283a16063565b308283a15b505083104ec2a087b9ab5bc2ae347870503ac3e97b123978db81aa99890101576a09fb1307e4c8a077f695e4c96ac0b6906df1b9bb86ce6dc37895c894acf755f0cc1b7fb6afa777000000d2f8d080850ba43b740083024f8e8080b87b6066806015600039303360006000a2806000f350fe6000803560e01c60008114602e5760018114603a5760028114604657600381146052576101008114605e576063565b632fb3c6c08283a16063565b63d1bb63188283a16063565b6338d8f8878283a16063565b6357c94dd38283a16063565b308283a15b505083104ec1a0a4c7cadb3a0cc42e0e95ccb8aa5dcac6e8801c4e88072ca626c80ffc2f531bdca0208a871501062b0eb1b2319c152d079a63050907fdf4ec4cabb4f541dd5b6aa7000001b1f901ae05850ba43b74008304faab943687ee3fb77c299e287d7a7fd4467623a4e49c4c80b90144ded9382a000000000000000000000000690000ef01dece82d837b5faa2719ae47b15669700000000000000000000000000000000000000000000000000ff68ff7bf0f9a00000000000000000000000000000000000000000000000015a7df7243317341e0000000000000000000000000000000000000000000000000000c2c65aaf92f60000000000000000000000008af20afecf5f4ee4fdab4c2349d764ed06f917280000000000000000000000000000000000000000000000000000000064ef377e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cb8365bb8fd8d9b81f468552ffd58f2a792be0997bac009c5b298abce7c6ce3f66bd0e72665dee544ed9ed24390a4d92c093e679c54f318ff633de0ffee3400d983104ec2a09c0f62d65bb3e97b1ccdba64a8492f820b65575f7191ad7073dc193b47fa3ba4a05d7c3ae98c872a87b082e45fc270df5c570d75e8a1e285aefc4f6fc34db39c12000000b7f8b507850ba43b7400830433c3949ad3c5617ecaa556d6e166787a970819071712308802c68af0bb140000b844c7cdea3700000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000000083104ec2a0b704d013792e65c071df7661a3c84713ae2ddb540f2d3772017a0efd22ae832ca0481081b54bff42285edbc6b1d0e504c3fb0c027621085f8df6814c0713315c6f000000aff8ad04850ba43b7400830119d794672f9e2237b1d6236654d181afc373e2bfb78fdb80b844a1448194000000000000000000000000f77b38ecf43ccc2bd1e2b0d626f2167162b008fc000000000000000000000000000000000000000000000000000000000000000183104ec2a043cb2df1be414967d7c14f60610fc22b95affe01d9254484a44c538df30d2e18a057da38986028b1679028efd7d76f032672dc69eb4878000eabf4eb3f2cf58bc60000008ef88c10850ba43b74008301687994ff355fc2b76c66323a8ae5e5b2df4c9c4fd1c89180a4a0712d68000000000000000000000000000000000000000000000000000000000000000383104ec2a05598114c4003815425512d35f2af917fe119c8919daf9e5192d9f174dc8d4c4aa008ebcd084b8a22dfaf2fac5ffc1d49569f05df45d8ed0ba5f34cb39a0acee257000000b6f8b480850ba43b740083044d58949ad3c5617ecaa556d6e166787a9708190717123087470de4df820000b844c7cdea3700000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000000000083104ec2a02b037835b9488ab2a728c9267eab23b575634a74be26561a1a515541e4b92753a038cff403be500a71e9488189e15380534775816fb7a98f2a8504a262f52c95840000008df88b02850ba43b740082a9e6944ed8bb0cd040e7bb9fed7e0939fdc592811b2a7d80a43fb5c1cb00000000000000000000000000000000000000000000000000000000000000c683104ec2a04cc23af1ba840f61b2370c1211ae560df39c057cd698059dba7880b467c5bdb1a01c23bacb7a238d7387d1a7b04a32ae1bc6ae4ef3cc95072490a7c8726a99255e00002652f9264f02850ba43b7400831a3ea08080b925fa60806040523480156200001157600080fd5b506040516200251a3803806200251a8339818101604052810190620000379190620004ad565b828281600390816200004a919062000788565b5080600490816200005c919062000788565b5050506200007f620000736200009a60201b60201c565b620000a260201b60201c565b6200009133826200016860201b60201c565b5050506200098a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d190620008d0565b60405180910390fd5b620001ee60008383620002d560201b60201c565b806002600082825462000202919062000921565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b591906200096d565b60405180910390a3620002d160008383620002da60201b60201c565b5050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034882620002fd565b810181811067ffffffffffffffff821117156200036a57620003696200030e565b5b80604052505050565b60006200037f620002df565b90506200038d82826200033d565b919050565b600067ffffffffffffffff821115620003b057620003af6200030e565b5b620003bb82620002fd565b9050602081019050919050565b60005b83811015620003e8578082015181840152602081019050620003cb565b60008484015250505050565b60006200040b620004058462000392565b62000373565b9050828152602081018484840111156200042a5762000429620002f8565b5b62000437848285620003c8565b509392505050565b600082601f830112620004575762000456620002f3565b5b815162000469848260208601620003f4565b91505092915050565b6000819050919050565b620004878162000472565b81146200049357600080fd5b50565b600081519050620004a7816200047c565b92915050565b600080600060608486031215620004c957620004c8620002e9565b5b600084015167ffffffffffffffff811115620004ea57620004e9620002ee565b5b620004f8868287016200043f565b935050602084015167ffffffffffffffff8111156200051c576200051b620002ee565b5b6200052a868287016200043f565b92505060406200053d8682870162000496565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059a57607f821691505b602082108103620005b057620005af62000552565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200061a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005db565b620006268683620005db565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000669620006636200065d8462000472565b6200063e565b62000472565b9050919050565b6000819050919050565b620006858362000648565b6200069d620006948262000670565b848454620005e8565b825550505050565b600090565b620006b4620006a5565b620006c18184846200067a565b505050565b5b81811015620006e957620006dd600082620006aa565b600181019050620006c7565b5050565b601f82111562000738576200070281620005b6565b6200070d84620005cb565b810160208510156200071d578190505b620007356200072c85620005cb565b830182620006c6565b50505b505050565b600082821c905092915050565b60006200075d600019846008026200073d565b1980831691505092915050565b60006200077883836200074a565b9150826002028217905092915050565b620007938262000547565b67ffffffffffffffff811115620007af57620007ae6200030e565b5b620007bb825462000581565b620007c8828285620006ed565b600060209050601f831160018114620008005760008415620007eb578287015190505b620007f785826200076a565b86555062000867565b601f1984166200081086620005b6565b60005b828110156200083a5784890151825560018201915060208501945060208101905062000813565b868310156200085a578489015162000856601f8916826200074a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008b8601f836200086f565b9150620008c58262000880565b602082019050919050565b60006020820190508181036000830152620008eb81620008a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200092e8262000472565b91506200093b8362000472565b9250828201905080821115620009565762000955620008f2565b5b92915050565b620009678162000472565b82525050565b60006020820190506200098460008301846200095c565b92915050565b611b80806200099a6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102a6578063a457c2d7146102c4578063a9059cbb146102f4578063dd62ed3e14610324578063f2fde38b146103545761010b565b806370a0823114610232578063715018a61461026257806379cc67901461026c5780638da5cb5b146102885761010b565b8063313ce567116100de578063313ce567146101ac57806339509351146101ca57806340c10f19146101fa57806342966c68146102165761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610370565b6040516101259190611178565b60405180910390f35b61014860048036038101906101439190611233565b610402565b604051610155919061128e565b60405180910390f35b610166610425565b60405161017391906112b8565b60405180910390f35b610196600480360381019061019191906112d3565b61042f565b6040516101a3919061128e565b60405180910390f35b6101b461045e565b6040516101c19190611342565b60405180910390f35b6101e460048036038101906101df9190611233565b610467565b6040516101f1919061128e565b60405180910390f35b610214600480360381019061020f9190611233565b61049e565b005b610230600480360381019061022b919061135d565b6104b4565b005b61024c6004803603810190610247919061138a565b6104c8565b60405161025991906112b8565b60405180910390f35b61026a610510565b005b61028660048036038101906102819190611233565b610524565b005b610290610544565b60405161029d91906113c6565b60405180910390f35b6102ae61056e565b6040516102bb9190611178565b60405180910390f35b6102de60048036038101906102d99190611233565b610600565b6040516102eb919061128e565b60405180910390f35b61030e60048036038101906103099190611233565b610677565b60405161031b919061128e565b60405180910390f35b61033e600480360381019061033991906113e1565b61069a565b60405161034b91906112b8565b60405180910390f35b61036e6004803603810190610369919061138a565b610721565b005b60606003805461037f90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546103ab90611450565b80156103f85780601f106103cd576101008083540402835291602001916103f8565b820191906000526020600020905b8154815290600101906020018083116103db57829003601f168201915b5050505050905090565b60008061040d6107a4565b905061041a8185856107ac565b600191505092915050565b6000600254905090565b60008061043a6107a4565b9050610447858285610975565b610452858585610a01565b60019150509392505050565b60006012905090565b6000806104726107a4565b9050610493818585610484858961069a565b61048e91906114b0565b6107ac565b600191505092915050565b6104a6610c77565b6104b08282610cf5565b5050565b6104c56104bf6107a4565b82610e4b565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610518610c77565b6105226000611018565b565b610536826105306107a4565b83610975565b6105408282610e4b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461057d90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546105a990611450565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60008061060b6107a4565b90506000610619828661069a565b90508381101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590611556565b60405180910390fd5b61066b82868684036107ac565b60019250505092915050565b6000806106826107a4565b905061068f818585610a01565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610729610c77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906115e8565b60405180910390fd5b6107a181611018565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108129061167a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361088a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108819061170c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161096891906112b8565b60405180910390a3505050565b6000610981848461069a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109fb57818110156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490611778565b60405180910390fd5b6109fa84848484036107ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061180a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad69061189c565b60405180910390fd5b610aea8383836110de565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061192e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c5e91906112b8565b60405180910390a3610c718484846110e3565b50505050565b610c7f6107a4565b73ffffffffffffffffffffffffffffffffffffffff16610c9d610544565b73ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061199a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90611a06565b60405180910390fd5b610d70600083836110de565b8060026000828254610d8291906114b0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3391906112b8565b60405180910390a3610e47600083836110e3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190611a98565b60405180910390fd5b610ec6826000836110de565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390611b2a565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fff91906112b8565b60405180910390a3611013836000846110e3565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611122578082015181840152602081019050611107565b60008484015250505050565b6000601f19601f8301169050919050565b600061114a826110e8565b61115481856110f3565b9350611164818560208601611104565b61116d8161112e565b840191505092915050565b60006020820190508181036000830152611192818461113f565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ca8261119f565b9050919050565b6111da816111bf565b81146111e557600080fd5b50565b6000813590506111f7816111d1565b92915050565b6000819050919050565b611210816111fd565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b6000806040838503121561124a5761124961119a565b5b6000611258858286016111e8565b92505060206112698582860161121e565b9150509250929050565b60008115159050919050565b61128881611273565b82525050565b60006020820190506112a3600083018461127f565b92915050565b6112b2816111fd565b82525050565b60006020820190506112cd60008301846112a9565b92915050565b6000806000606084860312156112ec576112eb61119a565b5b60006112fa868287016111e8565b935050602061130b868287016111e8565b925050604061131c8682870161121e565b9150509250925092565b600060ff82169050919050565b61133c81611326565b82525050565b60006020820190506113576000830184611333565b92915050565b6000602082840312156113735761137261119a565b5b60006113818482850161121e565b91505092915050565b6000602082840312156113a05761139f61119a565b5b60006113ae848285016111e8565b91505092915050565b6113c0816111bf565b82525050565b60006020820190506113db60008301846113b7565b92915050565b600080604083850312156113f8576113f761119a565b5b6000611406858286016111e8565b9250506020611417858286016111e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061146857607f821691505b60208210810361147b5761147a611421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114bb826111fd565b91506114c6836111fd565b92508282019050808211156114de576114dd611481565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006115406025836110f3565b915061154b826114e4565b604082019050919050565b6000602082019050818103600083015261156f81611533565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006115d26026836110f3565b91506115dd82611576565b604082019050919050565b60006020820190508181036000830152611601816115c5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006116646024836110f3565b915061166f82611608565b604082019050919050565b6000602082019050818103600083015261169381611657565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006116f66022836110f3565b91506117018261169a565b604082019050919050565b60006020820190508181036000830152611725816116e9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611762601d836110f3565b915061176d8261172c565b602082019050919050565b6000602082019050818103600083015261179181611755565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006117f46025836110f3565b91506117ff82611798565b604082019050919050565b60006020820190508181036000830152611823816117e7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006118866023836110f3565b91506118918261182a565b604082019050919050565b600060208201905081810360008301526118b581611879565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006119186026836110f3565b9150611923826118bc565b604082019050919050565b600060208201905081810360008301526119478161190b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006119846020836110f3565b915061198f8261194e565b602082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006119f0601f836110f3565b91506119fb826119ba565b602082019050919050565b60006020820190508181036000830152611a1f816119e3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a826021836110f3565b9150611a8d82611a26565b604082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000611b146022836110f3565b9150611b1f82611ab8565b604082019050919050565b60006020820190508181036000830152611b4381611b07565b905091905056fea26469706673582212204df6f0de305c90d5e7f095ff995f5884e7b51d307b600671a909171759701b0f64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000115c000000000000000000000000000000000000000000000000000000000000000465656577000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323200000000000000000000000000000000000000000000000000000000000083104ec29fe7a308a2e7365e476d40bcba87d70bdcd3f390b76a21530fbda4620dc2617ca002adcc34d12199c22c778c02445cac6b9416aab00bfd365149e786c0cbf80e3f0000008df88b07850ba43b740082a71b94530000000000000000000000000000000000000480a42e1a7d4d0000000000000000000000000000000000000000000000000000c7cfb233750b83104ec2a0d0bafb4cd5442c56b072a688c48315bc09fdfb6684704449020338ea5e46319ea06bbe8cf22c282cec7668d740da3092020964e159866696514cfe91a95df1c95400000218f902152b850ba43b74008302b72c9417afd0263d6909ba1f9a8eac697f76532365fb9588025bf6196bd10000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef33ea00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b652000000000000000000000000000000000000000000000000025bf6196bd10000000000000000000000000000000000000000000000000002df3642efb456b17700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a0bae91ce5dc19445136098834317d1990b512e04bc17b4d673764bb18a9890c609fbfcf09c31bc6224ab8248546afbd0f46235bbb2bc0bb7edbeb899b3356ff9f000002b1f902ae4c850ba43b74008303efe89417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef33d5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000ffd2ece82f7959ae184d10fe17865d27b4f0fb94000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000008f0d1800000000000000000000000000000000000000000000000000142731bbbe7afff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000142731bbbe7afff000000000000000000000000b7a973b36d1c39e5ce935f611613fc0bb58f86580000000000000000000000000000000000000000000000000000000083104ec2a014b20ed2c85a5c1a1b48b47534623db622cf4c6b9fa237603005f3c5e1f2adaca0382b0b2d098a0f7d4f19635d7a2dec55e887eb9611a3efac67fa5f304ca4f27e0000000000000000000000000000000000000000000000000000000000000000000000000000249d0500000000000520390000000064ef32d6000000000000000000000000000000000000000000000000000000000000000000000000007a120000040000000000000005203a0000000064ef32d9000000000000000000000000000000000000000000000000000000000000000000000000007a120000070000000000000005203b0000000064ef32dc000000000000000000000000000000000000000000000000000000000000000000000000007a120000030000000000000005203c0000000064ef32df000000000000000000000000000000000000000000000000000000000000000000000000007a120000040000000000000005203d0000000064ef32e2000000000000000000000000000000000000000000000000000000000000000000000000007a120000020000000002d8f902d509850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8704f94ae6af8000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000004f94ae6af8000000000000000000000000000000000000000000000000000060eccdd5c1d16390000000000000000000000000000000000000000000000000004b9a0c18d200000000000000000000000000000000000000000000000000005c1429f1782084000000000000000000000000093b988e7d596005bc71b4e09ffbe8175f11c894b0000000000000000000000000000000000000000000000000000000064ef365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0a086095355da2b87258e33e428ebdc39bb3b5d1f60f96756aa5f84872645ecd5a0304759b9546ac3343a12db1a01bcbf44a85e1ac5ceb08511de72fbe5d292a4e4000000b6f8b403850ba43b7400830433c3949ad3c5617ecaa556d6e166787a9708190717123087038d7ea4c68000b844c7cdea3700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000083104ec2a012074706a507210139a157b5e54f4a3df533e527059b112d676a5ba27bda8611a04565c4c90183d9f8071ce19c9b30c5e017fed20d6e2203bc457511eb7a008691000002d8f902d503850ba43b740083019f7694bbad0e891922a8a4a7e9c39d4cc0559117016fec8711b60f91caf056b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000011b60f91caf05600000000000000000000000000000000000000000000000015a6404b8c9b705a0000000000000000000000000000000000000000000000000011aac49b704653000000000000000000000000000000000000000000000000159860cf3886c23c000000000000000000000000342f6796d7b9d757e9355863c3dff3c5062158700000000000000000000000000000000000000000000000000000000064ef33de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a045d119de9f101892b7c34b06b014cb764f032db0c51b0575e5b66ad3ff81143ca02cf20dcc2f56cff75867f655f92e0c044a416e9b40141a4bc757eb00e95cd0c100000218f9021580850ba43b740083026a729417afd0263d6909ba1f9a8eac697f76532365fb958717aeb11212a000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef33de00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000cca7589b2742e57ff55d04e4f6a96aaa5879a13d0000000000000000000000000000000000000000000000000017aeb11212a0000000000000000000000000000000000000000000000000001cd522d257fab3c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a0b75d90faed4ac37b661a26353ad653590ffca47ca3e09ded38f23df0fcec9f3da0563ce4e83c2b3041bc7fd3d87ac38b99a52e2e7ee7bc25f2520564a3c13e3a04000002d8f902d509850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8704f94ae6af8000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000004f94ae6af8000000000000000000000000000000000000000000000000000060e6598a3d0dd700000000000000000000000000000000000000000000000000004b9a0c18d200000000000000000000000000000000000000000000000000005c0e08435399f400000000000000000000000006c8da65e9d173fc186d7ff10020db95e4d58d2880000000000000000000000000000000000000000000000000000000064ef365500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0f78b8fdfae61e082f30cbdf6e3dec9f6af8fcad01a666fdf2ce27546b4146562a0133fefdfd1c42cac10ec4541720d5a59608e45413044668e9f12ef7f51d079f1000002b1f902ae07850bdfd63e008304a2b69417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef59e2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004bbbf918d40111000000000000000000000000000000000000000000000000000047f346a7119d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000000047f346a7119d000000000000000000000000260ca22885185b92bbcdac78dbb526b5ee6f6e7f0000000000000000000000000000000000000000000000000000000083104ec1a002e2f6a82286dcf705b20d1bb72d29a1fe6484a97f5ec69737a0c26a3b907448a01634a4a321d44fe0a7f517881a441fcb9f54bcc43bddf0d9200cc359a5a4100b00000072f8708204b3850ba43b7400825208947cb2b6cb6aa9bbdc4f8862f7b5b77050c580de9187038d7ea4c680008083104ec2a0b828bab67f24182d249ec2f61bbfbee7e86bbde28337f4b07b982d9b2de9b3c6a04ce458d587c4d04c307ad9d1e2b4731552e35986704601077e0db6a20ac4158b000000b6f8b403850ba43b7400830433c3949ad3c5617ecaa556d6e166787a9708190717123087b1a2bc2ec50000b844c7cdea3700000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000000083104ec1a0d7994ec8b85029473ce31d18495b13618be7b5544a7a79e17812c771a7e55fe0a06c425c09559902ca0997319461d2272fde2364c7209b34cc81a0287150c33d6500000072f870821bca850ba43b74008261a89456e45dd03c9edf80631a725554c9a8ac9970579087470de4df8200008083104ec2a068a1c6c91f27a303feb09e625f8deb92e53775d0c7cf71785b710a9c045615fba012d21972578604f795c90603516a25cec0a6e867528f068846c4666ab0bdecc600000172f9016f8182850ba43b7400830289fb943687ee3fb77c299e287d7a7fd4467623a4e49c4c80b9010418cbafe5000000000000000000000000000000000000000000000cb49b44ba602d80000000000000000000000000000000000000000000000000000005cfb9fbd4c04d1c00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000058d089cb9d224433e94060a33b3fecccc30e4ea60000000000000000000000000000000000000000000000000000000064ef377c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000690000ef01dece82d837b5faa2719ae47b156697000000000000000000000000530000000000000000000000000000000000000483104ec2a06435ba082446e56238936cdae25fb233a594dfc0178eee820a0315dfdb1d7f2fa01019d578b1581255f4082797fad42f4d858bce636339070199d1b5a9b7c95f2000000130f9012d19850ba43b74008302d58b94ce87dbc5176cf0e37cf54741faf30e3e489e179980b8c48f6bdeaa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ebec21ee1da40000000000000000000000000000000000000000000000000000eb6d20760f03ea7b0000000000000000000000009ef3c073fbb1c77a065b76e92ae9d0d2a28cb6db0000000000000000000000000000000000000000000000000000000064ef33fa83104ec1a05dfadafbfbd7fc8ff2f6f926326fe71214cbc1be14df4cb6ba1e494d38cc129aa008a57480844c943e7032dbf9b98d2606711f7efb08bd051b542c9c7a66f9dffb000000aef8ac06850ba43b7400827ced94d9692f1748afee00face2da35242417dd05a861580b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb95000000000000000000000000000000000000000000000001b0bc0acfc83201a983104ec1a0e4d285b3912a407bb6e2a944a2e04823f95f7b3f45b7a34eb138748e31b68ef0a00a4c38390af30600ed51ff185deed774640bf5c9af926e5e452b83f5430b9b68000003f1f903ee23850ba43b740083051e5494bbad0e891922a8a4a7e9c39d4cc0559117016fec80b90384ac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000000a2f000000000000000000000000000000000000000000000000017f9828a2e5c45df000000000000000000000000000000000000000000000000015169a1f8ffcea90000000000000000000000000000000000000000000000019ecf9e08edefec260000000000000000000000000000000000000000000000000000000064ef33cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000000a2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000156814b3ae51358000000000000000000000000547580a7a72fe75268a1315e601bddac5a9150af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000000000000000000000000001a64c0a7a41f0d4b8000000000000000000000000547580a7a72fe75268a1315e601bddac5a9150af0000000000000000000000000000000000000000000000000000000083104ec1a00c9f0cccf1a84b6122f02d1151341873dbc8e85c0ee9d9540421086b557a1bafa03d20a9059ef463f16c89265575e613265158e3b3f2a604cdcb9957eed29d0ff2000000b1f8af820a46850ba43b740083013dc1946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b7000000000000000000000000e3f26a65d57548bb06e2de1ff24e881b41b583eb000000000000000000000000000000000000000000000000000000000000000083104ec1a09129a7f06182c9cb262365d9a96ffe6999c943867e7815f33aa20d133556cbcaa021116e937b78547580911c8110d9fcd5dea43731c6ec55035b2fa6792e867b38000000aef8ac2c850ba43b74008266d494b473160c57c7b2d228ba5a5f3c76ebc2e9668c6580b844095ea7b3000000000000000000000000837a9f1803d84a341a343f05be9705dec4b81f930000000000000000000000000000000000000000000000000b1d5f3c090b9eaf83104ec1a0624ba2c183727e9ca7fc2c3a8be3d9a462236667cd3c31e1d71b719b74606e54a034392e6224d768b41819a00fc67cdbe38b01eafd5577c7be6aa7a9c48d59061a000000aef8ac04850ba43b740082b4c094530000000000000000000000000000000000000480b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000000008e1bc9bf04000083104ec2a0a27b079622f4398d66686f9b8a909c301b5880a6bd18ceb121ebc1d4b2cc7125a036c74beef024feb50f27ecfa7d0ca0157f59d3624300d76309d1e6d0de433c4a000003f1f903ee06850ba43b74008305292194bbad0e891922a8a4a7e9c39d4cc0559117016fec80b90384ac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000006ffb00000000000000000000000000000000000000000000000002be0f04c7b462bb00000000000000000000000000000000000000000000000000104fcefa78b54e0000000000000000000000000000000000000000000000002cb2d85a09455baf0000000000000000000000000000000000000000000000000000000064ef33f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000006ffb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000011554e0cda318f000000000000000000000000548453631f70facef4e09697e0d2e5f4e149db73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000002e1853a465ed9f51000000000000000000000000548453631f70facef4e09697e0d2e5f4e149db730000000000000000000000000000000000000000000000000000000083104ec1a0b039e7ee7c3cac62dbbad4334e9115630ea77480e49c77e66ac65fed4361ac83a00adf32f7d6e5c5d9ccf4fc694b793bdc693884de263e8355794805cd89a499c5000002b3f902b0820f22850ba43b74008302e6fb94cbbc5da52ea2728279560dca8f4ec08d5f82998580b902446f888fa10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000e0793d76b8a0c82d19f5829015799705b1c665cc955adf1d3e5c658525f4ee77cc1675a428039c82c3a8ffe6f3a7cb1621230c08444566077459300d8ee2403de2000000000000000000000000000000000000000000000000000000000000a427000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7363726f6c6c2d7365706f6c69610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041402a8f05776a363cfbfa77f62c320234b0dea18eba182e5570609c87645a159636f686f7eb82f9b5c0419396a161b6403d4b01bc9a7191509974c1cb56a0ce8a1b0000000000000000000000000000000000000000000000000000000000000083104ec2a096da96cdde4dad6e5495fb73032063a5cbd8b521a4d136ae6db61237a48a2b25a03b12b04491b2dacbe8602d223217a0dfa0efd7f2f99c1808413fedf14fa166b5000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec87060a24181e4000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b400000000000000000000000000000000000000000000000000060a24181e4000000000000000000000000000000000000000000000000000075a9fd3e2ed5e9e0000000000000000000000000000000000000000000000000005bcd57d4ff00000000000000000000000000000000000000000000000000006fc7e3c7dfb19c0000000000000000000000000fd0e0c11bd40d7052cb86a76d6c645787dbfda520000000000000000000000000000000000000000000000000000000064ef365c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0a17ccfa20b473ef89f96806bfcda65828ba5f3380371701a53f206c2c5cbbf7ca036e99a208d4f49ed094d8dcfcfefe3e2736b942020f20c493c477ce39957fb9e000000b5f8b345850ba43b7400830433c3949ad3c5617ecaa556d6e166787a97081907171230865af3107a4000b844c7cdea3700000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000083104ec2a0ae0ae83ce8bf3f2eb648958a360dac3cf734467d0476b230ace81140520602fda014a2c94571cc914ef7db33df4f98e80f55ca155c869b507ac31602b043c96e4c000000000000000000000000000000000000000000000000000000000000000000176105000000000005203e0000000064ef32e5000000000000000000000000000000000000000000000000000000000000000000000000007a120000030000000000000005203f0000000064ef32e8000000000000000000000000000000000000000000000000000000000000000000000000007a12000005000000000000000520400000000064ef32eb000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000000000520410000000064ef32ee000000000000000000000000000000000000000000000000000000000000000000000000007a12000002000000000000000520420000000064ef32f1000000000000000000000000000000000000000000000000000000000000000000000000007a120000030000000002d8f902d505850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec87038d7ea4c68000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000004536d3a18df52c3000000000000000000000000000000000000000000000000000360051c896000000000000000000000000000000000000000000000000000041c0e2a646dc1c0000000000000000000000000c47f3b8497d221999b9dc540ad5f21fa581e4f9a0000000000000000000000000000000000000000000000000000000064ef366200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a0108868a8dcb350044b75a6e3cffcf4acf3ba0f7a53d718c9865453bd6d455242a074c280fb40b57efa2e08b50b55aeeb30abf6e4e496e330643d7a69be3e3b11af00000171f9016e0c850ba43b7400830557309448914c788295b5db23af2b5f0b3be775c4ea944080b9010402c205f00000000000000000000000002c9678042d52b97d27f2bd2947f7111d93f3dd0d000000000000000000000000000000000000000000000000000000001dcd6500000000000000000000000000b4518a802a1a42050c4e27bcec1e7ae15149170300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064ef40d1000000000000000000000000000000000000000000000000000000000000001b2f5536d4f75c9c2c64630ede2158bda62aa96c17e7d3594e96405cc85aa8ded14cd7b67de417954cb2e9bb9dd491b863b5348e7f12d6bd85e34a65c5f9e5112283104ec2a00c8a89588e9949f419cc17ccb14fde31899a6c187c170a13bda53135bd6467b6a035ba5db429b2b45513e5fe3a4949044ea3641f1f1d7ac0a3522de6a74c6a025a000000aef8ac05850ba43b7400827ced94d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000000000015a6d1a4a4139eb4e83104ec2a0d259cf5a8c5a9dea052c712740145069584add7ef738210f3fa0676ddc247c72a0345918f63e56cfdacb52eb6276e8fcb0ec621a0edeee754afefc21a5316eebd0000000b7f8b5038512a05f2000830433c3949ad3c5617ecaa556d6e166787a9708190717123088016345785d8a0000b844c7cdea37000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000083104ec2a093cf39127cdb9019de1ef47f2c02d3a19dd39cba39149fdc02e81048b1e97a83a02caceb646a098c4c8877a3c6796ecdf9a8fc540e28a39f6306ffcb9df566928700000070f86e02850ba43b740082520894ccdf5f933a2caf4fff8090e2aa1c9d02b02ffd20872386f26fc100008083104ec2a09269f9104aece2de5fabc1bf08eb7607d5f6535d3a867fb0878d1aac36e123fda03538cffc4a7ce687420b3fd3f66a8509dcff2e0b0cd82533560c9a40a87a993300000072f870821bcb850ba43b74008261a8944c66467e6e84ff10c9bbf82059912fee08a36df787470de4df8200008083104ec1a0af1394538c0400fae2b8e24ce69d61f1e9dd44691de695dbb7a16964cce03eeba06d80e279c0915db15b71e1816500713ab9e40e65d2b76da2a303a9c27c61a00b000000aef8ac2c850ba43b740082973494d9692f1748afee00face2da35242417dd05a861580b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb95ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec2a0b74f8f74c67140fb7729de8b3460595d5737fb74077cb16cc78504fb71bf6ed6a066b8acce7c293676fa5d5b78abcf7cf702ac3a2dcb044f1d58ca09be07c96fe600000296f902931984773594008304288e9477132b63429718db2b6ad8d942ee13a198f6ab498609184e72a000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001fa4a500f0b2d24a1b94c052ff058d0d745589d6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000354650dab54e0a0000000000000000000000000000000000000000000000000000000064ef3531000000000000000000000000000000000000000000000000000000000000002bfa6a407c4c49ea1d46569c1a4bcf71c3437be54c0007d0551197e6350936976dffb66b2c3bb15ddb72325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a0ff31d88db9d3508a2edb68cf07c7a3ec428c2bb64142613a65476bb339d32abda046d9a11eac74cf01b09f7671803ad2ca68a1397fc6dc4d75c0a89e1ada09db62000002b1f902ae07850ba43b74008303005d9417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef3408000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001b0bc0acfc83201a9000000000000000000000000000000000000000000000000019ec7954e4708ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000019ec7954e4708ad0000000000000000000000008c25caf7e3873d1d5b4973ff7e13af004d7c98cc0000000000000000000000000000000000000000000000000000000083104ec2a05c79dc543118060bb7d36201807128a92a1f4a069f7f005ad2582de77047f197a03552f6704ebb42287958479dcccc7cda74e5eae56c412a5e6e154b20bb28ce6d000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec87071afd498d0000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b400000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000008a6da05235ad30c0000000000000000000000000000000000000000000000000006c00a3912c00000000000000000000000000000000000000000000000000008381beb47fcae80000000000000000000000000d93dd9937f90791afd47cf1818524cd2eff4ca760000000000000000000000000000000000000000000000000000000064ef366900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a094b6380d5c72b504c9ce332faee04f88684b6fe0817945f60457f1c29245807da06113c48a1a92a1256346cbe5a74717304aa65c0df0c3f73644710c5e17280c7a000002b1f902ae048506fc23ac008302cffc9417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef33e7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000006125527c1fd8d7a8000000000000000000000000000000000000000000000000005d20aeec27d756000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000005d20aeec27d7560000000000000000000000006d67f0f1593b060cd2ee397b7b66f6bfa98c504d0000000000000000000000000000000000000000000000000000000083104ec2a07383bfa659c417a5adfd012677512ce1708601dcbae48dce450d0fb5694c17bba0376c8e73977be61476a29bd1c3757a2b8f2d22aa5216113d2cfe2e15440478d4000000aff8ad1a850ba43b7400830110dd94fa94da175be505b915187edc8ae2f62f4ccbf84880b844095ea7b3000000000000000000000000ce87dbc5176cf0e37cf54741faf30e3e489e1799fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83104ec2a074524c2a7c0b1248b132e2d91d0cf430d755131da7397fc30e1ddf622ec7bddda0333ceb0426f2613ff83d032d656202851675ab6d45dc0c0e45bcfa5637feefea0000008ef88c10850ba43b7400830113e79435d02cafb57424828e3c56a2e06d1fbd1d9d9d5e80a4a0712d68000000000000000000000000000000000000000000000000000000000000000183104ec1a04062167b29bb2bd12d3f1911d8ff64fe07755a03037d7dc94b5aa198ead497e8a0085acaa868e531917bee517ea987d5acdc20ada756c9b2e0e0dad89b8af07e04000002b1f902ae2d850ba43b7400830376ba9417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef3414000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000000000531ab7f93975a7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000531ab7f93975a7c000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b6520000000000000000000000000000000000000000000000000000000083104ec2a0956f3fbcb30cc21fb015edc82d08559d135f88171c13c8d728837ffc5b6e0708a05ff5398d5edfddae49824c34a3d1a00ac1bd3e14045234cc8598d9d28d01b9d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe80400000000000520430000000064ef32f4000000000000000000000000000000000000000000000000000000000000000000000000007a12000007000000000000000520440000000064ef32f7000000000000000000000000000000000000000000000000000000000000000000000000007a12000005000000000000000520450000000064ef32fa000000000000000000000000000000000000000000000000000000000000000000000000007a12000004000000000000000520460000000064ef32fd000000000000000000000000000000000000000000000000000000000000000000000000007a120000060000000002d8f902d507850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8704f94ae6af8000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000004f94ae6af8000000000000000000000000000000000000000000000000000060e6598a3eee1b30000000000000000000000000000000000000000000000000004b9a0c18d200000000000000000000000000000000000000000000000000005c0e08435562340000000000000000000000000196540b2697bb289b5825f3a8b0172182188c23e0000000000000000000000000000000000000000000000000000000064ef366f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a02b0058eb3eae76335fd0f5b3f51dec8550714f81292105c918d559f91ebd47f0a0316f757f6f93369afcd4da925c71b9f0dd4f4f4d9775aa82ebde9e0df8367438000000aef8ac04850ba43b740082c0b194d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000001236efcbcbb34000083104ec2a0b797596263e28bdd397c087cf5a94c68c7a6d0de6b78a35744167cf21c4acd7ca03a434df1d2db3a021b2310ecbe1d6325d4d61ff7156f843f64f28f79fe5db203000002d3f902d082028f850ba43b74008307a120946654b9c2b98d2bc001fe8937d6636b1398c61ccb80b90264c9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008009703b19ba1ef5d2183a2c61662d8400002dce060203010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000027d3f9bcf140000000000000000000000000000000000000000000000000000027d563ce9400000000000000000000000000000000000000000000000000000027d85be2a800000000000000000000000000000000000000000000000000000027d8da26e000000000000000000000000000000000000000000000000000000000000000002d2dc073eb930fcf451323edc2152b2d4a1e5300236226adfc378c32aa7331a18835d106847a1e560c2cb260cb7bec0e90a703adb24d9166a810d9372c43a8abe00000000000000000000000000000000000000000000000000000000000000027c759518700abee2a4a1b24c2a6b8841e88de97e6ac40de288931a67affa953f5e4eafd38f75570db91df133ce9e48bc3ce6042db7804162efc0cda72c4cd7e983104ec2a01819ed768910e8467b1d3bbd43a35f0726fe16213a909d18fb2a742e2f87891fa035e28043829f9d8f9463c3882ecaef3a1f07a29f2a07486532d176ce0452ff0100002653f9265002850ba43b7400831a3eb88080b925fa60806040523480156200001157600080fd5b506040516200251a3803806200251a8339818101604052810190620000379190620004ad565b828281600390816200004a919062000788565b5080600490816200005c919062000788565b5050506200007f620000736200009a60201b60201c565b620000a260201b60201c565b6200009133826200016860201b60201c565b5050506200098a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d190620008d0565b60405180910390fd5b620001ee60008383620002d560201b60201c565b806002600082825462000202919062000921565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b591906200096d565b60405180910390a3620002d160008383620002da60201b60201c565b5050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034882620002fd565b810181811067ffffffffffffffff821117156200036a57620003696200030e565b5b80604052505050565b60006200037f620002df565b90506200038d82826200033d565b919050565b600067ffffffffffffffff821115620003b057620003af6200030e565b5b620003bb82620002fd565b9050602081019050919050565b60005b83811015620003e8578082015181840152602081019050620003cb565b60008484015250505050565b60006200040b620004058462000392565b62000373565b9050828152602081018484840111156200042a5762000429620002f8565b5b62000437848285620003c8565b509392505050565b600082601f830112620004575762000456620002f3565b5b815162000469848260208601620003f4565b91505092915050565b6000819050919050565b620004878162000472565b81146200049357600080fd5b50565b600081519050620004a7816200047c565b92915050565b600080600060608486031215620004c957620004c8620002e9565b5b600084015167ffffffffffffffff811115620004ea57620004e9620002ee565b5b620004f8868287016200043f565b935050602084015167ffffffffffffffff8111156200051c576200051b620002ee565b5b6200052a868287016200043f565b92505060406200053d8682870162000496565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059a57607f821691505b602082108103620005b057620005af62000552565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200061a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005db565b620006268683620005db565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000669620006636200065d8462000472565b6200063e565b62000472565b9050919050565b6000819050919050565b620006858362000648565b6200069d620006948262000670565b848454620005e8565b825550505050565b600090565b620006b4620006a5565b620006c18184846200067a565b505050565b5b81811015620006e957620006dd600082620006aa565b600181019050620006c7565b5050565b601f82111562000738576200070281620005b6565b6200070d84620005cb565b810160208510156200071d578190505b620007356200072c85620005cb565b830182620006c6565b50505b505050565b600082821c905092915050565b60006200075d600019846008026200073d565b1980831691505092915050565b60006200077883836200074a565b9150826002028217905092915050565b620007938262000547565b67ffffffffffffffff811115620007af57620007ae6200030e565b5b620007bb825462000581565b620007c8828285620006ed565b600060209050601f831160018114620008005760008415620007eb578287015190505b620007f785826200076a565b86555062000867565b601f1984166200081086620005b6565b60005b828110156200083a5784890151825560018201915060208501945060208101905062000813565b868310156200085a578489015162000856601f8916826200074a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008b8601f836200086f565b9150620008c58262000880565b602082019050919050565b60006020820190508181036000830152620008eb81620008a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200092e8262000472565b91506200093b8362000472565b9250828201905080821115620009565762000955620008f2565b5b92915050565b620009678162000472565b82525050565b60006020820190506200098460008301846200095c565b92915050565b611b80806200099a6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102a6578063a457c2d7146102c4578063a9059cbb146102f4578063dd62ed3e14610324578063f2fde38b146103545761010b565b806370a0823114610232578063715018a61461026257806379cc67901461026c5780638da5cb5b146102885761010b565b8063313ce567116100de578063313ce567146101ac57806339509351146101ca57806340c10f19146101fa57806342966c68146102165761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610370565b6040516101259190611178565b60405180910390f35b61014860048036038101906101439190611233565b610402565b604051610155919061128e565b60405180910390f35b610166610425565b60405161017391906112b8565b60405180910390f35b610196600480360381019061019191906112d3565b61042f565b6040516101a3919061128e565b60405180910390f35b6101b461045e565b6040516101c19190611342565b60405180910390f35b6101e460048036038101906101df9190611233565b610467565b6040516101f1919061128e565b60405180910390f35b610214600480360381019061020f9190611233565b61049e565b005b610230600480360381019061022b919061135d565b6104b4565b005b61024c6004803603810190610247919061138a565b6104c8565b60405161025991906112b8565b60405180910390f35b61026a610510565b005b61028660048036038101906102819190611233565b610524565b005b610290610544565b60405161029d91906113c6565b60405180910390f35b6102ae61056e565b6040516102bb9190611178565b60405180910390f35b6102de60048036038101906102d99190611233565b610600565b6040516102eb919061128e565b60405180910390f35b61030e60048036038101906103099190611233565b610677565b60405161031b919061128e565b60405180910390f35b61033e600480360381019061033991906113e1565b61069a565b60405161034b91906112b8565b60405180910390f35b61036e6004803603810190610369919061138a565b610721565b005b60606003805461037f90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546103ab90611450565b80156103f85780601f106103cd576101008083540402835291602001916103f8565b820191906000526020600020905b8154815290600101906020018083116103db57829003601f168201915b5050505050905090565b60008061040d6107a4565b905061041a8185856107ac565b600191505092915050565b6000600254905090565b60008061043a6107a4565b9050610447858285610975565b610452858585610a01565b60019150509392505050565b60006012905090565b6000806104726107a4565b9050610493818585610484858961069a565b61048e91906114b0565b6107ac565b600191505092915050565b6104a6610c77565b6104b08282610cf5565b5050565b6104c56104bf6107a4565b82610e4b565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610518610c77565b6105226000611018565b565b610536826105306107a4565b83610975565b6105408282610e4b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461057d90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546105a990611450565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60008061060b6107a4565b90506000610619828661069a565b90508381101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590611556565b60405180910390fd5b61066b82868684036107ac565b60019250505092915050565b6000806106826107a4565b905061068f818585610a01565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610729610c77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906115e8565b60405180910390fd5b6107a181611018565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108129061167a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361088a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108819061170c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161096891906112b8565b60405180910390a3505050565b6000610981848461069a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109fb57818110156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490611778565b60405180910390fd5b6109fa84848484036107ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061180a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad69061189c565b60405180910390fd5b610aea8383836110de565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061192e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c5e91906112b8565b60405180910390a3610c718484846110e3565b50505050565b610c7f6107a4565b73ffffffffffffffffffffffffffffffffffffffff16610c9d610544565b73ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061199a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90611a06565b60405180910390fd5b610d70600083836110de565b8060026000828254610d8291906114b0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3391906112b8565b60405180910390a3610e47600083836110e3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190611a98565b60405180910390fd5b610ec6826000836110de565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390611b2a565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fff91906112b8565b60405180910390a3611013836000846110e3565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611122578082015181840152602081019050611107565b60008484015250505050565b6000601f19601f8301169050919050565b600061114a826110e8565b61115481856110f3565b9350611164818560208601611104565b61116d8161112e565b840191505092915050565b60006020820190508181036000830152611192818461113f565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ca8261119f565b9050919050565b6111da816111bf565b81146111e557600080fd5b50565b6000813590506111f7816111d1565b92915050565b6000819050919050565b611210816111fd565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b6000806040838503121561124a5761124961119a565b5b6000611258858286016111e8565b92505060206112698582860161121e565b9150509250929050565b60008115159050919050565b61128881611273565b82525050565b60006020820190506112a3600083018461127f565b92915050565b6112b2816111fd565b82525050565b60006020820190506112cd60008301846112a9565b92915050565b6000806000606084860312156112ec576112eb61119a565b5b60006112fa868287016111e8565b935050602061130b868287016111e8565b925050604061131c8682870161121e565b9150509250925092565b600060ff82169050919050565b61133c81611326565b82525050565b60006020820190506113576000830184611333565b92915050565b6000602082840312156113735761137261119a565b5b60006113818482850161121e565b91505092915050565b6000602082840312156113a05761139f61119a565b5b60006113ae848285016111e8565b91505092915050565b6113c0816111bf565b82525050565b60006020820190506113db60008301846113b7565b92915050565b600080604083850312156113f8576113f761119a565b5b6000611406858286016111e8565b9250506020611417858286016111e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061146857607f821691505b60208210810361147b5761147a611421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114bb826111fd565b91506114c6836111fd565b92508282019050808211156114de576114dd611481565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006115406025836110f3565b915061154b826114e4565b604082019050919050565b6000602082019050818103600083015261156f81611533565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006115d26026836110f3565b91506115dd82611576565b604082019050919050565b60006020820190508181036000830152611601816115c5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006116646024836110f3565b915061166f82611608565b604082019050919050565b6000602082019050818103600083015261169381611657565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006116f66022836110f3565b91506117018261169a565b604082019050919050565b60006020820190508181036000830152611725816116e9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611762601d836110f3565b915061176d8261172c565b602082019050919050565b6000602082019050818103600083015261179181611755565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006117f46025836110f3565b91506117ff82611798565b604082019050919050565b60006020820190508181036000830152611823816117e7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006118866023836110f3565b91506118918261182a565b604082019050919050565b600060208201905081810360008301526118b581611879565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006119186026836110f3565b9150611923826118bc565b604082019050919050565b600060208201905081810360008301526119478161190b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006119846020836110f3565b915061198f8261194e565b602082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006119f0601f836110f3565b91506119fb826119ba565b602082019050919050565b60006020820190508181036000830152611a1f816119e3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a826021836110f3565b9150611a8d82611a26565b604082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000611b146022836110f3565b9150611b1f82611ab8565b604082019050919050565b60006020820190508181036000830152611b4381611b07565b905091905056fea26469706673582212204df6f0de305c90d5e7f095ff995f5884e7b51d307b600671a909171759701b0f64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000c6aea155000000000000000000000000000000000000000000000000000000000000000272720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004656665650000000000000000000000000000000000000000000000000000000083104ec2a06c5bf08273c9572481612ebc6be5916246363d2ac4b31162683f3d8d8690b67aa05e9560c01e52cc196fad30c28c32cfdc5f9baf70b062db72c1be198890ea5320000001b1f901ae06850ba43b74008304b131943687ee3fb77c299e287d7a7fd4467623a4e49c4c80b90144ded9382a000000000000000000000000690000ef01dece82d837b5faa2719ae47b15669700000000000000000000000000000000000000000000000000bf8ebf9cf4bb380000000000000000000000000000000000000000000000012f5e21cb93e16c3d00000000000000000000000000000000000000000000000000007d308366a1ba0000000000000000000000008af20afecf5f4ee4fdab4c2349d764ed06f917280000000000000000000000000000000000000000000000000000000064ef37a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b2ac824ebc924643900ad018b366d583929b46ce3d27aeb15efecba6769b184ce465884873a68c5a1f968e2de490c5516d644a824798db12dcc7198f285b5913783104ec1a09c3b5a97ee7aa0010c42c9229b133457f075ccb3fc81cdce4f0bca01e7cba8b0a00869989f4f5f630f676aa7311a8c03a2f93665043c7c88b0a8653ecf348646190000008ef88c1a850ba43b74008301bd4194e62a60247d0b9c1d09193b0f60875bc49878f5df80a4e6be6c66000000000000000000000000000000000000000000000000000000000000311383104ec2a0b3aab19664bc4a6bde25832ff086c78f24a2e2b8a3574d23fbb260dc303bd8d0a0013f22bc43bdeaf038f4d6fd28ea98d6447360e41ca484da8ecb4b548ecf68ba00000074f87208850ba43b740082ca9094530000000000000000000000000000000000000487014d8ad652491b84d0e30db083104ec1a049db2c1ef445e222fe62cf04fb741fa40db8cad29041d4ec56cf3c47139d6791a01318af076b0be4692dbf2c9eedfd7b2c492309a5785ffee169cd7a3651ffa1e000000218f9021509850bdfd63e008304b4149417afd0263d6909ba1f9a8eac697f76532365fb958701f438daa06000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef59ff00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000001f40000000000000000000000009e879eaaa79d228e4d371b49c8a0c6628c2a14a50000000000000000000000000000000000000000000000000001f438daa060000000000000000000000000000000000000000000000000000203c1364d3fb3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a002d951d3ad6fc72df865696c315ec7d95a09434d7c15ca57eebd4b1e4ad6a448a02d189e6c5bf3a8d2ed5076c23ac96e56e9ead865a3cf6385d2db70e28fbfe41200000218f9021501850ba43b74008302cfae9417afd0263d6909ba1f9a8eac697f76532365fb958717a93c16344000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef340200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710000000000000000000000000cca7589b2742e57ff55d04e4f6a96aaa5879a13d0000000000000000000000000000000000000000000000000017a93c163440000000000000000000000000000000000000000000000000001ccb69a0abf6cdd600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a087f2909a5db333b84fb65ecf1a3a60edae163965d5718b4e27f2f32596560a38a05b26a183721f7c2cf2c19831b8e3ec45288a530a76501602e1ac976001e416c200000075f87380850ba43b740082c2c09453000000000000000000000000000000000000048801aa535d3d0c000084d0e30db083104ec1a049a7cd2a9cf8da5026de077bae6ba45fc3687159fa90f19a4a918177ea21c6c8a04f16ce1faf346cbc3a03b5765436f4253fd171652934497b600ff11a535e07f8000000aef8ac09850ba43b740082b77a94affb188e9e098ac7d9ca3eca6284384e95d65f4380b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000001ac7fc685306c98d783104ec2a08c16ca932639b0eec4e5c2fd5e9912a2756853434f17333ed8de6f0ce5b320cba0268b33542b72737242ee7a9f14285f2741b6694f233d12a9928a88eb1cb3d1b400000072f8708204b4850ba43b74008252089496346c9be6a7b3ca510f5b1e80ac8fb444bfc0d387038d7ea4c680008083104ec1a0be619b6aa2fd87505becb1cd0ab9060a95e3315b4c0faa2c4150ff7a9bef20a5a0088978180a1bc70ede21ce4c462f1fbab8075866c33694cdbde5356201adaba1000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8703e871b540c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000004c22b5366292fc80000000000000000000000000000000000000000000000000003b66c05ca5000000000000000000000000000000000000000000000000000048542c26dda53c000000000000000000000000086453d694fea978566d1531c75264304665ac05c0000000000000000000000000000000000000000000000000000000064ef367600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a075e3af69fe6d07225409dc53e867890dd7043a8e7e7d42c9850d7bf74316d568a00d31e015d2a7e868ed1137ef2b878bd7f1dfa128e116477ba3df779a46eed0730000008ef88c55850ba43b74008301224794e62a60247d0b9c1d09193b0f60875bc49878f5df80a43fc0287f000000000000000000000000000000000000000000000000000000000000060683104ec1a0dc3ad3c65251ce0c8f8ab864c2a03c54cacee1dbf1618c74eaa3aa8e13e35ce9a03d2afc4522d811058c9ec6fe881fcc1417165239d0638af4b28069e2c383750b000000b5f8b346850ba43b740083040abc949ad3c5617ecaa556d6e166787a97081907171230865af3107a4000b844c7cdea3700000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000083104ec2a0d8211bbcf89cddfb8a005014325bbc368d8de98bed2ce378bfc843f2c39f1ebba03c5c01776911d569b6ae7ff0e16d6714e4fda24ed3f7994d61ab0f32ae3aa04200000072f870821bcc850ba43b74008261a894489e5ae86575d964b37319d3c03761ebbfe0ccb687470de4df8200008083104ec2a0d9e44af785cc9333ad21e02f8ef38dad904be1a5a6edccf2165838823576fa93a00623f8ae8712dd7a0f1bcab988e1acc4682ea7c262fba34a23d173213dfcb0d900000070f86e03850ba43b740082520894ccdf5f933a2caf4fff8090e2aa1c9d02b02ffd20872386f26fc100008083104ec1a0ed8b7022f02bf2a7aefb173f52f4abe8a9f26bc6f9a0f38e9f33611dbaf68786a0586e2bf2c50298745d6e4fc689a5a35ba2fe479de95c259eeb62493aee3e59f6000001b9f901b604850ba43b74008301e0818080b90160608060405234801561000f575f80fd5b506101438061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632e64cec1146100385780636057361d14610056575b5f80fd5b610040610072565b60405161004d919061009b565b60405180910390f35b610070600480360381019061006b91906100e2565b61007a565b005b5f8054905090565b805f8190555050565b5f819050919050565b61009581610083565b82525050565b5f6020820190506100ae5f83018461008c565b92915050565b5f80fd5b6100c181610083565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100b4565b5b5f610104848285016100ce565b9150509291505056fea2646970667358221220b5c3075f2f2034d039a227fac6dd314b052ffb2b3da52c7b6f5bc374d528ed3664736f6c6343000814003383104ec1a0a563ff08b2be5ebcd48ce91e0dd86c7f2df812907fb8b0ea6815357b3154d002a07aff250448957f6e9fd610f6ce33e4e7d7fc79571218ba6046ee1ea8042b2e19000000d2f8d080850ba43b74008302bafa8080b87b6066806015600039303360006000a2806000f350fe6000803560e01c60008114602e5760018114603a5760028114604657600381146052576101008114605e576063565b6372cc7b018283a16063565b6378e86b638283a16063565b63c11557ea8283a16063565b63a93b43ad8283a16063565b308283a15b505083104ec1a0dad46eac2bd8095533a12aace7eeb950ba9a0716f281468ac106423681f39ff7a00b3a57f071ea2ce6f877904c7c8e7289f696d79259c8b5d8870052900770c443000000aff8ad2d850ba43b74008309660694837a9f1803d84a341a343f05be9705dec4b81f9380b844e2bbb15800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000b1d5f3c090b9eaf83104ec1a02cbf28f320f52c31d5e9fc2b3e4918af7473369ba566999e4261f441bff6623fa0437e4334549790cba9ea122399cbc130b6a67f6591381ad1ce1a9e7a9e70e7e30000008ef88c54850ba43b74008301224794e62a60247d0b9c1d09193b0f60875bc49878f5df80a43fc0287f000000000000000000000000000000000000000000000000000000000000060783104ec2a089091c9817db9704d756f806aeeb09ee56c626d0319ed5bf3ace7bc004b1b697a07e17b5a89e611e79c7e13d89aadc2a705c89172f5a6951262c474d1f8759a17d000000b6f8b405850ba43b7400830433c3949ad3c5617ecaa556d6e166787a9708190717123087038d7ea4c68000b844c7cdea3700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000083104ec2a067dcfeb65edc1518257b749a6c7c042efa3c49c111078f2574b569618b0ada87a06f989bc2a89b1b1ada45c7a4860bda9249f711d13be9083cd7a38c56c9cd4faa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019920300000000000520470000000064ef3300000000000000000000000000000000000000000000000000000000000000000000000000007a12000007000000000000000520480000000064ef3303000000000000000000000000000000000000000000000000000000000000000000000000007a12000006000000000000000520490000000064ef3306000000000000000000000000000000000000000000000000000000000000000000000000007a120000020000000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8705543df729c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000067d23ad800a561f00000000000000000000000000000000000000000000000000051007aace1000000000000000000000000000000000000000000000000000062a151806703800000000000000000000000000af69b50a2737ab31b1413c3909d192a12266fedf0000000000000000000000000000000000000000000000000000000064ef367b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a086909e983b0c23a44e4fff004f186f05dfe931670ef53214aa88a3ec5f054d96a068ae079571cf79cf257168709ad7d4042552e5b0bce76fdbd2edb5cb1480bf76000002b3f902b0820f23850ba43b74008302e6fb94cbbc5da52ea2728279560dca8f4ec08d5f82998580b902446f888fa10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000e01675a428039c82c3a8ffe6f3a7cb1621230c08444566077459300d8ee2403de251306f4437c2b57b58dc21323f7803252e0c69fae9bfad82f5ebfa8f7b8c728b000000000000000000000000000000000000000000000000000000000000a42d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7363726f6c6c2d7365706f6c69610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041c047d485917fba7c01e81d84494412ba6294deb2368c50f93733ea63aff8a98b23c090845dd0f31ed2471360f26dde8352ef47b971ada379a4dcc7ddee8aeff61b0000000000000000000000000000000000000000000000000000000000000083104ec1a0a1cc97be360954a43ae9a62bdd494cc1bcb8221196d49ab8b1388251aaa89932a01df1a3c877db83834de89c4079ca1634c20ca94156a5b734df4d78272ca40249000000aef8ac0d850ba43b740082d23394efbb3810c4347f416d2a24ee37b09b466b6eac1580b844095ea7b3000000000000000000000000bf57ef344114bb5d443d916700c7bcefb6750e150000000000000000000000000000000000000000000000104e82fb07aa1c6a3f83104ec1a023e8dede9c57e77182b43ccfdd430f76daa57d6a3526d48cc463e496082b190aa019a33660d8158c874cb969edbdccf63f134a5e74d4a9218846ecfba9ac066dcd00000172f9016f8183850ba43b7400830289fb943687ee3fb77c299e287d7a7fd4467623a4e49c4c80b9010418cbafe5000000000000000000000000000000000000000000000ed2b525841adfc0000000000000000000000000000000000000000000000000000004fa49781e46f42000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000058d089cb9d224433e94060a33b3fecccc30e4ea60000000000000000000000000000000000000000000000000000000064ef37a50000000000000000000000000000000000000000000000000000000000000002000000000000000000000000690000ef01dece82d837b5faa2719ae47b156697000000000000000000000000530000000000000000000000000000000000000483104ec1a0429e2174755f06d1cb02a83cf630e91a2012a8873708e46892e57151dc1b69f3a07412d23975163b6d66127dd21bd9edd968bff39f0ebceca63f7d6d81c8ce170400000075f87307850ba43b740082ca9094530000000000000000000000000000000000000488016345785d8a000084d0e30db083104ec1a09be494b71fbdc7cd41858e6cbcd2905c19738c870690c90e019cd63edc128bd3a063c51d588d97755460da3da16c2ef3eefc0df23cbfe974d0d1f0d411890d824000000072f870821bcd850ba43b74008261a8948a3ef1c26b75191f4b7d450deabaa9a32d186a3587470de4df8200008083104ec2a04a14cca88084da9e537358f21ea0304eae12f32b8678003ee8ca4b6deee280eba05316b5cff04a15e7ba43f774655ee1935c0d82aa29b9063441aec1197b3a522c00000296f902931a84773594008304288e9477132b63429718db2b6ad8d942ee13a198f6ab498609184e72a000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001fa4a500f0b2d24a1b94c052ff058d0d745589d6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000354650dab54e0a0000000000000000000000000000000000000000000000000000000064ef3543000000000000000000000000000000000000000000000000000000000000002bfa6a407c4c49ea1d46569c1a4bcf71c3437be54c0007d0551197e6350936976dffb66b2c3bb15ddb72325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a00cedc69fd67702d8add5b883dd0c16e5d7f69c687fd36677b89a06bf092c35dfa05ff26dfdb45771aebe0760a7e62df7a25b65f2e80070b033736f22957fb8ff0400000211f9020e06850ba43b740083028d0c940e7432dffc781e74014e0bb6d9c20f117a3c77e080b901a484bb1e4200000000000000000000000077133e1e255586d871bf5e3119397df3bdd3281d000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a06e420347fba565829810afa1d3ab5e74d56b9b98bd39197f15dac73acd3b4ad5a066a61e8e880dc513b858551cfc6954996e2509ab5693d4b71c98a97205465eaa0000008df88b09850ba43b740082a72794530000000000000000000000000000000000000480a42e1a7d4d00000000000000000000000000000000000000000000000000014d8ad652491b83104ec2a06a874f363167a145592fab5674c82ef6081c50037c225f880d0545bea63578d5a074535ac352e426952311b1ddb582ba8412c7435426c4590ca74ab5aaafe8035b00000219f902162e850ba43b74008302b2329417afd0263d6909ba1f9a8eac697f76532365fb9588027f7d0bdb920000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef341d00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b652000000000000000000000000000000000000000000000000027f7d0bdb9200000000000000000000000000000000000000000000000000030a1c9dff7549432700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a09becdcf7064aa04914df53495249e1737486c9c47bdcac7bb78ddf628d3bd6a4a0275ae09627bd306f9284c8d35905a46e073bbd7458f8dcd2ce5a74325d01fdf5000000aef8ac0a850ba43b740082dd7794affb188e9e098ac7d9ca3eca6284384e95d65f4380b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000001ac7fc685306c98d783104ec1a01178419cacb2f42cde8ea50b258b52e0b0e38406994f37974ba013c79c9af7b5a01ddea566b38184707b51d247ee6f89234f504579781163fcba7f0bb43828a9910000008ef88c57850ba43b74008301224794e62a60247d0b9c1d09193b0f60875bc49878f5df80a43fc0287f000000000000000000000000000000000000000000000000000000000000060883104ec2a0b958418dc8b0c7d47b42e750bf30276c374115192e2316ab44b8ef8784338b54a00b4bd4787feee5789d5762148315da76fb5260e8fb669d0378759e1d9c02444200000296f902931b84773594008304288e9477132b63429718db2b6ad8d942ee13a198f6ab498609184e72a000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001fa4a500f0b2d24a1b94c052ff058d0d745589d6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000354650dab54e0a0000000000000000000000000000000000000000000000000000000064ef3544000000000000000000000000000000000000000000000000000000000000002bfa6a407c4c49ea1d46569c1a4bcf71c3437be54c0007d0551197e6350936976dffb66b2c3bb15ddb72325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a038b399c757cf093c3a182eb2e995cf8ae70d2d35903ac42248e136ed5fb8061ea03bd2ac0f60229e6de4ab89d75202a4ab3e680541033a7ca2245b5b5bb4a70930000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8705543df729c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000067d23ad8013bbb800000000000000000000000000000000000000000000000000051007aace1000000000000000000000000000000000000000000000000000062a1518067925800000000000000000000000007d93803d87a46022e4d072621b3e8ea0cfda45910000000000000000000000000000000000000000000000000000000064ef368200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a0b61ec3413c9065acdb15c4205866e58d82451d8177e89b52baa1d89b9390326ca03ee0103ce75d32b10f6018bc5581a57649f76082aaf193d75b753264283058f800000218f9021580850ba43b74008302f5579417afd0263d6909ba1f9a8eac697f76532365fb9587b1a2bc2ec50000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef342600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000027100000000000000000000000004da5309c2d10289aff5236b3901478648e061d0c00000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000d82a24a0e1a6b47f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a093ad841a204c9b52e93f5bc137b88821b05acc46c28777bd593e54102b5b4b9fa0060293be878252cf16e5f17dfb34c99b5bb62f5541cf4a753fa48c7dfa853258000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017a704000000000005204a0000000064ef3309000000000000000000000000000000000000000000000000000000000000000000000000007a120000050000000000000005204b0000000064ef330c000000000000000000000000000000000000000000000000000000000000000000000000007a120000060000000000000005204c0000000064ef330f000000000000000000000000000000000000000000000000000000000000000000000000007a120000020000000000000005204d0000000064ef3312000000000000000000000000000000000000000000000000000000000000000000000000007a12000002000000000130f9012d1b850ba43b74008302d58b94ce87dbc5176cf0e37cf54741faf30e3e489e179980b8c48f6bdeaa00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ebec21ee1da40000000000000000000000000000000000000000000000000000eb6d7fa9807099c30000000000000000000000009ef3c073fbb1c77a065b76e92ae9d0d2a28cb6db0000000000000000000000000000000000000000000000000000000064ef342883104ec2a034b9f505221a147d06bea1c4e4aea11520a3958d1b08c1220e16b817049c7b47a0667af8c9e559c663c461b29043131b5d0edb61f2607e98f37a377a984747582f00000231f9022e0b850ba43b740083065cf594d32548ea5911a6336c5a34061e814148c396ae6f80b901c43e5d877b00000000000000000000000000000000000000000000000000000000aff87bf30000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000004863ee7a6c4f9ca63ba655bacdf6f5bc0a7ea25d00000000000000000000000000000000000000000000000000000000000ea285000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000041c8bafe89384b180012ac8544c2bfda8b6e62ec86ac06ce1dce0944589037cd3f49bd60b340e3387f70dfb8b00fa527b030f089e52ef97f1a8ba6149213d44ccb1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a011103e29e30b240d50d49304ce4c7cfe222164ac4724d550b1efc939be4be534a0621e1fbfdbd666e11069e58f382488cae84bf1f57ad26e005f447cf3377261fa0000008ef88c54850ba43b74008301224794e62a60247d0b9c1d09193b0f60875bc49878f5df80a43fc0287f000000000000000000000000000000000000000000000000000000000000060983104ec1a06df44748084d0b10f0db4913f8e435723d940c5bb31436a6d6b1e81f69042ef3a03bb01d862b24827828bc06672d6a9369052c99bbc6237260e0a6149bb4cf6cef000000cff8cd07850ba43b74008315cd00949629deec040fef7a1ac0748f8bdfe0cb252e45ba80b8649944ba5d000000000000000000000000e310227a350ab8d67e4b15a9eee0f1368586b30b00000000000000000000000000000000000000000000000000000000000000008326065dbbfa9caa5e67cd9de021bb91c86fbf318f3c42aabf5287aa68fb679f83104ec1a057633d4475d99d2584068d6959a85fad640de218a613c15139f74a4b53f84860a048d59de2267c7c4e8af69a0bd94d3e402c6bfe0e3a1b599fe6db7aadb727c00900000296f902931c84773594008304288e9477132b63429718db2b6ad8d942ee13a198f6ab498609184e72a000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001fa4a500f0b2d24a1b94c052ff058d0d745589d6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000354650dab54e0a0000000000000000000000000000000000000000000000000000000064ef3546000000000000000000000000000000000000000000000000000000000000002bfa6a407c4c49ea1d46569c1a4bcf71c3437be54c0007d0551197e6350936976dffb66b2c3bb15ddb72325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a05650a3c99d6eb8a07aab72ab49c7dc898c7e1bfa275adc85de014792041ed809a0517d1640932aeae1a0b427f8756d92d9b6e116c1ce424ba12acb526c5c492208000002d8f902d507850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8705543df729c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000067d23ad8013bbb800000000000000000000000000000000000000000000000000051007aace1000000000000000000000000000000000000000000000000000062a151806792580000000000000000000000000763b0a8bdd49de91783ee24938d2d1a423f3df7b0000000000000000000000000000000000000000000000000000000064ef368800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a066b4fa2cbc553375c716e587be3e63e943d5b3406298f69939ace5d8376541bca071bad274b3133594757217051414365044909e7fd3a454dc250af4170c281b3900000218f9021502850ba43b74008302e7d19417afd0263d6909ba1f9a8eac697f76532365fb958705f7f37b390000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef341a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710000000000000000000000000314067e7ca8360f5a7d6f8c3bbf7188462cd26f50000000000000000000000000000000000000000000000000005f7f37b390000000000000000000000000000000000000000000000000000074376b3a0b6a75800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a00bd58a4adbf5cb4352df81caf35c40709feefbb8e0a7bf180d14a3880af8debda0277b079d8167efd24e167e3029df2acf2aea543b2953ccab139ed12b1391914b000000b6f8b403850ba43b740083042452949ad3c5617ecaa556d6e166787a97081907171230872386f26fc10000b844c7cdea37000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000083104ec2a0c90a11b2e824e2997793ff9d4107e1b01a98d5cd8f7a9a191c0b5e27e328462ba07ab1ef30737a6e67539bb9bbe4dd0a2009d768aace669ef36ab575e249c3fc9900000075f87301850ba43b740082ca909453000000000000000000000000000000000000048801aa535d3d0c000084d0e30db083104ec2a0147ef8f1f7261e8ffd2c71eb2564aad6768c02eced9dd5304cc533dee3fae4f3a0092f51268e296c2a4efe29f69441b694ef36137c2054ea995f52dfe6a992bd1300000219f9021608850ba43b74008302f6de9417afd0263d6909ba1f9a8eac697f76532365fb95880de0b6b3a7640000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef342600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000027100000000000000000000000008c25caf7e3873d1d5b4973ff7e13af004d7c98cc0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000010dfa3521294389f8700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a02a798da0abed8ae611ad0efe5a7baba742d48ba23f2737161ddc5e14ea9d8256a03de5b082834573558eeafedee46149bb4fadfe9c0080575dda8aa099ba7424e5000000adf8ab04841dcd650082b74c94cae23aaa6ee04b3b70c2da30b75b3af912543a9e80b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000033b2e3c9fd0803ce800000083104ec1a03a549b0737b5d2e5fc6ec6fbcb2b969c8e95971c295a55fe15b7d0b100c3bcc3a03c20470c5787761ff2520482623f6d8e25c2bfd51a99c0d4644b6ed3b1bfcfc800000070f86e04850ba43b740082520894ccdf5f933a2caf4fff8090e2aa1c9d02b02ffd20872386f26fc100008083104ec1a068451bfec404d52f88c0fb46d92fce1629687a00f291ca7e3be7a90c62fa987fa026532afc5973f3ba2b6683b6f692cfc1646ee2458bbacc8aba49aa217dabf61400000296f902931d84773594008304288e9477132b63429718db2b6ad8d942ee13a198f6ab498609184e72a000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001fa4a500f0b2d24a1b94c052ff058d0d745589d6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000354650dab54e0a0000000000000000000000000000000000000000000000000000000064ef3548000000000000000000000000000000000000000000000000000000000000002bfa6a407c4c49ea1d46569c1a4bcf71c3437be54c0007d0551197e6350936976dffb66b2c3bb15ddb72325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a06e824a423c3a004149d9ee25715193b1d8f45ffab32eb2d17cccf96e124193c8a06fcba743571e103c2c8a28b9fd556dacd3fc0e4500e33ded57373e02afdf2c6a0000008ef88c0e850ba43b74008302268d94bf57ef344114bb5d443d916700c7bcefb6750e1580a4a3908e1b0000000000000000000000000000000000000000000000104e82fb07aa1c6a3f83104ec2a041b3310e9357d96c41758143fe3974b7bc96441ec8aacc624a0a9f1ea4e7fb47a02b93afa3079b9c9855a75e6ca412462d97c276cda894fa67c1457de73227ef74000002b1f902ae2f850ba43b74008303e5bf9417afd0263d6909ba1f9a8eac697f76532365fb9580b902445ae401dc0000000000000000000000000000000000000000000000000000000064ef342f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000d9692f1748afee00face2da35242417dd05a8615000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000000052eea1a256ffecb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000052eea1a256ffecb000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b6520000000000000000000000000000000000000000000000000000000083104ec1a0df147078e16e74ee99ece68564a5d64c14e4ba1be4282629b75ba36b1c58dce2a028e08adb28d7c080e92f3cf6e66cd048a8e2077a758e3541dea510467c76da1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480c07000000000005204e0000000064ef3315000000000000000000000000000000000000000000000000000000000000000000000000007a120000040000000000000005204f0000000064ef3318000000000000000000000000000000000000000000000000000000000000000000000000007a12000007000000000000000520500000000064ef331b000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000000000520510000000064ef331e000000000000000000000000000000000000000000000000000000000000000000000000007a12000003000000000000000520520000000064ef3321000000000000000000000000000000000000000000000000000000000000000000000000007a12000004000000000000000520530000000064ef3324000000000000000000000000000000000000000000000000000000000000000000000000007a12000002000000000000000520540000000064ef3327000000000000000000000000000000000000000000000000000000000000000000000000007a120000040000000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8706651728988000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b4000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000007c95de56a6a00dd0000000000000000000000000000000000000000000000000006133c6690e0000000000000000000000000000000000000000000000000000765b2cd2517e700000000000000000000000000e12f8341db316d99708a7645dbadcc8fe6dd7bb10000000000000000000000000000000000000000000000000000000064ef368f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a08bb3d5695fdba073187359f73a43d289767f90f05cddbdfcde556c144d26432da03fdb51048bd31f3540efc7067dff6b06161f68108d8e52a260f0ee7f53f2756c00000072f870821bce850ba43b74008261a894987e8b40b8f3154063bad183cf246099111f98ad87470de4df8200008083104ec1a084c12c57b6008779035924280a521e8262e0d519381b47525fd137ed77074b2ca043d422894d159a51675060c35a284cbde41fa4c030912900dd683208873e1b6f00002653f9265002850ba43b7400831a3ea08080b925fa60806040523480156200001157600080fd5b506040516200251a3803806200251a8339818101604052810190620000379190620004ad565b828281600390816200004a919062000788565b5080600490816200005c919062000788565b5050506200007f620000736200009a60201b60201c565b620000a260201b60201c565b6200009133826200016860201b60201c565b5050506200098a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d190620008d0565b60405180910390fd5b620001ee60008383620002d560201b60201c565b806002600082825462000202919062000921565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b591906200096d565b60405180910390a3620002d160008383620002da60201b60201c565b5050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034882620002fd565b810181811067ffffffffffffffff821117156200036a57620003696200030e565b5b80604052505050565b60006200037f620002df565b90506200038d82826200033d565b919050565b600067ffffffffffffffff821115620003b057620003af6200030e565b5b620003bb82620002fd565b9050602081019050919050565b60005b83811015620003e8578082015181840152602081019050620003cb565b60008484015250505050565b60006200040b620004058462000392565b62000373565b9050828152602081018484840111156200042a5762000429620002f8565b5b62000437848285620003c8565b509392505050565b600082601f830112620004575762000456620002f3565b5b815162000469848260208601620003f4565b91505092915050565b6000819050919050565b620004878162000472565b81146200049357600080fd5b50565b600081519050620004a7816200047c565b92915050565b600080600060608486031215620004c957620004c8620002e9565b5b600084015167ffffffffffffffff811115620004ea57620004e9620002ee565b5b620004f8868287016200043f565b935050602084015167ffffffffffffffff8111156200051c576200051b620002ee565b5b6200052a868287016200043f565b92505060406200053d8682870162000496565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059a57607f821691505b602082108103620005b057620005af62000552565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200061a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005db565b620006268683620005db565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000669620006636200065d8462000472565b6200063e565b62000472565b9050919050565b6000819050919050565b620006858362000648565b6200069d620006948262000670565b848454620005e8565b825550505050565b600090565b620006b4620006a5565b620006c18184846200067a565b505050565b5b81811015620006e957620006dd600082620006aa565b600181019050620006c7565b5050565b601f82111562000738576200070281620005b6565b6200070d84620005cb565b810160208510156200071d578190505b620007356200072c85620005cb565b830182620006c6565b50505b505050565b600082821c905092915050565b60006200075d600019846008026200073d565b1980831691505092915050565b60006200077883836200074a565b9150826002028217905092915050565b620007938262000547565b67ffffffffffffffff811115620007af57620007ae6200030e565b5b620007bb825462000581565b620007c8828285620006ed565b600060209050601f831160018114620008005760008415620007eb578287015190505b620007f785826200076a565b86555062000867565b601f1984166200081086620005b6565b60005b828110156200083a5784890151825560018201915060208501945060208101905062000813565b868310156200085a578489015162000856601f8916826200074a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008b8601f836200086f565b9150620008c58262000880565b602082019050919050565b60006020820190508181036000830152620008eb81620008a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200092e8262000472565b91506200093b8362000472565b9250828201905080821115620009565762000955620008f2565b5b92915050565b620009678162000472565b82525050565b60006020820190506200098460008301846200095c565b92915050565b611b80806200099a6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102a6578063a457c2d7146102c4578063a9059cbb146102f4578063dd62ed3e14610324578063f2fde38b146103545761010b565b806370a0823114610232578063715018a61461026257806379cc67901461026c5780638da5cb5b146102885761010b565b8063313ce567116100de578063313ce567146101ac57806339509351146101ca57806340c10f19146101fa57806342966c68146102165761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610370565b6040516101259190611178565b60405180910390f35b61014860048036038101906101439190611233565b610402565b604051610155919061128e565b60405180910390f35b610166610425565b60405161017391906112b8565b60405180910390f35b610196600480360381019061019191906112d3565b61042f565b6040516101a3919061128e565b60405180910390f35b6101b461045e565b6040516101c19190611342565b60405180910390f35b6101e460048036038101906101df9190611233565b610467565b6040516101f1919061128e565b60405180910390f35b610214600480360381019061020f9190611233565b61049e565b005b610230600480360381019061022b919061135d565b6104b4565b005b61024c6004803603810190610247919061138a565b6104c8565b60405161025991906112b8565b60405180910390f35b61026a610510565b005b61028660048036038101906102819190611233565b610524565b005b610290610544565b60405161029d91906113c6565b60405180910390f35b6102ae61056e565b6040516102bb9190611178565b60405180910390f35b6102de60048036038101906102d99190611233565b610600565b6040516102eb919061128e565b60405180910390f35b61030e60048036038101906103099190611233565b610677565b60405161031b919061128e565b60405180910390f35b61033e600480360381019061033991906113e1565b61069a565b60405161034b91906112b8565b60405180910390f35b61036e6004803603810190610369919061138a565b610721565b005b60606003805461037f90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546103ab90611450565b80156103f85780601f106103cd576101008083540402835291602001916103f8565b820191906000526020600020905b8154815290600101906020018083116103db57829003601f168201915b5050505050905090565b60008061040d6107a4565b905061041a8185856107ac565b600191505092915050565b6000600254905090565b60008061043a6107a4565b9050610447858285610975565b610452858585610a01565b60019150509392505050565b60006012905090565b6000806104726107a4565b9050610493818585610484858961069a565b61048e91906114b0565b6107ac565b600191505092915050565b6104a6610c77565b6104b08282610cf5565b5050565b6104c56104bf6107a4565b82610e4b565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610518610c77565b6105226000611018565b565b610536826105306107a4565b83610975565b6105408282610e4b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461057d90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546105a990611450565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60008061060b6107a4565b90506000610619828661069a565b90508381101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590611556565b60405180910390fd5b61066b82868684036107ac565b60019250505092915050565b6000806106826107a4565b905061068f818585610a01565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610729610c77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906115e8565b60405180910390fd5b6107a181611018565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108129061167a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361088a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108819061170c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161096891906112b8565b60405180910390a3505050565b6000610981848461069a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109fb57818110156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490611778565b60405180910390fd5b6109fa84848484036107ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061180a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad69061189c565b60405180910390fd5b610aea8383836110de565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061192e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c5e91906112b8565b60405180910390a3610c718484846110e3565b50505050565b610c7f6107a4565b73ffffffffffffffffffffffffffffffffffffffff16610c9d610544565b73ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061199a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90611a06565b60405180910390fd5b610d70600083836110de565b8060026000828254610d8291906114b0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3391906112b8565b60405180910390a3610e47600083836110e3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190611a98565b60405180910390fd5b610ec6826000836110de565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390611b2a565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fff91906112b8565b60405180910390a3611013836000846110e3565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611122578082015181840152602081019050611107565b60008484015250505050565b6000601f19601f8301169050919050565b600061114a826110e8565b61115481856110f3565b9350611164818560208601611104565b61116d8161112e565b840191505092915050565b60006020820190508181036000830152611192818461113f565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ca8261119f565b9050919050565b6111da816111bf565b81146111e557600080fd5b50565b6000813590506111f7816111d1565b92915050565b6000819050919050565b611210816111fd565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b6000806040838503121561124a5761124961119a565b5b6000611258858286016111e8565b92505060206112698582860161121e565b9150509250929050565b60008115159050919050565b61128881611273565b82525050565b60006020820190506112a3600083018461127f565b92915050565b6112b2816111fd565b82525050565b60006020820190506112cd60008301846112a9565b92915050565b6000806000606084860312156112ec576112eb61119a565b5b60006112fa868287016111e8565b935050602061130b868287016111e8565b925050604061131c8682870161121e565b9150509250925092565b600060ff82169050919050565b61133c81611326565b82525050565b60006020820190506113576000830184611333565b92915050565b6000602082840312156113735761137261119a565b5b60006113818482850161121e565b91505092915050565b6000602082840312156113a05761139f61119a565b5b60006113ae848285016111e8565b91505092915050565b6113c0816111bf565b82525050565b60006020820190506113db60008301846113b7565b92915050565b600080604083850312156113f8576113f761119a565b5b6000611406858286016111e8565b9250506020611417858286016111e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061146857607f821691505b60208210810361147b5761147a611421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114bb826111fd565b91506114c6836111fd565b92508282019050808211156114de576114dd611481565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006115406025836110f3565b915061154b826114e4565b604082019050919050565b6000602082019050818103600083015261156f81611533565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006115d26026836110f3565b91506115dd82611576565b604082019050919050565b60006020820190508181036000830152611601816115c5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006116646024836110f3565b915061166f82611608565b604082019050919050565b6000602082019050818103600083015261169381611657565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006116f66022836110f3565b91506117018261169a565b604082019050919050565b60006020820190508181036000830152611725816116e9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611762601d836110f3565b915061176d8261172c565b602082019050919050565b6000602082019050818103600083015261179181611755565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006117f46025836110f3565b91506117ff82611798565b604082019050919050565b60006020820190508181036000830152611823816117e7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006118866023836110f3565b91506118918261182a565b604082019050919050565b600060208201905081810360008301526118b581611879565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006119186026836110f3565b9150611923826118bc565b604082019050919050565b600060208201905081810360008301526119478161190b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006119846020836110f3565b915061198f8261194e565b602082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006119f0601f836110f3565b91506119fb826119ba565b602082019050919050565b60006020820190508181036000830152611a1f816119e3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a826021836110f3565b9150611a8d82611a26565b604082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000611b146022836110f3565b9150611b1f82611ab8565b604082019050919050565b60006020820190508181036000830152611b4381611b07565b905091905056fea26469706673582212204df6f0de305c90d5e7f095ff995f5884e7b51d307b600671a909171759701b0f64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000032dcd5000000000000000000000000000000000000000000000000000000000000000334353300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002657200000000000000000000000000000000000000000000000000000000000083104ec1a0ef9b07ba67e287a828d91e16ce542fb65365de4367e64edc2b9e1dfbe87b54c4a07de5e57772ebf86498393e4bffb27d0a1e5de974959dbc76261ccd608c4591e100000070f86e04850ba43b740082520894efddd3d3917cbce15aa53082339a9414de8f785787038d7ea4c680008083104ec2a07866395c018b454de69a43642c76edf86b6719dc7811f74a59666d45e7f1f59ba0644f70e9edceeaa0ae38d30b30db8fe9b147056c2fe230f6dc280d709fa5fa0100000218f9021505850df84758008302e6989417afd0263d6909ba1f9a8eac697f76532365fb958738d7ea4c680000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef369400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000c8e9dae10a06f48641d435be70136e84e392d6e40000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000003e4ac2d11f2b980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a0803cda4b7a4c4a1311d0333d4a8831bef88397a5c5bea3ac0c53f6b3d5ad8a88a0245a99131aa538568f9e2f65a4b9d84ba99fcd20e33ca28e065c9bc393e0ebed00000217f9021408850bdfd63e008304d7d69417afd0263d6909ba1f9a8eac697f76532365fb958648c273950000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef5a2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000260ca22885185b92bbcdac78dbb526b5ee6f6e7f000000000000000000000000000000000000000000000000000048c273950000000000000000000000000000000000000000000000000000004b1ec641c7a4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a015ac787e00d5dc28d477a2279f4f623acd8ea0bbf909b59214f41297c57f9902a063e6daf976f1fff9ef8fa82ba633448e915337cb7a964ed6f766282033c6bb73000000aff8ad01850bdfd63e00830183ba94d9692f1748afee00face2da35242417dd05a861580b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb95ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec2a069b2f72ab0c7e0930e82001dcd3cd10fa02dfc1739024195849752b62492ba69a042af83af4633e499464be99ab7d83b8e368b14e01533418065b13e7ac7aa4ba400000218f9021502850ba43b74008302e7df9417afd0263d6909ba1f9a8eac697f76532365fb95870aa87bee538000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef342600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a861500000000000000000000000000000000000000000000000000000000000027100000000000000000000000006394291f504a027de81308cf411ca485d20f0f2c000000000000000000000000000000000000000000000000000aa87bee5380000000000000000000000000000000000000000000000000000cf86d74b50a154400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a003832c87c434733391c4fd769541d6244f298262513b6800db2046f8b7749e05a06ae97f77b2cc05c68ceb9e9eace91d33590634cff870efa2aed292768c0b27ed00000178f9017507850ba43b740083032ff594d4d96b390f222a83004fe4d62c2a8abea8fbacf887470de4df820000b9010457965bfbe8b8e4e78892ad8036fd5c1bb6e5724863927eba9dd8fed45ad935a11c57031c000000000000000000000000000000000000000000000000000000000000001c53c7c5bff4bc0d799259640bd32b07feff9fec740b40ee47f7599debfb2365a2624da2a598ea92daf6de286fb6edaf4ba29eed2a01bf81b17b66f44783b5526500000000000000000000000080c8ec9cb3a1bd7d059ed4e2f1fc8b440b2ea41100000000000000000000000000000000000000000000000000000000000012e90000000000000000000000000000000000000000000000000000018a3e2c5322000000000000000000000000000000000000000000000000000000000000000083104ec2a007e2dad46159bb250819855f0d2d62292e13ea7052433cc4244dbec6391de147a01c0002db57b18627f6231f62f074f76f05440aeab6ab6a03684b36880dec586c000001b9f901b60e850ba43b74008301e0698080b90160608060405234801561000f575f80fd5b506101438061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632e64cec1146100385780636057361d14610056575b5f80fd5b610040610072565b60405161004d919061009b565b60405180910390f35b610070600480360381019061006b91906100e2565b61007a565b005b5f8054905090565b805f8190555050565b5f819050919050565b61009581610083565b82525050565b5f6020820190506100ae5f83018461008c565b92915050565b5f80fd5b6100c181610083565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100b4565b5b5f610104848285016100ce565b9150509291505056fea2646970667358221220bfa7ddc6d937b635c7a8ad020080923800f04f6b0a685c47330306fd5267626b64736f6c6343000815003383104ec2a0decac70665a915b8152ccda6b9cebc6e1940c1fa5971cdc9cd4f590f245ecf54a0027ee12cfa410e7ff9a2df73f59c2c97289f104d50f999ff64b5cf3fdb6e4c5e00000072f8708204b5850ba43b740082520894dfa1b4dbec3f65ad1b66f04b567180169d1d3f1987038d7ea4c680008083104ec1a0432353ae95f0bcd70294a88e034438f3788ff4df465000a446de6808bcbf01eaa0036ba1364c90bafed8b8da9b0a85f30300d934a5e26975d9c534ed89b66275ee000000b6f8b480850ba43b740083042452949ad3c5617ecaa556d6e166787a97081907171230872386f26fc10000b844c7cdea37000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000083104ec1a02fc3ff21c2050905317e69c0bd6ee19e1387779a4d93fcb6263e4cf7197738d2a03cf397b36dcc1c4f624153cee95fd296108668de3d32127d5a76021fb5834ce6000002d8f902d505850ba43b74008307a87194bbad0e891922a8a4a7e9c39d4cc0559117016fec87eea0824967b607b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b400000000000000000000000000000000000000000000000000eea0824967b607000000000000000000000000000000000000000000000001236efcbcbb33ff3200000000000000000000000000000000000000000000000000ee085ba52d10fa00000000000000000000000000000000000000000000000122b43c6e1c20d89d000000000000000000000000410da7b2848a134eeda65a43619690bf04c614270000000000000000000000000000000000000000000000000000000064ef343500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a03108249184a140fa1bfaa8aea2aecbaafc78bcf731b28c87713e2a848232f50fa0577b11fb4bce9f3691ce0c61227b5f6035e81a0ff83d8076aa9ab466b5c2edc4000000aef8ac09850ba43b740082dd4194ab541dce85dcb3f6222439ba3ff45578caef6de680b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec1a01efd0c52a1c9d648dbc1054bd15ec2efc2a0219bdf546338e1c2f00fcd89da0ba04e69577c08761ef31ad4ec0a422e53239e112496f8bd8a51e162f5ed0831dabb000002b3f902b0820f24850ba43b74008302e6fb94cbbc5da52ea2728279560dca8f4ec08d5f82998580b902446f888fa10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000e051306f4437c2b57b58dc21323f7803252e0c69fae9bfad82f5ebfa8f7b8c728b9d27d4fc1a186c49e1490154d89b4d98fae8e51f2921f9af9204b1bd1b091356000000000000000000000000000000000000000000000000000000000000a433000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7363726f6c6c2d7365706f6c69610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041a42e5a95501bdb2f5f0c265415cf778a29c718d3bca4f9ec40f4b34ef5c775c86bf5b9ebe270f901fc46be508476991640cf3467ef607f855ca91953e5f4a1411c0000000000000000000000000000000000000000000000000000000000000083104ec2a04d6e96dfe570d170fef87a9af9cc2820c6bfa9c734e99bc28a8a807d38b65e22a0729d5195281e57a2a5ed67f1391a571269db695767f18f4fdb311d598a235025000002d8f902d505850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec87060a24181e4000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b400000000000000000000000000000000000000000000000000060a24181e4000000000000000000000000000000000000000000000000000075a94073b788f580000000000000000000000000000000000000000000000000005bcd57d4ff00000000000000000000000000000000000000000000000000006fc7306dee5bb400000000000000000000000000ef12d05fbd8b1db345efc4e886df729d46f16580000000000000000000000000000000000000000000000000000000064ef369b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a08649003c39a9974445fec44f39f20dbda9163cc8e8b89985f3e875603c2e9003a0656ae59aea94024ddb9247f4dc548ca1a86028bf658a3be6de87063c8695b93500000072f870821bcf850ba43b74008261a8943ea63c82148709e18fa0b4cf9219be3a505f7b0787470de4df8200008083104ec2a005185f1dcdc2f4bbb138cf5e80c00bda7d8be0c9eafcd361368aaffa0235bbb0a04fb1c60f38a92e8b3467e0abdf6a9d3f5b1ec2752fd6320bfdf51126ba74e99200000110f9010d1c850ba43b74008303a7e994ce87dbc5176cf0e37cf54741faf30e3e489e179980b8a45f4b9bde00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5dd3700000000000000000000000000000000000000000000000564d2d67b6fa38cfb0000000000000000000000009ef3c073fbb1c77a065b76e92ae9d0d2a28cb6db0000000000000000000000000000000000000000000000000000000064ef37c683104ec1a0d998736d603eb8f3e91d4fe0da7fa37fae0dc70a94d260b851d244ef61203b31a02b7cfc1558d91c65788606433638a42760d504029a339bbd86a4c0fb7203c891000000b6f8b406850ba43b740083040abc949ad3c5617ecaa556d6e166787a9708190717123087038d7ea4c68000b844c7cdea3700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000083104ec2a062d9d6ffda264bf77d99ef50152ba550b6fd2536af0fc552ac22a9bcb96415c4a06ca2c537937975e3b7078f19b60446408240eb2194aa005a74c7a8ba14ea72a1000000aef8ac06850cce41660082c0a594d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000000000008ac7230489e8000083104ec1a01192c0a50136be8bfdedefc6483600ca3afde2fa26ebccb280fcd713831eb65aa058f9f9989f19d6587fe23cda4993c2b16a6a891c1a17504bf49f54ad0d5a246f000000aef8ac01850ba43b740082c0bd94d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec000000000000000000000000000000000000000000000000d84fb9f010eb792d83104ec2a0fdfacce52d8f49969d09c352e982fe1632e93d0b671cccc0ce12beb64705cfb1a010930856a99a6f19c04f739269bdc5002fe6c2e8ccf0f9eb6c40f7945b977caf0000008ef88c56850ba43b74008301bd4194e62a60247d0b9c1d09193b0f60875bc49878f5df80a4e6be6c66000000000000000000000000000000000000000000000000000000000000060683104ec2a0f01de96d4e3ca9627fee0a7cc8b0dc32a3fc34f9ce18a604f69764e357932b79a00eb8872fe3ea56848a99402601c2a2e63a2bf1f226972d0f5c9a945cbc42bde0000000aef8ac02850ba43b740082c0bd94d9692f1748afee00face2da35242417dd05a861580b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fec0000000000000000000000000000000000000000000000001cd2c8b549df391a83104ec1a06a3cb09374612aa8369f55f77128f6ae5e5559dc254b2907fbad2a81c5d60e78a070b83836be3b80fd7fbf01be7d7c3a9b5be674c9e5d4935f9303829d534b2b56000000aef8ac4d850ba43b740082c0c994d9692f1748afee00face2da35242417dd05a861580b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb95000000000000000000000000000000000000000000000023b0e9e8cd3cfc2f7f83104ec1a0a6ab7185c8bd04969a5e204541254ae06ac853e15e0d6bda08909bd3b32cc311a064ac119b202322af9bc1ed6ff48390d5dcd165a682a4ebb3e278d893d774b8bf00000218f9021502850ba43b74008303082c9417afd0263d6909ba1f9a8eac697f76532365fb9587b1a2bc2ec50000b901a45ae401dc0000000000000000000000000000000000000000000000000000000064ef344100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000009f68f1262052f00affbd64536425957370ab582a00000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000d811f194415963f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec1a05b787411d2dbb2e5ca09ca02f53c42d57db09568bb0dbde9f04f61d26718bbb4a06ee3025cdc87d205c66f2ca57c13d231a02bfadda51e106623f805ad4d693eef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004acf0600000000000520550000000064ef332a000000000000000000000000000000000000000000000000000000000000000000000000007a12000006000000000000000520560000000064ef332d000000000000000000000000000000000000000000000000000000000000000000000000007a12000007000000000000000520570000000064ef3330000000000000000000000000000000000000000000000000000000000000000000000000007a12000006000000000000000520580000000064ef3333000000000000000000000000000000000000000000000000000000000000000000000000007a12000003000000000000000520590000000064ef3336000000000000000000000000000000000000000000000000000000000000000000000000007a120000030000000000000005205a0000000064ef3339000000000000000000000000000000000000000000000000000000000000000000000000007a120000030000000000aef8ac3d850ba43b740082b4d394551197e6350936976dffb66b2c3bb15ddb72325080b844095ea7b300000000000000000000000067a1f4a939b477a6b7c5bf94d97e45de87e608ef0000000000000000000000000000000000000000000000056bc75e2d6310000083104ec1a03dc3d5f4ac8437002963f1104e3a7881f38239c470aa32a3bf91e043e5ff422da02731716eb68b4dd0ed851987409cb80c54004ba6f40a9ce258fcfa43f98690a7000000d2f8d001850ba43b740083022e778080b87b6066806015600039303360006000a2806000f350fe6000803560e01c60008114602e5760018114603a5760028114604657600381146052576101008114605e576063565b6338f6dae68283a16063565b63cc6c4d6c8283a16063565b630cb75d708283a16063565b63ac1946258283a16063565b308283a15b505083104ec2a0052f24b2f9860132102f9ef23d4dafe0215ae793ce3f18cca987bd6d9865dba9a05eb023c2c083a7d002f4933705175f533158271ce5232e4004935545e67144a4000000b1f8af820a47850ba43b74008301a0f6946f1da9076f36000d5f9decdebd52402b1410b2c580b844468021b70000000000000000000000004f7906ab12e10b6eae797f43ca6cacb3484b090f000000000000000000000000000000000000000000000000000000000000000083104ec2a043d80fcb79c4ecdaeabd3a741c66f1db613b77ebf52b2e51bcdb498beb9d4c4ea0782e9a8819d50a1b60ac836e1d455c2519dd1f7101e94d3fca40165333a0a506000002d9f902d624850ba43b74008307878a94bbad0e891922a8a4a7e9c39d4cc0559117016fec88013bcaa2a655f5d1b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2766000000000000000000000000000000000000000000000000000000000000d89a0000000000000000000000000000000000000000000000000013bcaa2a655f5d10000000000000000000000000000000000000000000000018493fba64eefff11000000000000000000000000000000000000000000000000013b0148949e8ce2000000000000000000000000000000000000000000000001839afb3d7ad6764a000000000000000000000000547580a7a72fe75268a1315e601bddac5a9150af0000000000000000000000000000000000000000000000000000000064ef342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec1a0e661dbf70421b5f33e347ed76cba4712db610ded1cd06abb637bcc7b36f98c00a0182e03191c02a26f9e0d0ba89b806d91ec1921d201ff49d318b493d10b9fede90000008ef88c10850ba43b7400830125ad9404dd9d9ac7c848705c2b2649b37b3c97d0560e7a80a4a0712d68000000000000000000000000000000000000000000000000000000000000000383104ec1a07e016df8a47a070b1093d60598a7e36f7687eb7b405e07428284ca3954440e46a06d9c5a30dc9aa0d96fc87e2e1f5690654b06ce56c4a150aa028fe058ba61c24400000074f8720a850ba43b740082ca90945300000000000000000000000000000000000004870177c70b58401984d0e30db083104ec2a0ff1f2edbea13a50b5780083a21887307ee110d69cb3dab36617fb8cde526813ea05d671d0afbe64e039b38ec13ea1d6163b2d5fa20408020c4b7cb1c5ad7696563000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8706c00a3912c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000006c00a3912c00000000000000000000000000000000000000000000000000008380ec5d1494eb1000000000000000000000000000000000000000000000000000669a34fd1d00000000000000000000000000000000000000000000000000007cedad586d270c0000000000000000000000000a71f1d3d636a01f04d93b4a1a8f92f79a4b981a80000000000000000000000000000000000000000000000000000000064ef36a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a0ff07ac921dc77c82fd7246f1c816292261229323d700c01bc300f1ab20fe2bbda023c9199a93cd17a1964665dd0220e031c1a7762b94c9bd57ec1039be1c98a67d0000008ef88c55850ba43b74008301bd4194e62a60247d0b9c1d09193b0f60875bc49878f5df80a4e6be6c66000000000000000000000000000000000000000000000000000000000000060783104ec1a073278681a295301262dd89921c71ecddbb5200b10a84a1f80d5d2fd4d9fd76bda07f9d574a658b6a8be52c60c698411ce3a4983c31b0f8af6a4c5c553a48df94e9000000aef8ac09850ba43b740082b70594d9692f1748afee00face2da35242417dd05a861580b844095ea7b300000000000000000000000017afd0263d6909ba1f9a8eac697f76532365fb95000000000000000000000000000000000000000000000010e22cb541cab983a383104ec2a09da47185aff6697039533256d2da3ff359559053d2f60762f23de229a8d1e99ba0314ea3126bf2d3936733c2f407bbda398fbb089f55f303f0b78e36bf79d2cb8e000000b5f8b347850ba43b74008304577e949ad3c5617ecaa556d6e166787a97081907171230865af3107a4000b844c7cdea3700000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000083104ec2a065ecae06efe1ec8e3ac9cc4b2a4d83847b1dd6975dfc773809e63b7f4090b396a0335994653697a08c381366194d44d9f423a52912d5da52e3b5cb8d88a1748ae7000002d9f902d630850ba43b7400830757cb94bbad0e891922a8a4a7e9c39d4cc0559117016fec880220a34f4a92aca2b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000002710fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2766000000000000000000000000000000000000000000000000000000000000d89a00000000000000000000000000000000000000000000000000220a34f4a92aca20000000000000000000000000000000000000000000000029cb1ff19496af921000000000000000000000000000000000000000000000000021f480b0ce802b50000000000000000000000000000000000000000000000029b057ec4cf350080000000000000000000000000ece5858ff6ac4bae6af42b483e84f9655a23b6520000000000000000000000000000000000000000000000000000000064ef345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a08627805b0d3303254b25b282126b29fb1b6db57655bda5d1dd35e2c4390bb785a0640fecb2878a330d5dcf372e5aa0c4cca4355f23cf313d0eeddd3cd172739b5c00000074f87215850ba43b740082ca909453000000000000000000000000000000000000048711c37937e0800084d0e30db083104ec1a0e483fe2f6955c8ef3d9944023d0871dab877b9d8ecaf296514b0612ff7229981a016ee3bee10447cf6159934a0d93393bbdbddeac7fe16ec6635c035237f2371aa00000350f9034d05840ee6b280835e949d94bbad0e891922a8a4a7e9c39d4cc0559117016fec80b902e4ac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008413ead5620000000000000000000000005300000000000000000000000000000000000004000000000000000000000000cae23aaa6ee04b3b70c2da30b75b3af912543a9e000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000003e7ffd4aefcd2cf2c91f36b6a74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000cae23aaa6ee04b3b70c2da30b75b3af912543a9e000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000214080000000000000000000000000000000000000000000000000000000000021b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013e9c16bcaa9c9fff40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013e9c16bcaa9c9fff40000000000000000000000005890aa503f0142f36ac0e51373a7111a626710aa0000000000000000000000000000000000000000000000000000000064ef34380000000000000000000000000000000000000000000000000000000083104ec2a0e152f9532ca16ce32f2c63ef3ffdbfaf06efe10b95c1977f648ac62ccf0a4b17a06c97934443c7318a5cf85d30ade2030d25ede2bf46b0e17d882df33fb7c5efeb000002d8f902d507850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8706c00a3912c000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000006c00a3912c0000000000000000000000000000000000000000000000000000837e5911784eeb1000000000000000000000000000000000000000000000000000669a34fd1d00000000000000000000000000000000000000000000000000007ceb3b03cbe48c0000000000000000000000000c8e9dae10a06f48641d435be70136e84e392d6e40000000000000000000000000000000000000000000000000000000064ef36ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a076d5753b4d8d3c771674b9d27e5e065ea357d3fe8dd3f1baf6e73f24aea1cdf6a0189ef18fa5e11809d67bbc82b6f9a79cd89afe75b6d3e41ee8de5b817d4ed19c00000277f9027402850ba43b74008302fd0c9417afd0263d6909ba1f9a8eac697f76532365fb95877217e846ef4161b902045ae401dc0000000000000000000000000000000000000000000000000000000064ef3447000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e45023b4df0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000003b01fd884b6bf6da722b7d96df7e13c75fe3b6790000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000007217e846ef4161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec29ff03eed2a54611edc62815461b96f7f9314043b03e95bd9f230fba7457771f6a04f40df29b070fed2950fc6546208799e7bbb18b7895b54a7894aa73a0cb0aa74000000aef8ac0a850ba43b7400827ff994ab541dce85dcb3f6222439ba3ff45578caef6de680b844095ea7b3000000000000000000000000bbad0e891922a8a4a7e9c39d4cc0559117016fecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec2a057b4bda72f5981d24ac90f52b5f7eeb9157f00e71880603904b4d062c352f27aa05d0158bd8b0efda60213353b91113ccf1fe27610238e95693a3dbb59aa492d22000000aff8ad08850ba43b740083012f909480c8ec9cb3a1bd7d059ed4e2f1fc8b440b2ea41180b844a22cb465000000000000000000000000d4d96b390f222a83004fe4d62c2a8abea8fbacf8000000000000000000000000000000000000000000000000000000000000000183104ec2a0b5fe9634078e11b9e2820f60283c371ff6b611d6894a706d34da9a1761746d4ca04c9187eac530de470b8d0043de7af664be3bbf14c6c6d5d83cde65ed48582c990000006df86b03850ba43b74008266c0944ed8bb0cd040e7bb9fed7e0939fdc592811b2a7d8084d09de08a83104ec2a01534e2268a1e4cf3906486699455de3b02520a89a90a2fc248acc6db40a25ecea0236d7da199585a02209517bbdc1570731fd8776c220f28b93cb5d9a42ceda4210000008ef88c58850ba43b74008301bd4194e62a60247d0b9c1d09193b0f60875bc49878f5df80a4e6be6c66000000000000000000000000000000000000000000000000000000000000060883104ec2a0bd965d6ccf52730056f6611634064cdafb07b496c933e10ee8d1da0acde3b60fa0730f48a38418a668b4e9286905f2bf703f3af7e03b0a3912610ea53d5870b17c00002653f9265002850ba43b7400831a3eb88080b925fa60806040523480156200001157600080fd5b506040516200251a3803806200251a8339818101604052810190620000379190620004ad565b828281600390816200004a919062000788565b5080600490816200005c919062000788565b5050506200007f620000736200009a60201b60201c565b620000a260201b60201c565b6200009133826200016860201b60201c565b5050506200098a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d190620008d0565b60405180910390fd5b620001ee60008383620002d560201b60201c565b806002600082825462000202919062000921565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b591906200096d565b60405180910390a3620002d160008383620002da60201b60201c565b5050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034882620002fd565b810181811067ffffffffffffffff821117156200036a57620003696200030e565b5b80604052505050565b60006200037f620002df565b90506200038d82826200033d565b919050565b600067ffffffffffffffff821115620003b057620003af6200030e565b5b620003bb82620002fd565b9050602081019050919050565b60005b83811015620003e8578082015181840152602081019050620003cb565b60008484015250505050565b60006200040b620004058462000392565b62000373565b9050828152602081018484840111156200042a5762000429620002f8565b5b62000437848285620003c8565b509392505050565b600082601f830112620004575762000456620002f3565b5b815162000469848260208601620003f4565b91505092915050565b6000819050919050565b620004878162000472565b81146200049357600080fd5b50565b600081519050620004a7816200047c565b92915050565b600080600060608486031215620004c957620004c8620002e9565b5b600084015167ffffffffffffffff811115620004ea57620004e9620002ee565b5b620004f8868287016200043f565b935050602084015167ffffffffffffffff8111156200051c576200051b620002ee565b5b6200052a868287016200043f565b92505060406200053d8682870162000496565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059a57607f821691505b602082108103620005b057620005af62000552565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200061a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005db565b620006268683620005db565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000669620006636200065d8462000472565b6200063e565b62000472565b9050919050565b6000819050919050565b620006858362000648565b6200069d620006948262000670565b848454620005e8565b825550505050565b600090565b620006b4620006a5565b620006c18184846200067a565b505050565b5b81811015620006e957620006dd600082620006aa565b600181019050620006c7565b5050565b601f82111562000738576200070281620005b6565b6200070d84620005cb565b810160208510156200071d578190505b620007356200072c85620005cb565b830182620006c6565b50505b505050565b600082821c905092915050565b60006200075d600019846008026200073d565b1980831691505092915050565b60006200077883836200074a565b9150826002028217905092915050565b620007938262000547565b67ffffffffffffffff811115620007af57620007ae6200030e565b5b620007bb825462000581565b620007c8828285620006ed565b600060209050601f831160018114620008005760008415620007eb578287015190505b620007f785826200076a565b86555062000867565b601f1984166200081086620005b6565b60005b828110156200083a5784890151825560018201915060208501945060208101905062000813565b868310156200085a578489015162000856601f8916826200074a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008b8601f836200086f565b9150620008c58262000880565b602082019050919050565b60006020820190508181036000830152620008eb81620008a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200092e8262000472565b91506200093b8362000472565b9250828201905080821115620009565762000955620008f2565b5b92915050565b620009678162000472565b82525050565b60006020820190506200098460008301846200095c565b92915050565b611b80806200099a6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102a6578063a457c2d7146102c4578063a9059cbb146102f4578063dd62ed3e14610324578063f2fde38b146103545761010b565b806370a0823114610232578063715018a61461026257806379cc67901461026c5780638da5cb5b146102885761010b565b8063313ce567116100de578063313ce567146101ac57806339509351146101ca57806340c10f19146101fa57806342966c68146102165761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610370565b6040516101259190611178565b60405180910390f35b61014860048036038101906101439190611233565b610402565b604051610155919061128e565b60405180910390f35b610166610425565b60405161017391906112b8565b60405180910390f35b610196600480360381019061019191906112d3565b61042f565b6040516101a3919061128e565b60405180910390f35b6101b461045e565b6040516101c19190611342565b60405180910390f35b6101e460048036038101906101df9190611233565b610467565b6040516101f1919061128e565b60405180910390f35b610214600480360381019061020f9190611233565b61049e565b005b610230600480360381019061022b919061135d565b6104b4565b005b61024c6004803603810190610247919061138a565b6104c8565b60405161025991906112b8565b60405180910390f35b61026a610510565b005b61028660048036038101906102819190611233565b610524565b005b610290610544565b60405161029d91906113c6565b60405180910390f35b6102ae61056e565b6040516102bb9190611178565b60405180910390f35b6102de60048036038101906102d99190611233565b610600565b6040516102eb919061128e565b60405180910390f35b61030e60048036038101906103099190611233565b610677565b60405161031b919061128e565b60405180910390f35b61033e600480360381019061033991906113e1565b61069a565b60405161034b91906112b8565b60405180910390f35b61036e6004803603810190610369919061138a565b610721565b005b60606003805461037f90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546103ab90611450565b80156103f85780601f106103cd576101008083540402835291602001916103f8565b820191906000526020600020905b8154815290600101906020018083116103db57829003601f168201915b5050505050905090565b60008061040d6107a4565b905061041a8185856107ac565b600191505092915050565b6000600254905090565b60008061043a6107a4565b9050610447858285610975565b610452858585610a01565b60019150509392505050565b60006012905090565b6000806104726107a4565b9050610493818585610484858961069a565b61048e91906114b0565b6107ac565b600191505092915050565b6104a6610c77565b6104b08282610cf5565b5050565b6104c56104bf6107a4565b82610e4b565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610518610c77565b6105226000611018565b565b610536826105306107a4565b83610975565b6105408282610e4b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461057d90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546105a990611450565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60008061060b6107a4565b90506000610619828661069a565b90508381101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590611556565b60405180910390fd5b61066b82868684036107ac565b60019250505092915050565b6000806106826107a4565b905061068f818585610a01565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610729610c77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906115e8565b60405180910390fd5b6107a181611018565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108129061167a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361088a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108819061170c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161096891906112b8565b60405180910390a3505050565b6000610981848461069a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109fb57818110156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490611778565b60405180910390fd5b6109fa84848484036107ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061180a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad69061189c565b60405180910390fd5b610aea8383836110de565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061192e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c5e91906112b8565b60405180910390a3610c718484846110e3565b50505050565b610c7f6107a4565b73ffffffffffffffffffffffffffffffffffffffff16610c9d610544565b73ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061199a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90611a06565b60405180910390fd5b610d70600083836110de565b8060026000828254610d8291906114b0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3391906112b8565b60405180910390a3610e47600083836110e3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190611a98565b60405180910390fd5b610ec6826000836110de565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390611b2a565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fff91906112b8565b60405180910390a3611013836000846110e3565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611122578082015181840152602081019050611107565b60008484015250505050565b6000601f19601f8301169050919050565b600061114a826110e8565b61115481856110f3565b9350611164818560208601611104565b61116d8161112e565b840191505092915050565b60006020820190508181036000830152611192818461113f565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ca8261119f565b9050919050565b6111da816111bf565b81146111e557600080fd5b50565b6000813590506111f7816111d1565b92915050565b6000819050919050565b611210816111fd565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b6000806040838503121561124a5761124961119a565b5b6000611258858286016111e8565b92505060206112698582860161121e565b9150509250929050565b60008115159050919050565b61128881611273565b82525050565b60006020820190506112a3600083018461127f565b92915050565b6112b2816111fd565b82525050565b60006020820190506112cd60008301846112a9565b92915050565b6000806000606084860312156112ec576112eb61119a565b5b60006112fa868287016111e8565b935050602061130b868287016111e8565b925050604061131c8682870161121e565b9150509250925092565b600060ff82169050919050565b61133c81611326565b82525050565b60006020820190506113576000830184611333565b92915050565b6000602082840312156113735761137261119a565b5b60006113818482850161121e565b91505092915050565b6000602082840312156113a05761139f61119a565b5b60006113ae848285016111e8565b91505092915050565b6113c0816111bf565b82525050565b60006020820190506113db60008301846113b7565b92915050565b600080604083850312156113f8576113f761119a565b5b6000611406858286016111e8565b9250506020611417858286016111e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061146857607f821691505b60208210810361147b5761147a611421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114bb826111fd565b91506114c6836111fd565b92508282019050808211156114de576114dd611481565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006115406025836110f3565b915061154b826114e4565b604082019050919050565b6000602082019050818103600083015261156f81611533565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006115d26026836110f3565b91506115dd82611576565b604082019050919050565b60006020820190508181036000830152611601816115c5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006116646024836110f3565b915061166f82611608565b604082019050919050565b6000602082019050818103600083015261169381611657565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006116f66022836110f3565b91506117018261169a565b604082019050919050565b60006020820190508181036000830152611725816116e9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611762601d836110f3565b915061176d8261172c565b602082019050919050565b6000602082019050818103600083015261179181611755565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006117f46025836110f3565b91506117ff82611798565b604082019050919050565b60006020820190508181036000830152611823816117e7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006118866023836110f3565b91506118918261182a565b604082019050919050565b600060208201905081810360008301526118b581611879565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006119186026836110f3565b9150611923826118bc565b604082019050919050565b600060208201905081810360008301526119478161190b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006119846020836110f3565b915061198f8261194e565b602082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006119f0601f836110f3565b91506119fb826119ba565b602082019050919050565b60006020820190508181036000830152611a1f816119e3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a826021836110f3565b9150611a8d82611a26565b604082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000611b146022836110f3565b9150611b1f82611ab8565b604082019050919050565b60006020820190508181036000830152611b4381611b07565b905091905056fea26469706673582212204df6f0de305c90d5e7f095ff995f5884e7b51d307b600671a909171759701b0f64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000087a23000000000000000000000000000000000000000000000000000000000000000435747936000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003747467000000000000000000000000000000000000000000000000000000000083104ec2a0b033b0e90cb66dd5ef2952003edecac053f9e763d78f0e2c2f0282ac98384b2ea04c651be2ab4d969952a5ee6b40f83d62f4d88e10450a0bc57f454a370f89178000000072f870821bd0850ba43b74008261a894ad395b804c8e91a4e6d59215e2f12419e959e1ae87470de4df8200008083104ec1a01f7fcfdbe5e79761fd30e476f458489dedb4e1e121f9590eefbce003be151b10a074bc8a43e91037cd3ac177c59d2eb43778befb6a66b36bbcaa0cbabb00ce136b00000075f8730285012a05f20082c2c094530000000000000000000000000000000000000488063eb89da4ed000084d0e30db083104ec2a08ce3f2e5fd234afeed447beb4bfd0777fc621ed7f07cb49d826e1fa54fd6d531a03bdd815558f8e2abe459fb971ecf58bb8f0e03fe8992c68426cb7f82d7191ff3000000b6f8b404850ba43b74008304577e949ad3c5617ecaa556d6e166787a97081907171230872386f26fc10000b844c7cdea37000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000083104ec2a0b02f8cced42dea51d6c4d95d9c851043cb61acc59652b125dab5c15b0c746baea00fb81dce565097ace45192525ee0a7568eca20431f30fa56753eea27ec9ae5e10000008ef88c55850ba43b74008301bd4194e62a60247d0b9c1d09193b0f60875bc49878f5df80a4e6be6c66000000000000000000000000000000000000000000000000000000000000060983104ec2a0c110ebd798580d7864c4693613d2e7fb38626b189c600c36f83db9a6dda47b2ea04abfdacd85dc5f43e113b741fe6f78ea6a94b21da8065226bbb6a2fa9bb927450000008df88b0b850ba43b740082a72794530000000000000000000000000000000000000480a42e1a7d4d000000000000000000000000000000000000000000000000000177c70b58401983104ec2a0ed05668033a74eb9b07285e0a8540c54b01fd3fa119e4cb193a6f854c80d9a85a0413818156a39ca5bcd5bc764f22b06588b900c179f9ef6ffef7f28eff72df1a1000002d8f902d506850df84758008308ac0e94bbad0e891922a8a4a7e9c39d4cc0559117016fec8705af3107a40000b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000005300000000000000000000000000000000000004000000000000000000000000d9692f1748afee00face2da35242417dd05a86150000000000000000000000000000000000000000000000000000000000000bb8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c00000000000000000000000000000000000000000000000000000000000d89b40000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000006eb9daf6c6714520000000000000000000000000000000000000000000000000005666e940f00000000000000000000000000000000000000000000000000000693090040952000000000000000000000000000654aa3dde9580487fc65b063c397d4999dc4ae010000000000000000000000000000000000000000000000000000000064ef36b400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec2a0252b5b29d8e2b3b3ffd69499d07d9ee16d13d0b8fbb60007bf526109b25c97aba0738b9a530befc131d24c8e6d2e8596e26258b6424c1d5325bfab8d793aa714ea000001c9f901c609850ba43b74008301eb058080b90170608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea2646970667358221220322c78243e61b783558509c9cc22cb8493dde6925aa5e89a08cdf6e22f279ef164736f6c6343000812003383104ec2a0e7a4a53f728b313e99f65e09c3506537baf7fa8c34dec301f1fe3609a26c93aaa043be096ddd804c6cc54937a3292a232e7eabb9571eb05f7cc04bef34aaa9ec2200000231f9022e10850ba43b740083065ce494d32548ea5911a6336c5a34061e814148c396ae6f80b901c43e5d877b00000000000000000000000000000000000000000000000000000001fdc1b5cb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000b0a9d798f7c8028b0e467b913a02b547d0528c4a000000000000000000000000000000000000000000000000000000000000f88c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000041bbd932f6795a087a941c37cfd91fa2d61b9a720e657761768de55ad81f008e1426d69cd55a0a85e5c7d375e523e2924fbaf3a58631966802fe0410706e54b2431b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec2a06e0c2d9af4a883d92a15584fcbfc9840b98cae58c2d7e22a271de8bfeaaa8fa0a042ff5570cee0c385a236380fbb31d53abcf4cdf3a10f624348b8fb4912ec135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" -} \ No newline at end of file diff --git a/rollup/types/encoding/bitmap.go b/rollup/types/encoding/bitmap.go new file mode 100644 index 0000000000..87fc31c645 --- /dev/null +++ b/rollup/types/encoding/bitmap.go @@ -0,0 +1,64 @@ +package encoding + +import ( + "fmt" + "math/big" + + "github.com/scroll-tech/go-ethereum/core/types" +) + +// ConstructSkippedBitmap constructs skipped L1 message bitmap of the batch. +func ConstructSkippedBitmap(batchIndex uint64, chunks []*Chunk, totalL1MessagePoppedBefore uint64) ([]byte, uint64, error) { + // skipped L1 message bitmap, an array of 256-bit bitmaps + var skippedBitmap []*big.Int + + // the first queue index that belongs to this batch + baseIndex := totalL1MessagePoppedBefore + + // the next queue index that we need to process + nextIndex := totalL1MessagePoppedBefore + + for chunkID, chunk := range chunks { + for blockID, block := range chunk.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + continue + } + currentIndex := tx.Nonce + + if currentIndex < nextIndex { + return nil, 0, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. Batch index: %d, chunk index in batch: %d, block index in chunk: %d, block hash: %v, transaction hash: %v", nextIndex, currentIndex, batchIndex, chunkID, blockID, block.Header.Hash(), tx.TxHash) + } + + // mark skipped messages + for skippedIndex := nextIndex; skippedIndex < currentIndex; skippedIndex++ { + quo := int((skippedIndex - baseIndex) / 256) + rem := int((skippedIndex - baseIndex) % 256) + for len(skippedBitmap) <= quo { + bitmap := big.NewInt(0) + skippedBitmap = append(skippedBitmap, bitmap) + } + skippedBitmap[quo].SetBit(skippedBitmap[quo], rem, 1) + } + + // process included message + quo := int((currentIndex - baseIndex) / 256) + for len(skippedBitmap) <= quo { + bitmap := big.NewInt(0) + skippedBitmap = append(skippedBitmap, bitmap) + } + + nextIndex = currentIndex + 1 + } + } + } + + bitmapBytes := make([]byte, len(skippedBitmap)*32) + for ii, num := range skippedBitmap { + bytes := num.Bytes() + padding := 32 - len(bytes) + copy(bitmapBytes[32*ii+padding:], bytes) + } + + return bitmapBytes, nextIndex, nil +} diff --git a/rollup/types/encoding/codecv0/codecv0.go b/rollup/types/encoding/codecv0/codecv0.go new file mode 100644 index 0000000000..3df5d7ba43 --- /dev/null +++ b/rollup/types/encoding/codecv0/codecv0.go @@ -0,0 +1,480 @@ +package codecv0 + +import ( + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "math" + "math/big" + "strings" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/rollup/types/encoding" +) + +// CodecV0Version denotes the version of the codec. +const CodecV0Version = 0 + +// DABlock represents a Data Availability Block. +type DABlock struct { + BlockNumber uint64 + Timestamp uint64 + BaseFee *big.Int + GasLimit uint64 + NumTransactions uint16 + NumL1Messages uint16 +} + +// DAChunk groups consecutive DABlocks with their transactions. +type DAChunk struct { + Blocks []*DABlock + Transactions [][]*types.TransactionData +} + +// DABatch contains metadata about a batch of DAChunks. +type DABatch struct { + Version uint8 + BatchIndex uint64 + L1MessagePopped uint64 + TotalL1MessagePopped uint64 + DataHash common.Hash + ParentBatchHash common.Hash + SkippedL1MessageBitmap []byte +} + +// NewDABlock creates a new DABlock from the given encoding.Block and the total number of L1 messages popped before. +func NewDABlock(block *encoding.Block, totalL1MessagePoppedBefore uint64) (*DABlock, error) { + if !block.Header.Number.IsUint64() { + return nil, errors.New("block number is not uint64") + } + + // note: numL1Messages includes skipped messages + numL1Messages := block.NumL1Messages(totalL1MessagePoppedBefore) + if numL1Messages > math.MaxUint16 { + return nil, errors.New("number of L1 messages exceeds max uint16") + } + + // note: numTransactions includes skipped messages + numL2Transactions := block.NumL2Transactions() + numTransactions := numL1Messages + numL2Transactions + if numTransactions > math.MaxUint16 { + return nil, errors.New("number of transactions exceeds max uint16") + } + + daBlock := DABlock{ + BlockNumber: block.Header.Number.Uint64(), + Timestamp: block.Header.Time, + BaseFee: block.Header.BaseFee, + GasLimit: block.Header.GasLimit, + NumTransactions: uint16(numTransactions), + NumL1Messages: uint16(numL1Messages), + } + + return &daBlock, nil +} + +// Encode serializes the DABlock into a slice of bytes. +func (b *DABlock) Encode() []byte { + bytes := make([]byte, 60) + binary.BigEndian.PutUint64(bytes[0:], b.BlockNumber) + binary.BigEndian.PutUint64(bytes[8:], b.Timestamp) + if b.BaseFee != nil { + binary.BigEndian.PutUint64(bytes[40:], b.BaseFee.Uint64()) + } + binary.BigEndian.PutUint64(bytes[48:], b.GasLimit) + binary.BigEndian.PutUint16(bytes[56:], b.NumTransactions) + binary.BigEndian.PutUint16(bytes[58:], b.NumL1Messages) + return bytes +} + +// DecodeDABlock takes a byte slice and decodes it into a DABlock. +func DecodeDABlock(bytes []byte) (*DABlock, error) { + if len(bytes) != 60 { + return nil, errors.New("block encoding is not 60 bytes long") + } + + block := &DABlock{ + BlockNumber: binary.BigEndian.Uint64(bytes[0:8]), + Timestamp: binary.BigEndian.Uint64(bytes[8:16]), + BaseFee: new(big.Int).SetUint64(binary.BigEndian.Uint64(bytes[40:48])), + GasLimit: binary.BigEndian.Uint64(bytes[48:56]), + NumTransactions: binary.BigEndian.Uint16(bytes[56:58]), + NumL1Messages: binary.BigEndian.Uint16(bytes[58:60]), + } + + return block, nil +} + +// NewDAChunk creates a new DAChunk from the given encoding.Chunk and the total number of L1 messages popped before. +func NewDAChunk(chunk *encoding.Chunk, totalL1MessagePoppedBefore uint64) (*DAChunk, error) { + var blocks []*DABlock + var txs [][]*types.TransactionData + + if chunk == nil { + return nil, errors.New("chunk is nil") + } + + if len(chunk.Blocks) == 0 { + return nil, errors.New("number of blocks is 0") + } + + if len(chunk.Blocks) > 255 { + return nil, errors.New("number of blocks exceeds 1 byte") + } + + for _, block := range chunk.Blocks { + b, err := NewDABlock(block, totalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + blocks = append(blocks, b) + totalL1MessagePoppedBefore += block.NumL1Messages(totalL1MessagePoppedBefore) + txs = append(txs, block.Transactions) + } + + daChunk := DAChunk{ + Blocks: blocks, + Transactions: txs, + } + + return &daChunk, nil +} + +// Encode serializes the DAChunk into a slice of bytes. +func (c *DAChunk) Encode() ([]byte, error) { + var chunkBytes []byte + chunkBytes = append(chunkBytes, byte(len(c.Blocks))) + + var l2TxDataBytes []byte + + for _, block := range c.Blocks { + chunkBytes = append(chunkBytes, block.Encode()...) + } + + for _, blockTxs := range c.Transactions { + for _, txData := range blockTxs { + if txData.Type == types.L1MessageTxType { + continue + } + var txLen [4]byte + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(txData) + if err != nil { + return nil, err + } + binary.BigEndian.PutUint32(txLen[:], uint32(len(rlpTxData))) + l2TxDataBytes = append(l2TxDataBytes, txLen[:]...) + l2TxDataBytes = append(l2TxDataBytes, rlpTxData...) + } + } + + chunkBytes = append(chunkBytes, l2TxDataBytes...) + return chunkBytes, nil +} + +// Hash computes the hash of the DAChunk data. +func (c *DAChunk) Hash() (common.Hash, error) { + chunkBytes, err := c.Encode() + if err != nil { + return common.Hash{}, err + } + + if len(chunkBytes) == 0 { + return common.Hash{}, errors.New("chunk data is empty and cannot be processed") + } + numBlocks := chunkBytes[0] + + // concatenate block contexts + var dataBytes []byte + for i := 0; i < int(numBlocks); i++ { + // only the first 58 bytes of each BlockContext are needed for the hashing process + dataBytes = append(dataBytes, chunkBytes[1+60*i:60*i+59]...) + } + + // concatenate l1 and l2 tx hashes + for _, blockTxs := range c.Transactions { + var l1TxHashes []byte + var l2TxHashes []byte + for _, txData := range blockTxs { + txHash := strings.TrimPrefix(txData.TxHash, "0x") + hashBytes, err := hex.DecodeString(txHash) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to decode tx hash from TransactionData: hash=%v, err=%w", txData.TxHash, err) + } + if txData.Type == types.L1MessageTxType { + l1TxHashes = append(l1TxHashes, hashBytes...) + } else { + l2TxHashes = append(l2TxHashes, hashBytes...) + } + } + dataBytes = append(dataBytes, l1TxHashes...) + dataBytes = append(dataBytes, l2TxHashes...) + } + + hash := crypto.Keccak256Hash(dataBytes) + return hash, nil +} + +// NewDABatch creates a DABatch from the provided encoding.Batch. +func NewDABatch(batch *encoding.Batch) (*DABatch, error) { + // compute batch data hash + var dataBytes []byte + totalL1MessagePoppedBeforeChunk := batch.TotalL1MessagePoppedBefore + + for _, chunk := range batch.Chunks { + // build data hash + daChunk, err := NewDAChunk(chunk, totalL1MessagePoppedBeforeChunk) + if err != nil { + return nil, err + } + totalL1MessagePoppedBeforeChunk += chunk.NumL1Messages(totalL1MessagePoppedBeforeChunk) + daChunkHash, err := daChunk.Hash() + if err != nil { + return nil, err + } + dataBytes = append(dataBytes, daChunkHash.Bytes()...) + } + + // compute data hash + dataHash := crypto.Keccak256Hash(dataBytes) + + // skipped L1 messages bitmap + bitmapBytes, totalL1MessagePoppedAfter, err := encoding.ConstructSkippedBitmap(batch.Index, batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + daBatch := DABatch{ + Version: CodecV0Version, + BatchIndex: batch.Index, + L1MessagePopped: totalL1MessagePoppedAfter - batch.TotalL1MessagePoppedBefore, + TotalL1MessagePopped: totalL1MessagePoppedAfter, + DataHash: dataHash, + ParentBatchHash: batch.ParentBatchHash, + SkippedL1MessageBitmap: bitmapBytes, + } + + return &daBatch, nil +} + +// NewDABatchFromBytes attempts to decode the given byte slice into a DABatch. +func NewDABatchFromBytes(data []byte) (*DABatch, error) { + if len(data) < 89 { + return nil, fmt.Errorf("insufficient data for DABatch, expected at least 89 bytes but got %d", len(data)) + } + + b := &DABatch{ + Version: data[0], + BatchIndex: binary.BigEndian.Uint64(data[1:9]), + L1MessagePopped: binary.BigEndian.Uint64(data[9:17]), + TotalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), + DataHash: common.BytesToHash(data[25:57]), + ParentBatchHash: common.BytesToHash(data[57:89]), + SkippedL1MessageBitmap: data[89:], + } + + return b, nil +} + +// Encode serializes the DABatch into bytes. +func (b *DABatch) Encode() []byte { + batchBytes := make([]byte, 89+len(b.SkippedL1MessageBitmap)) + batchBytes[0] = b.Version + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.ParentBatchHash[:]) + copy(batchBytes[89:], b.SkippedL1MessageBitmap[:]) + return batchBytes +} + +// Hash computes the hash of the serialized DABatch. +func (b *DABatch) Hash() common.Hash { + bytes := b.Encode() + return crypto.Keccak256Hash(bytes) +} + +// DecodeFromCalldata attempts to decode a DABatch and an array of DAChunks from the provided calldata byte slice. +func DecodeFromCalldata(data []byte) (*DABatch, []*DAChunk, error) { + // TODO: implement this function. + return nil, nil, nil +} + +// CalldataNonZeroByteGas is the gas consumption per non zero byte in calldata. +const CalldataNonZeroByteGas = 16 + +// GetKeccak256Gas calculates the gas cost for computing the keccak256 hash of a given size. +func GetKeccak256Gas(size uint64) uint64 { + return GetMemoryExpansionCost(size) + 30 + 6*((size+31)/32) +} + +// GetMemoryExpansionCost calculates the cost of memory expansion for a given memoryByteSize. +func GetMemoryExpansionCost(memoryByteSize uint64) uint64 { + memorySizeWord := (memoryByteSize + 31) / 32 + memoryCost := (memorySizeWord*memorySizeWord)/512 + (3 * memorySizeWord) + return memoryCost +} + +// EstimateBlockL1CommitCalldataSize calculates the calldata size in l1 commit for this block approximately. +// TODO: The calculation could be more accurate by using 58 + len(l2TxDataBytes) (see Chunk). +// This needs to be adjusted in the future. +func EstimateBlockL1CommitCalldataSize(b *encoding.Block) (uint64, error) { + var size uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + continue + } + size += 4 // 4 bytes payload length + txPayloadLength, err := getTxPayloadLength(txData) + if err != nil { + return 0, err + } + size += txPayloadLength + } + size += 60 // 60 bytes BlockContext + return size, nil +} + +// EstimateBlockL1CommitGas calculates the total L1 commit gas for this block approximately. +func EstimateBlockL1CommitGas(b *encoding.Block) (uint64, error) { + var total uint64 + var numL1Messages uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + numL1Messages++ + continue + } + + txPayloadLength, err := getTxPayloadLength(txData) + if err != nil { + return 0, err + } + total += CalldataNonZeroByteGas * txPayloadLength // an over-estimate: treat each byte as non-zero + total += CalldataNonZeroByteGas * 4 // 4 bytes payload length + total += GetKeccak256Gas(txPayloadLength) // l2 tx hash + } + + // 60 bytes BlockContext calldata + total += CalldataNonZeroByteGas * 60 + + // sload + total += 2100 * numL1Messages // numL1Messages times cold sload in L1MessageQueue + + // staticcall + total += 100 * numL1Messages // numL1Messages times call to L1MessageQueue + total += 100 * numL1Messages // numL1Messages times warm address access to L1MessageQueue + + total += GetMemoryExpansionCost(36) * numL1Messages // staticcall to proxy + total += 100 * numL1Messages // read admin in proxy + total += 100 * numL1Messages // read impl in proxy + total += 100 * numL1Messages // access impl + total += GetMemoryExpansionCost(36) * numL1Messages // delegatecall to impl + + return total, nil +} + +// EstimateChunkL1CommitCalldataSize calculates the calldata size needed for committing a chunk to L1 approximately. +func EstimateChunkL1CommitCalldataSize(c *encoding.Chunk) (uint64, error) { + var totalL1CommitCalldataSize uint64 + for _, block := range c.Blocks { + blockL1CommitCalldataSize, err := EstimateBlockL1CommitCalldataSize(block) + if err != nil { + return 0, err + } + totalL1CommitCalldataSize += blockL1CommitCalldataSize + } + return totalL1CommitCalldataSize, nil +} + +// EstimateChunkL1CommitGas calculates the total L1 commit gas for this chunk approximately. +func EstimateChunkL1CommitGas(c *encoding.Chunk) (uint64, error) { + var totalTxNum uint64 + var totalL1CommitGas uint64 + for _, block := range c.Blocks { + totalTxNum += uint64(len(block.Transactions)) + blockL1CommitGas, err := EstimateBlockL1CommitGas(block) + if err != nil { + return 0, err + } + totalL1CommitGas += blockL1CommitGas + } + + numBlocks := uint64(len(c.Blocks)) + totalL1CommitGas += 100 * numBlocks // numBlocks times warm sload + totalL1CommitGas += CalldataNonZeroByteGas // numBlocks field of chunk encoding in calldata + totalL1CommitGas += CalldataNonZeroByteGas * numBlocks * 60 // numBlocks of BlockContext in chunk + + totalL1CommitGas += GetKeccak256Gas(58*numBlocks + 32*totalTxNum) // chunk hash + return totalL1CommitGas, nil +} + +// EstimateBatchL1CommitGas calculates the total L1 commit gas for this batch approximately. +func EstimateBatchL1CommitGas(b *encoding.Batch) (uint64, error) { + var totalL1CommitGas uint64 + + // Add extra gas costs + totalL1CommitGas += 100000 // constant to account for ops like _getAdmin, _implementation, _requireNotPaused, etc + totalL1CommitGas += 4 * 2100 // 4 one-time cold sload for commitBatch + totalL1CommitGas += 20000 // 1 time sstore + totalL1CommitGas += 21000 // base fee for tx + totalL1CommitGas += CalldataNonZeroByteGas // version in calldata + + // adjusting gas: + // add 1 time cold sload (2100 gas) for L1MessageQueue + // add 1 time cold address access (2600 gas) for L1MessageQueue + // minus 1 time warm sload (100 gas) & 1 time warm address access (100 gas) + totalL1CommitGas += (2100 + 2600 - 100 - 100) + totalL1CommitGas += GetKeccak256Gas(89 + 32) // parent batch header hash, length is estimated as 89 (constant part)+ 32 (1 skippedL1MessageBitmap) + totalL1CommitGas += CalldataNonZeroByteGas * (89 + 32) // parent batch header in calldata + + // adjust batch data hash gas cost + totalL1CommitGas += GetKeccak256Gas(uint64(32 * len(b.Chunks))) + + totalL1MessagePoppedBefore := b.TotalL1MessagePoppedBefore + + for _, chunk := range b.Chunks { + chunkL1CommitGas, err := EstimateChunkL1CommitGas(chunk) + if err != nil { + return 0, err + } + totalL1CommitGas += chunkL1CommitGas + + totalL1MessagePoppedInChunk := chunk.NumL1Messages(totalL1MessagePoppedBefore) + totalL1MessagePoppedBefore += totalL1MessagePoppedInChunk + + totalL1CommitGas += CalldataNonZeroByteGas * (32 * (totalL1MessagePoppedInChunk + 255) / 256) + totalL1CommitGas += GetKeccak256Gas(89 + 32*(totalL1MessagePoppedInChunk+255)/256) + + totalL1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + return 0, err + } + totalL1CommitGas += GetMemoryExpansionCost(totalL1CommitCalldataSize) + } + + return totalL1CommitGas, nil +} + +// EstimateBatchL1CommitCalldataSize calculates the calldata size in l1 commit for this batch approximately. +func EstimateBatchL1CommitCalldataSize(b *encoding.Batch) (uint64, error) { + var totalL1CommitCalldataSize uint64 + for _, chunk := range b.Chunks { + chunkL1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + return 0, err + } + totalL1CommitCalldataSize += chunkL1CommitCalldataSize + } + return totalL1CommitCalldataSize, nil +} + +func getTxPayloadLength(txData *types.TransactionData) (uint64, error) { + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(txData) + if err != nil { + return 0, err + } + return uint64(len(rlpTxData)), nil +} diff --git a/rollup/types/encoding/codecv1/codecv1.go b/rollup/types/encoding/codecv1/codecv1.go new file mode 100644 index 0000000000..9370fd1780 --- /dev/null +++ b/rollup/types/encoding/codecv1/codecv1.go @@ -0,0 +1,522 @@ +package codecv1 + +import ( + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "math" + "math/big" + "strings" + + "github.com/scroll-tech/go-ethereum/accounts/abi" + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" + "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/rollup/types/encoding" +) + +var ( + // BLSModulus is the BLS modulus defined in EIP-4844. + BLSModulus *big.Int + + // BlobDataProofArgs defines the argument types for `_blobDataProof` in `finalizeBatchWithProof4844`. + BlobDataProofArgs abi.Arguments + + // MaxNumChunks is the maximum number of chunks that a batch can contain. + MaxNumChunks int = 15 +) + +func init() { + // initialize modulus + modulus, success := new(big.Int).SetString("52435875175126190479447740508185965837690552500527637822603658699938581184513", 10) + if !success { + log.Crit("BLSModulus conversion failed") + } + BLSModulus = modulus + + // initialize arguments + bytes32Type, err1 := abi.NewType("bytes32", "bytes32", nil) + bytes48Type, err2 := abi.NewType("bytes48", "bytes48", nil) + if err1 != nil || err2 != nil { + log.Crit("Failed to initialize abi types", "err1", err1, "err2", err2) + } + + BlobDataProofArgs = abi.Arguments{ + {Type: bytes32Type, Name: "z"}, + {Type: bytes32Type, Name: "y"}, + {Type: bytes48Type, Name: "commitment"}, + {Type: bytes48Type, Name: "proof"}, + } +} + +// CodecV1Version denotes the version of the codec. +const CodecV1Version = 1 + +// DABlock represents a Data Availability Block. +type DABlock struct { + BlockNumber uint64 + Timestamp uint64 + BaseFee *big.Int + GasLimit uint64 + NumTransactions uint16 + NumL1Messages uint16 +} + +// DAChunk groups consecutive DABlocks with their transactions. +type DAChunk struct { + Blocks []*DABlock + Transactions [][]*types.TransactionData +} + +// DABatch contains metadata about a batch of DAChunks. +type DABatch struct { + // header + Version uint8 + BatchIndex uint64 + L1MessagePopped uint64 + TotalL1MessagePopped uint64 + DataHash common.Hash + BlobVersionedHash common.Hash + ParentBatchHash common.Hash + SkippedL1MessageBitmap []byte + + // blob payload + blob *kzg4844.Blob + z *kzg4844.Point +} + +// NewDABlock creates a new DABlock from the given encoding.Block and the total number of L1 messages popped before. +func NewDABlock(block *encoding.Block, totalL1MessagePoppedBefore uint64) (*DABlock, error) { + if !block.Header.Number.IsUint64() { + return nil, errors.New("block number is not uint64") + } + + // note: numL1Messages includes skipped messages + numL1Messages := block.NumL1Messages(totalL1MessagePoppedBefore) + if numL1Messages > math.MaxUint16 { + return nil, errors.New("number of L1 messages exceeds max uint16") + } + + // note: numTransactions includes skipped messages + numL2Transactions := block.NumL2Transactions() + numTransactions := numL1Messages + numL2Transactions + if numTransactions > math.MaxUint16 { + return nil, errors.New("number of transactions exceeds max uint16") + } + + daBlock := DABlock{ + BlockNumber: block.Header.Number.Uint64(), + Timestamp: block.Header.Time, + BaseFee: block.Header.BaseFee, + GasLimit: block.Header.GasLimit, + NumTransactions: uint16(numTransactions), + NumL1Messages: uint16(numL1Messages), + } + + return &daBlock, nil +} + +// Encode serializes the DABlock into a slice of bytes. +func (b *DABlock) Encode() []byte { + bytes := make([]byte, 60) + binary.BigEndian.PutUint64(bytes[0:], b.BlockNumber) + binary.BigEndian.PutUint64(bytes[8:], b.Timestamp) + if b.BaseFee != nil { + binary.BigEndian.PutUint64(bytes[40:], b.BaseFee.Uint64()) + } + binary.BigEndian.PutUint64(bytes[48:], b.GasLimit) + binary.BigEndian.PutUint16(bytes[56:], b.NumTransactions) + binary.BigEndian.PutUint16(bytes[58:], b.NumL1Messages) + return bytes +} + +// DecodeDABlock takes a byte slice and decodes it into a DABlock. +func DecodeDABlock(bytes []byte) (*DABlock, error) { + if len(bytes) != 60 { + return nil, errors.New("block encoding is not 60 bytes long") + } + + block := &DABlock{ + BlockNumber: binary.BigEndian.Uint64(bytes[0:8]), + Timestamp: binary.BigEndian.Uint64(bytes[8:16]), + BaseFee: new(big.Int).SetUint64(binary.BigEndian.Uint64(bytes[40:48])), + GasLimit: binary.BigEndian.Uint64(bytes[48:56]), + NumTransactions: binary.BigEndian.Uint16(bytes[56:58]), + NumL1Messages: binary.BigEndian.Uint16(bytes[58:60]), + } + + return block, nil +} + +// NewDAChunk creates a new DAChunk from the given encoding.Chunk and the total number of L1 messages popped before. +func NewDAChunk(chunk *encoding.Chunk, totalL1MessagePoppedBefore uint64) (*DAChunk, error) { + var blocks []*DABlock + var txs [][]*types.TransactionData + + for _, block := range chunk.Blocks { + b, err := NewDABlock(block, totalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + blocks = append(blocks, b) + totalL1MessagePoppedBefore += block.NumL1Messages(totalL1MessagePoppedBefore) + txs = append(txs, block.Transactions) + } + + daChunk := DAChunk{ + Blocks: blocks, + Transactions: txs, + } + + return &daChunk, nil +} + +// Encode serializes the DAChunk into a slice of bytes. +func (c *DAChunk) Encode() []byte { + var chunkBytes []byte + chunkBytes = append(chunkBytes, byte(len(c.Blocks))) + + for _, block := range c.Blocks { + blockBytes := block.Encode() + chunkBytes = append(chunkBytes, blockBytes...) + } + + return chunkBytes +} + +// Hash computes the hash of the DAChunk data. +func (c *DAChunk) Hash() (common.Hash, error) { + var dataBytes []byte + + // concatenate block contexts + for _, block := range c.Blocks { + encodedBlock := block.Encode() + // only the first 58 bytes are used in the hashing process + dataBytes = append(dataBytes, encodedBlock[:58]...) + } + + // concatenate l1 tx hashes + for _, blockTxs := range c.Transactions { + for _, txData := range blockTxs { + if txData.Type == types.L1MessageTxType { + txHash := strings.TrimPrefix(txData.TxHash, "0x") + hashBytes, err := hex.DecodeString(txHash) + if err != nil { + return common.Hash{}, err + } + if len(hashBytes) != 32 { + return common.Hash{}, fmt.Errorf("unexpected hash: %s", txData.TxHash) + } + dataBytes = append(dataBytes, hashBytes...) + } + } + } + + hash := crypto.Keccak256Hash(dataBytes) + return hash, nil +} + +// NewDABatch creates a DABatch from the provided encoding.Batch. +func NewDABatch(batch *encoding.Batch) (*DABatch, error) { + // this encoding can only support a fixed number of chunks per batch + if len(batch.Chunks) > MaxNumChunks { + return nil, fmt.Errorf("too many chunks in batch") + } + + if len(batch.Chunks) == 0 { + return nil, fmt.Errorf("too few chunks in batch") + } + + // batch data hash + dataHash, err := computeBatchDataHash(batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + // skipped L1 messages bitmap + bitmapBytes, totalL1MessagePoppedAfter, err := encoding.ConstructSkippedBitmap(batch.Index, batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + // blob payload + blob, z, err := constructBlobPayload(batch.Chunks) + if err != nil { + return nil, err + } + + // blob versioned hash + c, err := kzg4844.BlobToCommitment(*blob) + if err != nil { + return nil, fmt.Errorf("failed to create blob commitment") + } + blobVersionedHash := kzg4844.CalcBlobHashV1(sha256.New(), &c) + + daBatch := DABatch{ + Version: CodecV1Version, + BatchIndex: batch.Index, + L1MessagePopped: totalL1MessagePoppedAfter - batch.TotalL1MessagePoppedBefore, + TotalL1MessagePopped: totalL1MessagePoppedAfter, + DataHash: dataHash, + BlobVersionedHash: blobVersionedHash, + ParentBatchHash: batch.ParentBatchHash, + SkippedL1MessageBitmap: bitmapBytes, + blob: blob, + z: z, + } + + return &daBatch, nil +} + +// computeBatchDataHash computes the data hash of the batch. +// Note: The batch hash and batch data hash are two different hashes, +// the former is used for identifying a badge in the contracts, +// the latter is used in the public input to the provers. +func computeBatchDataHash(chunks []*encoding.Chunk, totalL1MessagePoppedBefore uint64) (common.Hash, error) { + var dataBytes []byte + totalL1MessagePoppedBeforeChunk := totalL1MessagePoppedBefore + + for _, chunk := range chunks { + daChunk, err := NewDAChunk(chunk, totalL1MessagePoppedBeforeChunk) + if err != nil { + return common.Hash{}, err + } + totalL1MessagePoppedBeforeChunk += chunk.NumL1Messages(totalL1MessagePoppedBeforeChunk) + chunkHash, err := daChunk.Hash() + if err != nil { + return common.Hash{}, err + } + dataBytes = append(dataBytes, chunkHash.Bytes()...) + } + + dataHash := crypto.Keccak256Hash(dataBytes) + return dataHash, nil +} + +// constructBlobPayload constructs the 4844 blob payload. +func constructBlobPayload(chunks []*encoding.Chunk) (*kzg4844.Blob, *kzg4844.Point, error) { + // metadata consists of num_chunks (2 bytes) and chunki_size (4 bytes per chunk) + metadataLength := 2 + MaxNumChunks*4 + + // the raw (un-padded) blob payload + blobBytes := make([]byte, metadataLength) + + // challenge digest preimage + // 1 hash for metadata and 1 for each chunk + challengePreimage := make([]byte, (1+MaxNumChunks)*32) + + // the chunk data hash used for calculating the challenge preimage + var chunkDataHash common.Hash + + // blob metadata: num_chunks + binary.BigEndian.PutUint16(blobBytes[0:], uint16(len(chunks))) + + // encode blob metadata and L2 transactions, + // and simultaneously also build challenge preimage + for chunkID, chunk := range chunks { + currentChunkStartIndex := len(blobBytes) + + for _, block := range chunk.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + // encode L2 txs into blob payload + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(tx) + if err != nil { + return nil, nil, err + } + blobBytes = append(blobBytes, rlpTxData...) + } + } + } + + // blob metadata: chunki_size + if chunkSize := len(blobBytes) - currentChunkStartIndex; chunkSize != 0 { + binary.BigEndian.PutUint32(blobBytes[2+4*chunkID:], uint32(chunkSize)) + } + + // challenge: compute chunk data hash + chunkDataHash = crypto.Keccak256Hash(blobBytes[currentChunkStartIndex:]) + copy(challengePreimage[32+chunkID*32:], chunkDataHash[:]) + } + + // if we have fewer than MaxNumChunks chunks, the rest + // of the blob metadata is correctly initialized to 0, + // but we need to add padding to the challenge preimage + for chunkID := len(chunks); chunkID < MaxNumChunks; chunkID++ { + // use the last chunk's data hash as padding + copy(challengePreimage[32+chunkID*32:], chunkDataHash[:]) + } + + // challenge: compute metadata hash + hash := crypto.Keccak256Hash(blobBytes[0:metadataLength]) + copy(challengePreimage[0:], hash[:]) + + // convert raw data to BLSFieldElements + blob, err := makeBlobCanonical(blobBytes) + if err != nil { + return nil, nil, err + } + + // compute z = challenge_digest % BLS_MODULUS + challengeDigest := crypto.Keccak256Hash(challengePreimage) + pointBigInt := new(big.Int).Mod(new(big.Int).SetBytes(challengeDigest[:]), BLSModulus) + pointBytes := pointBigInt.Bytes() + + // the challenge point z + var z kzg4844.Point + start := 32 - len(pointBytes) + copy(z[start:], pointBytes) + + return blob, &z, nil +} + +// makeBlobCanonical converts the raw blob data into the canonical blob representation of 4096 BLSFieldElements. +func makeBlobCanonical(blobBytes []byte) (*kzg4844.Blob, error) { + // blob contains 131072 bytes but we can only utilize 31/32 of these + if len(blobBytes) > 126976 { + return nil, fmt.Errorf("oversized batch payload") + } + + // the canonical (padded) blob payload + var blob kzg4844.Blob + + // encode blob payload by prepending every 31 bytes with 1 zero byte + index := 0 + + for from := 0; from < len(blobBytes); from += 31 { + to := from + 31 + if to > len(blobBytes) { + to = len(blobBytes) + } + copy(blob[index+1:], blobBytes[from:to]) + index += 32 + } + + return &blob, nil +} + +// NewDABatchFromBytes attempts to decode the given byte slice into a DABatch. +// Note: This function only populates the batch header, it leaves the blob-related fields empty. +func NewDABatchFromBytes(data []byte) (*DABatch, error) { + if len(data) < 121 { + return nil, fmt.Errorf("insufficient data for DABatch, expected at least 121 bytes but got %d", len(data)) + } + + b := &DABatch{ + Version: data[0], + BatchIndex: binary.BigEndian.Uint64(data[1:9]), + L1MessagePopped: binary.BigEndian.Uint64(data[9:17]), + TotalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), + DataHash: common.BytesToHash(data[25:57]), + BlobVersionedHash: common.BytesToHash(data[57:89]), + ParentBatchHash: common.BytesToHash(data[89:121]), + SkippedL1MessageBitmap: data[121:], + } + + return b, nil +} + +// Encode serializes the DABatch into bytes. +func (b *DABatch) Encode() []byte { + batchBytes := make([]byte, 121+len(b.SkippedL1MessageBitmap)) + batchBytes[0] = b.Version + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.BlobVersionedHash[:]) + copy(batchBytes[89:], b.ParentBatchHash[:]) + copy(batchBytes[121:], b.SkippedL1MessageBitmap[:]) + return batchBytes +} + +// Hash computes the hash of the serialized DABatch. +func (b *DABatch) Hash() common.Hash { + bytes := b.Encode() + return crypto.Keccak256Hash(bytes) +} + +// BlobDataProof computes the abi-encoded blob verification data. +func (b *DABatch) BlobDataProof() ([]byte, error) { + if b.blob == nil { + return nil, errors.New("called BlobDataProof with empty blob") + } + if b.z == nil { + return nil, errors.New("called BlobDataProof with empty z") + } + + commitment, err := kzg4844.BlobToCommitment(*b.blob) + if err != nil { + return nil, fmt.Errorf("failed to create blob commitment") + } + + proof, y, err := kzg4844.ComputeProof(*b.blob, *b.z) + if err != nil { + log.Crit("failed to create KZG proof at point", "err", err, "z", hex.EncodeToString(b.z[:])) + } + + // Memory layout of ``_blobDataProof``: + // | z | y | kzg_commitment | kzg_proof | + // |---------|---------|----------------|-----------| + // | bytes32 | bytes32 | bytes48 | bytes48 | + + values := []interface{}{*b.z, y, commitment, proof} + return BlobDataProofArgs.Pack(values...) +} + +// Blob returns the blob of the batch. +func (b *DABatch) Blob() *kzg4844.Blob { + return b.blob +} + +// DecodeFromCalldata attempts to decode a DABatch and an array of DAChunks from the provided calldata byte slice. +func DecodeFromCalldata(data []byte) (*DABatch, []*DAChunk, error) { + // TODO: implement this function. + return nil, nil, nil +} + +// EstimateChunkL1CommitBlobSize estimates the size of the L1 commit blob for a single chunk. +func EstimateChunkL1CommitBlobSize(c *encoding.Chunk) (uint64, error) { + metadataSize := uint64(2 + 4*MaxNumChunks) // over-estimate: adding metadata length + chunkDataSize, err := chunkL1CommitBlobDataSize(c) + if err != nil { + return 0, err + } + paddedSize := ((metadataSize + chunkDataSize + 30) / 31) * 32 + return paddedSize, nil +} + +// EstimateBatchL1CommitBlobSize estimates the total size of the L1 commit blob for a batch. +func EstimateBatchL1CommitBlobSize(b *encoding.Batch) (uint64, error) { + metadataSize := uint64(2 + 4*MaxNumChunks) + var batchDataSize uint64 + for _, c := range b.Chunks { + chunkDataSize, err := chunkL1CommitBlobDataSize(c) + if err != nil { + return 0, err + } + batchDataSize += chunkDataSize + } + paddedSize := ((metadataSize + batchDataSize + 30) / 31) * 32 + return paddedSize, nil +} + +func chunkL1CommitBlobDataSize(c *encoding.Chunk) (uint64, error) { + var dataSize uint64 + for _, block := range c.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(tx) + if err != nil { + return 0, err + } + dataSize += uint64(len(rlpTxData)) + } + } + } + return dataSize, nil +} diff --git a/rollup/types/encoding/da.go b/rollup/types/encoding/da.go new file mode 100644 index 0000000000..06a3bb6514 --- /dev/null +++ b/rollup/types/encoding/da.go @@ -0,0 +1,259 @@ +package encoding + +import ( + "fmt" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/common/hexutil" + "github.com/scroll-tech/go-ethereum/core/types" +) + +// CodecVersion defines the version of encoder and decoder. +type CodecVersion int + +const ( + // CodecV0 represents the version 0 of the encoder and decoder. + CodecV0 CodecVersion = iota + + // CodecV1 represents the version 1 of the encoder and decoder. + CodecV1 +) + +// Block represents an L2 block. +type Block struct { + Header *types.Header + Transactions []*types.TransactionData + WithdrawRoot common.Hash `json:"withdraw_trie_root,omitempty"` + RowConsumption *types.RowConsumption `json:"row_consumption,omitempty"` +} + +// Chunk represents a group of blocks. +type Chunk struct { + Blocks []*Block `json:"blocks"` +} + +// Batch represents a batch of chunks. +type Batch struct { + Index uint64 + TotalL1MessagePoppedBefore uint64 + ParentBatchHash common.Hash + Chunks []*Chunk +} + +// NumL1Messages returns the number of L1 messages in this block. +// This number is the sum of included and skipped L1 messages. +func (b *Block) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { + var lastQueueIndex *uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + lastQueueIndex = &txData.Nonce + } + } + if lastQueueIndex == nil { + return 0 + } + // note: last queue index included before this block is totalL1MessagePoppedBefore - 1 + // TODO: cache results + return *lastQueueIndex - totalL1MessagePoppedBefore + 1 +} + +// NumL2Transactions returns the number of L2 transactions in this block. +func (b *Block) NumL2Transactions() uint64 { + var count uint64 + for _, txData := range b.Transactions { + if txData.Type != types.L1MessageTxType { + count++ + } + } + return count +} + +// NumL1Messages returns the number of L1 messages in this chunk. +// This number is the sum of included and skipped L1 messages. +func (c *Chunk) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { + var numL1Messages uint64 + for _, block := range c.Blocks { + numL1MessagesInBlock := block.NumL1Messages(totalL1MessagePoppedBefore) + numL1Messages += numL1MessagesInBlock + totalL1MessagePoppedBefore += numL1MessagesInBlock + } + // TODO: cache results + return numL1Messages +} + +// ConvertTxDataToRLPEncoding transforms []*TransactionData into []*types.Transaction. +func ConvertTxDataToRLPEncoding(txData *types.TransactionData) ([]byte, error) { + data, err := hexutil.Decode(txData.Data) + if err != nil { + return nil, fmt.Errorf("failed to decode txData.Data: data=%v, err=%w", txData.Data, err) + } + + var tx *types.Transaction + switch txData.Type { + case types.LegacyTxType: + tx = types.NewTx(&types.LegacyTx{ + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasPrice: txData.GasPrice.ToInt(), + Data: data, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case types.AccessListTxType: + tx = types.NewTx(&types.AccessListTx{ + ChainID: txData.ChainId.ToInt(), + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasPrice: txData.GasPrice.ToInt(), + Data: data, + AccessList: txData.AccessList, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case types.DynamicFeeTxType: + tx = types.NewTx(&types.DynamicFeeTx{ + ChainID: txData.ChainId.ToInt(), + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasTipCap: txData.GasTipCap.ToInt(), + GasFeeCap: txData.GasFeeCap.ToInt(), + Data: data, + AccessList: txData.AccessList, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case types.L1MessageTxType: // L1MessageTxType is not supported + default: + return nil, fmt.Errorf("unsupported tx type: %d", txData.Type) + } + + rlpTxData, err := tx.MarshalBinary() + if err != nil { + return nil, fmt.Errorf("failed to marshal binary of the tx: tx=%v, err=%w", tx, err) + } + + return rlpTxData, nil +} + +// CrcMax calculates the maximum row consumption of crc. +func (c *Chunk) CrcMax() (uint64, error) { + // Map sub-circuit name to row count + crc := make(map[string]uint64) + + // Iterate over blocks, accumulate row consumption + for _, block := range c.Blocks { + if block.RowConsumption == nil { + return 0, fmt.Errorf("block (%d, %v) has nil RowConsumption", block.Header.Number, block.Header.Hash().Hex()) + } + for _, subCircuit := range *block.RowConsumption { + crc[subCircuit.Name] += subCircuit.RowNumber + } + } + + // Find the maximum row consumption + var maxVal uint64 + for _, value := range crc { + if value > maxVal { + maxVal = value + } + } + + // Return the maximum row consumption + return maxVal, nil +} + +// NumTransactions calculates the total number of transactions in a Chunk. +func (c *Chunk) NumTransactions() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += uint64(len(block.Transactions)) + } + return totalTxNum +} + +// NumL2Transactions calculates the total number of L2 transactions in a Chunk. +func (c *Chunk) NumL2Transactions() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += block.NumL2Transactions() + } + return totalTxNum +} + +// L2GasUsed calculates the total gas of L2 transactions in a Chunk. +func (c *Chunk) L2GasUsed() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += block.Header.GasUsed + } + return totalTxNum +} + +// StateRoot gets the state root after committing/finalizing the batch. +func (b *Batch) StateRoot() common.Hash { + numChunks := len(b.Chunks) + if len(b.Chunks) == 0 { + return common.Hash{} + } + lastChunkBlockNum := len(b.Chunks[numChunks-1].Blocks) + return b.Chunks[len(b.Chunks)-1].Blocks[lastChunkBlockNum-1].Header.Root +} + +// WithdrawRoot gets the withdraw root after committing/finalizing the batch. +func (b *Batch) WithdrawRoot() common.Hash { + numChunks := len(b.Chunks) + if len(b.Chunks) == 0 { + return common.Hash{} + } + lastChunkBlockNum := len(b.Chunks[numChunks-1].Blocks) + return b.Chunks[len(b.Chunks)-1].Blocks[lastChunkBlockNum-1].WithdrawRoot +} + +// TxsToTxsData converts transactions to a TransactionData array. +func TxsToTxsData(txs types.Transactions) []*types.TransactionData { + txsData := make([]*types.TransactionData, len(txs)) + for i, tx := range txs { + v, r, s := tx.RawSignatureValues() + + nonce := tx.Nonce() + + // We need QueueIndex in `NewBatchHeader`. However, `TransactionData` + // does not have this field. Since `L1MessageTx` do not have a nonce, + // we reuse this field for storing the queue index. + if msg := tx.AsL1MessageTx(); msg != nil { + nonce = msg.QueueIndex + } + + txsData[i] = &types.TransactionData{ + Type: tx.Type(), + TxHash: tx.Hash().String(), + Nonce: nonce, + ChainId: (*hexutil.Big)(tx.ChainId()), + Gas: tx.Gas(), + GasPrice: (*hexutil.Big)(tx.GasPrice()), + GasTipCap: (*hexutil.Big)(tx.GasTipCap()), + GasFeeCap: (*hexutil.Big)(tx.GasFeeCap()), + To: tx.To(), + Value: (*hexutil.Big)(tx.Value()), + Data: hexutil.Encode(tx.Data()), + IsCreate: tx.To() == nil, + AccessList: tx.AccessList(), + V: (*hexutil.Big)(v), + R: (*hexutil.Big)(r), + S: (*hexutil.Big)(s), + } + } + return txsData +}